'use strict'; const BitHelper = require("./bitHelper"); var OutputMappingCollection = function () { let self = {}, data = [], timerOverrides = {}; const colorTable = [ "#8ecae6", "#2a9d8f", "#e9c46a", "#f4a261", "#e76f51", "#ef476f", "#ffc300" ]; const TIM_USE_ANY = 0; const TIM_USE_PPM = 0; const TIM_USE_PWM = 1; const TIM_USE_MOTOR = 2; // Motor output const TIM_USE_SERVO = 3; // Servo output (i.e. TRI) //const TIM_USE_MC_CHNFW = 4; // Deprecated and not used after removal of CHANNEL_FORWARDING feature //const TIM_USE_FW_MOTOR = 5; //const TIM_USE_FW_SERVO = 6; const TIM_USE_LED = 24; const TIM_USE_BEEPER = 25; const OUTPUT_TYPE_MOTOR = 0; const OUTPUT_TYPE_SERVO = 1; const OUTPUT_TYPE_LED = 2; const SPECIAL_LABEL_LED = 1; self.TIMER_OUTPUT_MODE_AUTO = 0; self.TIMER_OUTPUT_MODE_MOTORS = 1; self.TIMER_OUTPUT_MODE_SERVOS = 2; self.TIMER_OUTPUT_MODE_LED = 3; self.flushTimerOverrides = function() { timerOverrides = {}; } self.setTimerOverride = function (timer, outputMode) { timerOverrides[timer] = outputMode; } self.getTimerOverride = function (timer) { return timerOverrides[timer]; } self.getTimerColor = function (timer) { let timerIndex = self.getUsedTimerIds().indexOf(String(timer)); return colorTable[timerIndex % colorTable.length]; } self.isLedPin = function(timer) { return data[timer].specialLabels == SPECIAL_LABEL_LED; } self.getOutputTimerColor = function (output) { let timerId = self.getTimerId(output); return self.getTimerColor(timerId); } self.getUsedTimerIds = function (timer) { let used = {}; let outputCount = self.getOutputCount(); for (let i = 0; i < outputCount; ++i) { let timerId = self.getTimerId(i); used[timerId] = 1; } return Object.keys(used).sort((a, b) => a - b); } function getTimerMap(isMR, motors, servos) { let timerMap = [], motorsToGo = motors, servosToGo = servos; for (let i = 0; i < data.length; i++) { timerMap[i] = null; if (servosToGo > 0 && BitHelper.bit_check(data[i]['usageFlags'], TIM_USE_LED)) { console.log(i + ": LED"); timerMap[i] = OUTPUT_TYPE_LED; } else if (servosToGo > 0 && BitHelper.bit_check(data[i]['usageFlags'], TIM_USE_SERVO)) { console.log(i + ": SERVO"); servosToGo--; timerMap[i] = OUTPUT_TYPE_SERVO; } else if (motorsToGo > 0 && BitHelper.bit_check(data[i]['usageFlags'], TIM_USE_MOTOR)) { console.log(i + ": MOTOR"); motorsToGo--; timerMap[i] = OUTPUT_TYPE_MOTOR; } } return timerMap; }; self.getOutputTable = function (isMR, motors, servos) { let currentMotorIndex = 1, currentServoIndex = 0, timerMap = getTimerMap(isMR, motors, servos.length), outputMap = [], offset = getFirstOutputOffset(); console.log("Offset: " + offset) for (let i = 0; i < self.getOutputCount(); i++) { let assignment = timerMap[i + offset]; if (assignment === null) { outputMap[i] = "-"; } else if (assignment == OUTPUT_TYPE_MOTOR) { outputMap[i] = "Motor " + currentMotorIndex; currentMotorIndex++; } else if (assignment == OUTPUT_TYPE_SERVO) { outputMap[i] = "Servo " + servos[currentServoIndex]; currentServoIndex++; } else if (assignment == OUTPUT_TYPE_LED) { outputMap[i] = "Led"; } } return outputMap; }; self.flush = function () { data = []; }; self.put = function (element) { data.push(element); }; self.getOutputCount = function () { let retVal = 0; for (let i = 0; i < data.length; i++) { let flags = data[i]['usageFlags']; if ( BitHelper.bit_check(flags, TIM_USE_MOTOR) || BitHelper.bit_check(flags, TIM_USE_SERVO) || BitHelper.bit_check(flags, TIM_USE_LED) ) { retVal++; }; } return retVal; } function getFirstOutputOffset() { for (let i = 0; i < data.length; i++) { if ( BitHelper.bit_check(data[i]['usageFlags'], TIM_USE_MOTOR) || BitHelper.bit_check(data[i]['usageFlags'], TIM_USE_SERVO) || BitHelper.bit_check(data[i]['usageFlags'], TIM_USE_LED) ) { return i; } } return 0; } function getTimerId(outputIndex) { return data[outputIndex]['timerId']; } function getOutput(servoIndex, bit) { let offset = getFirstOutputOffset(); let lastFound = 0; for (let i = offset; i < data.length; i++) { if (BitHelper.bit_check(data[i]['usageFlags'], bit)) { if (lastFound == servoIndex) { return i - offset + 1; } else { lastFound++; } } } return null; } self.getTimerId = function(outputIndex) { return getTimerId(outputIndex) } self.getFwServoOutput = function (servoIndex) { return getOutput(servoIndex, TIM_USE_SERVO); }; self.getMrServoOutput = function (index) { return getOutput(index, TIM_USE_SERVO); }; return self; } module.exports = OutputMappingCollection;