вот код- сильно не пинать, потом окультурю
PHP код:
#include <SPI.h> #include "mcp_can.h" MCP_CAN CAN(10); unsigned char len = 0; unsigned char buf[8]; INT32U canId = 0x000; unsigned long time0 = -120;
//RDS int digit1, digit2;
uint8_t DATA[162] = {}; uint8_t DATA2[162] = {}; boolean Flag = false; boolean Flag2 = false; int Count = 0; int Count2 = 0; int FMS = 0; int VolCount = 5; int arrcmp;
//Multiframe int LengthP; int DataBufSize; int Scroll = 0; uint8_t MULTIFRAMEFTMP[3] = {}; uint8_t MULTIFRAMETMP[54] = {}; uint8_t MULTIFRAME[55] = {}; //Multiframe RDTxT //Package length: 64 int LengthR; int DataBufSizeR;
void setup() { DATA[14] = 0x20; Serial.begin(115200); pinMode(9, INPUT); CAN.begin(CAN_125KBPS,MCP_8MHz); }
unsigned long time2 = 0; unsigned char stmp[8] = {14, 0, 0, 15, 1, 0, 0, 160};
void loop() { // if ((millis() - time2) > 100){ // CAN.sendMsgBuf(0x036, 0, 8, stmp); //Это пакет зажигания. // time2 = millis();} if(!digitalRead(9)) { CAN.readMsgBuf(&len, buf); canId = CAN.getCanId();
if(canId == 0x125) { 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]; if (buf[1] == 112 && buf[0] == 6){ bitWrite(DATA[30],7,1); bitWrite(DATA[30],5,0); bitWrite(DATA[30],6,0); 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; if (buf[4] == 19) Scroll = 2; 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){ FMS = 1; 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; if (buf[5] == 19) Scroll = 2; if (buf[5] != 16 && buf[5] != 19) Scroll = 0; } if (buf[1] == 58){ 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; } }
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],6,0); bitWrite(DATA[30],7,0);} if (FMS == 2) {bitWrite(DATA[30],6,1); bitWrite(DATA[30],5,0); bitWrite(DATA[30],7,0);} } } } if(canId == 0xA4 && bitRead(DATA[21],5) == 1) { if ((buf[0] >> 4) == 0x01){ LengthR = ((buf[0] & 0x0F) * 256 + buf[1]) - 6; DataBufSizeR = 98; DATA[96] = buf[6]; DATA[97] = buf[7]; }
if(((buf[0] >> 4) == 0x02) && LengthR > 0) multiframeRF(); if(((buf[0] >> 4) == 0x02) && LengthR == 0){ } } if(canId == 0xB6){ DATA[0] = buf[0];DATA[1] = buf[1]; DATA[2] = buf[2];DATA[3] = buf[3];} if(canId == 0x221){DATA[4] = buf[1];DATA[5] = buf[2]; bitWrite(DATA[36],3,bitRead(buf[0],3));} if(canId == 0x2A1){DATA[6] = buf[3];DATA[7] = buf[4];<< 8 | buf [4]; DATA[8] = buf[0]; DATA[9] = buf[1];DATA[10] = buf[2];} if(canId == 0xF6) DATA[11] = buf[6]; if(canId == 0x1A1){if (bitRead(buf[2],7) == 1) DATA[12] = 0x01; else DATA[12] = 0x00; DATA[13] = buf[1];} if(canId == 0x1A5) //421 1A5 if (buf[0] <= 30){ DATA[14] = buf[0]; VolCount = 0; } else { if (VolCount < 5) VolCount = VolCount +1; else DATA[14] = 0x1F; } if(canId == 0x1E5){ 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);} if (bitRead(buf[1],7) == 1){DATA[15] = 0x02; DATA[16] = (buf[1] & 0x7F);} if (bitRead(buf[2],7) == 1){DATA[15] = 0x03; DATA[16] = (buf[2] & 0x7F);} if (bitRead(buf[4],7) == 1){DATA[15] = 0x04; DATA[16] = (buf[4] & 0x7F);} if (bitRead(buf[5],7) == 1){DATA[15] = 0x05; DATA[16] = bitRead(buf[5],6);} if (bitRead(buf[5],4) == 1){DATA[15] = 0x06; DATA[16] = bitRead(buf[5],2);} if (bitRead(buf[6],6) == 1){DATA[15] = 0x07; if ((buf[6] & 0x1F) == 3)DATA[16] = 1; if ((buf[6] & 0x1F) == 7)DATA[16] = 2; if ((buf[6] & 0x1F) == 11)DATA[16] = 3; if ((buf[6] & 0x1F) == 15)DATA[16] = 4; if ((buf[6] & 0x1F) == 19)DATA[16] = 5; if ((buf[6] & 0x1F) == 23)DATA[16] = 6; } }else DATA[15] = 0x00; bitWrite(DATA[21],7,bitRead(buf[5],6)); }
if(canId == 0x165) { if (buf[0] == 192)DATA[17] = 0x01; else DATA[17] = 0x00; if (buf[2] == 16){DATA[17] = 0x02;} if (buf[2] == 32){DATA[17] = 0x03;} if (buf[2] == 48){DATA[17] = 0x04;} if (buf[2] == 64){DATA[17] = 0x05;} if (buf[2] == 80){DATA[17] = 0x06;} } if(canId == 0x225 && DATA[17] == 0x02) { DATA[19] = buf[3]; DATA[20] = buf[4]; DATA[31] = buf[1]; bitWrite(DATA[18],0,bitRead(buf[2],4)); bitWrite(DATA[18],1,bitRead(buf[2],5)); bitWrite(DATA[18],2,bitRead(buf[2],6)); if (bitRead(buf[2],4) == 1 && bitRead(buf[2],6) == 1)bitWrite(DATA[18],3,1); else bitWrite(DATA[18],3,0); bitWrite(DATA[18],4,bitRead(buf[0],2)); //bitWrite(DATA[18],5,bitRead(buf[0],7)); if (bitRead(buf[0],2) == 1) Flag = true; if (bitRead(buf[0],2) == 0 && Flag == true){ Count = Count + 1; if (Count > 2){ if (bitRead(buf[0],7) == 0) {bitWrite(DATA[18],5,1);bitWrite(DATA[18],6,0);} if (bitRead(buf[0],7) == 1) {bitWrite(DATA[18],5,0);bitWrite(DATA[18],6,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; } } } if(canId == 0x1E0) { bitWrite(DATA[21],0,bitRead(buf[0],5)); bitWrite(DATA[21],1,bitRead(buf[0],2)); bitWrite(DATA[21],2,bitRead(buf[1],7)); bitWrite(DATA[21],3,bitRead(buf[2],5)); bitWrite(DATA[21],4,bitRead(buf[3],7)); bitWrite(DATA[21],5,bitRead(buf[4],5)); } if(canId == 0x2A5 && DATA[17] == 0x02) { 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;} } if(canId == 0x365 && DATA[17] == 0x03) DATA[20] = buf[0]; if(canId == 0x3A5 && DATA[17] == 0x03) { 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; } } if (DATA[17] == 0x04) { if(canId == 0x162) DATA[19] = buf[3]; if(canId == 0x1A2) DATA[20] = buf[0]; if(canId == 0x1E2) { 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; } } }
if(canId == 0x265) { bitWrite(DATA[21],6,bitRead(buf[0],4)); bitWrite(DATA[30],0,bitRead(buf[1],7)); bitWrite(DATA[30],1,bitRead(buf[1],6)); bitWrite(DATA[30],2,bitRead(buf[1],5)); bitWrite(DATA[30],3,bitRead(buf[0],5)); bitWrite(DATA[30],4,bitRead(buf[0],2)); DATA[32] = buf[2]; DATA[33] = buf[3]; }
if(canId == 0x21F) { bitWrite(DATA[34],0,bitRead(buf[0],7)); bitWrite(DATA[34],1,bitRead(buf[0],6)); if(bitRead(buf[0],3) == 1 && bitRead(buf[0],2) == 1) bitWrite(DATA[34],2,1); else bitWrite(DATA[34],2,0); if(bitRead(buf[0],3) == 1 && bitRead(buf[0],2) == 0) bitWrite(DATA[34],3,1); else bitWrite(DATA[34],3,0); if(bitRead(buf[0],2) == 1 && bitRead(buf[0],3) == 0) bitWrite(DATA[34],4,1); else bitWrite(DATA[34],4,0); bitWrite(DATA[34],5,bitRead(buf[0],1)); DATA[37] = buf[1]; }
if(canId == 0x3E5) { bitWrite(DATA[34],6,(bitRead(buf[0],6))); bitWrite(DATA[34],7,(bitRead(buf[0],4))); bitWrite(DATA[35],0,(bitRead(buf[0],0))); bitWrite(DATA[35],1,(bitRead(buf[1],6))); bitWrite(DATA[35],2,(bitRead(buf[1],4))); bitWrite(DATA[35],3,(bitRead(buf[1],0))); bitWrite(DATA[35],4,(bitRead(buf[2],6))); bitWrite(DATA[35],5,(bitRead(buf[2],4))); bitWrite(DATA[35],6,(bitRead(buf[2],2))); bitWrite(DATA[35],7,(bitRead(buf[5],6))); bitWrite(DATA[36],0,(bitRead(buf[5],4))); bitWrite(DATA[36],1,(bitRead(buf[5],2))); bitWrite(DATA[36],2,(bitRead(buf[5],0))); } }
//delay(2); //Не знаю зачем, но без этого и со строкой выше высыпается каша! arrcmp = memcmp(DATA,DATA2,161); if ((millis() - time0) > 100 && arrcmp != 0){ Serial.write(DATA, 161); memcpy(DATA2,DATA,161); time0 = millis();} }
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 multiframeRF(){ 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; } }
|