![]() |
iCarDS или как это работает
В этой теме буду описывать какие команды понимает iCar и как они работают. А также некоторые хитрости при создании скина для iCarDS, которые позволяют реализовать казалось бы не реализуемые вещи.
Просьба здесь не писать, всё-равно удалю Обсуждаем и спрашиваем здесь http://www.pccar.ru/showthread.php?p=183057#post183057 |
Архитектура скина для iCarDS полностью соответствует архитектуре скина для RideRunner, поэтому на данном вопросе я останавливаться не буду. И на стандартных командах RideRunner на первом этапе тоже.
Подавляющее большинство команд RideRunner работает и в iCarDS, поэтому если кого будет интересовать работа конкретных команд, то спрашивайте здесь http://www.pccar.ru/showthread.php?t=14957, а я отвечу в этой теме Для начала остановимся что есть в iCarDS и нет или не было в ранних версиях RideRunner, так как некоторые новые команды появились и в iCarDS и в RideRunner |
skin.ini и команды для работы с ним и другими ini файлами
Как известно скин RR хранит все свои данные в файле skin.ini
Для работы с ним в RR есть командa SaveToSkin;переменная;значение Данная команда поддерживается iCar, но существуют дополнительные возможности для работы со skin.ini и другими ini файлами 1. В skin.ini можно включать другие ini файлы используя следующую команду в файле skin.ini #INC,путь к файлу Допустим у нас такой skin.ini Код:
#INC,$skinpath$myfile.ini 2. Для работы с другими ini файлами также добавлены следующие команды SaveVarToFile;<путь к файлу>;<переменная>;<значение> - сохраняет значение переменной в файл, например Код:
SaveVarToFile;$skinpath$myfile.ini;var1;5 SetVarFromFile;<путь к файлу>;<переменная>;<значение по умолчанию> - Читает значение переменной из ini файла, а если такой переменной в файле не найдено, то присваивает ей значение по умолчанию, например Код:
SetVarFromFile;$skinpath$myfile.ini;var1;1 |
Добавление команд в skin файлы
В RR для создания новых команд использовался файл ExecTBL.ini
Так же это работает и в iCar, но есть ещё одна возможность добавлять свои команды. Команды нужные в данном конкретном экране можно теперь создавать прямо в нем. Например, вставив такую строку в файл myskin1.skin, в любом месте между заголовком (три первые строки) и командой End Код:
........ также чтобы не писать длинные команды можно сделать так Код:
........ Теперь как это можно использовать. Во-первых это позволяет не замусоривать файл ExecTBL.ini командами нужными только в этом экране. Во-вторых это даёт большие возможности при необходимости выполнять скины динамически Например, в файле myskin2.skin Код:
........ и выполним такую команду Load;$MySkin$||ExecScript;Init , в результате загрузится скин myskin2.skin и выполниться его скрипт Init и переменная MySkinNum станет равна 2 теперь MySkin=myskin1.skin - SetVar;MySkin;myskin1.skin и выполним туже команду Load;$MySkin$||ExecScript;Init в результате загрузиться уже скин myskin1.skin и выполниться его скрипт Init и значение MySkinNum = 1 Данный пример упрощён, но именно благодаря ему в скине CFStyle реализована работа с шаблонами для встраивания программ. Ещё допустим можно использовать команды задаваемые в скине так: в каждом скине создаём скрипт CloseScreen, в каждом скине он будет выполнять свои действия необходимые для корректного закрытия экрана, то есть во всех скинах это может быть разный набор команд. А на горячую клавишу вешаем команду ExecScript;CloseScreen . В результате при нажатии горячей клавиши в любом из экранов будет выполнено именно то действие, которое заданно на закрытие именно в этом скине. Также есть особенные имена скриптов, на сегодняшний момент это OnScreenStart OnScreenEnd Которые выполняются при входе и при выходе из скина в котором они описаны. Данные команды очень удобны при необходимости вывести оверлайный экран над текущим. |
Popup и Overlay
Как известно любителям RR в нем есть два типа команд для загрузки скинов. Это команды Load и Menu.
В iCar кроме этих команд есть ещё команды Popup и Overlay. Команда Popup;myskin.skin;10 равносильна команде Menu;myskin.skin, но в отличие от скина загруженного командой Menu, скин загруженный командой Popup будет будет находиться на экране только время указанное во втором параметре, то есть 10 секунд. Команда Overlay;myskin.skin загружает скин myskin.skin по верх всех окон на экране. Скин будет на экране до тех пор пока не будет выполнена команда CloseOverlay. В данный момент на экране может быть только один скин типа overlay. Те части скина которые должны быть прозрачными следует рисовать розовым цветом (FF00FF). Для перемещения оверлайного скина по экрану есть команда OverlayMoveTo;X;Y , где X,Y координаты верхнего левого угла скина |
Очень нужная команда UnloadAllScreens
Очень часто возникает необходимость перерисовать картинку экрана, допустим сменить какую-нибудь картинку на экране. Для этого в RR существует команда ReloadScreen, которая перегружает текущий экран.
Но что делать если картинку надо сменить не на одном, а на нескольких экранах? Для решения этого вопроса и появилась команда UnloadAllScreens, которая выгружает из памяти все экраны и при повторном обращении к ним они будут заново перерисованы. Именно благодаря этой команде в скине CFStyle удалось сделать изменение данных в шапке скина в зависимости от текущего медиаисточника и использовать картинки(тег IMG) для отрисовки иконок на динамических кнопках вместо индикаторов (тег I), что значительно уменьшило нагрузку на процессор Кстати недавно такая команда появилась и в RR |
Таймеры или превратим скин в программу
Основное назначение скина это новый вид программы, а что делать если хочется постоянно выполнять какие либо действия вне зависимости от экрана в котором находишься в данный момент? Допустим проверять значение скорости и выдавать сообщение о превышении определённого значения. В RR это решалось написанием плагина. Но написать такой простой плагин значительно сложнее чем предлагаемый ниже способ.
В iCar существует возможность создавать независимые от экранов таймеры. Команда StartTimer;<Имя таймера>;<Интервал в милисекундах> - запускает таймер с именем <Имя таймера> Команда EndTimer;<Имя таймера> - останавливает данный таймер Каждый таймер с заданным интервалом вызывает событие On<Имя таймера>Timer То есть решить нашу проблему мы можем теперь таким способом: В ExecTBL.ini создаём такие команды Код:
/ запускаем таймер с именем Main и интервалом 1 секунда Таким образом в скине CFStyle реализованы звуковые предупреждения о начале движения, приветствия при включении программе, а также предупреждения по условиям. Кроме этого таймеры имеют ещё много вариантов применения. Вот так наш скин от простого отрисовывания экранов и обработки нажатий на кнопки, превратился в хоть и простейшую, но всё же программу. |
Слайдеры Label и Var
Что такое слайдеры я думаю объяснять не надо. В RR и iCar есть специальные слайдеры для отображения положения в списке воспроизведения, текущей позиции воспроизводимого трека, но что делать если хочется отобразить скорость автомобиля в виде слайдера?
Единственным способом решить эту проблему в RR это сделать флешку. iCar предоставляет другой способ решения этой проблемы. Для отображения скорости у нас имеется в распоряжении label GPSSPDN, а также вот такой слайдер Label;<имя label>;<минимум>;<максимум> , в результате вставив в наш скин такую строку мы получить отображение скорости ввиде слайдера в промежутке от 0 до 180 км/ч Код:
...... |
iCar и второй монитор
Для того чтобы iCar смог работать со вторым монитором рабочий стол в системе должен быть расширен на второй монитор.
Предположим что у нас два монитора. Первый 1024Х600 и на нем будет находиться iCar, и второй 800х480 и на него надо выводить встроенные в iCar программы. рассмотрим простой вариант когда программу надо сразу запустить на втором мониторе Создаём скин в котором для области A и C задаём второй монитор, его координаты в данном случае будут: левый угол 1024,0 и размер экрана 800х480 Код:
... Но обычно второй монитор расположен в таком месте, что управлять размещённой на нём программой фактически невозможно. Поэтому теперь рассмотрим как перемещать программу с одного монитора на другой нажатием одной кнопки Создаём скин с таким кодом Код:
... monitor1.txt Код:
... Код:
... Так что всё предельно просто, но правильно это будет работать только с новой версий программы, в текущей версии при переходе на другой экран окно встроенной программы на втором мониторе будет закрыто, а в новой останется на втором мониторе |
if и while
Очень часто возникает ситуация выполнения каких либо действий по условию. RR предлагал для этого такие команды как Eval и ByVar, которые позволяли делать необходимые проверки и выполнять нужную команду по результату проверки.
Эти команды также поддерживаются в iCar, но в связи с тем, что скин для iCar всё больше обретает очертания программы, то в него добавлены ещё такие команды как IF и WHILE Команда IF позволяет проверить какое либо условие и выполнить команду в зависимости от результата сравнения. Допустим у нас есть переменная MyVar и надо выполнить нужную команду в зависимости от того больше её значение 10 или нет Код:
If;>($MyVar$;10);TrueCommand;FalseCommand С недавних пор в RR тоже появилась подобная команда. Команда WHILE на сегодняшний момент доступна только в iCar, её цель организация цикла, допустим такая комбинация команд позволит выполнить цикл девять раз пока значение i меньше 10 Код:
"StartCycle","SetVar;i;1||While;<($i$;10);CycleCommand" |
Часовой пояс GMT +4, время: 05:37. |
Работает на vBulletin® версия 3.8.4.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot