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

PCCar.ru - Ваш автомобильный компьютер (http://pccar.ru/index.php)
-   Общение с машиной (http://pccar.ru/forumdisplay.php?f=14)
-   -   Вывод инфы на дисплей приборки VW. (http://pccar.ru/showthread.php?t=24102)

xmetal 14.04.2016 03:26

Вывод инфы на дисплей приборки VW.
 
Вложений: 8
Думаю многим было бы интересно выводить какую либо свою информацию на дисплей приборки. На эксперименты потратил кучу времени и решил поделиться информацией, может поможет кому-нибудь сократить путь до достижения желаемого результата.

Как известно есть два вида протокола по которому общаются дисплей приборки и устройства авто между собой, это DDP и BAP.
DDP (Display Data Protocol) - устаревший на данный момент протокол. Этот протокол используют красные и некоторые чернобелые дисплеи.
BAP (Bedien und Anzeigeprotokoll) - новый протокол. Используют цветные и некоторые чернобелые дисплеи.
В моей машине красный дисплей, поэтому буду рассматривать соответственно DDP протокол.

Небольшая предистория зачем мне все это понадобилось. Установил в авто китайскую бошку, все бы ничего, но она отказалась понимать управление с руля, вернее громкость управляется, но нет переключения радиостанций и треков. В описании заявлена поддержка, на деле же хрен. Задавал вопросы в официальную тех.поддержку - тишина. Можно было бы сдать обратно в магаз, но на момент установки прошло больше двух недель с момента покупки - раз, интернет магазина, где приобреталась бошка уже нет - это два. Пришлось выкручиваться самому.
Был бы 12 кнопочный руль проблем не возникло бы. Но как переключать треки на 8-ми кнопочном руле, если нет кнопок смены треков? Есть только вверх/вниз, которыми управляется бортовой комп. Смотрим, что в этом случае делает штатная голова. При ее включении на дисплее приборки появляется страница "audio", попадая в которую можно переключать треки теми самыми кнопками вверх/вниз и при этом не мешая бортовику. Вот это меня натолкнуло на идею сделать свою страницу "audio" и генерировать коды недостающих кнопок на руле. Путем снифинга кан шины и анализа данных штатной головы получилось создать нужную страницу. Как я и ожидал, управление с руля теперь работает нормально. Далее выяснилось, что китайская бошка всетаки может выводить инфу на приборку, но только по BAP протоколу. Эту инфу тоже удалось отображать. Вообще можно выводить любые нужные данные.

DDP представляет из себя набор команд для дисплея, такие как стереть область экрана, вывести текст определенного размера в нужном месте и другие служебные. Чтобы передать эти данные по кан шине используется транспортный протокол TP2.0. В целом процесс выглядит так: запрашиваем соединение передачи данных, производим инициализацию областей экрана, отправляем данные для отображения на дисплей, при выключении авто нужно деактивировать экраные области. Соединений может быть 5 и у каждого соединения используется своя пара ID для передачи данных по кан шине. У VW они распределены по следующим устройствам:
0x680-0x681 Радио (0х680 - радио, 0х681 - дисплей)
0x682-0x683 Нави (0х682 - Нави, 0х683 - дисплей. Остальное аналогично)
0x684-0x685 Телефон
0x686-0x687 Телематика
0x688-0x689 Компас

Транспортный протокол TP2.0 (http://www.doc88.com/p-396948011721.html)
Нужное нам начинается с 10 страницы. Все описывать не буду, немного поясню, очень много нюансов.

Общение с дисплеем начинается с обмена параметрами:
680 06 A0 04 59 FF 32 FF - запрашивает радио
681 06 A1 04 8A FF 32 FF - дисплей отвечает

A0 - запрос соединения. Отправляется устройством, который будет что-либо выводить на дисплей.
04 - количество подряд идущих сообщений перед запросом подтверждения. Значения от 1 до 15.
59 - время ожидания следующего сообщения (как считаются временые параметры см на стр 12). В данном случае 25 мсек.
32 - минимальное время между отправками сообщений этому устройству. В данном случае 5 мсек.
FF - не используется и всегда должно быть FF

A1 - подтвердить соединение. Ответ дисплея.
04 - количество подряд идущих сообщений перед запросом подтверждения.
8A - время ожидания следующего сообщения 100 мсек.
32 - минимальное время между отправками сообщений дисплею 5 мсек.
FF - не используется и всегда должно быть FF

A3 - тест соединения. Отправляется раз в секунду. В ответ придет A1 04 8A FF 32 FF. Если дисплей не поймает сообщение в период 1050 мсек, то он сам станет слать A3, если не отвечать A1, то после 5 попыток разорвет соединение сообщением A8.
A4 - прервать передачу данных
A8 - отсоединиться, в ответ придет A8

Сообщения с данными начинаются с контрольного байта:
0n - требуется подтверждение о получении данных, будет продолжение отправки, n - порядковый номер
1n - требуется подтверждение о получении данных, не будет продолжения отправки
2n - не требуется подтверждение о получении данных, будет продолжение отправки
3n - не требуется подтверждение о получении данных, не будет продолжения отправки

Bn - подтверждение, n - порядковый номер + 1
9n - неготовность к приему новых данных, n - порядковый номер в зависимости от ситуации (стр 18, 19)

пример, контрольный байт в столбце:
Код:

680  08  |27| 00 61 0A 00 00 03 00 - Радио шлет данные дисплею, по 4 сообщения
680  08  |28| 47 00 46 4D 02 31 61  с интервалом не менее 5 и не более 100 мсек
680  08  |29| 07 08 00 6D 00 47 00
680  08  |0A| 20 61 07 02 00 03 00 - будет продолжение отправки, требуется подтверждение приема
681  01  |BB|                      - дисплей подтверждает прием данных, и указывает порядковый номер с какого продолжать отправку           
680  08  |2B| 00 00 20 61 07 08 00 - радио продолжает отправлять
680  08  |2C| 6D 00 00 00 20 61 0F 
680  08  |2D| 00 00 03 00 12 00 31
680  08  |0E| 30 33 2E 35 20 4D 48
681  01  |BF|
680  08  |2F| 7A 61 0A 00 00 03 00
680  08  |20| 24 00 41 42 54 4F 61
680  08  |21| 0F 00 00 03 00 36 00
680  08  |02| 31 30 32 2E 36 20 4D - будет продолжение отправки, требуется подтверждение приема
681  01  |B3|                            - дисплей подтверждает прием данных
680  04  |13| 48 7A 08            - последнее сообщение, больше отправки не будет, требуется подтверждение приема
681  01  |B4|                            - дисплей подтверждает прием данных

Обработка ошибок, временные интервалы, все это есть в документе.

Протокол DDP.
Документации в инете нет, так что возможно неточное или полное непонимание тех или иных данных. Надеюсь совместными усилиями разберемся.

В авто у меня стоит полноразмерный дисплей highline (MFD+). Размер экрана 110х166 точек.
Для вывода инфы доступны 3 экранные области.
1. В списке SETTINGS, когда заходим в настройки и выбираем свой пункт в меню, доступна вся область 110х166 точек.
2. В рабочем режиме, когда кнопкой меню прокручиваем страницы, доступна центральная часть экрана. Размер 110х91 точек.
3. В рабочем режиме, спустя 10 сек после переключения страниц в верхней части экрана (когда пропадает заголовок). Размер 45х20 точек.

1->Вложение 43489Вложение 43486 2->Вложение 43487 3->Вложение 43488
Какие области экрана будут доступны указываем при инициализации.
Организация экранных меню может отличаться от того, что в моем авто. У меня нет главного MENU, в котором есть пункты SETUP, MFD, AUDIO, так что могут быть серьезные отличия.

Инициализация:
Инициализация начинается со строки 00 xx 00 FF
где xx идентификатор устройства. Есть следующие варианты: Радио - 52, Нави - 4D, Телефон - 5A, Телематика - 55, Компас - 40

в ответ придет 3 сообщения:
20 01 11 00 11 00 11
00 11 00 0A 00 0D 00
11 00
Что здесь передается непонятно, может версию дисплея, короче если сообщение такое, то можно продолжать.

Далее необходимо указать дисплею какие области будут использоваться, путем отправки сообщений:
01 07 - область в меню настроек SETTINGS. Ответом будет сообщение с размерами 110х166 точек - 21 00 3F 00 6E 00 A6
01 12 - центральная область экрана. Ответ с размерами 110х91 точек - 21 00 04 00 6E 00 5B
01 23 - область в верхней части экрана. Ответ с размерами 45х20 точек - 21 00 03 00 2D 00 14

Далее идет привязка областей экрана к идентификатору устройства (как это правильно назвать незнаю) и присваивание названия к строке меню в списке SETTINGS и названия страницы по аналогии со страницей audio.
Отправляем такие сообщения:
02 70 xx 07 ss ss ss ss ss ss ss ss ss ss - xx - идентификатор устройства, 07 - область экрана в SETTINGS, ss - название строки меню в ASCII кодировке. Какая максимальная длина не проверял.
02 70 xx 12 ss ss ss ss ss ss ss ss ss ss - xx - идентификатор устройства, 12 - центральная область экрана, ss - название заголовка страницы в ASCII кодировке.
02 80 xx 23 - xx - идентификатор устройства, 23 - область вверху экрана. Здесь названия нет.
После каждого сообщения ответ будет: 23 xx 00 00 - xx - индефикатор экранной области. Что означает само сообщение написано ниже.
Идентификаторы экранных областей будут разные у каждого из 5 соединений, по 3:
00, 01, 02 у Радио
10, 11, 12 у Нави
08, 09, 0A у Телефона
18, 19, 1A у Телематики
20, 21, 22 у Компаса

Динамическая смена названия пункта в меню или заголовка страницы:
0F xx tt tt tt tt tt tt - xx - идентификатор области экрана, tt - новое название. Возможно она ограничена 12 символами, надо проверять. В ответ придет сообщение 27 xx 01, о котором написано ниже.

Незабываем, что сообщения завернуты в транспортный протокол.
Пример инициализации радио:
Код:

680  06  A0 04 59 FF 32 FF          радио делает запрос на соединение
681  06  A1 04 8A FF 32 FF          дисплей отвечает
680  05  10 00 52 00 FF              радио начинает инициализацию сообщая свой иденификатор - 52. Счетчик начинается с 0
681  01  B1                          подтверждение - данные получены
681  08  20 20 01 11 00 11 00 11    дисплей отвечает своими какими-то параметрами. Свой счетчик начинает с 0
681  08  21 00 11 00 0A 00 0D 00
681  03  12 11 00
680  01  B3                          радио подтвердило прием
680  03  11 01 12                    радио запрашивает центральную область экрана
681  01  B2                          подтверждение - данные получены
681  08  13 21 00 04 00 6E 00 5B    дисплей отвечает параметрами экранной области 110x91
680  01  B4                          подтверждение - данные получены
680  08  22 02 70 52 12 41 75 64    радио привязывает область к своему идентификатору и задает название страницы "Aud"
680  03  13 69 6F                    "io" продолжает отправлять название
681  01  B4                          подтверждение - данные получены
681  05  14 23 00 00 00              23 xx 00 00 -  xx = 00 идентификатор области центральной части экрана. О команде чуть ниже.
680  01  B5                          подтверждение - данные получены

Здесь видно, что радио не использует меню настройки и область верхней части экрана.

Итак, все готово чтобы начать выводить информацию на экран. Вывод можно производить только тогда, когда дисплей разрешит это сделать. Например в случае с радио, мы листаем страницы на дисплее и попадаем на страницу с названием AUDIO.
Дисплей посылает две комманды:
2A xx - область экрана доступна, незнаю точно для чего служит эта команда, если есть вторая. Посылаются они одна за другой. xx - идентификатор области экрана.
23 xx 01 00 - область экрана доступна, отрисовка разрешена. После этой команды можно выводить свои данные. Пока область доступна, можно выводить несколько раз подряд или не выводить ничего. xx - идентификатор области экрана.
Есть нюанс с областью вверху экрана, она разрешается только одной этой командой. Когда в SETTINGS заходим в свое меню, как уже говорил, становится доступна вся область экрана, придется самим рисовать все элементы меню, включая заголовки.

Когда мы будем переключать страницы дальше и уйдем со страницы AUDIO, или откроем дверь и на экране появится автомобиль, или в каких-то других случаях, дисплей отправит команду, что экранная область больше не доступна:
23 xx 00 00 - область экрана недоступна, отрисовка запрещена. xx - идентификатор области экрана.
Тут крылась засада, никак не мог понять, почему иногда просто отваливалась отрисовка и дисплей больше не хотел выводить мои данные. Не сразу-то и поймешь, что происходит и куда смотреть.
Дело оказалось в том, что бывают ситуации, когда данные дисплею полностью еще не передались, а он сообщает, что область экрана стала недоступна. Я прекращал передачу и при следующем разрешении на вывод выводил все сначала. Это неправильно. Нужно спокойно выводить все данные до конца. В конце отправки дисплей опять скажет, что область недоступна. И все, никакого сбоя не будет.

После получения разрешения на отрисовку можно начинать передачу. Чтобы дисплей понял где начало и конец данных есть две команды:
09 xx - начало массива данных. xx - идентификатор области экрана
08 - конец массива данных

После приема и отображения на экране дисплей ответит об успешности отрисовки:
27 xx 01 - отрисовка завершена. xx- идентификатор области экрана. Если данные были отправлены на отрисовку, то только после этой команды можно отправлять новые данные.
Бывают ситуации когда, данные отправлены полностью, но отрисовка не произошла, так как экранная область стала недоступна. В этом случае вместо подтверждения отрисовки будет сообщение 23 xx 00 00. Это нормально.

Текст и графика:
Команда работы с прямоугольниками. Можно стирать, закрашивать прямоугольные области, рисовать горизонтальные и вертикальтные линии, точки. Комбинируя несколько команд можно рисовать рамки. С помощью точек рисовать изображения, главное чтобы дисплей не опух от потока данных).
60 ll aa xx 00 yy 00 ww 00 hh 00

где:
60 - команда
ll - длина данных в команде после этого байта, всегда 09
aa - атрибут: 0 или 1-стереть, 2 - рисовать, 3-рисовать курсор. Курсор рисуется всегда одинаково, в независимости от ширины и высоты прямоугольника.
00 - разделители
xx - координата X, в пикселах. 0 верхний левый угол экранной области в которую производится отрисовка.
yy - координата Y
ww - ширина
hh - высота
Чтобы не возникло ошибки, координаты X и Y, должны находиться в пределах области экрана, ширина и высота могут уходить за пределы.

Команда работы с текстом. Рисует текст в кодировке ASCII. В красных дисплеях нет русских символов, тем у кого чернобелая придется искать самим.
61 ll aa ii xx 00 yy 00 tt .... tt

где:
61 - команда
ll - длина данных в команде после этого байта, с учетом количества символов текста
aa - атрибут шрифта: (младший полубайт) x0 - нормальный, x1 - жирный 1, x2 - жирный 2, x3 - китайский, x4 - мелкий, x5 - графические символы, (старший полубайт) 0x - выравнивание по левому краю, 1х - выравнить по центру от координаты X
ii - атрибут инверсии: 0 - нормальный, 2- инверсный
xx - координата X, в пикселах. 0 верхний левый угол экранной области в которую производится отрисовка.
yy - координата Y
tt - текст
00 - разделители
Чтобы не возникло ошибки, координаты X и Y, должны находиться в пределах области экрана, текст может уходить за пределы.
Вся графика, которую RNS510 выводит на приборку в режиме навигации отображается графическими символами знакогенератора дисплея.
Вложение 43484 Вложение 43485

пример вывода:
Вложение 43495 Вложение 43496
Код:

681  03  1B 2A 00                    переключились на страницу AUDIO
680  01  BC                          подтвердили прием
681  05  1C 23 00 01 00              дисплей говорит, что экранная область 00 доступна для отрисовки
680  01  BD                          подтвердили прием
680  08  2F 09 00 60 09 00 00 00      начинаем слать данные (команда 09)  для экранной области 00 
680  08  20 00 00 6E 00 5B 00 61      в этих сообщениях стираем всю область и пишем текст ABTO в центре и в нижнем левом углу FM1
680  08  21 0A 10 00 37 00 1E 00     
680  08  02 41 42 54 4F 61 0A 00
681  01  B3                          дисплей подтвердил прием                       
680  08  23 00 03 00 47 00 46 4D      продолжаем слать
680  04  14 02 31 08                  закончили пересылку, (команда 08)
681  01  B5                          дисплей подтвердил прием
681  04  1D 27 00 01                  дисплей отрисовал на экране
680  01  BE                          подтвердили прием
через какое-то время отсылаем еще

680  08  25 09 00 60 09 00 00 00      отправляем новые данные для экранной области 00
680  08  26 13 00 6E 00 36 00 60      в этикх сообщениях стираем уже не весь экран, а часть и выводим список станций с курсором
680  08  27 09 03 00 00 23 00 6E     
680  08  08 00 14 00 61 0F 00 00      103.9 MHz
681  01  B9                          ------------
680  08  29 03 00 12 00 31 30 33      103.5 MHz  <     
680  08  2A 2E 39 20 4D 48 7A 61      ------------
680  08  2B 0F 00 00 03 00 24 00      ABTO     
680  08  0C 31 30 33 2E 35 20 4D     
681  01  BD                          дисплей подтвердил прием
680  08  2D 48 7A 61 0A 00 00 03      продолжаем слать
680  08  2E 00 36 00 41 42 54 4F
680  02  1F 08                        закончили пересылку, (команда 08)         
681  01  B0                          дисплей подтвердил прием
681  04  1E 27 00 01                  дисплей отрисовал на экране
680  01  BF                          подтвердили прием

Еще есть несколько служебных команд.

0C xx - показать область экрана. Запрос на отображение без нажатия кнопок на руле. Работает только с центральной областью экрана. При попытке показать другие области произойдет ошибка. xx - идентификатор области экрана. В ответ получим два сообщения 23 xx 00 00, 23 xx 01 00. После второго сообщения можно отправлять данные для отображения.

0A xx - скрыть область экрана, xx - идентификатор области экрана. Когда нужно выйти из своего собственного меню на странице SETTINGS необходимо отправить эту команду. Если не отправлять ее и не нажимать кнопки, то дисплей сам выйдет через несколько секунд. Так же этой командой скрываются верхняя и центральная области экрана.

05 xx - деактивировать область экрана. Чтобы стала доступна снова, нужно инициализировать по новой. Не уверен в правильности понимания, но такая команда пролетает когда например радио выключается.

После команд 0A и 05 придет ответ:
25 xx - экран деактивирован или что-то вроде того, xx - идентификатор области экрана

2B FF xx - критическая ошибка. xx - какие-то коды ошибок видимо. Не выясненная команда, как на нее реагировать пока не ясно.

Также необходимо раз в секунду отправлять сообщения:
Код:

661  08  00 00 00 00 00 00 00 00 - для радио
5A7  08  00 00 00 00 00 00 00 00 - для телематики
665  07  00 00 00 00 00 00 00 - для телефона
??? - компас и нави


cherkasoff 14.04.2016 11:10

Это очень крутая и полезная инфа!
Спасибо!

(vS) 14.04.2016 15:12

офигенно!

JamesDoe 19.04.2016 13:22

Очень интересно! У меня Ауди с красным монохромным дисплеем. Я правильно понимаю, что будет примерно всё то же самое?

xmetal 19.04.2016 22:00

Скорее всего там что-то подобное. Есть же Фис контрол для Ауди, значит есть возможность выводить свою информацию на экране.

xmetal 09.08.2016 18:28

Непонятно как качать с dot88.com, за деньги только наверное или просто региться надо. Делал printscreen, кому надо качайте https://cloud.mail.ru/public/2Xvv/ST9eLory2

xmetal 30.08.2016 16:59

Обновил первый пост. Есть возможность без нажатия кнопок руля выводить инфу на экране.

Alex57 08.11.2016 13:24

Добрый день, можно уточнить - в момент когда на MFA находится меню Audio, то кнопки вверх-вних выдают ДРУГОЙ CAN код, чем когда в других меню, верно?

(у меня тоже 8-кнопочный руль на одной машине)

xmetal 09.11.2016 22:36

Нет. Рулевые кнопки не меняют свой код. У меня работает так: когда находимся в меню Audio ловим код нужной кнопки и сразу отправляем код нужной кнопки от 12 кнопочного руля. В итоге в кан шине появляется 2 команды подряд, но моя китайская магнитола не понимает кнопки вверх вниз от руля, поэтому первый код игнорируется магнитолой, но она срабатывает на второй код.

ghans 13.02.2017 16:49

Круто! А про BAP протокол что то удалось нарыть ?


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

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