all files / lib/lifx/packets/ setMultiZoneEffect.js

47.3% Statements 35/74
42.31% Branches 11/26
50% Functions 1/2
47.3% Lines 35/74
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173                                                                                                                                                                                                                                                                                   
'use strict';
 
var _require = require('../../lifx'),
    constants = _require.constants;
 
var Packet = {
  size: 59
};
 
/**
 * Converts packet specific data from a buffer to an object
 * @param  {Buffer} buf Buffer containing only packet specific data no header
 * @return {Object}     Information contained in packet
 */
Packet.toObject = function (buf) {
  var obj = {};
  var offset = 0;
 
  if (buf.length !== this.size) {
    throw new Error('Invalid length given for setMultiZoneEffect LIFX packet');
  }
 
  obj.instanceId = buf.readUInt32LE(offset);
  offset += 4;
 
  obj.effectType = buf.readUInt8(offset);
  offset += 1;
 
  // skip reserved field UInt16LE
  offset += 2;
 
  obj.speed = buf.readUInt32LE(offset);
  offset += 4;
 
  // FIXME: Int64 is not supported. Not giving the value makes the effect infinite
  // obj.duration = utils.readUInt64LE(buf, offset);
  // obj.duration = new Int64(buf.readUInt32LE(offset), buf.readUInt32LE(offset + 4));
  offset += 8;
 
  // skip reserved field UInt32LE
  offset += 4;
 
  // skip reserved field UInt32LE
  offset += 4;
 
  // Parameters Block 8*32Bit
  // reserved for internal use
  offset += 4;
 
  if (obj.type === constants.MULTIZONE_EFFECTS.indexOf('MOVE')) {
    obj.parameter2 = buf.readUInt32LE(offset);
    offset += 4;
    // skip parameter3
    offset += 4;
    // skip parameter4
    offset += 4;
    // skip parameter5
    offset += 4;
    // skip parameter6
    offset += 4;
    // skip parameter7
    offset += 4;
    // skip parameter8
    offset += 4;
  } else if (obj.type === constants.MULTIZONE_EFFECTS.indexOf('OFF')) {
    // skip parameter2
    offset += 4;
    // skip parameter3
    offset += 4;
    // skip parameter4
    offset += 4;
    // skip parameter5
    offset += 4;
    // skip parameter6
    offset += 4;
    // skip parameter7
    offset += 4;
    // skip parameter8
    offset += 4;
  }
 
  return obj;
};
 
/**
 * Converts the given packet specific object into a packet
 * @param  {Object}  obj object with configuration data
 * @param  {Number}  obj.instanceId client identifier (set randomly)
 * @param  {Number}  obj.effectType a constants.MULTIZONE_EFFECTS
 * @param  {Number}  obj.speed speed in milliseconds for completing one animation if cyclic or for one animation frame if acyclic
 * @param  {Number}  obj.duration duration in nanosecond for how long the effect should last
 * @param  {Number}  obj.parameter2 a constants.MULTIZONE_EFFECTS_MOVE_DIRECTION if effect 'MOVE' is set
 * @return {Buffer}  packet
 */
Packet.toBuffer = function (obj) {
  var buf = Buffer.alloc(this.size);
  buf.fill(0);
  var offset = 0;
 
  // instanceId is random. Could be used to identify the event later on
  buf.writeUInt32LE(Math.floor(Math.random() * 1000), offset);
  offset += 4;
 
  Iif (obj.effectType === undefined) {
    throw new TypeError('obj.effectType value must be given for setMultiZoneEffect LIFX packet');
  }
  Iif (typeof obj.effectType !== 'number' && obj.effectType < 0 || obj.effectType > constants.MULTIZONE_EFFECTS.length - 1) {
    throw new RangeError('Invalid type value given for setMultiZoneEffect LIFX packet, must be a number between 0 and ' + (constants.MULTIZONE_EFFECTS.length - 1));
  }
  buf.writeUInt8(obj.effectType, offset);
  offset += 1;
 
  // skip reserved field UInt16LE
  offset += 2;
 
  Iif (obj.speed === undefined) {
    throw new TypeError('obj.speed value must be given for setMultiZoneEffect LIFX packet');
  }
  Iif (typeof obj.speed !== 'number') {
    throw new TypeError('Invalid speed type given for setMultiZoneEffect LIFX packet, must be a number');
  }
  buf.writeUInt32LE(obj.speed, offset);
  offset += 4;
 
  // FIXME: Disabled due to missing Int64 support in node
  // if (obj.duration === undefined) {
  //   throw new TypeError('obj.duration value must be given for setMultiZoneEffect LIFX packet');
  // }
  // if (typeof obj.duration !== 'number') {
  //   throw new TypeError('Invalid duration type given for setMultiZoneEffect LIFX packet, must be a number');
  // }
  // utils.writeUInt64LE(buf, offset, obj.duration);
  // obj.duration.toBuffer().copy(buf, offset);
  offset += 8;
 
  // skip reserved field UInt32LE
  offset += 4;
 
  // skip reserved field UInt32LE
  offset += 4;
 
  // Parameters Block 8*32Bit
  // reserved for internal use
  offset += 4;
 
  // The following parameters vary depending on the effect
  Eif (obj.effectType === constants.MULTIZONE_EFFECTS.indexOf('MOVE')) {
    Iif (obj.parameter2 === undefined) {
      throw new TypeError('obj.parameter2 value must be given for setMultiZoneEffect (effect MOVE) LIFX packet');
    }
    Iif (typeof obj.parameter2 !== 'number' && obj.parameter2 < 0 || obj.parameter2 > constants.MULTIZONE_EFFECTS_MOVE_DIRECTION.length - 1) {
      throw new RangeError('Invalid parameter2 value given for setMultiZoneEffect (effect MOVE) LIFX packet, must be a number between 0 and ' + (constants.MULTIZONE_EFFECTS_MOVE_DIRECTION.length - 1));
    }
    buf.writeUInt32LE(obj.parameter2, offset);
    offset += 4;
    // skip parameter3
    offset += 4;
    // skip parameter4
    offset += 4;
    // skip parameter5
    offset += 4;
    // skip parameter6
    offset += 4;
    // skip parameter7
    offset += 4;
    // skip parameter8
    offset += 4;
  }
 
  return buf;
};
 
module.exports = Packet;