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

Вернуться   PCCar.ru - Ваш автомобильный компьютер > MP3Car ТехИнфа > Разработка программ > Программы управления > iCarDS

Ответ
 
Опции темы Поиск в этой теме
Старый 04.05.2011, 15:23   #1
Bersenev
Бывалый писикарщик
 
Аватар для Bersenev
 
Регистрация: 23.04.2009
Возраст: 53
Город: Ставрополь
Регион: 26
Машина: Opel Zafira 2007
Сообщений: 5,275
Bersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant future
По умолчанию iCarDS или как это работает

В этой теме буду описывать какие команды понимает iCar и как они работают. А также некоторые хитрости при создании скина для iCarDS, которые позволяют реализовать казалось бы не реализуемые вещи.

Просьба здесь не писать, всё-равно удалю

Обсуждаем и спрашиваем здесь http://www.pccar.ru/showthread.php?p=183057#post183057
Bersenev вне форума   Ответить с цитированием
Старый 04.05.2011, 15:57   #2
Bersenev
Бывалый писикарщик
 
Аватар для Bersenev
 
Регистрация: 23.04.2009
Возраст: 53
Город: Ставрополь
Регион: 26
Машина: Opel Zafira 2007
Сообщений: 5,275
Bersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant future
По умолчанию

Архитектура скина для iCarDS полностью соответствует архитектуре скина для RideRunner, поэтому на данном вопросе я останавливаться не буду. И на стандартных командах RideRunner на первом этапе тоже.

Подавляющее большинство команд RideRunner работает и в iCarDS, поэтому если кого будет интересовать работа конкретных команд, то спрашивайте здесь http://www.pccar.ru/showthread.php?t=14957, а я отвечу в этой теме

Для начала остановимся что есть в iCarDS и нет или не было в ранних версиях RideRunner, так как некоторые новые команды появились и в iCarDS и в RideRunner
Bersenev вне форума   Ответить с цитированием
Старый 04.05.2011, 16:25   #3
Bersenev
Бывалый писикарщик
 
Аватар для Bersenev
 
Регистрация: 23.04.2009
Возраст: 53
Город: Ставрополь
Регион: 26
Машина: Opel Zafira 2007
Сообщений: 5,275
Bersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant future
По умолчанию 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
var1=1
var2=2
.......
В результате содержимое файла myfile.ini из папки скина будет подключено к skin.ini при загрузке скина

2. Для работы с другими ini файлами также добавлены следующие команды

SaveVarToFile;<путь к файлу>;<переменная>;<значение> - сохраняет значение переменной в файл, например

Код:
SaveVarToFile;$skinpath$myfile.ini;var1;5
добавит в файл myfile.ini строку var1=5

SetVarFromFile;<путь к файлу>;<переменная>;<значение по умолчанию> - Читает значение переменной из ini файла, а если такой переменной в файле не найдено, то присваивает ей значение по умолчанию, например

Код:
SetVarFromFile;$skinpath$myfile.ini;var1;1
создаст в скине переменную var1 и присвоит её значение из файла myfile.ini, а если такая переменная там не будет найдена, то её будет присвоено значение 1
Bersenev вне форума   Ответить с цитированием
Старый 04.05.2011, 17:38   #4
Bersenev
Бывалый писикарщик
 
Аватар для Bersenev
 
Регистрация: 23.04.2009
Возраст: 53
Город: Ставрополь
Регион: 26
Машина: Opel Zafira 2007
Сообщений: 5,275
Bersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant future
По умолчанию Добавление команд в skin файлы

В RR для создания новых команд использовался файл ExecTBL.ini
Так же это работает и в iCar, но есть ещё одна возможность добавлять свои команды.

Команды нужные в данном конкретном экране можно теперь создавать прямо в нем.

Например, вставив такую строку в файл myskin1.skin, в любом месте между заголовком (три первые строки) и командой End

Код:
........
Script,Init,SetVar;MySkinNum;1
........
Мы можем при нахождении в экране myskin1.skin выполнить данную команду ExecScript;Init

также чтобы не писать длинные команды можно сделать так

Код:
........
Script,Init,SetVar;MySkinNum1;1
Script,Init,SetVar;MySkinNum2;2
Script,Init,SetVar;MySkinNum3;3
 ........
в результате при выполнении команды ExecScript;Init будут выполнены последовательно все три команды

Теперь как это можно использовать. Во-первых это позволяет не замусоривать файл ExecTBL.ini командами нужными только в этом экране. Во-вторых это даёт большие возможности при необходимости выполнять скины динамически

Например, в файле myskin2.skin

Код:
........
Script,Init,SetVar;MySkinNum;2
........
зададим переменную MySkin=myskin2.skin - SetVar;MySkin;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

Которые выполняются при входе и при выходе из скина в котором они описаны. Данные команды очень удобны при необходимости вывести оверлайный экран над текущим.

Последний раз редактировалось Bersenev; 05.05.2011 в 08:41.
Bersenev вне форума   Ответить с цитированием
Старый 04.05.2011, 19:21   #5
Bersenev
Бывалый писикарщик
 
Аватар для Bersenev
 
Регистрация: 23.04.2009
Возраст: 53
Город: Ставрополь
Регион: 26
Машина: Opel Zafira 2007
Сообщений: 5,275
Bersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant future
По умолчанию 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 координаты верхнего левого угла скина

Последний раз редактировалось Bersenev; 04.05.2011 в 21:45.
Bersenev вне форума   Ответить с цитированием
Старый 04.05.2011, 20:40   #6
Bersenev
Бывалый писикарщик
 
Аватар для Bersenev
 
Регистрация: 23.04.2009
Возраст: 53
Город: Ставрополь
Регион: 26
Машина: Opel Zafira 2007
Сообщений: 5,275
Bersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant future
По умолчанию Очень нужная команда UnloadAllScreens

Очень часто возникает необходимость перерисовать картинку экрана, допустим сменить какую-нибудь картинку на экране. Для этого в RR существует команда ReloadScreen, которая перегружает текущий экран.

Но что делать если картинку надо сменить не на одном, а на нескольких экранах?

Для решения этого вопроса и появилась команда UnloadAllScreens, которая выгружает из памяти все экраны и при повторном обращении к ним они будут заново перерисованы.

Именно благодаря этой команде в скине CFStyle удалось сделать изменение данных в шапке скина в зависимости от текущего медиаисточника и использовать картинки(тег IMG) для отрисовки иконок на динамических кнопках вместо индикаторов (тег I), что значительно уменьшило нагрузку на процессор

Кстати недавно такая команда появилась и в RR

Последний раз редактировалось Bersenev; 04.05.2011 в 21:44.
Bersenev вне форума   Ответить с цитированием
Старый 04.05.2011, 20:42   #7
Bersenev
Бывалый писикарщик
 
Аватар для Bersenev
 
Регистрация: 23.04.2009
Возраст: 53
Город: Ставрополь
Регион: 26
Машина: Opel Zafira 2007
Сообщений: 5,275
Bersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant future
По умолчанию Таймеры или превратим скин в программу

Основное назначение скина это новый вид программы, а что делать если хочется постоянно выполнять какие либо действия вне зависимости от экрана в котором находишься в данный момент? Допустим проверять значение скорости и выдавать сообщение о превышении определённого значения. В RR это решалось написанием плагина. Но написать такой простой плагин значительно сложнее чем предлагаемый ниже способ.

В iCar существует возможность создавать независимые от экранов таймеры.

Команда StartTimer;<Имя таймера>;<Интервал в милисекундах> - запускает таймер с именем <Имя таймера>

Команда EndTimer;<Имя таймера> - останавливает данный таймер

Каждый таймер с заданным интервалом вызывает событие On<Имя таймера>Timer

То есть решить нашу проблему мы можем теперь таким способом:

В ExecTBL.ini создаём такие команды
Код:
/ запускаем таймер с именем Main  и интервалом 1 секунда
"ONSKINSTART","StartTimer;Main;1000"
/ Проверяем скорость на значение больше 60, и выдаём звуковой сигнал при превышении этого значения
"OnMainTimer","SetVarByCode;spd;GPSSPDN||Eval;res;>($spd$;60)||Byvar;res;<<PlaySound;$SkinPath$Sounds\beep.wav"
В результате в течении пяти минут мы добавили дополнительный функционал, для которого в RR пришлось бы делать плагин.

Таким образом в скине CFStyle реализованы звуковые предупреждения о начале движения, приветствия при включении программе, а также предупреждения по условиям.

Кроме этого таймеры имеют ещё много вариантов применения.

Вот так наш скин от простого отрисовывания экранов и обработки нажатий на кнопки, превратился в хоть и простейшую, но всё же программу.

Последний раз редактировалось Bersenev; 04.05.2011 в 21:43.
Bersenev вне форума   Ответить с цитированием
Старый 05.05.2011, 08:40   #8
Bersenev
Бывалый писикарщик
 
Аватар для Bersenev
 
Регистрация: 23.04.2009
Возраст: 53
Город: Ставрополь
Регион: 26
Машина: Opel Zafira 2007
Сообщений: 5,275
Bersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant future
По умолчанию Слайдеры Label и Var

Что такое слайдеры я думаю объяснять не надо. В RR и iCar есть специальные слайдеры для отображения положения в списке воспроизведения, текущей позиции воспроизводимого трека, но что делать если хочется отобразить скорость автомобиля в виде слайдера?

Единственным способом решить эту проблему в RR это сделать флешку. iCar предоставляет другой способ решения этой проблемы.

Для отображения скорости у нас имеется в распоряжении label GPSSPDN, а также вот такой слайдер Label;<имя label>;<минимум>;<максимум> , в результате вставив в наш скин такую строку мы получить отображение скорости ввиде слайдера в промежутке от 0 до 180 км/ч

Код:
......
S,135,494,296,10,135,494,296,10,,01,,5,"Label;GPSSPDN;0;180",""
......
Аналогичный слайдер есть и для переменных Var;<имя переменной>;<минимум>;<максимум>;<шаг> , допустим такой слайдер Var;MyVar;0;10 позволит менять значение переменной MyVar в пределах от 0 до 10 с шагом 1, а вот такой Var;MyVar;0;10;0.1 уже в пределах от 0 до 10 с шагом 0.1

Bersenev вне форума   Ответить с цитированием
Старый 05.05.2011, 22:55   #9
Bersenev
Бывалый писикарщик
 
Аватар для Bersenev
 
Регистрация: 23.04.2009
Возраст: 53
Город: Ставрополь
Регион: 26
Машина: Opel Zafira 2007
Сообщений: 5,275
Bersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant future
По умолчанию iCar и второй монитор

Для того чтобы iCar смог работать со вторым монитором рабочий стол в системе должен быть расширен на второй монитор.

Предположим что у нас два монитора. Первый 1024Х600 и на нем будет находиться iCar, и второй 800х480 и на него надо выводить встроенные в iCar программы.

рассмотрим простой вариант когда программу надо сразу запустить на втором мониторе

Создаём скин в котором для области A и C задаём второй монитор, его координаты в данном случае будут: левый угол 1024,0 и размер экрана 800х480

Код:
...
C,1024,0,800,480
A,1024,0,800,480,,
...
Загружаем данный скин как обычно и видим нашу программу на втором мониторе.

Но обычно второй монитор расположен в таком месте, что управлять размещённой на нём программой фактически невозможно. Поэтому теперь рассмотрим как перемещать программу с одного монитора на другой нажатием одной кнопки

Создаём скин с таким кодом

Код:
...
/ подключаем файл для монитора под номером заданном в Num
INC,monitor$Num$.txt
/ меняем номер монитора и перегружаем скин
B,0,0,60,60,"ByVar;Num;<<Setvar;Num;2<<SetVar;Num;1||ReloadScreen",""
...
и два txt файла такого содержания

monitor1.txt
Код:
...
C,60,60,964,600
A,60,60,964,600,,
...
monitor2.txt
Код:
 ...
 C,0,0,800,480
 A,0,0,800,480,,
 ...
Теперь перед выполнением команды LOAD сначала задаём номер монитора SetVar;Num;1 . В результате программа попадёт на первый монитор, а нажав кнопку в скине мы переносим её на второй монитор, а при очередном нажатии опять на первый.

Так что всё предельно просто, но правильно это будет работать только с новой версий программы, в текущей версии при переходе на другой экран окно встроенной программы на втором мониторе будет закрыто, а в новой останется на втором мониторе
Bersenev вне форума   Ответить с цитированием
Старый 13.05.2011, 02:16   #10
Bersenev
Бывалый писикарщик
 
Аватар для Bersenev
 
Регистрация: 23.04.2009
Возраст: 53
Город: Ставрополь
Регион: 26
Машина: Opel Zafira 2007
Сообщений: 5,275
Bersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant futureBersenev has a brilliant future
По умолчанию if и while

Очень часто возникает ситуация выполнения каких либо действий по условию. RR предлагал для этого такие команды как Eval и ByVar, которые позволяли делать необходимые проверки и выполнять нужную команду по результату проверки.

Эти команды также поддерживаются в iCar, но в связи с тем, что скин для iCar всё больше обретает очертания программы, то в него добавлены ещё такие команды как IF и WHILE

Команда IF позволяет проверить какое либо условие и выполнить команду в зависимости от результата сравнения. Допустим у нас есть переменная MyVar и надо выполнить нужную команду в зависимости от того больше её значение 10 или нет

Код:
If;>($MyVar$;10);TrueCommand;FalseCommand
Теперь если значение MyVar будет больше 10, то выполниться TrueCommand, а если меньше или равно 10, то FalseCommand . Комманда IF поддерживает такие же условия, что и EVAL.

С недавних пор в RR тоже появилась подобная команда.

Команда WHILE на сегодняшний момент доступна только в iCar, её цель организация цикла, допустим такая комбинация команд позволит выполнить цикл девять раз пока значение i меньше 10

Код:
"StartCycle","SetVar;i;1||While;<($i$;10);CycleCommand"
"CycleCommand","<Команды цикла>||Eval;i;$i$+1"
Для чего её применять решать вам, я использую её для инициализации переменных в скине, для организации автоматического закрытия скина встроенной программы при её закрытии не скином, в общем для выполнения однотипных операций
Bersenev вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.



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


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