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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.04.2016, 23:04   #321
sisoft
Новый Пользователь
 
Регистрация: 26.09.2015
Регион: 16, 116
Машина: Citroen C4
Сообщений: 13
sisoft is on a distinguished road
По умолчанию

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

в 2e1 есть ещё два статуса в байте 2, биты 4 и 5:
10 - STOP - START system deactivated
30 - STOP - START system activated
sisoft вне форума   Ответить с цитированием
Старый 01.05.2016, 07:27   #322
T_r_D
Старший Пользователь
 
Регистрация: 03.07.2015
Регион: 77, 97, 99, 177
Сообщений: 372
T_r_D is a jewel in the roughT_r_D is a jewel in the roughT_r_D is a jewel in the rough
По умолчанию

Странно! Я сегодня проверю. Может реально пропустил, но вроде все проверял в 2Е1.

А ты перебирал все значения байтов в 361? А то я только чтоб еденица была в битах 0-7.
Ну вряд ли это идёт в другом месте. В этом id ещё места куча!

Надо искать тогда машину у которой стоит адаптивный свет и снимать лог если не в этом id.

А ты нашёл как отображать подпунктAutomatic lighting of headlamp (вкл # выкл)?
Я не нашёл!

UPD.
Проверил дома, посылаю 2Е1 00 00 10 00 00 00 00 00
Пункт не появляется на дисплее!
попробовал слать FF FE FF FF FF FF FF FF
тоже не появился!
Ты шлёшь чисто этот ID или весь лог с машины?
Может на это влияет ещё какой ID?

Попробовал те же FF заслать в 361ID изменений тоже нет. Сколько пунктов было, столько и осталось.

Последний раз редактировалось T_r_D; 01.05.2016 в 11:15.
T_r_D вне форума   Ответить с цитированием
Старый 02.05.2016, 16:17   #323
T_r_D
Старший Пользователь
 
Регистрация: 03.07.2015
Регион: 77, 97, 99, 177
Сообщений: 372
T_r_D is a jewel in the roughT_r_D is a jewel in the roughT_r_D is a jewel in the rough
По умолчанию

И так, сегодня в машине я проверил.
Нету 2Е1!
Возможно он выдаётся только при определённом типе дисплея.
Проверю через пол часика...
Проверил- нет такого ID. Да и фиг с ним!

Но зато! Нашлось напряжение борт сети!
идёт оно в 0E6 байт 5.
Формула:
бит5 в DEC/20 + 7,20

Ну тоесть 0x00 соответствует напряжению 7,2В

Последний раз редактировалось T_r_D; 02.05.2016 в 16:58.
T_r_D вне форума   Ответить с цитированием
Старый 06.05.2016, 12:35   #324
T_r_D
Старший Пользователь
 
Регистрация: 03.07.2015
Регион: 77, 97, 99, 177
Сообщений: 372
T_r_D is a jewel in the roughT_r_D is a jewel in the roughT_r_D is a jewel in the rough
По умолчанию

Думаю что это одно из заключительных сообщений этой темы.
Я заканчиваю этот проект. Я с эмулировать полностью дисплей.
Осталось от тестировать всё в машине, причесать интерфейс дройда и сделать питание, но это уже не в этой теме.

Спасибо всем кто помогал!
T_r_D вне форума   Ответить с цитированием
Старый 06.05.2016, 17:40   #325
PowerMax
Пользователь
 
Регистрация: 12.08.2015
Возраст: 40
Регион: 10
Сообщений: 32
PowerMax is infamous around these parts
По умолчанию

не за что)
PowerMax вне форума   Ответить с цитированием
Старый 10.05.2016, 11:32   #326
Garen
Пользователь
 
Регистрация: 17.08.2015
Регион: 06
Сообщений: 45
Garen is on a distinguished road
По умолчанию

А я вот ищу решение чтобы ничего не пилить, планшет под нужный размер пока найти не удалось.
Garen вне форума   Ответить с цитированием
Старый 11.05.2016, 13:44   #327
T_r_D
Старший Пользователь
 
Регистрация: 03.07.2015
Регион: 77, 97, 99, 177
Сообщений: 372
T_r_D is a jewel in the roughT_r_D is a jewel in the roughT_r_D is a jewel in the rough
По умолчанию

А вот кстати скетч финальный.
PHP код:
#include <SPI.h>
#include "mcp_can.h"
#include <EEPROM.h>

MCP_CAN CAN(10);
unsigned char len 0;
unsigned char buf[8];
INT32U canId 0x000// идентификаторы могут быть 11-ти или 29-битные
unsigned long time0 = -120;

//RDS
int digit1digit2;

uint8_t DATA[162], DATA2[162] = {};
boolean Flag false;
boolean Flag2 false;
int Count 0;
int Count2 0;
int FMS 0;
int VolCount 5;
int arrcmp;
boolean Compare false;

//Menu
boolean Activate false;
boolean Once true;
unsigned long time1 0;

//Multiframe
int LengthP
int DataBufSize;
int Scroll 0;
uint8_t MULTIFRAMEFTMP[3], MULTIFRAMETMP[54], MULTIFRAME[55] = {};
//Multiframe RDTxT
//Package length: 64
int LengthR
int DataBufSizeR;

int KeyCount 0;

unsigned long time2 0;
unsigned char Ignition[8] = {14000x0F10016}; //Зажигание 0x036
unsigned char DisplayAtOnce[8] = {0x25,0xA,0xB,0x4,0xC,0x1,0x200x11}; //Один раз при старте 0x5E5
unsigned char Display[8] = {0xA,0x6,0xFF,0xFF,0x7F,0xFF,0x00x0}; //Дисплей в режиме трипа (0bit A) 0x167
unsigned char DisplayCloseMenu[3] = {0x10,0x0,0x50}; //Дисплей в режиме не открытого меню 0xDF
unsigned char DisplayOpenMenu[3] = {0x10,0x0,0x70}; //Дисплей в режиме открытого меню 0xDF
unsigned char DisplayOpenMMenu[3] = {0x90,0x0,0x70}; //Дисплей в режиме открытого Main Menu 0xDF
unsigned char DisplayAcknowledg[3] = {0x30,0x0,0xA}; //Ответ дисплея на мультифрейм 11F
unsigned char DisplayTripReset[8] = {0x8A,0x6,0xFF,0xFF,0x7F,0xFF,0x00x0}; //Дисплей в режиме трипа (0bit A). Сброс трипа. 0x167 (сброс работал при 89 проверить с А).
unsigned char DisplayCarOpt[8] = {0x010x030x920x400x0000x000x10};
void setup()
{
    
Serial.begin(230400);
    
pinMode(9INPUT);
    
CAN.begin(CAN_125KBPS,MCP_16MHz);
    
CAN.sendMsgBuf(0x5E508DisplayAtOnce);
    
DATA[14] = 0x20;
                           
// 01 03 92 40 00 C0 00 10
                           //byte5 for 0x15B C0- Rear wipe inactive, D0 - active
                           
    
if (EEPROM.read(0) == 0xC0bitWrite(DATA[161],1,0);
    if (
EEPROM.read(0) == 0xD0bitWrite(DATA[161],1,1);
    
DisplayCarOpt[5] = EEPROM.read(0);
}

void loop()
{
//***********************************************************
  
if ((millis() - time2) > 100){
  
CAN.sendMsgBuf(0x03608Ignition); //Это пакет зажигания.
  
CAN.sendMsgBuf(0x16708Display);
  
CAN.sendMsgBuf(0x15B08DisplayCarOpt);
  
  if(
bitRead(DATA[30],1) == ||
     
bitRead(DATA[30],5) == ||
     
bitRead(DATA[30],7) == ||
     
bitRead(DATA[36],6) == ||
     
DATA[15] != 0) {
      
DATA[14] = 31;
      if (
bitRead(DATA[36],6) == 0CAN.sendMsgBuf(0xDF03DisplayOpenMenu);
      else 
CAN.sendMsgBuf(0xDF03DisplayOpenMMenu);
  }
  else 
CAN.sendMsgBuf(0xDF03DisplayCloseMenu);  
  
time2 millis();
  }
//***********************************************************
if ((millis() - time1) == 10000bitWrite(DATA[36],6,0); //Таймаут главного меню.

  
if(!digitalRead(9)) // пин 9 можно переназначить                       
{
CAN.readMsgBuf(&lenbuf);
canId CAN.getCanId();

switch(
canId){
//____________________________MULTIFRAME__________________________________
// if ((buf[0] >> 4) == 0 // Single frame
// if ((buf[0] >> 4) == 0x01 // First Frame
// if ((buf[0] >> 4) == 0x02 // Consecutive Frame
//Length длин дальше идущего пакета не считая этого первого.
case 0x125// 293DEC 125HEX
  
if (buf[0] == 1) {  //Выход из меню
     
bitWrite(DATA[30],5,0);
     
bitWrite(DATA[30],6,0);
     
bitWrite(DATA[30],7,0);
     
memset(MULTIFRAMEFTMP0sizeof(MULTIFRAMEFTMP)); //Стираем что было в массиве.
     
memset(MULTIFRAMETMP0sizeof(MULTIFRAMETMP));
     
memset(MULTIFRAME0sizeof(MULTIFRAME));
     for (
int i=0i<55i++) DATA[i+41] = 0x00;
  }
  else {              
              if (
buf[0] == 4DATA[39] = buf[4];         //Позиция курсора в пределах экрана в меню LIST
               
if (buf[1] == 112 &&  buf[0] == 6){ // buf[1] == 112 или buf[0] == 6 Думаю что 6 это без мультифрейма  List of track НЕ ДОДЕЛАН
                  
bitWrite(DATA[30],1,0);
                  
bitWrite(DATA[30],7,1);
                  
bitWrite(DATA[30],5,0);
                  
bitWrite(DATA[30],6,0);
                  
bitWrite(DATA[36],6,0); //закрытие MENU
                   
if (buf[4]!=16 && buf[4]!=19 && 
                       
buf[4]!=64 && buf[4]!=65 && 
                       
buf[4]!=66 && buf[4]!=67DATA[39] = buf[4];
                   else {
                    if (
buf[4] == 16 || buf[4] == 64DATA[39] = 0x00;
                    if (
buf[4] == 65DATA[39] = 0x01;
                    if (
buf[4] == 66DATA[39] = 0x02;
                    if (
buf[4] == 19 || buf[4] == 67DATA[39] = 0x03;
                    }
                    if (
buf[4] == 16Scroll 1//Arrow up
                    
if (buf[4] == 19Scroll 2//Arrow down
                    
if (buf[4] != 16 && buf[5] != 19Scroll 0;
                  
DATA[40] = buf[3] + 0x01;
               }
              
              if ((
buf[0] >> 4) == 0x01){
                
LengthP = ((buf[0] & 0x0F) * 256 buf[1]) - 6;
                
DataBufSize 0;
                
MULTIFRAMEFTMP[0] = buf[6];
                
MULTIFRAMEFTMP[1] = buf[7];
                if (
buf[1] == 13 || buf[1] == 22 || buf[1] == 31 || buf[1] == 40){ //List of station
                    
FMS 1;                                              //При нажатии LIST. 13 одна строка, 22 две, 31 три, 40 четыре
                    
if (buf[5] == 64 || buf[5] == 16DATA[39] = 0x00;
                    if (
buf[5] == 65 || buf[5] == 33DATA[39] = 0x01;
                    if (
buf[5] == 66 || buf[5] == 50DATA[39] = 0x02;
                    if (
buf[5] == 67 || buf[5] == 19DATA[39] = 0x03;
                    if (
buf[5] == 16Scroll 1//Arrow up
                    
if (buf[5] == 19Scroll 2//Arrow down
                    
if (buf[5] != 16 && buf[5] != 19Scroll 0;
                    }
                if (
buf[1] == 58){                                                 //Band preset
                    
FMS 2;
                    if (
buf[3] == 16DATA[39] = 0x00;
                    if (
buf[3] == 32DATA[39] = 0x01;
                    if (
buf[3] == 48DATA[39] = 0x02;
                    if (
buf[3] == 64DATA[39] = 0x03;
                    if (
buf[3] == 80DATA[39] = 0x04;
                    if (
buf[3] == 96DATA[39] = 0x05;
                    
Scroll 0;
                    }
                
CAN.sendMsgBuf(0x11F03DisplayAcknowledg);
             } 

              if(((
buf[0] >> 4) == 0x02) && LengthP != 0multiframef(); //проверка
              
if(((buf[0] >> 4) == 0x02) && LengthP == 0)
              {
              if (
Scroll == 0){
              
MULTIFRAME[0] = MULTIFRAMEFTMP[0];
              
MULTIFRAME[1] = MULTIFRAMEFTMP[1];
              for(
int i=0;i<=51;i++) MULTIFRAME[i+2] = MULTIFRAMETMP[i];}

              if (
Scroll == 1){ //Сдвиг вправо >>>>>
                
for (int i 26i>=0i--) MULTIFRAME[i+9] = MULTIFRAME[i];
                
MULTIFRAME[0] = MULTIFRAMEFTMP[0];
                
MULTIFRAME[1] = MULTIFRAMEFTMP[1];
                for (
int i 0i<7;i++) MULTIFRAME[i+2] = MULTIFRAMETMP[i];
                }

              if (
Scroll == 2){ //Сдвиг влево <<<<<
                
for (int i 0i<=26i++) MULTIFRAME[i] = MULTIFRAME[i+9];
                
MULTIFRAME[27] = MULTIFRAMEFTMP[0];
                
MULTIFRAME[28] = MULTIFRAMEFTMP[1];
                for (
int i 0i<7;i++) MULTIFRAME[i+29] = MULTIFRAMETMP[i];
                }
              for (
int i=0i<54i++) DATA[i+41] = MULTIFRAME[i];              
              if (
FMS == 1) {bitWrite(DATA[30],5,1); bitWrite(DATA[30],1,0); bitWrite(DATA[30],6,0); bitWrite(DATA[30],7,0);bitWrite(DATA[36],6,0);}
              if (
FMS == 2) {bitWrite(DATA[30],6,1); bitWrite(DATA[30],1,0); bitWrite(DATA[30],5,0); bitWrite(DATA[30],7,0);bitWrite(DATA[36],6,0);}
              }
  }
Compare true;
break;
//___________________________MULTIFRAME RADIOTEXT_________________________
case 0xA4
          if(
bitRead(DATA[21],5) == 1//A4 /164
          
{
              if ((
buf[0] >> 4) == 0x01){
                
LengthR = ((buf[0] & 0x0F) * 256 buf[1]) - 6;
                
DataBufSizeR 98;
                
DATA[96] = buf[6];
                
DATA[97] = buf[7];
                
CAN.sendMsgBuf(0x9F03DisplayAcknowledg);
              } 

              if(((
buf[0] >> 4) == 0x02) && LengthR 0) {
                 if (
LengthR 7)
                  {
                    for (
int i=07;i++) DATA[DataBufSizeR] = buf[i+1];
                    
DataBufSizeR DataBufSizeR 7;
                    
LengthR LengthR 7;
                 }
                  else{
                    for (
int i=0LengthR;i++) DATA[DataBufSizeR] = buf[i+1];
                   
LengthR 0;
                  }
            }
          }
Compare true;
break;
//_________________________________TRIP___________________________________
case 0xB6//B6 182
          
DATA[0] = buf[0];DATA[1] = buf[1]; //(int)buf[0] << 5 | buf[1] >> 3; //Обороты
          
DATA[2] = buf[2];DATA[3] = buf[3]; //((int)buf[2] << 8 | buf[3]) / 100; //скорость
Compare true;
break;
case 
0x221//HEX221 DEC545//(int)buf[1] << 8 | buf[2]; //моментальный расход / 10, если -1 то показаний нет
          
DATA[4] = buf[1];DATA[5] = buf[2]; 
          
          
//_________________/////////STEERING WEEL KEY_____________________
          
bitWrite(DATA[36],3,bitRead(buf[0],3)); //Кнопка на лепистке руля
            
if (bitRead(buf[0],3) == 1){ //Trip Reset
              
KeyCount KeyCount 1;
              if (
KeyCount 1CAN.sendMsgBuf(0x16708DisplayTripReset);
            }
            if (
bitRead(buf[0],3) == 0KeyCount 0;
          
//________________________________________________________________  
          
Compare true;
break;
case 
0x2A1:
          
DATA[6] = buf[3];DATA[7] = buf[4]; //2A1 673 //(int)buf[3] << 8 | buf [4]; //Расход на 100км /10
          
DATA[8] = buf[0]; //Средняя скорость
          
DATA[9] = buf[1];DATA[10] = buf[2]; //(int)buf[1] << 8 | buf [2];       //Трип
Compare true;
break;
case 
0xF6
          
DATA[11] = buf[6]; //0F6 //(buf[6] / 2) - 39; //246 F6//Температура
Compare true;
break;
//______________________________ERROR MSG_________________________________
case 0x1A1
          if (
bitRead(buf[2],7) == 1
            
DATA[12] = 0x01
          else 
            
DATA[12] = 0x00//1A1 //417
            
DATA[13] = buf[1]; //buf[2]bit[1] X00000000 X=1 when SHOW 0R buf[0] 0x80(128) show, 0x7F(127) hide, 0xff(255) clear (default)
Compare true;
break;
//________________________________BAT POWER_______________________________
case 0x0E6:
  
DATA[38] = buf[5];
Compare true;
break;
//_________________________________VOLUME_________________________________          
case 0x1A5//421 1A5
if(bitRead(DATA[30],1) == &&
   
bitRead(DATA[30],5) == &&
   
bitRead(DATA[30],6) == &&
   
bitRead(DATA[30],7) == &&
   
bitRead(DATA[36],6) == &&
   
bitRead(DATA[15],0) == 0) {
    
            if (
buf[0] <= 30){ 
            
DATA[14] = buf[0];
            
VolCount 0;
            }
            else {
              if (
VolCount 5VolCount VolCount +1;
              else 
DATA[14] = 0x1F//1A5
            
}
}
else 
DATA[14] = 31;

Compare true;
break;
//__________________________Меню настройки аудио__________________________
case 0x1E5:  //485 1E5
            
if (bitRead(buf[0],7) == || bitRead(buf[1],7) == || bitRead(buf[2],7) == || bitRead(buf[4],7) == || 
                
bitRead(buf[5],7) == || bitRead(buf[5],4) == || bitRead(buf[6],6) == 1){
                  if (
bitRead(buf[0],7) == 1){DATA[15] = 0x01DATA[16] = (buf[0] & 0x7F);}// - 63;} //BALANCE L/R ||логическое И с 01111111. Где 0 там всегда 0 
                  
if (bitRead(buf[1],7) == 1){DATA[15] = 0x02DATA[16] = (buf[1] & 0x7F);}// - 63;} //BALANCE RR/FF
                  
if (bitRead(buf[2],7) == 1){DATA[15] = 0x03DATA[16] = (buf[2] & 0x7F);}// - 63;} //BASS
                  
if (bitRead(buf[4],7) == 1){DATA[15] = 0x04DATA[16] = (buf[4] & 0x7F);}// - 63;} //TREBLE
                  
if (bitRead(buf[5],7) == 1){DATA[15] = 0x05DATA[16] = bitRead(buf[5],6);}    //LOUD
                  
if (bitRead(buf[5],4) == 1){DATA[15] = 0x06DATA[16] = bitRead(buf[5],2);}    //AUTO VOLUME
                  
if (bitRead(buf[6],6) == 1){DATA[15] = 0x07;
                                       if ((
buf[6] & 0x1F) == 3)DATA[16] = 1;  //NONE ||//Логическое И c 00011111
                                       
if ((buf[6] & 0x1F) == 7)DATA[16] = 2;  //CLASSIC
                                       
if ((buf[6] & 0x1F) == 11)DATA[16] = 3//JAZZ-BLUES
                                       
if ((buf[6] & 0x1F) == 15)DATA[16] = 4//POP-ROCK
                                       
if ((buf[6] & 0x1F) == 19)DATA[16] = 5//VOCAL
                                       
if ((buf[6] & 0x1F) == 23)DATA[16] = 6//TECHNO
                                       
}
                  }else 
DATA[15] = 0x00;
           
bitWrite(DATA[21],7,bitRead(buf[5],6));  //Значёк АКТИВНО ЛИ LOUDNESS
Compare true;
break;
//_______________Включено или нет радио, источник на радио________________
case 0x165//HEX165 DEC357
          
if (buf[0] == 192)DATA[17] = 0x01; else DATA[17] = 0x00//ON/OFF
          
if (buf[2] == 16){DATA[17] = 0x02;} //Radio
          
if (buf[2] == 32){DATA[17] = 0x03;} //CD
          
if (buf[2] == 48){DATA[17] = 0x04;} //CD-Changer
          
if (buf[2] == 64){DATA[17] = 0x05;} //AUX 1
          
if (buf[2] == 80){DATA[17] = 0x06;} //AUX 2
          
if (bitRead(buf[0],5) == 1bitWrite(DATA[18],7,1); else bitWrite(DATA[18],7,0); //Silence/Pause
Compare true;
break;
//_________________________Банды и частота радио__________________________
//первые 2 меняются иногда, последнии 3 незнамо что (мусор или уровень сигнала), 
//частота и мусор не пропадают при отключении магнитолы
case 0x225:
          if(
DATA[17] == 0x02//HEX225 DEC549
          
{
          
DATA[19] = buf[3];
          
DATA[20] = buf[4];
          
DATA[31] = buf[1]; //Станция забита на кнопку 1-6, если 0, то не забита
          
bitWrite(DATA[18],0,bitRead(buf[2],4)); //FM1     //(int)buf[3] << 8 | buf[4];} //RFR = RFR / 20 + 50;
          
bitWrite(DATA[18],1,bitRead(buf[2],5)); //FM2
          
bitWrite(DATA[18],2,bitRead(buf[2],6)); //FM AST
          
if (bitRead(buf[2],4) == && bitRead(buf[2],6) == 1)bitWrite(DATA[18],3,1); else bitWrite(DATA[18],3,0); //MW (int)buf[3] << 8 | buf[4];
          
bitWrite(DATA[18],4,bitRead(buf[0],2)); //PTY Scan. Show "PleaseWait". 0,2 показывает одно и то же?
          //bitWrite(DATA[18],5,bitRead(buf[0],7)); //после поиска PTY 1- нашли, 0- нет.
          
            
if (bitRead(buf[0],2) == 1Flag true;
            if (
bitRead(buf[0],2) == && Flag == true){ //ЭТО НАДО ТЕСТИТЬ!!! РЕАЛЬНО ЛИ ВСЕГДА ПОСЛЕ 2 ПАКЕТОВ ПРОИСХОДИТ ВЫВОД ИНФОРМАЦИИ О ТОМ, НАШЛИ ИЛИ НЕТ PTY .
            
Count Count 1;
              if (
Count 2){
              if (
bitRead(buf[0],7) == 0) {bitWrite(DATA[18],5,1);bitWrite(DATA[18],6,0);} //Serial.println("0");//
              
if (bitRead(buf[0],7) == 1) {bitWrite(DATA[18],5,0);bitWrite(DATA[18],6,1);} //Serial.println("1");//
              
Flag false;
              
Count 0;
              
Flag2 true;
              
Count2 0;
             }                               
            }
            if (
Flag2 == true){ //Держим окно висящим некоторое время
              
Count2Count2 1;
              if (
Count2 == 14){
                  
bitWrite(DATA[18],5,0);
                  
bitWrite(DATA[18],6,0);
                  
Count2 0;
                  
Flag2 false;
                }
            }
          }
Compare true;
break;
//_________________________________SIGNS__________________________________
case 0x1E0//1E0 480 Символы
           /*if(DATA[17] == 0x03) { //Если активен CD
              bitWrite(DATA[21],0,bitRead(buf[0],5));  //Track Intro
              bitWrite(DATA[21],1,bitRead(buf[0],2));  //Random Play
              bitWrite(DATA[21],2,bitRead(buf[1],7));  //CD Repeat 
           }*/
            
bitWrite(DATA[21],0,bitRead(buf[0],5));  //Track Intro
            
bitWrite(DATA[21],1,bitRead(buf[0],2));  //Random Play
            
bitWrite(DATA[21],2,bitRead(buf[1],7));  //CD Repeat 
            
bitWrite(DATA[21],3,bitRead(buf[2],5));  //RDS
            
bitWrite(DATA[21],4,bitRead(buf[3],7));  //REG
            
bitWrite(DATA[21],5,bitRead(buf[4],5));  //Radio text
Compare true;
break;
/*case 0x1A0:
            if(DATA[17] == 0x04){ //Если активен СD- CHANGER (ПРОВЕРИТЬ!)
               bitWrite(DATA[21],0,bitRead(buf[0],5));  //Track Intro
               bitWrite(DATA[21],1,bitRead(buf[0],2));  //Random Play
               bitWrite(DATA[21],2,bitRead(buf[1],7));  //CD Repeat       
            }
Compare = true;
break;*/
//___________________________________RDS__________________________________
case 0x2A5:
          if(
DATA[17] == 0x02//2A5 677 RDS
          
{
            if (
buf[0] != && buf[1] != && buf[2] != && buf[3] != && buf[4] != && buf[5] != && buf[6] != && buf[7] != && buf[8] != 0){
            for(
int i 22i<=29i++) DATA[i] = buf[i-22];}
            else
            {
DATA[22] = 0x20;DATA[23] = 0x4E;DATA[24] = 0x4F;DATA[25] = 0x20;
            
DATA[26] = 0x52;DATA[27] = 0x44;DATA[28] = 0x53;DATA[29] = 0x00;}
          }
Compare true;
break;
//_________________________________TA+PTY_________________________________
case 0x265//HEX265 DEC613
          
bitWrite(DATA[21],6,bitRead(buf[0],4)); //Значёк TA
          
bitWrite(DATA[30],0,bitRead(buf[1],7)); //Значёк PTY
          
bitWrite(DATA[30],1,bitRead(buf[1],6)); //PTY MENU SHOW
          
if (bitRead(buf[1],6)){
           
bitWrite(DATA[30],5,0);
           
bitWrite(DATA[30],7,0);
           
bitWrite(DATA[36],6,0);
           
bitWrite(DATA[15],0,0);
          }
          
bitWrite(DATA[30],2,bitRead(buf[1],5)); //Перечёркнутое PTY
          
bitWrite(DATA[30],3,bitRead(buf[0],5)); //Перечёркнутое RDS и REG
          
bitWrite(DATA[30],4,bitRead(buf[0],2)); //Перечёркнутое TA
          
DATA[32] = buf[2]; //PTY Selected Option
          
DATA[33] = buf[3]; //PTY Station Option
Compare true;
break;
//_________________________Кнопки на руле справа__________________________
case 0x21F//21F 543
          
bitWrite(DATA[34],0,bitRead(buf[0],7));  //Forward >
          
bitWrite(DATA[34],1,bitRead(buf[0],6)); //Backward <
          
if(bitRead(buf[0],3) == && bitRead(buf[0],2) == 1bitWrite(DATA[34],2,1); else bitWrite(DATA[34],2,0); //Mute
          
if(bitRead(buf[0],3) == && bitRead(buf[0],2) == 0bitWrite(DATA[34],3,1); else bitWrite(DATA[34],3,0); //Vol Up
          
if(bitRead(buf[0],2) == && bitRead(buf[0],3) == 0bitWrite(DATA[34],4,1); else bitWrite(DATA[34],4,0); //Vol Down
          
bitWrite(DATA[34],5,bitRead(buf[0],1)); //Source
          
DATA[37] = buf[1];
Compare true;
break;
//_____________________________Кнопки магнитолы___________________________
case 0x3E5//3E5 997
Activate false;
          
bitWrite(DATA[34],6,(bitRead(buf[0],6))); //Menu
          
bitWrite(DATA[34],7,(bitRead(buf[0],4))); //Tel
          
bitWrite(DATA[35],0,(bitRead(buf[0],0))); //Clim
          
bitWrite(DATA[35],1,(bitRead(buf[1],6))); //Trip
          
bitWrite(DATA[35],2,(bitRead(buf[1],4))); //Mode
          
bitWrite(DATA[35],3,(bitRead(buf[1],0))); //Audio
          
bitWrite(DATA[35],4,(bitRead(buf[2],6))); //Ok
          
bitWrite(DATA[35],5,(bitRead(buf[2],4))); //Esc
          
bitWrite(DATA[35],6,(bitRead(buf[2],2))); //Dark
          
bitWrite(DATA[35],7,(bitRead(buf[5],6))); //Up
          
bitWrite(DATA[36],0,(bitRead(buf[5],4))); //Down
          
bitWrite(DATA[36],1,(bitRead(buf[5],2))); //Right
          
bitWrite(DATA[36],2,(bitRead(buf[5],0))); //Left

          //ХОЖДЕНИЕ ПО MENU/ОТКРЫТИЕ/ЗАКРЫТИЕ/ПОДТВЕРЖДЕНИЕ
          
if (bitRead(buf[0],6) == 1) { //ОТКРЫТИЕ MENU
            
bitWrite(DATA[30],5,0);
            
bitWrite(DATA[30],6,0);
            
bitWrite(DATA[30],7,0);
            
bitWrite(DATA[36],7,0);
            
bitWrite(DATA[36],6,1);
            
bitWrite(DATA[36],5,0);
            
bitWrite(DATA[36],4,0);
            
time1 millis(); //Взводим таймаут основного меню.
            
DATA[39] = 0;
          }
/*          
      4- положение в корне меню
      5- 0 корень/1 элементы
      6- Menu закрыто/открыто
      7- Меню ОК в Menu не видно/видно
 */
          
if (bitRead(buf[2],4) == && bitRead(DATA[36],7) == 0bitWrite(DATA[36], 60); //ЗАКРЫТИЕ Menu
          
if (bitRead(buf[2],6) == && bitRead(DATA[36],6) == && bitRead(DATA[36],5) == && bitRead(DATA[36],7) == 0) {
            
bitWrite(DATA[36],7,1); //Нажатие на кнопку ОК. Если Menu открыто, то активируем окно с выбором [activate deactivate]
            
Activate true;
          }
          
          if (
bitRead(DATA[36], 6) == 1){ //ОТКРЫТОЕ Menu
            
           
if (bitRead(buf[2],4) == ||
               
bitRead(buf[2],6) == ||
               
bitRead(buf[5],0) == ||
               
bitRead(buf[5],2) == ||
               
bitRead(buf[5],4) == ||
               
bitRead(buf[5],6) == 1time1 millis(); //Сбрасываем таймаут основного меню если нажата какая либо кнопка.
            
            
if (bitRead(DATA[36], 4) == 0DATA[39] = (DATA[39] & B11000111) + (<< 3); //в бит 3-5 сначала его стираем, потом записываем 6. Это сколько ITEM в меню магнитолы
            
if (bitRead(DATA[36], 4) == 1DATA[39] = (DATA[39] & B11000111) + (<< 3); //итемов в меню машины
          
          
if (bitRead(DATA[36],7) == 0){ //Меню по кнопке ОК не выведено- бродим по основному меню
            
if (bitRead(buf[5],2) == && bitRead(DATA[36], 5) == 0  && (DATA[39] & B00111000) > 0bitWrite(DATA[36],5,1); //Переместились в MENU в ITEM
            
if (bitRead(buf[5],0) == && bitRead(DATA[36], 5) == 1bitWrite(DATA[36],5,0); //Переместились в MENU в ROOT

            
if (bitRead(buf[5],4) == && bitRead(DATA[36], 5) == && bitRead(DATA[36], 4) == 0) {
              
bitWrite(DATA[36],4,1); //преместились по корню Menu вниз
              
DATA[39] = DATA[39] & B11111000;
            }
            if (
bitRead(buf[5],6) == && bitRead(DATA[36], 5) == && bitRead(DATA[36], 4) == 1) {
              
bitWrite(DATA[36],4,0); //преместились по корню Menu вверх
              
DATA[39] = DATA[39] & B11111000;
            }
            
            if (
bitRead(DATA[36],5) == 1){ //Нахождение в Menu итем.
              
if (bitRead(buf[5],4) == && (DATA[39] & B00000111) < ((DATA[39] & B00111000) >> 3) - 1DATA[39] = DATA[39] + 1//перемещение вниз
              
if (bitRead(buf[5],6) == && (DATA[39] & B00000111) > 0DATA[39] = DATA[39] - 1//перемещение вниз
            
}
          }
          else 
//Меню по кнопке ОК выведено- бродим в нём
          
{
            if (
Once == true) {
              if (
bitRead(DATA[36], 4) == 0) { //В меню магнитолы
                
switch (DATA[39] & B00000111) {                                                    //Cтатус элемента.
                
case 0: if (bitRead(DATA[21],3) == 1bitWrite(DATA[39],7,1); else bitWrite(DATA[39],7,0); break; //RDS
                
case 1: if (bitRead(DATA[21],4) == 1bitWrite(DATA[39],7,1); else bitWrite(DATA[39],7,0); break; //REG
                
case 2: if (bitRead(DATA[21],5) == 1bitWrite(DATA[39],7,1); else bitWrite(DATA[39],7,0); break; //Radio Text
                
case 3: if (bitRead(DATA[21],0) == 1bitWrite(DATA[39],7,1); else bitWrite(DATA[39],7,0); break; //Intro
                
case 4: if (bitRead(DATA[21],1) == 1bitWrite(DATA[39],7,1); else bitWrite(DATA[39],7,0); break; //Random
                
case 5: if (bitRead(DATA[21],2) == 1bitWrite(DATA[39],7,1); else bitWrite(DATA[39],7,0); break; //Repeat
                
}
             }
             if (
bitRead(DATA[36], 4) == 1) { //В меню машины
                
switch (DATA[39] & B00000111) {
                  case 
0:
                  if (
EEPROM.read(0) == 0xC0bitWrite(DATA[39],7,0);
                  if (
EEPROM.read(0) == 0xD0bitWrite(DATA[39],7,1);
                  break;  
                }
             }
            }
            
            if (
bitRead(buf[5],2) == 1){ 
              
bitWrite(DATA[39],7,0); //Нажатие ВПРАВО
              
Once false;
            }
            if (
bitRead(buf[5],0) == 1){
              
bitWrite(DATA[39],7,1); //Нажатие ВЛЕВО
              
Once false;
            }
            if (
bitRead(buf[2],4) == 1){
              
bitWrite(DATA[36],7,0); //Нажатие Esc.  Закрываем Меню.
              
Once true;
            }
            if (
bitRead(buf[2],6) == 1  && !Activate){
              
bitWrite(DATA[36],7,0); //Нажатие на OK. Закрываем Меню.
             //Сравниваем что есть у элемента и что сейчас выбранно и если не совпадает, то отправляем пакет магнитоле
             
if (bitRead(DATA[36], 4) == 0) { //В меню магнитолы
              
switch (DATA[39] & B00000111) {
                case 
0: if (bitRead(DATA[21],3) != bitRead(DATA[39],7)) if (bitRead(DATA[39],7) == 1MenuElement(0x12,0x01); else MenuElement(0x11,0x01); break; //RDS
                
case 1: if (bitRead(DATA[21],4) != bitRead(DATA[39],7)) if (bitRead(DATA[39],7) == 1MenuElement(0x12,0x03); else MenuElement(0x11,0x03); break; //REG
                
case 2: if (bitRead(DATA[21],5) != bitRead(DATA[39],7)) if (bitRead(DATA[39],7) == 1MenuElement(0x12,0x24); else MenuElement(0x11,0x24); break; //Radio Text
                
case 3: if (bitRead(DATA[21],0) != bitRead(DATA[39],7)) if (bitRead(DATA[39],7) == 1MenuElement(0x12,0x41); else MenuElement(0x11,0x41); break; //Intro
                
case 4: if (bitRead(DATA[21],1) != bitRead(DATA[39],7)) if (bitRead(DATA[39],7) == 1MenuElement(0x12,0x42); else MenuElement(0x11,0x42); break; //Random
                
case 5: if (bitRead(DATA[21],2) != bitRead(DATA[39],7)) if (bitRead(DATA[39],7) == 1MenuElement(0x12,0x43); else MenuElement(0x11,0x43); break; //Repeat  
              
}
             }
             if (
bitRead(DATA[36], 4) == 1) { //В меню машины
              
switch (DATA[39] & B00000111) {
               case 
0//Rear Wiper
                
if (bitRead(DATA[39],7) == && EEPROM.read(0) == 0xD0) {
                  
EEPROM.write(00xC0); //Inactivaited
                  
bitWrite(DATA[161],1,0);
                  
DisplayCarOpt[5] = 0xC0;
                }
                if (
bitRead(DATA[39],7) == && EEPROM.read(0) == 0xC0) {
                  
EEPROM.write(00xD0); //Activaited
                  
bitWrite(DATA[161],1,1);
                  
DisplayCarOpt[5] = 0xD0;
                }
               break;  
              }
             }
              
Once true;
            }
            
Activate false;
          }
          
          }
          
//____________________________________
          
Compare true;
break;
//___________________________________CD___________________________________
case 0x365
          if(
DATA[17] == 0x03
          
DATA[20] = buf[0]; //HEX365 DEC869 Это сколько всего треков
Compare true;
break;          
case 
0x3A5
          if(
DATA[17] == 0x03//3A5 933 Это номер трека и время CD
          
{
            if (
buf[3] == 255 && buf[4] == 127){
            
DATA[22] = 0x20;DATA[23] = 0x20;DATA[24] = 0x20;DATA[25] = 0x2D;DATA[26] = 0x2D;DATA[27] = 0x3A;DATA[28] = 0x2D;DATA[29] = 0x2D;}
            else {
            
converter(buf[0]);
            
DATA[22] = digit1;
            
DATA[23] = digit2;
            
DATA[24] = 0x2D;
            
converter(buf[3]);
            
DATA[25] = digit1;
            
DATA[26] = digit2;
            
DATA[27] = 0x3A;
            
converter(buf[4]);
            
DATA[28] = digit1;
            
DATA[29] = digit2;
            }  
          }
Compare true;
break;
//______________________________CD CHANGER________________________________
case 0x162:
          if(
DATA[17] == 0x04DATA[19] = buf[3]; //HEX162 DEC354 Диск
Compare true;
break;
case 
0x1A2:          
          if(
DATA[17] == 0x04DATA[20] = buf[0]; //1A2 418 Это сколько треков на диске ченджера
Compare true;
break;
case 
0x1E2:
          if(
DATA[17] == 0x04//1E2 482 Это трек и время ченджера
          
{
            if (
buf[3] == 255 && buf[4] == 127){
            
DATA[22] = 0x20;DATA[23] = 0x20;DATA[24] = 0x20;DATA[25] = 0x2D;DATA[26] = 0x2D;DATA[27] = 0x3A;DATA[28] = 0x2D;DATA[29] = 0x2D;}
            else {
            
converter(buf[0]);
            
DATA[22] = digit1;
            
DATA[23] = digit2;
            
DATA[24] = 0x2D;
            
converter(buf[3]);
            
DATA[25] = digit1;
            
DATA[26] = digit2;
            
DATA[27] = 0x3A;
            
converter(buf[4]);
            
DATA[28] = digit1;
            
DATA[29] = digit2;
            }
          }
Compare true;
break;
//_______________________________Car options______________________________
case 0x361:
  if (
buf[2] == 0x10bitWrite(DATA[161],0,1); else bitWrite(DATA[161],0,0); //Rear wiper options
Compare true;
break;
//________________________________________________________________________
//Switch 
//if DigitalPin 9
//________________________________________________________________________

if ((millis() - time0) > 100 && Compare == true){
arrcmp memcmp(DATA,DATA2,162);
  if (
arrcmp != 0)
  {
      
Serial.write(DATA162); //41 + 54 +64
      
memcpy(DATA2,DATA,162); //Присваиваем массиву DATA2 161 байт массива DATA
  
}
time0 millis();
Compare false;
}

//void loop

void converter(int inpint){
              if (
inpint 10){
                
digit1 48;
                
digit2 inpint 48;
              }
              else{
                if (
inpint 89) {digit1 48digit2 inpint 42;}
                else if (
inpint 79) {digit1 48digit2 inpint 32;}
                     else if (
inpint 69) {digit1 48digit2 inpint 22;}
                          else if (
inpint 59) {digit1 48digit2 inpint 12;}
                               else if (
inpint 49) {digit1 48digit2 inpint 2;}
                                    else if (
inpint 39) {digit1 48digit2 inpint 8;}
                                         else if (
inpint 29) {digit1 48digit2 inpint 18;}
                                              else if (
inpint 19) {digit1 48digit2 inpint 28;}
                                                   else if (
inpint 9) {digit1 48digit2 inpint 38;}
              }
}

void multiframef(){
              if (
LengthP 7)
              {
                for (
int i=07;i++) MULTIFRAMETMP[DataBufSize] = buf[i+1];
                
DataBufSize DataBufSize 7;
                
LengthP LengthP 7;
              }
              else{
                for (
int i=0LengthP;i++) MULTIFRAMETMP[DataBufSize] = buf[i+1];
                
LengthP 0;
              }
}

void MenuElement(byte OutSend1byte OutSend2){
unsigned char OutSend[3] = {OutSend1,OutSend2,0x50};
time2 millis() - 50;
CAN.sendMsgBuf(0xDF03OutSend);

T_r_D вне форума   Ответить с цитированием
Старый 11.05.2016, 13:50   #328
T_r_D
Старший Пользователь
 
Регистрация: 03.07.2015
Регион: 77, 97, 99, 177
Сообщений: 372
T_r_D is a jewel in the roughT_r_D is a jewel in the roughT_r_D is a jewel in the rough
По умолчанию

Garen
Если в ситроен C4 первой генерации, то Lenovo tab 2 A7.
Встаёт идеально в штатную рамку. Единственное что нужно будет использовать, так это угловые USB, а то с простыми будет тяжко. Я для себя вообще спаял самопал длинной по 5см, а корпус USB просто из термоклея сделал.
T_r_D вне форума   Ответить с цитированием
Старый 13.05.2016, 12:55   #329
T_r_D
Старший Пользователь
 
Регистрация: 03.07.2015
Регион: 77, 97, 99, 177
Сообщений: 372
T_r_D is a jewel in the roughT_r_D is a jewel in the roughT_r_D is a jewel in the rough
По умолчанию

Оттестировал в машине скетч который выше- всё работает.
Трип сбрасывается, задний дворник включается.

Так что настройки машины которые делаются при помощи магнитолы и отображаются на дисплеи хранятся в дисплее.
T_r_D вне форума   Ответить с цитированием
Старый 28.06.2016, 12:37   #330
T_r_D
Старший Пользователь
 
Регистрация: 03.07.2015
Регион: 77, 97, 99, 177
Сообщений: 372
T_r_D is a jewel in the roughT_r_D is a jewel in the roughT_r_D is a jewel in the rough
По умолчанию

Итак, я наконец запихал это в машину!
https://www.dropbox.com/s/kblf9ba908...93347.3gp?dl=0
T_r_D вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

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

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



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


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