fs.read(file_handle, file_data, 0, 10, 0, function(err, data) { if (err !== null) { return cb(err); } if (file_data.slice(0, 3).toString() !== 'ID3') { return cb("No ID3 Tag"); } var data_size = id3Size(file_data.slice(6,10)); var version = '2.'+file_data.readUInt8(3)+'.'+file_data.readUInt8(4); return cb(null, file_handle, data_size, version); });
assert.throws(function() { buf.readUInt8(0); }, /beyond buffer length/);
var buf = Buffer(8); buf.writeFloatLE(0.0, -1); }, RangeError); // offset checks { const buf = new Buffer(0); assert.throws(function() { buf.readUInt8(0); }, RangeError); assert.throws(function() { buf.readInt8(0); }, RangeError); } { const buf = new Buffer([0xFF]); assert.equal(buf.readUInt8(0), 255); assert.equal(buf.readInt8(0), -1); } [16, 32].forEach(function(bits) { var buf = new Buffer(bits / 8 - 1); assert.throws(function() { buf['readUInt' + bits + 'BE'](0); }, RangeError, 'readUInt' + bits + 'BE'); assert.throws(function() { buf['readUInt' + bits + 'LE'](0); }, RangeError, 'readUInt' + bits + 'LE'); assert.throws(function() { buf['readInt' + bits + 'BE'](0); },
client.request(FC.READ_HOLDING_REGISTERS, blocks[blockindex].start, blocks[blockindex].len, function(err, response) { if (err) { /* stop on error */ dbgout(err); stop(); } /* write modbus data array to buffer * this is easier to handle/convert the data * */ var buf = new buffer(response.length*2); for (var i=0; i<response.length; i++) { buf.writeUInt16LE(response[i],i*2); } /* convert data depending on current block */ switch (blockindex) { case 0: dp['serial'] = buf.readUInt32LE(4)+(buf.readUInt32LE(8)<<32); dp['name'] = buf.toString('utf-8',12,32); dp['version'] = buf.readUInt8(45)+'.'+ buf.readUInt8(44); setState(settings.adapters.pluggit.firstId+1, dp['name']); setState(settings.adapters.pluggit.firstId+2, dp['serial']); setState(settings.adapters.pluggit.firstId+3, dp['version']); dbgout("\r\nsn: " + dp['serial']); dbgout("\r\nname: " + dp['name']); dbgout("\r\nfw: " + dp['version']); break; case 1: dp['t1'] = buf.readFloatLE(0); dp['t2'] = buf.readFloatLE(4); dp['t3'] = buf.readFloatLE(8); dp['t4'] = buf.readFloatLE(12); dp['t5'] = buf.readFloatLE(16); setState(settings.adapters.pluggit.firstId+10, dp['t1']); setState(settings.adapters.pluggit.firstId+11, dp['t2']); setState(settings.adapters.pluggit.firstId+12, dp['t3']); setState(settings.adapters.pluggit.firstId+13, dp['t4']); setState(settings.adapters.pluggit.firstId+14, dp['t5']); dbgout("\r\nt1: " + dp['t1'] + "°C"); dbgout("\r\nt2: " + dp['t2'] + "°C"); dbgout("\r\nt3: " + dp['t3'] + "°C"); dbgout("\r\nt4: " + dp['t4'] + "°C"); dbgout("\r\nt5: " + dp['t5'] + "°C"); break; case 2: dp['filter'] = buf.readUInt32LE(0); dp['humidity'] = buf.readUInt32LE(4); dp['bypass'] = buf.readUInt32LE(8); switch (dp['bypass']) { case 0x0000: dp['bypassState']='closed'; break; case 0x0001: dp['bypassState']='in process'; break; case 0x0020: dp['bypassState']='closing'; break; case 0x0040: dp['bypassState']='opening'; break; case 0x00FF: dp['bypassState']='opened'; break; default: dp['bypassState']='unknown'; break; } setState(settings.adapters.pluggit.firstId+20, dp['filter']); setState(settings.adapters.pluggit.firstId+22, dp['humidity']); setState(settings.adapters.pluggit.firstId+23, dp['bypass']); setState(settings.adapters.pluggit.firstId+24, dp['bypassState']); dbgout("\r\nfilter: " + dp['filter'] + " month"); dbgout("\r\nRH: " + dp['humidity'] + "%"); dbgout("\r\nBypass: "******"\r\nspeed: " + dp['speed']); break; case 4: dp['alarm'] = buf.readUInt16LE(0); switch (dp['alarm']) { case 0: dp['alarmState']='None'; break; case 1: dp['alarmState']='Exhaust FAN Alarm'; break; case 2: dp['alarmState']='Supply FAN Alarm'; break; case 3: dp['alarmState']='Bypass Alarm'; break; case 4: dp['alarmState']='T1 Alarm'; break; case 5: dp['alarmState']='T2 Alarm'; break; case 6: dp['alarmState']='T3 Alarm'; break; case 7: dp['alarmState']='T4 Alarm'; break; case 8: dp['alarmState']='T5 Alarm'; break; case 9: dp['alarmState']='RH Alarm'; break; case 10: dp['alarmState']='Outdoor13 Alarm'; break; case 11: dp['alarmState']='Supply5 Alarm'; break; case 12: dp['alarmState']='Fire Alarm'; break; case 13: dp['alarmState']='Communication Alarm'; break; case 14: dp['alarmState']='FireTermostat Alarm'; break; case 15: dp['alarmState']='VOC Alarm'; break; default: dp['alarmState']='unknown'; break; } setState(settings.adapters.pluggit.firstId+30, dp['alarm']); setState(settings.adapters.pluggit.firstId+31, dp['alarmState']); dbgout("\r\nalarm: " + dp['alarm'] + ' ('+dp['alarmState']+')'); break; case 5: dp['filterReset'] = buf.readUInt16LE(0); setState(settings.adapters.pluggit.firstId+22, dp['filterReset']); dbgout("\r\nfilter reset: " + dp['filterReset'] + ' days'); break; case 6: dp['workTime'] = buf.readUInt32LE(0); setState(settings.adapters.pluggit.firstId+40, dp['workTime']); dbgout("\r\work time: " + dp['workTime'] + ' hours'); break; default: /* should not happen */ stop(); } if (++blockindex < Object.keys(blocks).length) { /* request next block * be aware that this is a recursive call */ requestBlock(blockindex); } else { /* store all data in database */ storeDatabase(timestamp, dp); /* now all is done */ stop(); } });
assert.throws(function() { buf.readUInt8(0); }, RangeError);
Buff.prototype.readByte = function() { var b = new Buffer(1); fs.readSync(this.ba, b, 0, 1, this.pointer++); return b.readUInt8(0); };