From 1138440119847d6f1e36e117506310af721a9b2c Mon Sep 17 00:00:00 2001 From: Mathias Malmqvist Date: Tue, 28 Oct 2025 01:10:45 +0100 Subject: [PATCH] Show power-saving warning in Quick Test modal when battery is low --- js/controller-manager.js | 8 ++++---- js/controllers/ds4-controller.js | 14 +++++++------- js/controllers/ds5-controller.js | 13 +++++++------ js/core.js | 4 ++-- js/modals/quick-test-modal.js | 19 ++++++++++++++++--- templates/quick-test-modal.html | 4 ++++ 6 files changed, 40 insertions(+), 22 deletions(-) diff --git a/js/controller-manager.js b/js/controller-manager.js index 40b62f0..cf6447c 100644 --- a/js/controller-manager.js +++ b/js/controller-manager.js @@ -35,7 +35,7 @@ class ControllerManager { this.batteryStatus = { bat_txt: "", changed: false, - bat_capacity: 0, + charge_level: 0, cable_connected: false, is_charging: false, is_error: false @@ -578,7 +578,7 @@ class ControllerManager { /** * Convert battery percentage to display text with icons */ - _batteryPercentToText({bat_capacity, is_charging, is_error}) { + _batteryPercentToText({charge_level, is_charging, is_error}) { if (is_error) { return '' + l("error") + ''; } @@ -590,10 +590,10 @@ class ControllerManager { { threshold: 80, icon: 'fa-battery-three-quarters' }, ]; - const icon_txt = batteryIcons.find(item => bat_capacity < item.threshold)?.icon || 'fa-battery-full'; + const icon_txt = batteryIcons.find(item => charge_level < item.threshold)?.icon || 'fa-battery-full'; const icon_full = ``; const bolt_txt = is_charging ? '' : ''; - return [`${bat_capacity}%`, icon_full, bolt_txt].join(' '); + return [`${charge_level}%`, icon_full, bolt_txt].join(' '); } /** diff --git a/js/controllers/ds4-controller.js b/js/controllers/ds4-controller.js index a13e05e..c8b0e6c 100644 --- a/js/controllers/ds4-controller.js +++ b/js/controllers/ds4-controller.js @@ -420,29 +420,29 @@ class DS4Controller extends BaseController { const bat_status = (bat >> 4) & 1; const cable_connected = bat_status === 1; - let bat_capacity = 0; + let charge_level = 0; let is_charging = false; let is_error = false; if (cable_connected) { if (bat_data < 10) { - bat_capacity = Math.min(bat_data * 10 + 5, 100); + charge_level = Math.min(bat_data * 10 + 5, 100); is_charging = true; } else if (bat_data === 10) { - bat_capacity = 100; + charge_level = 100; is_charging = true; } else if (bat_data === 11) { - bat_capacity = 100; // Fully charged + charge_level = 100; // Fully charged } else { - bat_capacity = 0; + charge_level = 0; is_error = true; } } else { // On battery power - bat_capacity = bat_data < 10 ? bat_data * 10 + 5 : 100; + charge_level = bat_data < 10 ? bat_data * 10 + 5 : 100; } - return { bat_capacity, cable_connected, is_charging, is_error }; + return { charge_level, cable_connected, is_charging, is_error }; } /** diff --git a/js/controllers/ds5-controller.js b/js/controllers/ds5-controller.js index cd9b9b6..0f549f1 100644 --- a/js/controllers/ds5-controller.js +++ b/js/controllers/ds5-controller.js @@ -844,7 +844,7 @@ class DS5Controller extends BaseController { const bat_charge = bat & 0x0f; const bat_status = bat >> 4; - let bat_capacity = 0; + let charge_level = 0; let cable_connected = false; let is_charging = false; let is_error = false; @@ -852,32 +852,33 @@ class DS5Controller extends BaseController { switch (bat_status) { case 0: // On battery power - bat_capacity = Math.min(bat_charge * 10 + 5, 100); + charge_level = Math.min(bat_charge * 10 + 5, 100); break; case 1: // Charging - bat_capacity = Math.min(bat_charge * 10 + 5, 100); + charge_level = Math.min(bat_charge * 10 + 5, 100); is_charging = true; cable_connected = true; break; case 2: // Fully charged - bat_capacity = 100; + charge_level = 100; cable_connected = true; break; case 15: // Battery is flat - bat_capacity = 0; + charge_level = 0; is_charging = true; cable_connected = true; break; + case 11: // not sure yet what this error means default: // Error state is_error = true; break; } - return { bat_capacity, cable_connected, is_charging, is_error }; + return { charge_level, cable_connected, is_charging, is_error }; } } diff --git a/js/core.js b/js/core.js index 91693cb..fb163be 100644 --- a/js/core.js +++ b/js/core.js @@ -623,7 +623,7 @@ const throttled_refresh_sticks = (() => { const update_stick_graphics = (changes) => throttled_refresh_sticks(changes); -function update_battery_status({/* bat_capacity, cable_connected, is_charging, is_error, */ bat_txt, changed}) { +function update_battery_status({/* charge_level, cable_connected, is_charging, is_error, */ bat_txt, changed}) { if(changed) { $("#d-bat").html(bat_txt); } @@ -760,7 +760,7 @@ function handleControllerInput({ changes, inputConfig, touchPoints, batteryStatu // Handle Quick Test Modal input (can be open from any tab) if (isQuickTestVisible()) { - quicktest_handle_controller_input(changes); + quicktest_handle_controller_input(changes, batteryStatus); return; } diff --git a/js/modals/quick-test-modal.js b/js/modals/quick-test-modal.js index 7418567..a11a630 100644 --- a/js/modals/quick-test-modal.js +++ b/js/modals/quick-test-modal.js @@ -93,6 +93,7 @@ export class QuickTestModal { isTransitioning: false, skippedTests: [], lightsAnimationInterval: null, + batteryAlertShown: false, }; } @@ -1275,9 +1276,21 @@ export class QuickTestModal { /** * Handle controller input for test navigation and control */ - handleControllerInput(changes) { + handleControllerInput(changes, batteryStatus) { if(this.state.isTransitioning) return; + // Check battery status and show/hide warning if charge is 5% or less + if (batteryStatus) { + // Only update visibility if alert hasn't been shown or charge level changed + if (!this.state.batteryAlertShown || batteryStatus.changed ) { + console.log("Battery status changed:", batteryStatus); + const { charge_level, is_error } = batteryStatus; + const $batteryWarning = $('#battery-warning-alert'); + $batteryWarning.toggle(charge_level <= 5 || is_error); + this.state.batteryAlertShown = true; + } + } + const activeTest = this._getCurrentActiveTest(); // If buttons test is active, track button presses @@ -1572,9 +1585,9 @@ export function isQuickTestVisible() { /** * Handle controller input for the Quick Test Modal */ -export function quicktest_handle_controller_input(changes) { +export function quicktest_handle_controller_input(changes, batteryStatus) { if (currentQuickTestInstance && isQuickTestVisible()) { - currentQuickTestInstance.handleControllerInput(changes); + currentQuickTestInstance.handleControllerInput(changes, batteryStatus); } } diff --git a/templates/quick-test-modal.html b/templates/quick-test-modal.html index 464c900..a694872 100644 --- a/templates/quick-test-modal.html +++ b/templates/quick-test-modal.html @@ -8,6 +8,10 @@