All files / src/lifx/packets setMultiZoneEffect.js

47.29% Statements 35/74
42.3% Branches 11/26
50% Functions 1/2
47.29% Lines 35/74

Press n or j to go to the next uncovered block, b, p or k for the previous block.

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    1x   1x                 1x                                                                                                                                                               1x 2x 2x 2x     2x 2x   2x     2x     2x 2x     2x   2x     2x     2x 2x                     2x     2x     2x       2x     2x 2x     2x     2x 2x   2x   2x   2x   2x   2x   2x     2x     1x  
'use strict';
 
const {constants} = require('../../lifx');
 
const 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) {
  const obj = {};
  let 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) {
  const buf = Buffer.alloc(this.size);
  buf.fill(0);
  let 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;