diff --git a/messages/SLGetScheduleData.js b/messages/SLGetScheduleData.js index 70572f6..70d6b50 100644 --- a/messages/SLGetScheduleData.js +++ b/messages/SLGetScheduleData.js @@ -14,7 +14,6 @@ exports.SLGetScheduleData = class SLGetScheduleData extends SLMessage { if (!buf) { - // console.log('Requested Schedule type = ', scheduleType); this.writeInt32LE(0); this.writeInt32LE(scheduleType); } else { @@ -37,26 +36,16 @@ exports.SLGetScheduleData = class SLGetScheduleData extends SLMessage { this.events[i].scheduleId = this.readUInt32LE(); this.events[i].circuitId = this.readUInt32LE(); - this.events[i].startTime = this.readTime(this.readUInt32LE()); - this.events[i].stopTime = this.readTime(this.readUInt32LE()); + this.events[i].startTime = this.decodeTime(this.readUInt32LE()); + this.events[i].stopTime = this.decodeTime(this.readUInt32LE()); this.events[i].dayMask = this.readUInt32LE(); this.events[i].flags = this.readUInt32LE(); this.events[i].heatCmd = this.readUInt32LE(); this.events[i].heatSetPoint = this.readUInt32LE(); - + this.events[i].days = this.decodeDayMask(this.events[i].dayMask); } } - readTime(rawTime) { - var retVal; - - retVal = Math.floor(rawTime / 60) * 100 + rawTime % 60; - - retVal = String(retVal).padStart(4, '0'); - - return retVal; - } - static getResponseId() { return MSG_ID + 1; } diff --git a/messages/SLMessage.js b/messages/SLMessage.js index 5d0f413..4132b86 100644 --- a/messages/SLMessage.js +++ b/messages/SLMessage.js @@ -2,6 +2,16 @@ const SmartBuffer = require('smart-buffer').SmartBuffer; +const DAY_VALUES = [ + ['Mon', 0x1 ], + ['Tue', 0x2 ], + ['Wed', 0x4 ], + ['Thu', 0x8 ], + ['Fri', 0x10 ], + ['Sat', 0x20 ], + ['Sun', 0x40 ], +]; + exports.SLMessage = class SLMessage extends SmartBuffer { constructor(senderId, messageId, size) { var options; @@ -93,6 +103,53 @@ exports.SLMessage = class SLMessage extends SmartBuffer { this.dataLength = this.readInt32LE(); } + isBitSet(value, bit) { + return ((value >> bit) & 0x1) === 1; + } + + decodeTime(rawTime) { // Takes 'rawTime' in mins past midnight and returns military time as a string + var retVal; + + retVal = Math.floor(rawTime / 60) * 100 + rawTime % 60; + + retVal = String(retVal).padStart(4, '0'); + + return retVal; + } + + encodeTime(stringTime) { // Takes 'stringTime' as military time and returns mins past midnight + return Number(stringTime.substr(0, 2) * 60) + Number(stringTime.substr(2, 2)); + } + + decodeDayMask(dayMask) { + var days = []; + + for (var i = 0; i < 7; i++) { + if (this.isBitSet(dayMask, i)) { + days.push(DAY_VALUES[i][0]); + } + } + return days; + } + + encodeDayMask(daysArray) { + var dayMask = 0; + + for (var i = 0; i < daysArray.length; i++) { + dayMask += this.getDayValue(daysArray[i]); + } + return dayMask; + } + + getDayValue(dayName) { + for (var i = 0; i < DAY_VALUES.length; i++) { + if (DAY_VALUES[i][0] === dayName) { + return DAY_VALUES[i][1]; + } + } + return 0; + } + static slackForAlignment(val) { return (4 - val % 4) % 4; }