Add buttons for quick-calibrating from the finetune dialog

This commit is contained in:
Mathias Malmqvist
2025-09-27 00:17:03 +02:00
committed by dualshock-tools
parent a6f1b2e503
commit 72c5dfbbeb
8 changed files with 130 additions and 43 deletions

View File

@@ -8,10 +8,8 @@ import { l } from '../translations.js';
* Handles step-by-step manual stick center calibration
*/
export class CalibCenterModal {
constructor(controllerInstance, { resetStickDiagrams, set_progress }, doneCallback = null) {
constructor(controllerInstance, doneCallback = null) {
this.controller = controllerInstance;
this.resetStickDiagrams = resetStickDiagrams;
this.set_progress = set_progress;
this.doneCallback = doneCallback;
this._initEventListeners();
@@ -31,6 +29,14 @@ export class CalibCenterModal {
});
}
/**
* Set progress bar width
* @param {number} i - Progress percentage (0-100)
*/
setProgress(i) {
$("#calib-center-progress").css('width', '' + i + '%')
}
/**
* Remove event listeners
*/
@@ -113,21 +119,20 @@ export class CalibCenterModal {
if(!this.controller.isConnected())
return;
this.set_progress(0);
this.setProgress(0);
new bootstrap.Modal(document.getElementById('calibrateModal'), {}).show();
await sleep(1000);
// Use the controller manager's calibrateSticks method with UI progress updates
this.set_progress(10);
this.setProgress(10);
const result = await this.controller.calibrateSticks((progress) => {
this.set_progress(progress);
this.setProgress(progress);
});
await sleep(500);
this._close(true, result?.message);
this.resetStickDiagrams();
}
/**
@@ -220,8 +225,8 @@ function destroyCurrentInstance() {
}
// Legacy function exports for backward compatibility
export async function calibrate_stick_centers(controller, dependencies, doneCallback = null) {
currentCalibCenterInstance = new CalibCenterModal(controller, dependencies, doneCallback);
export async function calibrate_stick_centers(controller, doneCallback = null) {
currentCalibCenterInstance = new CalibCenterModal(controller, doneCallback);
await currentCalibCenterInstance.open();
}
@@ -241,24 +246,20 @@ async function quick_calibrate_instead() {
currentCalibCenterInstance.doneCallback = null; // Temporarily remove callback to avoid double-calling
currentCalibCenterInstance._close();
// Get the controller and dependencies from the current instance
// Get the controller from the current instance
const { controller } = currentCalibCenterInstance;
const dependencies = {
resetStickDiagrams: currentCalibCenterInstance.resetStickDiagrams,
set_progress: currentCalibCenterInstance.set_progress
};
// Destroy the current instance
destroyCurrentInstance();
// Start auto calibration with the original callback
await auto_calibrate_stick_centers(controller, dependencies, doneCallback);
await auto_calibrate_stick_centers(controller, {}, doneCallback);
}
}
// "Old" fully automatic stick center calibration
export async function auto_calibrate_stick_centers(controller, dependencies, doneCallback = null) {
currentCalibCenterInstance = new CalibCenterModal(controller, dependencies, doneCallback);
export async function auto_calibrate_stick_centers(controller, doneCallback = null) {
currentCalibCenterInstance = new CalibCenterModal(controller, doneCallback);
await currentCalibCenterInstance.multiCalibrateSticks();
}

View File

@@ -7,10 +7,8 @@ import { sleep } from '../utils.js';
* Handles stick range calibration
*/
export class CalibRangeModal {
constructor(controllerInstance, { resetStickDiagrams }, doneCallback = null) {
// Dependencies
constructor(controllerInstance, doneCallback = null) {
this.controller = controllerInstance;
this.resetStickDiagrams = resetStickDiagrams;
this.doneCallback = doneCallback;
}
@@ -26,7 +24,6 @@ export class CalibRangeModal {
async onClose() {
bootstrap.Modal.getOrCreateInstance('#rangeModal').hide();
this.resetStickDiagrams();
const result = await this.controller.calibrateRangeOnClose();
@@ -48,9 +45,9 @@ function destroyCurrentInstance() {
}
// Legacy function exports for backward compatibility
export async function calibrate_range(controller, dependencies, doneCallback = null) {
export async function calibrate_range(controller, doneCallback = null) {
destroyCurrentInstance(); // Clean up any existing instance
currentCalibRangeInstance = new CalibRangeModal(controller, dependencies, doneCallback);
currentCalibRangeInstance = new CalibRangeModal(controller, doneCallback);
await currentCalibRangeInstance.open();
}

View File

@@ -2,6 +2,8 @@
import { draw_stick_position } from '../stick-renderer.js';
import { dec2hex32, float_to_str } from '../utils.js';
import { auto_calibrate_stick_centers } from './calib-center-modal.js';
import { calibrate_range } from './calib-range-modal.js';
const FINETUNE_INPUT_SUFFIXES = ["LL", "LT", "RL", "RT", "LR", "LB", "RR", "RB", "LX", "LY", "RX", "RY"];
const LEFT_AND_RIGHT = ['left', 'right'];
@@ -50,6 +52,7 @@ export class Finetune {
this.active_stick = null; // 'left', 'right', or null
this._centerStepSize = 5; // Default step size for center mode
this._circularityStepSize = 5; // Default step size for circularity mode
this.isQuickCalibrating = false; // Prevents dialog destruction during quick calibration
// Dependencies
this.controller = null;
@@ -147,12 +150,7 @@ export class Finetune {
const modal = new bootstrap.Modal(document.getElementById('finetuneModal'), {})
modal.show();
const maxValue = this.controller.getFinetuneMaxValue();
FINETUNE_INPUT_SUFFIXES.forEach((suffix, i) => {
$("#finetune" + suffix)
.attr('max', maxValue)
.val(data[i]);
});
this._initializeFinetuneInputs(data);
// Start in center mode
this.setMode('center');
@@ -287,6 +285,12 @@ export class Finetune {
_onModalHidden() {
console.log("Finetune modal hidden event triggered");
// Don't destroy the instance if quick calibration is in progress
if (this.isQuickCalibrating) {
console.log("Quick calibration in progress, preventing dialog destruction");
return;
}
// Reset circularity sliders to zero when modal closes
LEFT_AND_RIGHT.forEach(lOrR => {
$(`#${lOrR}CircularitySlider`).val(0);
@@ -331,6 +335,26 @@ export class Finetune {
}
}
/* Set the quick calibrating state to prevent dialog destruction
* @param {boolean} isCalibrating - Whether quick calibration is in progress
*/
setQuickCalibrating(isCalibrating) {
this.isQuickCalibrating = isCalibrating;
const finetuneModal = bootstrap.Modal.getInstance('#finetuneModal');
finetuneModal.toggle(!isCalibrating);
if(!isCalibrating) {
this.clearCircularity();
// Refresh the finetune data after calibration
this._readFinetuneData().then((data) => {
this._initializeFinetuneInputs(data);
this.refresh_finetune_sticks();
console.log('Finetune modal refreshed');
});
}
}
/**
* Save finetune changes
*/
@@ -406,6 +430,19 @@ export class Finetune {
}
}
/**
* Initialize finetune input fields with data and max values
* @param {Array} data - Array of finetune values
*/
_initializeFinetuneInputs(data) {
const maxValue = this.controller.getFinetuneMaxValue();
FINETUNE_INPUT_SUFFIXES.forEach((suffix, i) => {
$("#finetune" + suffix)
.attr('max', maxValue)
.val(data[i]);
});
}
/**
* Check if stick is in extreme position (close to edges)
* @param {Object} stick - Stick object with x and y properties
@@ -1240,5 +1277,28 @@ export function isFinetuneVisible() {
return !!currentFinetuneInstance;
}
// Quick calibrate functions
async function finetune_quick_calibrate_center() {
// Hide the finetune modal
currentFinetuneInstance.setQuickCalibrating(true);
const { controller } = currentFinetuneInstance;
await auto_calibrate_stick_centers(controller, (success, message) => {
currentFinetuneInstance.setQuickCalibrating(false);
});
}
async function finetune_quick_calibrate_range() {
// Hide the finetune modal
currentFinetuneInstance.setQuickCalibrating(true);
const { controller } = currentFinetuneInstance;
await calibrate_range(controller, (success, message) => {
currentFinetuneInstance.setQuickCalibrating(false);
});
}
window.finetune_cancel = finetune_cancel;
window.finetune_save = finetune_save;
window.finetune_quick_calibrate_center = finetune_quick_calibrate_center;
window.finetune_quick_calibrate_range = finetune_quick_calibrate_range;