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 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, как у меня. Ищу решение чтобы ничего не пилить, планшет под нужный размер пока найти не удалось.


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

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