"use strict";
|
|
module.exports = {
|
id: 0x29,
|
type: 'TIMEN',
|
name: 'Time',
|
hasScale: true,
|
dataLengthLength: 1,
|
dataLengthFromScale: function dataLengthFromScale(scale) {
|
switch (scale) {
|
case 0:
|
case 1:
|
case 2:
|
return 3;
|
|
case 3:
|
case 4:
|
return 4;
|
|
case 5:
|
case 6:
|
case 7:
|
return 5;
|
}
|
},
|
declaration: function declaration(parameter) {
|
return 'time(' + this.resolveScale(parameter) + ')';
|
},
|
resolveScale: function resolveScale(parameter) {
|
if (parameter.scale != null) {
|
return parameter.scale;
|
} else if (parameter.value === null) {
|
return 0;
|
} else {
|
return 7;
|
}
|
},
|
writeTypeInfo: function writeTypeInfo(buffer, parameter) {
|
buffer.writeUInt8(this.id);
|
buffer.writeUInt8(parameter.scale);
|
},
|
writeParameterData: function writeParameterData(buffer, parameter, options) {
|
if (parameter.value != null) {
|
const time = new Date(+parameter.value);
|
let timestamp;
|
|
if (options.useUTC) {
|
timestamp = ((time.getUTCHours() * 60 + time.getUTCMinutes()) * 60 + time.getUTCSeconds()) * 1000 + time.getUTCMilliseconds();
|
} else {
|
timestamp = ((time.getHours() * 60 + time.getMinutes()) * 60 + time.getSeconds()) * 1000 + time.getMilliseconds();
|
}
|
|
timestamp = timestamp * Math.pow(10, parameter.scale - 3);
|
timestamp += (parameter.value.nanosecondDelta != null ? parameter.value.nanosecondDelta : 0) * Math.pow(10, parameter.scale);
|
timestamp = Math.round(timestamp);
|
|
switch (parameter.scale) {
|
case 0:
|
case 1:
|
case 2:
|
buffer.writeUInt8(3);
|
buffer.writeUInt24LE(timestamp);
|
break;
|
|
case 3:
|
case 4:
|
buffer.writeUInt8(4);
|
buffer.writeUInt32LE(timestamp);
|
break;
|
|
case 5:
|
case 6:
|
case 7:
|
buffer.writeUInt8(5);
|
buffer.writeUInt40LE(timestamp);
|
}
|
} else {
|
buffer.writeUInt8(0);
|
}
|
},
|
validate: function validate(value) {
|
if (value == null) {
|
return null;
|
}
|
|
if (value instanceof Date) {
|
return value;
|
}
|
|
value = Date.parse(value);
|
|
if (isNaN(value)) {
|
return new TypeError('Invalid time.');
|
}
|
|
return value;
|
}
|
};
|