Загрузка данных
const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));
async function forceSelectReact(element, value) {
if (!element) return;
for (let i = 0; i < element.options.length; i++) {
if (element.options[i].value === value) {
element.selectedIndex = i;
element.options[i].selected = true;
} else {
element.options[i].selected = false;
}
}
const nativeSetter = Object.getOwnPropertyDescriptor(window.HTMLSelectElement.prototype, "value")?.set;
if (nativeSetter) {
nativeSetter.call(element, value);
} else {
element.value = value;
}
if (element._valueTracker) {
element._valueTracker.setValue('');
}
element.dispatchEvent(new Event('focus', { bubbles: true }));
element.dispatchEvent(new MouseEvent('mousedown', { bubbles: true }));
element.dispatchEvent(new Event('input', { bubbles: true }));
element.dispatchEvent(new Event('change', { bubbles: true }));
element.dispatchEvent(new Event('blur', { bubbles: true }));
await sleep(50);
}
async function setReactSlider(hiddenInputName, targetValue) {
const hiddenInput = document.querySelector(`input[name="${hiddenInputName}"][type="hidden"]`);
if (!hiddenInput) return;
const sliderContainer = hiddenInput.closest('.input-wrapper');
if (!sliderContainer) return;
const track = sliderContainer.querySelector('.input-range__track--background');
const handle = sliderContainer.querySelector('.input-range__slider');
if (!track || !handle) return;
const min = parseFloat(handle.getAttribute('aria-valuemin'));
const max = parseFloat(handle.getAttribute('aria-valuemax'));
let val = parseFloat(targetValue);
if (val < min) val = min;
if (val > max) val = max;
const percentage = (val - min) / (max - min);
const rect = track.getBoundingClientRect();
let clickX = rect.left + (rect.width * percentage);
const clickY = rect.top + (rect.height / 2);
if (percentage === 0) clickX += 1;
if (percentage === 1) clickX -= 1;
const mousedown = new MouseEvent('mousedown', { bubbles: true, cancelable: true, view: window, clientX: clickX, clientY: clickY });
const mouseup = new MouseEvent('mouseup', { bubbles: true, cancelable: true, view: window, clientX: clickX, clientY: clickY });
track.dispatchEvent(mousedown);
track.dispatchEvent(mouseup);
await sleep(100);
}
async function applyMyDefaults() {
console.log("ESC Auto: Применяю дефолтные настройки...");
const myBtn = document.getElementById('my-custom-default-btn');
if (myBtn) {
myBtn.disabled = true;
myBtn.innerText = 'Применяю настройки...';
}
// 1. НАПРАВЛЕНИЯ ВРАЩЕНИЯ
const targetDirections = ["1", "2", "2", "1"];
for (let i = 0; i < targetDirections.length; i++) {
const currentMotorSelects = document.querySelectorAll('select[name="MOTOR_DIRECTION"]');
if (currentMotorSelects[i]) {
await forceSelectReact(currentMotorSelects[i], targetDirections[i]);
await sleep(250);
}
}
// 2. ВЫПАДАЮЩИЕ СПИСКИ ОБЩИХ ПАРАМЕТРОВ
const selectsMap = {
'COMMUTATION_TIMING': '3',
'DEMAG_COMPENSATION': '2',
'RPM_POWER_SLOPE': '9',
'BEACON_DELAY': '5',
'POWER_RATING': '2',
'TEMPERATURE_PROTECTION': '0'
};
for (const [name, val] of Object.entries(selectsMap)) {
const el = document.querySelector(`select[name="${name}"]`);
await forceSelectReact(el, val);
}
// 3. ЧЕКБОКСЫ
const checkboxMap = {
'FORCE_EDT_ARM': false,
'BRAKE_ON_STOP': false
};
for (const [name, targetState] of Object.entries(checkboxMap)) {
const el = document.querySelector(`input[name="${name}"][type="checkbox"]`);
if (el && el.checked !== targetState) {
el.click();
await sleep(50);
}
}
// 4. ПОЛЗУНКИ
const slidersMap = {
'STARTUP_POWER_MIN': '1030',
'STARTUP_POWER_MAX': '1056',
'BEEP_STRENGTH': '0',
'BEACON_STRENGTH': '0',
'BRAKING_STRENGTH': '100'
};
for (const [name, val] of Object.entries(slidersMap)) {
await setReactSlider(name, val);
}
// =========================================================
// НОВЫЙ БЛОК: АВТОМАТИЧЕСКОЕ НАЖАТИЕ "ПРИМЕНИТЬ НАСТРОЙКИ"
// =========================================================
console.log("ESC Auto: Все параметры выставлены. Сохраняем...");
await sleep(500); // Даем 0.5 сек, чтобы интерфейс точно был готов к записи
// Ищем все кнопки на странице
const allButtons = document.querySelectorAll('button');
let writeBtn = null;
// Ищем кнопку по тексту
for (let btn of allButtons) {
if (btn.innerText.trim() === 'Применить настройки' || btn.innerText.trim() === 'Write Settings') {
writeBtn = btn;
break;
}
}
if (writeBtn && !writeBtn.disabled) {
console.log("ESC Auto: Нажимаю кнопку сохранения!");
writeBtn.click(); // Физически нажимаем на кнопку сайта
if (myBtn) {
myBtn.style.backgroundColor = '#38a169'; // Зеленый цвет успеха
myBtn.innerText = 'Прошивка запущена!';
}
} else {
console.log("ESC Auto: Кнопка сохранения не найдена или заблокирована!");
if (myBtn) {
myBtn.style.backgroundColor = '#e53e3e'; // Красный цвет ошибки
myBtn.innerText = 'Ошибка сохранения';
}
}
// Восстанавливаем нашу кнопку через 2 секунды, чтобы она снова стала активной
setTimeout(() => {
if (myBtn) {
myBtn.style.backgroundColor = '#2b6cb0'; // Возвращаем синий цвет
myBtn.innerText = 'Применить мой шаблон';
myBtn.disabled = false;
}
}, 2000);
}
function injectCustomButton() {
const buttonBar = document.querySelector('.buttons-right');
if (buttonBar && !document.getElementById('my-custom-default-btn')) {
const btnContainer = document.createElement('div');
btnContainer.className = 'generic-button';
const myBtn = document.createElement('button');
myBtn.type = 'button';
myBtn.id = 'my-custom-default-btn';
myBtn.innerText = 'Применить мой шаблон';
myBtn.style.backgroundColor = '#2b6cb0';
myBtn.style.color = '#ffffff';
myBtn.style.fontWeight = 'bold';
myBtn.style.transition = 'all 0.3s ease';
myBtn.addEventListener('click', applyMyDefaults);
btnContainer.appendChild(myBtn);
buttonBar.insertBefore(btnContainer, buttonBar.firstChild);
}
}
setInterval(injectCustomButton, 1000);