Старший Пользователь
Регистрация: 03.07.2015
Регион: 77, 97, 99, 177
Сообщений: 372
|
А вот кстати скетч финальный.
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); }
|