#include <SoftwareSerial.h>
SoftwareSerial IBusSerial(11,10); // RX, TX for IBus
//Lbus = Ibus from Car
//Vss = Ground
//Vbb = +12V do Pin LWAKE - Rezystor 220ohm
// Pins we use for MCP2025
const int cspin = 8; //CS
boolean read_byte = false;
byte readbuffer[64];
int i;
int buffer_index = 0;
int buffer_max = 64; // 64 default
int cksum;
long lastrx;
long lasttx;
char *Buffer = new char[buffer_max];
boolean byteSTATE = false;
int EventID = 0; // Event number (for case select)
byte volup[6] = {0x50,0x4,0x68,0x32,0x11,0x1F}; // Steering wheel Volume Up
//char volume_up[]="\x50\x04\x68\x32\x11\x1F";
byte voldown[6] = { 0x50 , 0x4 , 0x68 , 0x32, 0x10 , 0x1E }; // Steering wheel Volume Down
//50 4 68 32 11 1F
//50 4 68 32 10 1E
byte pressmode[6] = { 0xF0, 0x4, 0x68, 0x48, 0x23, 0xF7 };
byte pressmenu[6] = {0x68,0x4,0x3B,0x46,0x1,0x10}; //Menu Klikniecie
byte showmenu[6] = {0x68,0x4,0x3B,0x46,0xC,0x1D}; //Menu Pokazanie
byte releasemode[6] = { 0xF0, 0x4, 0x68, 0x48, 0xA3, 0x77 };
//MENU 68 4 3B 46 1 10
////68 4 3B 46 C 1D
byte ibussucks[22] = {
0x68, 0x12, 0x3B, 0x23, 0x62, 0x10, 0x49, 0x42, 0x55,
0x53, 0x53, 0x55, 0x43, 0x4b, 0x53, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x40
};
int messagelen;
void setup(){
// initialize buffer array to 0's
memset(readbuffer, 0, sizeof(readbuffer));
// Debug to PC serial
Serial.begin(9600, SERIAL_8E1);
Serial.println("IBus Debugging begins");
// set the data rate for the SoftwareSerial port
IBusSerial.begin(9600);
// Set high to enable TX on MCP2025
pinMode(cspin, OUTPUT);
digitalWrite(cspin, HIGH); //High To CS/LWAKE MCP
pinMode(13, OUTPUT);
digitalWrite(13, LOW); // Disable L diode
lastrx = millis();
lasttx = millis();
}
void loop(){
delayMicroseconds(3000);
if (Serial.available()){
Serial.println("Got Input");
handleMessage(Serial.read());
}
lasttx = millis();
if ((millis() - lastrx) > 15) {
memset(readbuffer, 0, sizeof(readbuffer));
buffer_index = 0;
read_byte = false;
buffer_max = 64;
lastrx = millis();
return;
}
if (IBusSerial.available()) {
readbuffer[buffer_index] = IBusSerial.read();
read_byte = true;
}
if (read_byte){
if (buffer_index == 1){
buffer_max = readbuffer[buffer_index] + 2;
cksum = readbuffer[0] ^ readbuffer[1];
} else if ((buffer_index > 1 ) && (buffer_index < buffer_max)){
cksum = cksum ^ readbuffer[buffer_index];
}
}
// Reset buffer_index when it is buffer_max - 1.
if (buffer_index == (buffer_max - 1)) {
// if ((readbuffer[0] == 0x68) || (readbuffer[2] == 0x68)) { //Disable to read all data I-Bus
if (cksum == 0) {
for (i = 0; i < buffer_max; i++){
Serial.print(readbuffer[i],HEX);
}
if(memcmp(readbuffer, volup, 6) == 0 ){ Serial.println("Wcisniety guzik z głośnosci"); } //Get Info is a push button + on Managers
}else {
Serial.print("Invalid message. cksum: ");
Serial.println(cksum, HEX);
for (i = 0; i < buffer_max; i++){
Serial.print(readbuffer[i], HEX);
Serial.print(" ");
}
}
Serial.println();
// }
// Empty the buffer
memset(readbuffer, 0, sizeof(readbuffer));
buffer_index = 0;
read_byte = false;
lastrx = millis();
}
// Increment index if we put something into the buffer
if (read_byte == true){
read_byte = false;
buffer_index++;
lastrx = millis();
}
}
void handleMessage(byte messageType){
switch (messageType){
case 0x70: // p for vol up
Serial.println("Sending vol up.");
sendMessage(volup);
break;
case 0x6E: // n for vol down
Serial.println("Sending vol down.");
sendMessage(voldown);
break;
case 0x42: // B for IBus Sucks
Serial.println("Sending IBus Sucks.");
sendMessage(ibussucks);
break;
case 0x6D: // m for mode
Serial.println(" Mode.");
sendMessage(pressmode);
delay(150);
sendMessage(releasemode);
break;
}
}
void sendMessage(byte message_data[]){
for (int i=0; i <= sizeof(message_data); i++){
IBusSerial.write(message_data[i]);
}
}