Тема: CITROEN-ARDUINO
Показать сообщение отдельно
Старый 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 вне форума   Ответить с цитированием