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..3399427a9b 100644 --- a/src/js/tabs/motors.js +++ b/src/js/tabs/motors.js @@ -33,6 +33,7 @@ const motors = { sensorGyroScale: 2000, sensorAccelRate: 20, sensorAccelScale: 2, + amperageHistory: [], // Store amperage readings with timestamps for average calculation sensorSelectValues: { gyroScale: { 1: 1, @@ -77,6 +78,9 @@ motors.initialize = async function (callback) { self.configHasChanged = false; self.configChanges = {}; + // Reset amperage history when initializing + self.amperageHistory = []; + // Update filtering defaults based on API version const FILTER_DEFAULT = FC.getFilterDefaults(); @@ -463,6 +467,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 +645,55 @@ 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 using timestamp-based approach + const currentAmperage = FC.ANALOG.amperage; + const currentTimestamp = performance.now(); + + // Add current reading with timestamp + TABS.motors.amperageHistory.push({ + value: currentAmperage, + timestamp: currentTimestamp, + }); + + // Calculate time thresholds + const tenSecondsAgo = currentTimestamp - 10000; + const fiveSecondsAgo = currentTimestamp - 5000; + + // Remove readings older than 10 seconds and calculate averages in one pass + const validReadings = []; + let amperageSum5s = 0; + let amperageSum10s = 0; + let count5s = 0; + let count10s = 0; + + for (const reading of TABS.motors.amperageHistory) { + if (reading.timestamp >= tenSecondsAgo) { + validReadings.push(reading); + amperageSum10s += reading.value; + count10s++; + + if (reading.timestamp >= fiveSecondsAgo) { + amperageSum5s += reading.value; + count5s++; + } + } + } + + // Update history with only valid readings + TABS.motors.amperageHistory = validReadings; + + // Calculate averages + const amperageAverage5s = count5s > 0 ? amperageSum5s / count5s : 0; + const amperageAverage10s = count10s > 0 ? amperageSum10s / count10s : 0; + + // 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..39ceda3508 100644 --- a/src/js/tabs/power.js +++ b/src/js/tabs/power.js @@ -11,11 +11,15 @@ import { initializeModalDialog } from "../utils/initializeModalDialog"; const power = { supported: false, analyticsChanges: {}, + amperageHistory: [], // Store amperage readings with timestamps for average calculation }; power.initialize = function (callback) { const self = this; + // Reset amperage history when initializing + self.amperageHistory = []; + if (GUI.active_tab != "power") { GUI.active_tab = "power"; } @@ -224,6 +228,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 +338,53 @@ 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 using timestamp-based approach + const currentAmperage = FC.BATTERY_STATE.amperage; + const currentTimestamp = performance.now(); + + // Add current reading with timestamp + self.amperageHistory.push({ + value: currentAmperage, + timestamp: currentTimestamp, + }); + + // Calculate time thresholds + const tenSecondsAgo = currentTimestamp - 10000; + const fiveSecondsAgo = currentTimestamp - 5000; + + // Remove readings older than 10 seconds and calculate averages in one pass + const validReadings = []; + let amperageSum5s = 0; + let amperageSum10s = 0; + let count5s = 0; + let count10s = 0; + + for (const reading of self.amperageHistory) { + if (reading.timestamp >= tenSecondsAgo) { + validReadings.push(reading); + amperageSum10s += reading.value; + count10s++; + + if (reading.timestamp >= fiveSecondsAgo) { + amperageSum5s += reading.value; + count5s++; + } + } + } + + // Update history with only valid readings + self.amperageHistory = validReadings; + + // Calculate averages + const amperageAverage5s = count5s > 0 ? amperageSum5s / count5s : 0; + const amperageAverage10s = count10s > 0 ? amperageSum10s / count10s : 0; + + // 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 @@ + +