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

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

T_r_D 04.02.2016 15:00

Цитата:

Сообщение от autowp (Сообщение 350735)
Чтобы не писать "if(canId == 293) // 125HEX" и не забивать себе голову никому не нужными DEC'ами, рекомендую "if(canId == 0x125)"

(buf[0] >> 4) == 16

Это всегда false, не может быть равен 16 байт, 4 раза поделенный на 2

- (len - 2)

Вот это не понятно. Length - это что? (понятно, что длина, но длина чего?)

Это я хочу туда запихать длину пакета. А это - (len - 2) вычитание длины первого пакета и двух первых байт. В первом же пакете оставшиеся байты кроме первых двух входят в общею длину.

А если не смещать на 4, то нужно битовую маску?
buf[0] & 0xF0 ?

GASCHE 04.02.2016 15:03

Цитата:

Сообщение от T_r_D (Сообщение 350734)
GASCHE в вики написано что 4 старших бита нулевого байта если 0000, то это одиночный пакет, а если 0001, то длинный, тоесть с мультифреймом.

Да, я этого и не отрицаю.

T_r_D 04.02.2016 15:06

Короче я со смещениями опять всё перепутал...

Куда чего надо смещать или с какой маской плюсовать чтоб узнать длину пакета?
Помогите плиз- чайник я в этом.

GASCHE 04.02.2016 15:26

Цитата:

Сообщение от T_r_D (Сообщение 350740)
Короче я со смещениями опять всё перепутал...

Так Dmitry8 вам правильно показал.
Цитата:

Сообщение от T_r_D (Сообщение 350740)
Куда чего надо смещать или с какой маской плюсовать чтоб узнать длину пакета?

Как-то так
buf[0] & 0x0F * 256 + buf[1]

T_r_D 04.02.2016 16:08

Вот что получилось.
Кстати почему не работает вот такой способ узнать длину массива
int i = DataBuf.length?

PHP код:

          if(canId == 293// 125HEX
          
{
            if ((
buf[0] >> 4) == 0x01){
              
Length = (buf[0] & 0x0F 256 buf[1]) - (len -2);
              for (
int i=0i<len;i++){
              
DataBuf[i] = buf[i];
              }
            }

            if(((
buf[0] >> 4) == 0x02) && Length 0){
              
int sz sizeof(DataBuf);
              
Length Length len;

              if (
Length len){
                for (
int i sz< (len sz);i++){
                
DataBuf[i] = buf[i-sz];
                }
              }
              else{
                for (
int i =sz< (Length +sz);i++){
                
DataBuf[i] = buf[i-sz];
                }
              
//тут надо обрабатывать полученный пакет  
              
}
            }  
          
          } 

Работоспособно?

GASCHE 04.02.2016 16:37

Цитата:

Сообщение от T_r_D (Сообщение 350748)
Работоспособно?

Не знаю, len - это что?

T_r_D 04.02.2016 18:47

Цитата:

Сообщение от GASCHE (Сообщение 350753)
Не знаю, len - это что?

Это длина буфера с пришедшим сообщением

Вот только не пойму
Length = (buf[0] & 0x0F * 256 + buf[1]) - (len -2);
постоянно возвращает -6.
тоесть (buf[0] & 0x0F * 256 + buf[1]) равно нулю!

Length это int

T_r_D 04.02.2016 18:49

вот полный код
PHP код:

#include <SPI.h>
#include "mcp_can.h"
MCP_CAN CAN(10);
unsigned char len 0;
unsigned char buf[8];
INT32U canId 0x000// идентификаторы могут быть 11-ти или 29-битные

int LengthP
int DataBuf[100];
int DataBufSize;

void setup()
{
    
Serial.begin(38400);
    
pinMode(9INPUT);

START_INIT:
    if(
CAN_OK == CAN.begin(CAN_125KBPS,MCP_8MHz))
    {
Serial1.println("Init OK!");}
    else
    {
Serial1.println("Init fail");delay(100);goto START_INIT;}
}


void loop()
{
//  if(CAN_MSGAVAIL == CAN.checkReceive()) // check if data coming
if(!digitalRead(9))
    {
        
CAN.readMsgBuf(&lenbuf);
        
canId CAN.getCanId();
         
          if(
canId == 293// 125HEX
          
{
            
Serial.println("PKG");
            if ((
buf[0] >> 4) == 0x01)
            {
              
LengthP = (buf[0] & 0x0F 256 buf[1]) - (len 2);
              for (
int i=0i<len;i++){
              
DataBuf[i] = buf[i];
              
DataBufSize i;
              }
              
Serial.print("FIRST Length=");
              
Serial.println(LengthP);              
            }

            if(((
buf[0] >> 4) == 0x02) && LengthP 0){
              
int Length2 LengthP len;
              
Serial.print("SECOND Length=");
              
Serial.print(LengthP);
              
Serial.print(" len=");
              
Serial.println(len);
              
              if (
Length2 len){
              
Serial.println("SECOND>>> Length=");
              
Serial.print(LengthP);
              
Serial.print(" len=");
              
Serial.println(len);
              
                for (
int i 0len;i++){
                
DataBuf[i+DataBufSize] = buf[i];
                }
                
DataBufSize DataBufSize len;
              }
              else{
              
Serial.println("SECOND2>>> Length=");
              
Serial.print(LengthP);
              
Serial.print(" len=");
              
Serial.println(len);
              
                for (
int i=0LengthP;i++){
                
DataBuf[DataBufSize] = buf[i];
                }
                
DataBufSize DataBufSize LengthP;
                
                for (
int iDataBufSize;i++){
                 
Serial.print(DataBuf[i], HEX); 
                }
                
Serial.println(" ");
              }
            }  
          
          }
    }



GASCHE 04.02.2016 19:13

Цитата:

Сообщение от T_r_D (Сообщение 350766)
Это длина буфера с пришедшим сообщением

Цитата:

Сообщение от T_r_D (Сообщение 350658)
мой лог в HEX
10 0D 10 1D 19 10 56 45
04 00 60
30 00 0A
10 00
21 53 54 49 20 46 4D 90
00 00 00 00 00 00 00 D0
00 FF FF 00 55 00 00 00
01 03 92 40 00 D0 00 10
00 00 02 6F 00 59 00 00
FF FF 00 50 00 00 00 00
01 00 00 00 00
00 FF FF 00 00 07 38 09
02 3F FF FF FF 00 FF FF

Если сообщение 10 0D 10 1D 19 10 56 45 то
buf[0] & 0x0F * 256 = 0
buf[1] = 0D
Length = (buf[0] & 0x0F * 256 + buf[1]) = 0D общая длина сообщения.
Теперь
First frame количество значащих байт 6
j = 0;
for (int i=2; 6;i++){
DataBuf[j] = buf[i];
j++;
}
Теперь судя по логу надо искать 21 и со следующего байта копировать 7 или (Length - 6) байт если (Length - 6) < 7 потом искать 22 если надо и так далее пока не скопируете Length байт.
В этом случае в DataBuf будет посылка без обрамления и DataBufSize = Length.
К сожалению я не знаю язык на котором вы пишите.

T_r_D 04.02.2016 19:15

модифицировал чтоб видить пакеты
PHP код:

    {
        
CAN.readMsgBuf(&lenbuf);
        
canId CAN.getCanId();
         
          if(
canId == 293// 125HEX
          
{
            
Serial.print("PKG: ");
            for (
int i=0;i<len;i++){
            
Serial.print(buf[i], HEX);
            
Serial.print(" ");  
            }
            
Serial.println("");            
            
            if ((
buf[0] >> 4) == 0x01

В лог пришло следующее:
PKG: 10 D 10 1D 13 10 4E 52
FIRST Length=-6
PKG: 21 4A 31 30 34 2E 32 B0
PKG: 10 D 10 1D 12 10 4D 41
FIRST Length=-6
PKG: 21 58 49 4D 55 4D 20 80
PKG: 10 D 10 1D 11 10 20 4D
FIRST Length=-6
PKG: 21 2D 43 41 52 4C 4F 90
PKG: 10 D 10 1D 10 10 20 20
FIRST Length=-6
PKG: 21 4A 61 7A 7A 20 20 90
PKG: 10 D 10 1D F 10 46 4D
FIRST Length=-6
PKG: 21 20 38 39 2E 39 20 90
PKG: 10 D 10 1D E 10 45 75
FIRST Length=-6
PKG: 21 72 6F 70 61 20 20 90
PKG: 10 D 10 1D D 10 44 4F
FIRST Length=-6
PKG: 21 50 4F 2A 48 4F 45 80
PKG: 10 D 10 1D C 10 44 46
FIRST Length=-6
PKG: 21 4D 44 41 4E 43 45 90
PKG: 10 D 10 1D B 10 20 44
FIRST Length=-6
PKG: 21 41 43 48 41 20 20 90
PKG: 10 D 10 1D A 10 20 43
FIRST Length=-6
PKG: 21 4F 4D 45 44 59 20 90
PKG: 10 D 10 1D 9 10 42 45
FIRST Length=-6
PKG: 21 53 54 20 46 4D 20 90
PKG: 10 D 10 1D 8 10 42 45
FIRST Length=-6
PKG: 21 43 48 41 20 46 4D 90
PKG: 10 D 10 1D 7 10 61 6E
FIRST Length=-6
PKG: 21 73 6F 6E 2E 66 6D 80
PKG: 10 D 10 1D 6 10 39 38
FIRST Length=-6
PKG: 21 2E 38 20 46 4D 20 90
PKG: 10 D 10 1D 5 10 20 39
FIRST Length=-6
PKG: 21 38 2E 34 20 46 4D 90
PKG: 10 D 10 1D 4 10 20 39
FIRST Length=-6
PKG: 21 36 2C 38 20 46 4D 90
PKG: 10 D 10 1D 3 10 39 30
FIRST Length=-6
PKG: 21 2E 33 20 46 4D 20 B0
PKG: 10 D 10 1D 2 10 38 38
FIRST Length=-6
PKG: 21 2E 37 20 46 4D 20 B0
PKG: 10 D 10 1D 1 10 20 20
FIRST Length=-6
PKG: 21 38 38 2E 33 20 20 90
PKG: 10 D 10 1D 0 10 31 30
FIRST Length=-6
PKG: 21 37 2E 38 20 46 4D 80

Грабли точно в строке
LengthP = (buf[0] & 0x0F * 256 + buf[1]) - (len - 2);
Может её нужно как-то по другому записать или скобок где наставить?

Короче сам разобрался
скобок не хватало
LengthP = ((buf[0] & 0x0F) * 256 + buf[1]) - (len - 2);
вот так всё красиво!

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

T_r_D 05.02.2016 14:46

Вот окончательный скетч который точно работает с одной строчкой, тоесть First Frame + Consecutive Frame. У меня больше 1 Consecutive Frame не идёт с моим дисплеем.
PHP код:

#include <SPI.h>
#include "mcp_can.h"
MCP_CAN CAN(10);
unsigned char len 0;
unsigned char buf[8];
INT32U canId 0x000// идентификаторы могут быть 11-ти или 29-битные

int LengthP
int DataBuf[100];
int DataBufSize;

void setup()
{
    
Serial.begin(38400);
    
pinMode(9INPUT);
delay (7000);
START_INIT:
    if(
CAN_OK == CAN.begin(CAN_125KBPS,MCP_8MHz))
    {
Serial1.println("Init OK!");}
    else
    {
Serial1.println("Init fail");delay(100);goto START_INIT;}
}


void loop()
{
//  if(CAN_MSGAVAIL == CAN.checkReceive()) // check if data coming
if(!digitalRead(9))
    {
        
CAN.readMsgBuf(&lenbuf);
        
canId CAN.getCanId();
         
          if(
canId == 293// 125HEX
          
{
            if ((
buf[0] >> 4) == 0x01)
            {
              
LengthP = ((buf[0] & 0x0F) * 256 buf[1]) - (len 2);
              
DataBufSize len;
              for (
int i=0i<len;i++){
              
DataBuf[i] = buf[i];
              }
            }

            if(((
buf[0] >> 4) == 0x02) && LengthP 0){
              
int Length2 LengthP len;
              if (
Length2 len){
                for (
int i 0len;i++){
                
DataBuf[DataBufSize] = buf[i];
                }
                
DataBufSize DataBufSize len;
              }
              else{
                for (
int i=0LengthP;i++){
                
DataBuf[DataBufSize] = buf[i];
                }
                
DataBufSize DataBufSize LengthP;
                
                for (
int i=0DataBufSize;i++){
                 
Serial.print(DataBuf[i], HEX);
                 
Serial.print(" "); 
                }
                 for (
int i=0DataBufSize;i++){
                 
Serial.print(char(DataBuf[i]));
                }
                
Serial.println(" ");
              }
            }  
          
          }
    }


Выдаёт он вот такое:
10 D 10 1D 12 10 4D 41 21 58 49 4D 55 4D 20 MA!XIMUM
10 D 10 1D 11 10 20 48 21 49 54 20 46 4D 20 H!IT FM
10 D 10 1D 10 10 46 4D 21 20 38 39 2E 39 20 FM! 89.9
10 D 10 1D F 10 45 75 21 72 6F 70 61 20 20 Eu!ropa
10 D 10 1D E 10 44 4F 21 50 4F 2A 48 4F 45 DO!PO*HOE
10 D 10 1D D 10 20 44 21 41 43 48 41 20 20 D!ACHA
10 D 10 1D C 10 20 43 21 4F 4D 45 44 59 20 C!OMEDY
10 D 10 1D B 10 20 42 21 4F 43 54 4F 4B 20 B!OCTOK
10 D 10 1D A 10 42 45 21 53 54 20 46 4D 20 BE!ST FM
10 D 10 1D 9 10 42 45 21 43 48 41 20 46 4D BE!CHA FM
10 D 10 1D 8 10 61 6E 21 73 6F 6E 2E 66 6D an!son.fm
10 D 10 1D 7 10 20 39 21 38 2E 34 20 46 4D 9!8.4 FM
10 D 10 1D 6 10 39 36 21 2C 34 20 46 4D 20 96!,4 FM
10 D 10 1D 5 10 20 39 21 35 2E 36 20 46 4D 9!5.6 FM
10 D 10 1D 4 10 39 30 21 2E 33 20 46 4D 20 90!.3 FM
10 D 10 1D 3 10 38 38 21 2E 37 20 46 4D 20 88!.7 FM
10 D 10 1D 2 10 20 20 21 38 38 2E 33 20 20 !88.3
10 D 10 1D 1 10 31 30 21 37 2E 38 20 46 4D 10!7.8 FM
10 D 10 1D 0 10 31 30 21 36 2C 36 20 46 4D
То что нечитабельными символами в ascii сюда не копируется, но между хексом и нормальным текстом то, что не перевелось в ascii.
Восклицательный знак это 0 байт Consecutive Frame.

При нажатии кнопки LIST при проигрование диска на дисплее отображаются номер трека и звёздочки за место текста (ну его и нет), но в этот ID это почему-то не попадает....

T_r_D 06.02.2016 18:48

Итак, у меня классные новости!
Я купил магнитолу и дисплей, кинул их на стол, отсканировал и нашёл то, что мне не хватало.
Нашёл где прячится иконка LOUD, а так же подошёл к событию которое позволит выкинуть дисплей штатный нафиг.
Вот что я накопал:
ID от дисплея
0 <0,0,80,1> через секунд 30 после включения
4 <0,F,F0,0,0,80,1> через секунд 30 после включения
6 через секунд 30 после включения
5E0 Один раз при подключении питания магнитолы.
1ED неизменен
167 неизменен
15B неизменен
525 неизменен
5E5 неизменен
DF Отвечае открыто меню или нет: 10,0,50 открыто, 90,0,70 не открыто.
Если не отреагировать на нажатие кнопки MENU изменением битов,
то магнитола не отреагирует и будет кнопками также переключать станции или треки.

Всего 10 ID. Скорее всего какие-то отвечают за набор функций в дисплее.
Это будет просто проверить отсканировав мой строчный дисплей (этот графический).

T_r_D 07.02.2016 12:43

Так ребят, извиняюсь.
Вчера не было времени на детальный анализ ID.
Исправляюсь

0xDF Отвечае открыто меню или нет и состояние его элементов.
За открытие меню отвечает второй байт.
50HEX 0101 0000 закрыто
70HEX 0111 0000 открыто

Первый байт отвечает за выбор элемента.
Отображает выбраный элемент в реальном времени если меню вызвано через OK
или последний элемент с которым производились действия если меню вызвано через MENU.
При повторном входе в меню любой кнопкой сбрасывается на первый элемент.
1HEX 00000001 Alternative frequencies
3HEX 00000011 Regional mode (00000010, но не включается без RDS)
24HEX 00100100 Radio-text information
42HEX 01000010 Track random play

Нулевой байт отвечает сразу за 2 функции.
при неактивном меню
10HEX 00010000 Выход из меню по таймауту или ESC
11HEX 00010001 элемен был деактивирован
12HEX 00010010 элемент был активирован
при активном
90HEX 10010000 нахождение в меню в предидущий вход действий с элементами не выполнялось
91HEX 10010001 элемент был активирован - передаётся во время нажатия OK
92HEX 10010010 элемент был деактивирован - передаётся во время нажатия OK

Тоесть если вы попали в меню через OK, то положение в нём можно отследить, если через кнопку MENU, то нет.

T_r_D 08.02.2016 13:19

И ещё раз прошу помощи с мультифреймом.
Собрал пакет и не пойму как теперь его разбить на части.
Вот пример:
PHP код:

10 28 10 1E 0 41 2D 45 >>> -
21 4E 45 52 47 59 2D B0 
>>> N E R G Y ° 
22 31 30 33 2E 30 20 46 
>>> 1 0 3 0   F 
23 4D 80 20 20 38 38 2E 
>>> M Ђ     8 8 
24 33 20 20 80 39 30 2E >>> 3     Ђ 9 0 
25 33 20 46 4D 20 B0 2E >>> 3   F M   ° 
10 28 10 1E 0 41 2D 45 4E 45 52 47 59 2D B0 31 30 33 2E 30 20 46 4D 80 20 20 38 38 2E 33 20 20 80 39 30 2E 33 20 46 4D 20 B0 0 (     A-ENERGY-°103.0 FMЂ  88.3  Ђ90.3 FM ° 

Присутствует паразитный(а может и нет, а информационный) символ 80(Ђ).
На экране БК выглядит так:
-ENERGY- PTY TA
103.0 FM
88.3
90.3 FM PTY TA

И не понятно ещё где хранятся данные о PTY, но оно отображается.

B0 ° это признак TA на станции с РДС, а вот пакет для станций без РДС, но с ТА. там 0. И как его выуживать тоже не понятно. Единственное он всегда в плотную к следующей надписи идёт
PHP код:

10 28 10 1E C 41 39 33 >>> 9 3 
21 2E 36 30 0 0 0 10 
>>> . 6 0 
22 39 34 2E 38 30 0 0 
>>> 9 4 8 0 
3 0 30 39 35 2E 32 30 
>>>      0 9 5 2 0
24 0 0 0 10 39 35 2E 
>>>      9 5 .
25 36 30 0 0 0 10 2E >>> 6 0     .
10 28 10 1E C 41 39 33 2E 36 30 0 0 0 10 39 34 2E 38 30 0 0 0 30 39 35 2E 32 30 0 0 0 10 39 35 2E 36 30 0 0 0 10 0 (A93.60    94.80    095.20      95.60 


autowp 08.02.2016 13:56

10 28 в собранном сообщение быть не должно.

>> Присутствует паразитный(а может и нет, а информационный) символ 80(Ђ).

Конечно он не паразитный. Что-то он в себе несёт, но покуда вам нет в нем нужды, игнорируйте этот байт.

Вторая посылка на первый взгляд выглядит так же, как первая. не понятен вопрос.

У всех данных фиксированные позиции в посылках. Иначе и быть не может. Если в одно сообщение информация идет 5ым байтом, то и в другом она будет 5ым байтом

T_r_D 08.02.2016 14:29

Цитата:

Сообщение от autowp (Сообщение 351084)
10 28 в собранном сообщение быть не должно.

>> Присутствует паразитный(а может и нет, а информационный) символ 80(Ђ).

Конечно он не паразитный. Что-то он в себе несёт, но покуда вам нет в нем нужды, игнорируйте этот байт.

Вторая посылка на первый взгляд выглядит так же, как первая. не понятен вопрос.

У всех данных фиксированные позиции в посылках. Иначе и быть не может. Если в одно сообщение информация идет 5ым байтом, то и в другом она будет 5ым байтом

Я не понял.
Выглядят-то они идентично. Вопрос как разбить на строки?
Специально дал то, что отражается на дисплее. Ведь сообщения которые в разных посылках в одной строчке на дисплеее.
Как искать разделение?

А, всё! ДОГНАЛ!
Получается что мои сообщения всегда занимают 9 байт! Счёт идёт с 6 байта первого пакета!

Это утверждение не верно!
Цитата:

У всех данных фиксированные позиции в посылках. Иначе и быть не может. Если в одно сообщение информация идет 5ым байтом, то и в другом она будет 5ым байтом

T_r_D 08.02.2016 17:49

так ребят, не наступите на грабли! Я час потратил чтоб разобраться! Символы переведённые способом char(), переводятся все и получается что даже не видимые символы могут потом складываться с видимыми давая чудесные результаты!
вот окончательный код сборки строки.
через | выводится что поддерживает данная станция.
PHP код:

          if(canId == 293// 125HEX
          
{
            if ((
buf[0] >> 4) == 0x01)
            {
              
LengthP = ((buf[0] & 0x0F) * 256 buf[1]) - 6;
              
DataBufSize 2;
              
DataBuf[0]=buf[6];
              
DataBuf[1]=buf[7];
            }    

            if(((
buf[0] >> 4) == 0x02) && LengthP 0){
              if (
LengthP 8)
              {
                for (
int i=18;i++) DataBuf[DataBufSize 1] = buf[i];
                
DataBufSize DataBufSize 7;
                
LengthP LengthP 7;
              }
              else{
                for (
int i=1LengthP+1;i++) DataBuf[DataBufSize 1] = buf[i];
                
DataBufSize DataBufSize LengthP;
                
                
//OUT OF MESSAGE
                
for (int c=0DataBufSize/9;c++){
                    
String strmsg;
                  for (
int i9*c< (9*c)+8;i++){
                    if (
DataBuf[i] > 31strmsg strmsg char(DataBuf[i]);
                    else  
strmsg strmsg " ";
                  }
                  
strmsg strmsg "|" String(DataBuf[(9*c)+8]);
                  
Message[c] = strmsg;
                }
                for (
int i=0DataBufSize/9;i++) Serial.println(Message[i]);
                }
            }  
          
          } 


Dmitry8 09.02.2016 13:51

T_r_D, а как вы собираетесь инсталлировать планшет в машину? Есть уже какой-то план? Пилить пластик будете? Заглушки штатные будут?

T_r_D 09.02.2016 14:30

Цитата:

Сообщение от Dmitry8 (Сообщение 351157)
T_r_D, а как вы собираетесь инсталлировать планшет в машину? Есть уже какой-то план? Пилить пластик будете? Заглушки штатные будут?

Ни чего видимого пилить не буду. Из невидимого рамку изнутри изрядно вырезать надо будет и 4 отверстия для крепления прижимной "пластины" планшета к рамке.

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

А сама рамка вот
http://www.ebay.com/itm/Car-Radio-Fr...ZUAE-B&vxp=mtr

Только отверстие под SD уберу и затяну в плёнку под карбон.

Dmitry8 09.02.2016 14:36

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

T_r_D 10.02.2016 11:40

Кстати в мультифрейме идёт ещё и выбор запрограммированных станций. При нажатии кнопок 1-6 тоже отображается мультифрейм и при нажатии кнопки BAND.

Надо записать диск с CD-Text и посмотреть как там организован мультифрейм.

Для этих случаев он организован одинакого- пакет состоит из 8 байт текстовой информации + 1 байт служебной. Для листа станций радио этот девятый байт это PTY, TA, RDS.

Скоро совмещу мультифрейм скетч и основной и покажу что получилось.

По идеи остаётся два меню- одно для кнопки OK на радио, второе на ЦД.
Это собственные меню магнитолы. Они идут с выбором позиции. В них те же пункты что и по кнопке MENU, но отрабатываемые магнитолой, а не дисплеем.
Тоесть там включение RDS, REG, RDTXT, Intro mode, Random play.

А и ещё меню с выбором трека если нет CD-Text. Оно выдаётся по кнопке LIST

PS.
Пытался записать болванку с ЦД-текстом разными программами и ни одной не получилось!
Есть у кого такой компакт? Снимите образ с него, а то проверить не могу.

T_r_D 18.02.2016 09:33

Короче забил я на CD-Text. Как не старался его записать на болванку ни чего не вышло. Если попадётся, то допишу потом его расшифровку...

Для полного завершения не хватает отработки трёх меню.
Первое при нажатии кнопки OK в режиме радио
Второе при нажитии кнопки OK в режиме CD
Третье при нажатии собственно кнопки MENU.

Если дисплей подключен, то по ID DF он передаёт в магнитолу выбраный элемент меню, но вопрос откуда он берёт эти меню.
Оказалось что при загрузке у него для радио 3 стандартных пункта меню, а для CD один. Я так понимаю что это минимальный набор и он присутствует всегда.
Далее похоже на то, что дисплею посылается установка, но какая-то она маленькая...
ID 365
при запуске FF,FF,FF,0,0
при работе 45,31,1B,0,0
В процессе работы меняется иногда на пустое, но на долю секунды
Возможно что такой пакет это и есть опции меню?
Просто больше других не вижу.

Итак- раскопал я этот ID. Отношение к меню он имеет только тем, что если вставлен диск, то появляется дополнительный элемент меню.

при запуске и если нет диска FF,FF,FF,0,0
при работе:
Нулевой байт это количество треков на диске.
Первый байт общее время на диске минуты
Второй байт общее время на диске секунды
Третий и четвёртый ноли всегда.

В процессе работы меняется иногда на пустое, но на долю секунды

Если диск вставлен, то в меню появляется пункт Activate Track Intro

Тоесть меня это не особо приблизило к цели, но из задачь убралось первые два пункта.

Кстати в 1E0 ещё и источник передаётся!
нулевой байт это источник!
0101 0000
^^
||радио
|CD
Дальше надо в машине смотреть, на столе нету ни аукса ни ченджера.

T_r_D 20.02.2016 14:16

Найден ещё один ID с мультифреймом!

Radio Text 0xA4

5 10 0 0 0 0
10 44 10 0 0 0 20 20
21 20 20 20 20 20 20 20
22 20 20 20 2E 63 6F 6D
23 2F 72 61 64 20 20 20
24 20 20 20 20 20 72 75
25 20 20 20 20 20 20 20
26 20 20 20 20 20 20 20
27 20 20 20 20 20 20 20
28 20 20 20 20 20 20 20
29 20 20 20 20 20 20
23 2F 72 61 64 69 6F 73
24 70 20 20 20 20 72 75
10 44 10 0 0 0 49 4E
21 20 40 20 77 77 77 2E
22 69 6E 73 20 20 20 20
23 20 20 20 20 20 20 20
24 20 20 20 20 20 5F 66
25 6D 20 20 20 20 20 20
22 69 6E 73 74 61 67 72
23 61 6D 2E 63 6F 6D 2F
24 73 70 6F 72 74 5F 66
22 20 20 20 20 20 20 20
24 20 20 20 20 20 20 20
23 52 53 54 20 20 20 20
21 20 20 20 77 77 77 20
10 44 10 0 0 0 46 42
22 66 61 63 20 20 20 20
23 20 20 20 20 6D 2F 73
24 70 6F 72 74 66 6D 2E
25 72 75 20 20 20 20 20
21 20 20 20 74 77 69 20
23 61 6D 2E 63 20 20 20
24 20 70 6F 72 74 20 20
24 73 70 6F 72 74 20 20
21 20 40 20 77 77 77 20
10 44 10 0 0 0 40 20

autowp 20.02.2016 14:30

Цитата:

Сообщение от T_r_D (Сообщение 352341)
Найден ещё один ID с мультифреймом!

Radio Text 0xA4

Прям "breaking news" =)
http://autowp.github.io/#0A4

T_r_D 21.02.2016 03:57

autowp

Source: Radio
Dest: Display

Current track name

ISO 15765-2
0A4
00100000 00000000 010
A
1 - message contains track author data
1000
NNNNNNNN
track nubmer
[
TEXT_DATA
author & track name
]

И?
Тут понятно что это? Что у тебя написано?
Какой блин автор и трек нейм?
Это Радиотекст!

Я тебя просил поправить свои таблицы с моими дополнениями- ты сказал чтоб я сам их правил.
Так что буду тут разъяснять что нахожу.

autowp 21.02.2016 12:38

Я и не говорю, что там все понятно. Я просто заметил, что "найден!" звучит странно.

>Какой блин автор и трек нейм?
>Это Радиотекст!

Логично предположить, что это и то, и другое : текущий трек/станция

T_r_D 23.02.2016 19:45

Вложений: 1
Так. Потестил всё и пошёл в машину.
Оказалось что в машине List of station который передаётся мультифреймом не такой как дома. Он всегда состоит из одной строки отображающийся на дисплее.
Короче стало очевидно что магнитола определяет тип дисплея который подключён или может он прописывается диагностической программой при установке?
Есть у кого какие мысли?
На всякий приложу картинку с ID которые у меня есть на столе в связке магнитола и нормальный дисплей. Там нескольких нет, но они возникают после некоторого время работы, так что не относятся точно к иниту дисплея если он есть.

T_r_D 24.02.2016 08:55

Народ, а кто нить делал что нить на исходниках для дройда которые я использую? Всплыла плохая бяка. С увеличением длины строки некоторые цифры начинают переводится в ASCII как я подозреваю. Тоесть при каком-то наборе символов в передаваемой строке всё замирает, а дальнейшие пакеты валятся в буфер. Какое-то время это продолжается, а потом вываливается всё что накопилось. Ща не дома, но если интересно, то могу дать строку которая при передачи с ардуины в дройд не будет отображаться совсем, но как только в ней поменяется первое число, то выпадет на экран всё что напередавалось

xmetal 24.02.2016 12:22

Цитата:

Сообщение от T_r_D (Сообщение 352573)
Короче стало очевидно что магнитола определяет тип дисплея который подключён или может он прописывается диагностической программой при установке?
Есть у кого какие мысли?

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

Dmitry8 24.02.2016 18:59

Мой дисплей после включения постоянно отправляет какие-то данные. Вполне вероятно что в них указан тип дисплея.

T_r_D 24.02.2016 23:36

У меня на столе собрана магнитола и дисплей. При включении они выплёвывают по одному Id. На картинке такой id для дисплея указан. При этом есть циклический id который очень похож на тот который единожды проходит.

Короче я понял- Ща с глюком перекодировки разбирусь, доделаю менюшки не требующие эмуляции дисплея и с машины сниму свой строчечный дисплей чтоб на столе запустить и посмотреть отличия.

Dmitry8 25.02.2016 10:25

Так у вас в машине другой тип дисплея?
Скорее всего при телекодировании в магнитоле прописывается тип дисплея и от этого зависит как она передаёт данные на дисплей.

T_r_D 25.02.2016 15:56

Народ- дурацкий вопрос. Передаю из ардуины дройду два байта
DATA[9] = 0x09;
DATA[10] = 0xA0;
принимаю на стороне дройда нормально, а теперь пытаюсь их склеить и получаю чушь!
(Arbyte[9] << 8) + Arbyte[10])

Arbyte[9] равно -91 и поэтому заполняется еденицами, а нужно чтоб нолями.
Как это сделать?

GASCHE 25.02.2016 22:41

А так (Arbyte[9] * 256 ) + Arbyte[10] не пробовали?

T_r_D 25.02.2016 23:42

Пробовал- тоже самое.
Помогла маска 0хff.
Там дело в том, что он про арбайт 10 думает что оно-90, а оно на самом деле 160.
Тоесть 160 это 16 бит и старшим забиты нулями. Если обрезать до 8 бит, то получится как раз -90

GASCHE 26.02.2016 10:43

Цитата:

Сообщение от T_r_D (Сообщение 352854)
Тоесть 160 это 16 бит и старшим забиты нулями. Если обрезать до 8 бит, то получится как раз -90

Вы бы вначале сами разобрались. Как это Байт стал 16 бит и при этом еще умудрился сдвинуться на 4 бита?

lti1 26.02.2016 11:43

Цитата:

Сообщение от GASCHE (Сообщение 352869)
Вы бы вначале сами разобрались. Как это Байт стал 16 бит и при этом еще умудрился сдвинуться на 4 бита?

Ни какого сдвига на 4 бита нет. А вот каким чудесным образом в андройд меняется тип значения на 16 битный, не понятно.
T_r_D описался, не -90, а -96.

GASCHE 26.02.2016 13:17

Цитата:

Сообщение от lti1 (Сообщение 352873)
T_r_D описался, не -90, а -96.

Даже не знаю что сказать
00001001(09)*00000001 00000000(256)=00001001 00000000(09 00)
00001001 00000000(09 00) + 10100000(А0) = 00001001 10100000(09 A0)

01011010(90) это еще можно объяснить, но это 01100000(96) откуда вы взяли, даже понять не могу.

lti1 26.02.2016 13:30

Вложений: 1
Цитата:

Сообщение от GASCHE (Сообщение 352882)
Даже не знаю что сказать
00001001(09)*00000001 00000000(256)=00001001 00000000(09 00)
00001001 00000000(09 00) + 10100000(А0) = 00001001 10100000(09 A0)

01011010(90) это еще можно объяснить, но это 01100000(96) откуда вы взяли, даже понять не могу.

Не 01100000(96), а 10100000(-96).
8 бит и 16 бит дают разный результат.

xmetal 26.02.2016 15:43

Я так понимаю вся беда в том, что ява не поддерживает беззнаковый тип данных, отсюда и косяки. Либо надо работать с более вместительными типами, либо как сделал T_r_D, обрезать маской.


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

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