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
Возраст: 42
Регион: 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 digit1, digit2;

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] = {14, 0, 0, 0x0F, 1, 0, 0, 16}; //Зажигание 0x036
unsigned char DisplayAtOnce[8] = {0x25,0xA,0xB,0x4,0xC,0x1,0x20, 0x11}; //Один раз при старте 0x5E5
unsigned char Display[8] = {0xA,0x6,0xFF,0xFF,0x7F,0xFF,0x0, 0x0}; //Дисплей в режиме трипа (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,0x0, 0x0}; //Дисплей в режиме трипа (0bit A). Сброс трипа. 0x167 (сброс работал при 89 проверить с А).
unsigned char DisplayCarOpt[8] = {0x01, 0x03, 0x92, 0x40, 0x00, 0, 0x00, 0x10};
void setup()
{
    
Serial.begin(230400);
    
pinMode(9, INPUT);
    
CAN.begin(CAN_125KBPS,MCP_16MHz);
    
CAN.sendMsgBuf(0x5E5, 0, 8, DisplayAtOnce);
    
DATA[14] = 0x20;
                           
// 01 03 92 40 00 C0 00 10
                           //byte5 for 0x15B C0- Rear wipe inactive, D0 - active
                           
    
if (EEPROM.read(0) == 0xC0) bitWrite(DATA[161],1,0);
    if (
EEPROM.read(0) == 0xD0) bitWrite(DATA[161],1,1);
    
DisplayCarOpt[5] = EEPROM.read(0);
}

void loop()
{
//***********************************************************
  
if ((millis() - time2) > 100){
  
CAN.sendMsgBuf(0x036, 0, 8, Ignition); //Это пакет зажигания.
  
CAN.sendMsgBuf(0x167, 0, 8, Display);
  
CAN.sendMsgBuf(0x15B, 0, 8, DisplayCarOpt);
  
  if(
bitRead(DATA[30],1) == 1 ||
     
bitRead(DATA[30],5) == 1 ||
     
bitRead(DATA[30],7) == 1 ||
     
bitRead(DATA[36],6) == 1 ||
     
DATA[15] != 0) {
      
DATA[14] = 31;
      if (
bitRead(DATA[36],6) == 0) CAN.sendMsgBuf(0xDF, 0, 3, DisplayOpenMenu);
      else 
CAN.sendMsgBuf(0xDF, 0, 3, DisplayOpenMMenu);
  }
  else 
CAN.sendMsgBuf(0xDF, 0, 3, DisplayCloseMenu);  
  
time2 = millis();
  }
//***********************************************************
if ((millis() - time1) == 10000) bitWrite(DATA[36],6,0); //Таймаут главного меню.

  
if(!digitalRead(9)) // пин 9 можно переназначить                       
{
CAN.readMsgBuf(&len, buf);
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(MULTIFRAMEFTMP, 0, sizeof(MULTIFRAMEFTMP)); //Стираем что было в массиве.
     
memset(MULTIFRAMETMP, 0, sizeof(MULTIFRAMETMP));
     
memset(MULTIFRAME, 0, sizeof(MULTIFRAME));
     for (
int i=0; i<55; i++) DATA[i+41] = 0x00;
  }
  else {              
              if (
buf[0] == 4) DATA[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]!=67) DATA[39] = buf[4];
                   else {
                    if (
buf[4] == 16 || buf[4] == 64) DATA[39] = 0x00;
                    if (
buf[4] == 65) DATA[39] = 0x01;
                    if (
buf[4] == 66) DATA[39] = 0x02;
                    if (
buf[4] == 19 || buf[4] == 67) DATA[39] = 0x03;
                    }
                    if (
buf[4] == 16) Scroll = 1; //Arrow up
                    
if (buf[4] == 19) Scroll = 2; //Arrow down
                    
if (buf[4] != 16 && buf[5] != 19) Scroll = 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] == 16) DATA[39] = 0x00;
                    if (
buf[5] == 65 || buf[5] == 33) DATA[39] = 0x01;
                    if (
buf[5] == 66 || buf[5] == 50) DATA[39] = 0x02;
                    if (
buf[5] == 67 || buf[5] == 19) DATA[39] = 0x03;
                    if (
buf[5] == 16) Scroll = 1; //Arrow up
                    
if (buf[5] == 19) Scroll = 2; //Arrow down
                    
if (buf[5] != 16 && buf[5] != 19) Scroll = 0;
                    }
                if (
buf[1] == 58){                                                 //Band preset
                    
FMS = 2;
                    if (
buf[3] == 16) DATA[39] = 0x00;
                    if (
buf[3] == 32) DATA[39] = 0x01;
                    if (
buf[3] == 48) DATA[39] = 0x02;
                    if (
buf[3] == 64) DATA[39] = 0x03;
                    if (
buf[3] == 80) DATA[39] = 0x04;
                    if (
buf[3] == 96) DATA[39] = 0x05;
                    
Scroll = 0;
                    }
                
CAN.sendMsgBuf(0x11F, 0, 3, DisplayAcknowledg);
             } 

              if(((
buf[0] >> 4) == 0x02) && LengthP != 0) multiframef(); //проверка
              
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 = 26; i>=0; i--) MULTIFRAME[i+9] = MULTIFRAME[i];
                
MULTIFRAME[0] = MULTIFRAMEFTMP[0];
                
MULTIFRAME[1] = MULTIFRAMEFTMP[1];
                for (
int i = 0; i<7;i++) MULTIFRAME[i+2] = MULTIFRAMETMP[i];
                }

              if (
Scroll == 2){ //Сдвиг влево <<<<<
                
for (int i = 0; i<=26; i++) MULTIFRAME[i] = MULTIFRAME[i+9];
                
MULTIFRAME[27] = MULTIFRAMEFTMP[0];
                
MULTIFRAME[28] = MULTIFRAMEFTMP[1];
                for (
int i = 0; i<7;i++) MULTIFRAME[i+29] = MULTIFRAMETMP[i];
                }
              for (
int i=0; i<54; i++) 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(0x9F, 0, 3, DisplayAcknowledg);
              } 

              if(((
buf[0] >> 4) == 0x02) && LengthR > 0) {
                 if (
LengthR > 7)
                  {
                    for (
int i=0; i < 7;i++) DATA[i + DataBufSizeR] = buf[i+1];
                    
DataBufSizeR = DataBufSizeR + 7;
                    
LengthR = LengthR - 7;
                 }
                  else{
                    for (
int i=0; i < LengthR;i++) DATA[i + 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 > 1) CAN.sendMsgBuf(0x167, 0, 8, DisplayTripReset);
            }
            if (
bitRead(buf[0],3) == 0) KeyCount = 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) == 0 &&
   
bitRead(DATA[30],5) == 0 &&
   
bitRead(DATA[30],6) == 0 &&
   
bitRead(DATA[30],7) == 0 &&
   
bitRead(DATA[36],6) == 0 &&
   
bitRead(DATA[15],0) == 0) {
    
            if (
buf[0] <= 30){ 
            
DATA[14] = buf[0];
            
VolCount = 0;
            }
            else {
              if (
VolCount < 5) VolCount = VolCount +1;
              else 
DATA[14] = 0x1F; //1A5
            
}
}
else 
DATA[14] = 31;

Compare = true;
break;
//__________________________Меню настройки аудио__________________________
case 0x1E5:  //485 1E5
            
if (bitRead(buf[0],7) == 1 || bitRead(buf[1],7) == 1 || bitRead(buf[2],7) == 1 || bitRead(buf[4],7) == 1 || 
                
bitRead(buf[5],7) == 1 || bitRead(buf[5],4) == 1 || bitRead(buf[6],6) == 1){
                  if (
bitRead(buf[0],7) == 1){DATA[15] = 0x01; DATA[16] = (buf[0] & 0x7F);}// - 63;} //BALANCE L/R ||логическое И с 01111111. Где 0 там всегда 0 
                  
if (bitRead(buf[1],7) == 1){DATA[15] = 0x02; DATA[16] = (buf[1] & 0x7F);}// - 63;} //BALANCE RR/FF
                  
if (bitRead(buf[2],7) == 1){DATA[15] = 0x03; DATA[16] = (buf[2] & 0x7F);}// - 63;} //BASS
                  
if (bitRead(buf[4],7) == 1){DATA[15] = 0x04; DATA[16] = (buf[4] & 0x7F);}// - 63;} //TREBLE
                  
if (bitRead(buf[5],7) == 1){DATA[15] = 0x05; DATA[16] = bitRead(buf[5],6);}    //LOUD
                  
if (bitRead(buf[5],4) == 1){DATA[15] = 0x06; DATA[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) == 1) bitWrite(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) == 1 && 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) == 1) Flag = true;
            if (
bitRead(buf[0],2) == 0 && 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){ //Держим окно висящим некоторое время
              
Count2= Count2 + 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] != 0 && buf[1] != 0 && buf[2] != 0 && buf[3] != 0 && buf[4] != 0 && buf[5] != 0 && buf[6] != 0 && buf[7] != 0 && buf[8] != 0){
            for(
int i = 22; i<=29; i++) 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) == 1 && bitRead(buf[0],2) == 1) bitWrite(DATA[34],2,1); else bitWrite(DATA[34],2,0); //Mute
          
if(bitRead(buf[0],3) == 1 && bitRead(buf[0],2) == 0) bitWrite(DATA[34],3,1); else bitWrite(DATA[34],3,0); //Vol Up
          
if(bitRead(buf[0],2) == 1 && bitRead(buf[0],3) == 0) bitWrite(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) == 1 && bitRead(DATA[36],7) == 0) bitWrite(DATA[36], 6, 0); //ЗАКРЫТИЕ Menu
          
if (bitRead(buf[2],6) == 1 && bitRead(DATA[36],6) == 1 && bitRead(DATA[36],5) == 1 && 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) == 1 ||
               
bitRead(buf[2],6) == 1 ||
               
bitRead(buf[5],0) == 1 ||
               
bitRead(buf[5],2) == 1 ||
               
bitRead(buf[5],4) == 1 ||
               
bitRead(buf[5],6) == 1) time1 = millis(); //Сбрасываем таймаут основного меню если нажата какая либо кнопка.
            
            
if (bitRead(DATA[36], 4) == 0) DATA[39] = (DATA[39] & B11000111) + (6 << 3); //в бит 3-5 сначала его стираем, потом записываем 6. Это сколько ITEM в меню магнитолы
            
if (bitRead(DATA[36], 4) == 1) DATA[39] = (DATA[39] & B11000111) + (1 << 3); //итемов в меню машины
          
          
if (bitRead(DATA[36],7) == 0){ //Меню по кнопке ОК не выведено- бродим по основному меню
            
if (bitRead(buf[5],2) == 1 && bitRead(DATA[36], 5) == 0  && (DATA[39] & B00111000) > 0) bitWrite(DATA[36],5,1); //Переместились в MENU в ITEM
            
if (bitRead(buf[5],0) == 1 && bitRead(DATA[36], 5) == 1) bitWrite(DATA[36],5,0); //Переместились в MENU в ROOT

            
if (bitRead(buf[5],4) == 1 && bitRead(DATA[36], 5) == 0 && bitRead(DATA[36], 4) == 0) {
              
bitWrite(DATA[36],4,1); //преместились по корню Menu вниз
              
DATA[39] = DATA[39] & B11111000;
            }
            if (
bitRead(buf[5],6) == 1 && bitRead(DATA[36], 5) == 0 && 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) == 1 && (DATA[39] & B00000111) < ((DATA[39] & B00111000) >> 3) - 1) DATA[39] = DATA[39] + 1; //перемещение вниз
              
if (bitRead(buf[5],6) == 1 && (DATA[39] & B00000111) > 0) DATA[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) == 1) bitWrite(DATA[39],7,1); else bitWrite(DATA[39],7,0); break; //RDS
                
case 1: if (bitRead(DATA[21],4) == 1) bitWrite(DATA[39],7,1); else bitWrite(DATA[39],7,0); break; //REG
                
case 2: if (bitRead(DATA[21],5) == 1) bitWrite(DATA[39],7,1); else bitWrite(DATA[39],7,0); break; //Radio Text
                
case 3: if (bitRead(DATA[21],0) == 1) bitWrite(DATA[39],7,1); else bitWrite(DATA[39],7,0); break; //Intro
                
case 4: if (bitRead(DATA[21],1) == 1) bitWrite(DATA[39],7,1); else bitWrite(DATA[39],7,0); break; //Random
                
case 5: if (bitRead(DATA[21],2) == 1) bitWrite(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) == 0xC0) bitWrite(DATA[39],7,0);
                  if (
EEPROM.read(0) == 0xD0) bitWrite(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) == 1) MenuElement(0x12,0x01); else MenuElement(0x11,0x01); break; //RDS
                
case 1: if (bitRead(DATA[21],4) != bitRead(DATA[39],7)) if (bitRead(DATA[39],7) == 1) MenuElement(0x12,0x03); else MenuElement(0x11,0x03); break; //REG
                
case 2: if (bitRead(DATA[21],5) != bitRead(DATA[39],7)) if (bitRead(DATA[39],7) == 1) MenuElement(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) == 1) MenuElement(0x12,0x41); else MenuElement(0x11,0x41); break; //Intro
                
case 4: if (bitRead(DATA[21],1) != bitRead(DATA[39],7)) if (bitRead(DATA[39],7) == 1) MenuElement(0x12,0x42); else MenuElement(0x11,0x42); break; //Random
                
case 5: if (bitRead(DATA[21],2) != bitRead(DATA[39],7)) if (bitRead(DATA[39],7) == 1) MenuElement(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) == 0 && EEPROM.read(0) == 0xD0) {
                  
EEPROM.write(0, 0xC0); //Inactivaited
                  
bitWrite(DATA[161],1,0);
                  
DisplayCarOpt[5] = 0xC0;
                }
                if (
bitRead(DATA[39],7) == 1 && EEPROM.read(0) == 0xC0) {
                  
EEPROM.write(0, 0xD0); //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] == 0x04) DATA[19] = buf[3]; //HEX162 DEC354 Диск
Compare = true;
break;
case 
0x1A2:          
          if(
DATA[17] == 0x04) DATA[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] == 0x10) bitWrite(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(DATA, 162); //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 = 9 + 48; digit2 = inpint - 42;}
                else if (
inpint > 79) {digit1 = 8 + 48; digit2 = inpint - 32;}
                     else if (
inpint > 69) {digit1 = 7 + 48; digit2 = inpint - 22;}
                          else if (
inpint > 59) {digit1 = 6 + 48; digit2 = inpint - 12;}
                               else if (
inpint > 49) {digit1 = 5 + 48; digit2 = inpint - 2;}
                                    else if (
inpint > 39) {digit1 = 4 + 48; digit2 = inpint + 8;}
                                         else if (
inpint > 29) {digit1 = 3 + 48; digit2 = inpint + 18;}
                                              else if (
inpint > 19) {digit1 = 2 + 48; digit2 = inpint + 28;}
                                                   else if (
inpint > 9) {digit1 = 1 + 48; digit2 = inpint + 38;}
              }
}

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

void MenuElement(byte OutSend1, byte OutSend2){
unsigned char OutSend[3] = {OutSend1,OutSend2,0x50};
time2 = millis() - 50;
CAN.sendMsgBuf(0xDF, 0, 3, OutSend);
} 
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, время: 16:54.


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