PCCar.ru - Ваш автомобильный компьютер

PCCar.ru - Ваш автомобильный компьютер (http://pccar.ru/index.php)
-   АвтоЗвук (http://pccar.ru/forumdisplay.php?f=16)
-   -   сборка/тема foobar 2000 для CarPС (http://pccar.ru/showthread.php?t=19671)

duzzy 18.05.2018 23:48

Скрипт для отправки команд из Икара в фубар для МПС :wink2:

Для функционирования скрипта необходима библиотека автоит AutoItX3.dll(в корне папки сборки в папке "assemblies" и еще манифест AutoItX3.dll.manifest, в свежей сборке FLAT есть все что нужно).
И плагин foo_ui_hacks.

Пример кнопки для Икара:

B,5,120,250,113,"SETVAR;SENDFB2K;nexttrack",

SENDFB2K --- переменная которую объявляем в икаре и читаем в js скрипте фубара
nexttrack --- команда которую прочитает фубар при например нажатии кнопки

Работает так, запускаем фубар из икара, скрипт в фубаре начинает работать, опрашивать переменную икара "SENDFB2K", как только из икара переменной присвоено какое то значение и если оно совпадает со значением в переключателе выполняется то что было прописано под этим значением, при выполнении переменная икара обнуляется.

Команды прописанные в переключателе(nexttrack, prevtrack, playorpause... и т.д.)прописаны как пример, можно прописывать что угодно, не забывая повесть команду на кнопку в икаре.
PHP код:

//--- send commands to fb2k(iCarDS<->fb2k)
var autoit_obj = new ActiveXObject("AutoItX3.Control");
var 
rr undefined;
var 
rr_getinfo_timer false;
var 
rr_obj_check_timer false;
var 
rr_obj_check_timer_value 5000//--- таймаут проверки икара в мс, работает он или нет
var rr_getinfo_timer_value 500//--- таймаут опроса икара в мс

rr_check();

//--- ниже в rr_get_info() задаем свои команды которые будем отправлять из икара
//--- case ' тут пишем команду ':
//--- тут что то делаем при получении команды
//--- break;
function rr_get_info() {
    try { 
//--- обработчик ошибок зацикленной схемой проверки на работающий икар
        
rr_get_ret rr.getinfo("=$SENDFB2K$");
    } catch (
e) {
        
rr_get_ret '0';
        
tt('>>> iCarDS GetInfo "SENDFB2K" Error...');
        
rr_getinfo_timer false && rr_getinfo_timer.Dispose();
        
rr undefined;
        
rr_obj_check_timer window.CreateTimerInterval(rr_obj_check_timer_value);
    };
    switch (
rr_get_ret) {
    
//switch (rr.getinfo("=$SENDFB2K$")) { //--- вариант без обработчика ошибок
    
case 'nexttrack':
        
rr.execute("SETVAR;SENDFB2K;0");
        
fb.Next();
        break;
    case 
'prevtrack':
        
rr.execute("SETVAR;SENDFB2K;0");
        
fb.Prev();
        break;
    case 
'playorpause':
        
rr.execute("SETVAR;SENDFB2K;0");
        
fb.PlayOrPause();
        break;
    case 
'shuffle':
        
rr.execute("SETVAR;SENDFB2K;0");
        
fb.PlaybackOrder 4;
        break;
    case 
'default':
        
rr.execute("SETVAR;SENDFB2K;0");
        
fb.PlaybackOrder 0;
        break;
    case 
'random':
        
rr.execute("SETVAR;SENDFB2K;0");
        
fb.PlaybackOrder 3;
        break;
    case 
'test'//вместо "test" прописываем нужное значение/команду идущую из икара
        
rr.execute("SETVAR;SENDFB2K;0"); //обнуляем принятое значение или отправляем что то в икар
        // тут делаем что то
        
break;
    case 
'':
        
rr.execute("SETVAR;SENDFB2K;0");
        
// тут делаем что то
        
break;
    case 
'':
        
rr.execute("SETVAR;SENDFB2K;0");
        
// тут делаем что то
        
break;
    case 
'':
        
rr.execute("SETVAR;SENDFB2K;0");
        
// тут делаем что то
        
break;
    case 
'':
        
rr.execute("SETVAR;SENDFB2K;0");
        
// тут делаем что то
        
break;
    case 
'':
        
rr.execute("SETVAR;SENDFB2K;0");
        
// тут делаем что то
        
break;
    case 
'':
        
rr.execute("SETVAR;SENDFB2K;0");
        
// тут делаем что то
        
break;
    case 
'':
        
rr.execute("SETVAR;SENDFB2K;0");
        
// тут делаем что то
        
break;
    case 
'':
        
rr.execute("SETVAR;SENDFB2K;0");
        
// тут делаем что то
        
break;
    case 
'':
        
rr.execute("SETVAR;SENDFB2K;0");
        
// тут делаем что то
        
break;
    case 
'':
        
rr.execute("SETVAR;SENDFB2K;0");
        
// тут делаем что то
        
break;
    };
};
//----------------------------------------------------------- rr get info end
function rr_check() {
    if (
icar_check()) {
        
rr_obj_check_timer false && rr_obj_check_timer.Dispose();
        
rr = new ActiveXObject("RideRunner.sdk");
        
is_rr_on true;
    } else {
        
is_rr_on false;
        
rr undefined;
        
rr_obj_check_timer window.CreateTimerInterval(rr_obj_check_timer_value);
    };
    
is_rr_on rr_getinfo_timer window.CreateTimerInterval(rr_getinfo_timer_value) : rr_getinfo_timer false && rr_getinfo_timer.Dispose();
};

function 
icar_check() {
    var 
ret_check "";
    
ret_check autoit_obj.ProcessExists("iCarDS.exe");
    if (
ret_check == 0) {
        
tt('>>> iCarDS not running...');
        return 
false;
    } else {
        return 
true;
    };
};

function 
on_timer(id) {
    if (
rr_getinfo_timer && id == rr_getinfo_timer.ID) {
        
rr_get_info();
    };
    if (
rr_obj_check_timer && id == rr_obj_check_timer.ID) {
        
rr_check();
    };
};

function 
tt(t) {
    
fb.trace(t);
}; 

- Поправил немного скрипт, добавил цикличный обработчик ошибок, т.е. теперь скрипт падать не будет, а будет ждать пока появится икар.

Видео по работе снимать не стал, разобраться не сложно... но если нужно сниму

Теперь не обязательно использовать фубар с командной строкой, команды приходящие из икара обрабатываются почти сразу фубаром, да и использовать так проще и выбор того что можно делать больше :spiteful:

seriousstas 19.05.2018 14:29

Слава - хорошая альтернатива!
НО!
Цитата:

Теперь не обязательно использовать фубар с командной строкой
Давай вместо видео - живой пример)
Я пока так делаю - при помощи :
C:\XXX\YYY\Documents\iCarDS\skins\Chameleon\Script s\SendKey.exe
(один из вариантов использования) :
1. При запуске скрипта есть контроль раскладки (всегда английская! для отправки анг буквенных символов)
2. Скажем - отправляю повороты колеса (+2) над стрелочниками:
Код:

B,770,518,126,80,"RUNW;$SKINPATH$\Scripts\sendkey.exe|"[CLASS:{E7076D1C-A7BF-4f39-B771-BCBE88F2A2A8}]" "Analog VU Meter" "" "+2"
,
как это сделать через AutoItX3.dll?
Цитата:

500
- это опрос в цикле ..
Когда отправляем разово - цикла ведь нет ?
Ну скажем :
RUN;$foobar_exe$|/command:"repeat (track)" - стучим и получаем мгновенно ответ , а не через пол секунды - разве нет ?
Так-же и через sendkey - запуск > ответ.
Я просто пока не вижу преимуществ :dntknw:

duzzy 19.05.2018 17:54

seriousstas

Цитата:

Давай вместо видео - живой пример)
Хорошо ))
Цитата:

При запуске скрипта есть контроль раскладки (всегда английская! для отправки анг буквенных символов)
Вот тут не понял для чего это и зачем.

Цитата:

Скажем - отправляю повороты колеса (+2) над стрелочниками
Стрелочниками не пользуюсь, но по сути должно работать, либо можно просто запустить скрипт при отправке команды который выполнит поворот колеса мыши.

Пример:
autoit_obj.ControlFocus(foobar_class, "", pl_class);
autoit_obj.ControlSend(foobar_class, "", pl_class, "{F3}");

Цитата:

- это опрос в цикле ..
Когда отправляем разово - цикла ведь нет ?
...
Я просто пока не вижу преимуществ
Это легко сравнить просто попробовав :)
Да это опрос в цикле одной переменной которая принимает разные значения.

Да когда отправляем разово цикла нет, НО при этом нужно:
1.выполнить команду
2.запустить ехе-шник(а это как правило скрипт автоит, который обрабатывается при его старте)
а это тоже время и ресурсы.

Ты также запускаешь копию фубара с командой и на это так же тратится время, так как запускается еще одна копия которая отрабатывает ком строку.

Время цикла можно уменьшить и до 300 или 100 мс, это опрос всего лишь одной переменной в икаре, на производительность это почти не влияет.
Могу даже больше сказать, многие варианты обработчиков работают так, только опросчик работает в другом потоке с очень короткой задержкой, это самый простой вариант опроса не используя сложные методы.
По такому же принципу собрал себе плагин для пот-плеера(он кривой косой но работает) :smile2:
Единственное отличие этого опросчика в JS что он работает в главном потоке.

В этой схеме удобство еще в одном, тебе не нужно писать скрипты в икаре, нужно лишь отправить одну команду для приема фубаром т.е. js-ом а он ее уже обработает как необходимо. Это универсальная схема которая позволяет делать ну почти все в сборке... например: показывать/прятать панели, работать с плейлистами, менять порядок проигрывания, громкость, переключать ДСП, включать опции в панелях, запускать собственные кастомные функции... и т.д. т.е можно использовать почти все возможности js.
А ком строка фубара это может ?... я очень сильно сомневаюсь
Видос я запишу чуть позже будет просто более наглядно как оно работает.

Это не замена всего что можно, это просто еще один вариант использования js :smile2:

seriousstas 19.05.2018 18:06

Цитата:

либо можно просто запустить скрипт при отправке команды который выполнит поворот колеса мыши.
Ну это перебор ))

Этот скрипт , что выше - отдельный или вставляется скажем в MPS ?

Цитата:

При запуске скрипта есть контроль раскладки (всегда английская! для отправки анг буквенных символов)
Вот тут не понял для чего это и зачем.
Если отправляю скажем букву Q или комбинацию например CTRL+Q - то не работает при вкл русской раскладке (скрипт задает принудительно Eng) ..

seriousstas 19.05.2018 18:24

Цитата:

запустить ехе-шник(а это как правило скрипт автоит, который обрабатывается при его старте)
Кстати сравниваю в виртуалке под 7-X86
Запуски AutoHotkey и Autoit
Получаю мгновенный запуск AutoHotkey-я и думающий где-то 300-500мс Autoit :ohmy2:

duzzy 19.05.2018 18:33

seriousstas
Это как вариант, разнообразного использования

Цитата:

Этот скрипт , что выше - отдельный или вставляется скажем в MPS ?
Это самостоятельный скрипт, но может быть использован и в основном мпс скрипте.
Только нужно добавить в on_timer()
if (rr_getinfo_timer && id == rr_getinfo_timer.ID) {...}
if (rr_obj_check_timer && id == rr_obj_check_timer.ID) {...}
и проверить переменные чтоб не совпадали.

Можно и отдельную панель сунуть просто ее спрятав :)

Цитата:

Если отправляю скажем букву Q или комбинацию например CTRL+Q
Ааа теперь понял для чего... Спасибо не знал что есть такая засада .

duzzy 19.05.2018 18:39

Цитата:

Сообщение от seriousstas (Сообщение 402255)
Кстати сравниваю в виртуалке под 7-X86
Запуски AutoHotkey и Autoit
Получаю мгновенный запуск AutoHotkey-я и думающий где-то 300-500мс Autoit :ohmy2:

Вот о чем я говорил, автохоткей вроде не так пакуется а автоит можно жестко упаковать и старт будет еще дольше.
Не помню точно схему но суть в том что при запуске сначала распаковывается скрипт затем он попадает в обработчик ну и мы видим запуск. По сути как js построчное чтение и выполнение кода.

seriousstas 19.05.2018 18:43

Цитата:

Сообщение от duzzy (Сообщение 402257)
Вот о чем я говорил, автохоткей вроде не так пакуется а автоит можно жестко упаковать и старт будет еще дольше.
Не помню точно схему но суть в том что при запуске сначала распаковывается скрипт затем он попадает в обработчик ну и мы видим запуск. По сути как js построчное чтение и выполнение кода.

Если компилировать по ПКМ - то сжатия почти нет ..
Понял, что сжатие - не влияет ..
Тут да - разные методы походу.. Но уже в 8.1-ке и 10ке любые скрипты работают быстро..

duzzy 19.05.2018 19:01

Цитата:

Сообщение от seriousstas (Сообщение 402258)
Если комтилировать по ПКМ - то сжатия почти нет ..
Понял, что сжатие - не влияет ..
Тут да - разные методы походу.. Но уже в 8.1-ке и 10ке любые скрипты работают быстро..

Сжатие влияет, это так же как и с архивами, сожми сильно и распаковывать будешь дольше, сожми меньше и распакуешь быстро, просто это не так видно из за быстроты обработки.
Скорее всего да разные методы, а виртуалка позволяет увидеть многое что невидно на живой системе.

Сейчас видос отсниму по обработчику js глянешь как это хозяйство работает :wink2:
У меня эта идея давно в моем воспаленном мозге роилась, но использование сборки с интерфейсом мне более по душе.

seriousstas 19.05.2018 19:07

Цитата:

но использование сборки с интерфейсом мне более по душе.
Икаровские кнопки оч удобны для 6-7-8 дюймовок .. Мне нравится и размер и отклик..
Это словами сложно пояснить))


Часовой пояс GMT +4, время: 04:28.

Работает на vBulletin® версия 3.8.4.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot