Скрипт¶
Режим "Скрипт" позволяет задать произвольный алгоритм для расчёта требуемой скорости вентиляторов видеокарты. Каждую секунду в скрипт1 будет передаваться информация о текущем состоянии видеокарты, в т.ч. её температура. На основе этой информации скрипт может принять одно из следующих решений:
Задать требуемую скорость вентиляторов.
Дать видеокарте определить нужную скорость вентиляторов.
Примечание
Реальная скорость вентиляторов может не совпадать точно с тем, что задано на графике. Это зависит от видеокарты. Например, если видеокарта не поддерживает слишком низкие скорости вентиляторов, то при установке скорости вентиляторов в 5%, реальная скорость может быть равна 30%.
Алгоритм описывается с помощью языка ECMAScript 62.
В тексте программы должна быть главная функция, которая будет вызываться каждую секунду. Ссылка на эту функцию должна идти последним выполняемым оператором скрипта. Это можно сделать двумя способами:
Реализовать главную функцию как стрелочную функцию3 и поставить её в конец скрипта.
<код до главной функции>
()=>{
<код главной функции>
}
// конец скрипта
Прописать идентификатор функции последним оператором скрипта.
function f1(){
<код первой функции>
}
function f2(){
<код второй функции>
}
// выбор главной функции в зависимости от категории плагина
$.dev.plugin.category == 'nvidia' ? f1 : f2
// конец скрипта
Главная функция будет выполняться, только если скрипт запущен. Ниже приведён пример скрипта, который устанавливает скорость вентиляторов, если температура поднялась выше 60°C, а если температура ниже 60°C, то скрипт отдаёт управление вентиляторами видеокарте.
// При первом запуске скрипта, будет выполнен код,
// который находится вне главной функции.
// Здесь можно произвести инициализацию переменных
// и определить дополнительные функции.
var tempThreshold = 60
function getTimestamp()
{
return Math.round(Date.now() / 1000)
}
// Далее идёт главная функция, которая будет вызываться каждую секунду.
()=>{
var secsPassed = getTimestamp() - tsStart
if(secsPassed && secsPassed % 10 == 0)
console.log('Скрипт работает в течение '+secsPassed+' секунд')
// $.dev.curTemp - текущая температура видеокарты
if($.dev.curTemp > tempThreshold)
return $.dev.curTemp / 2 // установить скорость вентиляторов
else
return $.dev.FAN_SPEED_GPU // дать видеокарте определить скорость
}
Перед написанием скрипта рекомендуется ознакомится со следующей информацией:
Встроенные объекты ECMAScript, доступные для использования: https://doc.qt.io/qt-5.12/ecmascript.html.
Описание интерфейса окна режима "Скрипт"¶
- Редактор кода
Редактор кода с минимальным функционалом и подсветкой синтаксиса. Помимо редактирования текста позволяет выполнять следующие действия:
"CTRL + колёсико мыши" регулирует размер текста.
Клавиша Tab может передвигать блоки текста вправо, если предварительно выделить нужный блок.
Shift+Tab может передвигать блоки текста влево, если предварительно выделить нужный блок.
Важно помнить, что текст, отображаемый в редакторе, может не соответствовать тексту текущего выполняемого скрипта. Изменение текста в редакторе не будет влиять на уже запущенный скрипт. Чтобы запустить скрипт с новым текстом, необходимо нажать кнопку "Применить и перезапустить".
- Состояние скрипта
Может содержать несколько значений, отделённых запятой. Возможные значения:
запущен - скрипт запущен, и текст, который отображается в редакторе, соответствует тексту запущенного скрипта.
запущен старый скрипт - скрипт запущен, но текст, который отображается в редакторе, был изменён с момента запуска скрипта и больше не соответствует тексту запущенного скрипта.
на паузе - скрипт был инициализирован, но временно не выполняется. Как правило, это связано с тем, что скрипт находится в режиме "Переопределение".
на паузе старый скрипт - то же самое, что предыдущий пункт, но текст, который отображается в редакторе, был изменён с момента запуска скрипта и больше не соответствует тексту инициализированного скрипта.
остановлен - скрипт не активен и не будет выполняться.
не сохранён - текущий текст, который отображается в редакторе, не был сохранён на диск и будет утерян при перезапуске программы.
- Переопределение
Если включён данный переключатель, то скрипт будет работать, только когда включены другие режимы (кроме режима "Под управлением GPU"). При этом каждую секунду будет выполняться внутренний алгоритм выбранного режима, а затем будет выполняться скрипт, чтобы иметь возможность модифицировать желаемую скорость вентиляторов, которую установил режим.
Например, если установить галку "Переопределение", запустить скрипт и включить режим "Кривая", то каждую секунду будет происходить следующее:
На основе точек кривой и гистерезиса рассчитывается требуемая скорость вентиляторов
Эта скорость сохраняется в переменной $.dev.targetFanSpeed.
Вызывается главная функция скрипта. Она может вернуть либо другое желаемое значение скорости вентиляторов, либо $.dev.targetFanSpeed (или $.dev.FAN_SPEED_NO_CHANGE), если требуется установить ту скорость, которую выбрал текущий режим программы.
То, что вернула главная функция скрипта, принимается за конечное значение скорости вентиляторов, которое требуется установить для видеокарты. Естественно, скрипт может также вернуть $.dev.FAN_SPEED_GPU, чтобы видеокарта сама решила, какая скорость нужна.
При включённом "Переопределении" скрипт не может работать, когда включён режим "Скрипт". Поэтому в данном случае, он будет поставлен на паузу. Если "Переопределение" не включено, то скрипт будет работать только при выбранном режиме "Скрипт", а иначе - будет поставлен на паузу. Скрипт также будет поставлен на паузу, если будет выбран режим "Под управлением GPU". Естественно, скрипт будет поставлен на паузу, только если он был предварительно запущен.
- Применить и перезапустить
Перезапускает скрипт с новым текстом, взятым из редактора. После этого скрипт будет выполняться каждую секунду (с учётом режима "Переопределение"). При этом последовательность будет следующей:
Если скрипт был запущен или стоял на паузе, то он будет остановлен.
Текст, который прописан в редакторе кода, будет использоваться в качестве текста нового скрипта.
Скрипт инициализируется (выполняется). При этом, скрипт должен задать главную функцию.
Если установлен переключатель "Переопределение", то скрипт будет поставлен на паузу, а иначе - переведён в состояние "запущен".
- Остановить
Останавливает скрипт.
Примечания
- 1
Статья "Скрипт" ("Сценарный язык") в Википедии: https://ru.wikipedia.org/wiki/Скрипт.
- 2
Статья "ECMAScript" в Википедии: https://ru.wikipedia.org/wiki/ECMAScript.
- 3
Статья "Стрелочные функции" в MDN: https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Functions/Arrow_functions.