diff --git a/locales/en/messages.json b/locales/en/messages.json index ed06eae027..47411986ec 100755 --- a/locales/en/messages.json +++ b/locales/en/messages.json @@ -3130,6 +3130,12 @@ "motorsmAhDrawn": { "message": "Amp. drawn:" }, + "motorsAmperageAverage5s": { + "message": "Amperage (5s avg):" + }, + "motorsAmperageAverage10s": { + "message": "Amperage (10s avg):" + }, "motorsVoltageValue": { "message": "$1 V" }, @@ -3139,6 +3145,12 @@ "motorsmAhDrawnValue": { "message": "$1 mAh" }, + "motorsAmperageAverage5sValue": { + "message": "$1 A" + }, + "motorsAmperageAverage10sValue": { + "message": "$1 A" + }, "motorsText":{ "message": "Motors" }, @@ -5333,6 +5345,12 @@ "powerBatteryAmperage": { "message": "Amperage" }, + "powerBatteryAmperageAverage5s": { + "message": "Amperage (5s average)" + }, + "powerBatteryAmperageAverage10s": { + "message": "Amperage (10s average)" + }, "powerBatteryCapacity": { "message": "Capacity (mAh)" }, diff --git a/locales/zh_CN/messages.json b/locales/zh_CN/messages.json index 97a4063086..46f7a0e4f9 100644 --- a/locales/zh_CN/messages.json +++ b/locales/zh_CN/messages.json @@ -2239,6 +2239,12 @@ "motorsmAhDrawn": { "message": "已消耗电流:" }, + "motorsAmperageAverage5s": { + "message": "电流 (5秒平均):" + }, + "motorsAmperageAverage10s": { + "message": "电流 (10秒平均):" + }, "motorsVoltageValue": { "message": "$1 V" }, @@ -2248,6 +2254,12 @@ "motorsmAhDrawnValue": { "message": "$1 mAh" }, + "motorsAmperageAverage5sValue": { + "message": "$1 A" + }, + "motorsAmperageAverage10sValue": { + "message": "$1 A" + }, "motorsText": { "message": "电机" }, @@ -4000,6 +4012,12 @@ "powerBatteryAmperage": { "message": "电流" }, + "powerBatteryAmperageAverage5s": { + "message": "电流 (5秒平均)" + }, + "powerBatteryAmperageAverage10s": { + "message": "电流 (10秒平均)" + }, "powerBatteryCapacity": { "message": "容量 (mAh)" }, diff --git a/src/js/tabs/motors.js b/src/js/tabs/motors.js index 10a8fc42c0..f789cb67f1 100644 --- a/src/js/tabs/motors.js +++ b/src/js/tabs/motors.js @@ -33,6 +33,10 @@ const motors = { sensorGyroScale: 2000, sensorAccelRate: 20, sensorAccelScale: 2, + amperageHistory5s: [], // Store last 5 seconds of amperage readings for average calculation + amperageHistorySize5s: 20, // Number of readings to keep for 5 seconds average (4Hz * 5s = 20) + amperageHistory10s: [], // Store last 10 seconds of amperage readings for average calculation + amperageHistorySize10s: 40, // Number of readings to keep for 10 seconds average (4Hz * 10s = 40) sensorSelectValues: { gyroScale: { 1: 1, @@ -77,6 +81,10 @@ motors.initialize = async function (callback) { self.configHasChanged = false; self.configChanges = {}; + // Reset amperage history when initializing + self.amperageHistory5s = []; + self.amperageHistory10s = []; + // Update filtering defaults based on API version const FILTER_DEFAULT = FC.getFilterDefaults(); @@ -463,6 +471,8 @@ motors.initialize = async function (callback) { const motorVoltage = $(".motors-bat-voltage"); const motorMahDrawingElement = $(".motors-bat-mah-drawing"); const motorMahDrawnElement = $(".motors-bat-mah-drawn"); + const motorAmperageAverage5sElement = $(".motors-bat-amperage-average-5s"); + const motorAmperageAverage10sElement = $(".motors-bat-amperage-average-10s"); const rawDataTextElements = { x: [], @@ -639,6 +649,33 @@ motors.initialize = async function (callback) { motorVoltage.text(i18n.getMessage("motorsVoltageValue", [FC.ANALOG.voltage])); motorMahDrawingElement.text(i18n.getMessage("motorsADrawingValue", [FC.ANALOG.amperage.toFixed(2)])); motorMahDrawnElement.text(i18n.getMessage("motorsmAhDrawnValue", [FC.ANALOG.mAhdrawn])); + + // Calculate amperage averages + const currentAmperage = FC.ANALOG.amperage; + + // 5 seconds average + TABS.motors.amperageHistory5s.push(currentAmperage); + if (TABS.motors.amperageHistory5s.length > TABS.motors.amperageHistorySize5s) { + TABS.motors.amperageHistory5s.shift(); + } + const amperageSum5s = TABS.motors.amperageHistory5s.reduce((sum, value) => sum + value, 0); + const amperageAverage5s = amperageSum5s / TABS.motors.amperageHistory5s.length; + + // 10 seconds average + TABS.motors.amperageHistory10s.push(currentAmperage); + if (TABS.motors.amperageHistory10s.length > TABS.motors.amperageHistorySize10s) { + TABS.motors.amperageHistory10s.shift(); + } + const amperageSum10s = TABS.motors.amperageHistory10s.reduce((sum, value) => sum + value, 0); + const amperageAverage10s = amperageSum10s / TABS.motors.amperageHistory10s.length; + + // Display average amperages + motorAmperageAverage5sElement.text( + i18n.getMessage("motorsAmperageAverage5sValue", [amperageAverage5s.toFixed(2)]), + ); + motorAmperageAverage10sElement.text( + i18n.getMessage("motorsAmperageAverage10sValue", [amperageAverage10s.toFixed(2)]), + ); } } diff --git a/src/js/tabs/power.js b/src/js/tabs/power.js index aea823fc14..8049097145 100644 --- a/src/js/tabs/power.js +++ b/src/js/tabs/power.js @@ -11,11 +11,19 @@ import { initializeModalDialog } from "../utils/initializeModalDialog"; const power = { supported: false, analyticsChanges: {}, + amperageHistory5s: [], // Store last 5 seconds of amperage readings for average calculation + amperageHistorySize5s: 25, // Number of readings to keep for 5 seconds average (5Hz * 5s = 25) + amperageHistory10s: [], // Store last 10 seconds of amperage readings for average calculation + amperageHistorySize10s: 50, // Number of readings to keep for 10 seconds average (5Hz * 10s = 50) }; power.initialize = function (callback) { const self = this; + // Reset amperage history when initializing + self.amperageHistory5s = []; + self.amperageHistory10s = []; + if (GUI.active_tab != "power") { GUI.active_tab = "power"; } @@ -224,6 +232,8 @@ power.initialize = function (callback) { $(elementBatteryState).find(".voltage").attr("id", "battery-voltage"); $(elementBatteryState).find(".mah-drawn").attr("id", "battery-mah-drawn"); $(elementBatteryState).find(".amperage").attr("id", "battery-amperage"); + $(elementBatteryState).find(".amperage-average-5s").attr("id", "battery-amperage-average-5s"); + $(elementBatteryState).find(".amperage-average-10s").attr("id", "battery-amperage-average-10s"); destinationBatteryState.append(elementBatteryState.children()); @@ -332,6 +342,31 @@ power.initialize = function (callback) { elementMspBatteryState.text(i18n.getMessage("powerMahValue", [FC.BATTERY_STATE.mAhDrawn])); elementMspBatteryState = $(`${elementPrefix}-amperage .value`); elementMspBatteryState.text(i18n.getMessage("powerAmperageValue", [FC.BATTERY_STATE.amperage])); + + // Calculate amperage averages + const currentAmperage = FC.BATTERY_STATE.amperage; + + // 5 seconds average + self.amperageHistory5s.push(currentAmperage); + if (self.amperageHistory5s.length > self.amperageHistorySize5s) { + self.amperageHistory5s.shift(); + } + const amperageSum5s = self.amperageHistory5s.reduce((sum, value) => sum + value, 0); + const amperageAverage5s = amperageSum5s / self.amperageHistory5s.length; + + // 10 seconds average + self.amperageHistory10s.push(currentAmperage); + if (self.amperageHistory10s.length > self.amperageHistorySize10s) { + self.amperageHistory10s.shift(); + } + const amperageSum10s = self.amperageHistory10s.reduce((sum, value) => sum + value, 0); + const amperageAverage10s = amperageSum10s / self.amperageHistory10s.length; + + // Display average amperages + elementMspBatteryState = $(`${elementPrefix}-amperage-average-5s .value`); + elementMspBatteryState.text(i18n.getMessage("powerAmperageValue", [amperageAverage5s.toFixed(2)])); + elementMspBatteryState = $(`${elementPrefix}-amperage-average-10s .value`); + elementMspBatteryState.text(i18n.getMessage("powerAmperageValue", [amperageAverage10s.toFixed(2)])); }); } diff --git a/src/tabs/motors.html b/src/tabs/motors.html index 2d3c1987f6..c9402f6e94 100644 --- a/src/tabs/motors.html +++ b/src/tabs/motors.html @@ -279,6 +279,8 @@ + +
diff --git a/src/tabs/power.html b/src/tabs/power.html index 990f75a761..3dd623c830 100644 --- a/src/tabs/power.html +++ b/src/tabs/power.html @@ -123,6 +123,14 @@ + + + + + + + +