Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // XirallicBolts
- // XB_Camera-NewShiftKnob, adapted for smaller MCP2515 module
- // Front camera display by shift knob +
- // Force rear camera by shift knob -
- // Turn off screen by long-pressing Power
- // Driver heated seat + wheel by long-pressing EJECT
- // Driver/pass seat + wheel by long-pressing SOUND
- // 2-14-2021 Sync 3.4 Activate seats with short press of Eject
- // 3-30-2021 Press 'Phone' on steering wheel to switch to USB... not always working.
- // More research needed
- // To-do: Use separate arrays to clean up code
- // INT 2 Pink / Brown
- // Relay 7 Green
- // Shift+ 8 Grey
- // Shift- 9 Grey/White
- // CS 10 White / Pink
- // S1 11 White
- // S0 12 Yellow
- // SCK 13 Purple
- // --------------------
- // I-CAN + Orange
- // I-CAN - White / Orange
- // HS-CAN + Orange
- // HS-CAN - White / Orange
- // Acc 12v Red
- // Ground White / Red
- //
- // Message ID 0x109 Bytes 0/1: RPM
- // (Gear Message) Byte 2: Gear (01 Park | 11 Reverse | 21 Neutral | 31 Drive | 41 Sport)
- // Sometimes the last character changes, such as 0x1E for Reverse
- // Bytes 3/4/5: Speed
- // Byte 6: Ignition mode? (28 Accessory | 58 Engine Running)
- //
- //
- // Message ID 0x2A0 xx FF FF FF 10 00 1E 02 Button is PRESSED
- // (Front Panel) xx FF FF FF 10 00 1E 00 Button is HELD
- // xx FF FF FF 00 00 1E 00 Button is RELEASED
- // 0x34: Eject 0x18: Sound 0x5F: Home 0x1F: Power
- //
- //
- // Message ID 0x35B 00 00 00 FE 80 00 00 Heated Steering Wheel
- // (Climate) 00 00 01 FE 00 00 00 Driver Heated Seat
- // 00 00 03 FE 00 00 00 Passenger Heated Seat
- //
- // Common between shift buttons connects to ground
- #include <mcp_can.h>
- #include <SPI.h>
- #define CAN_INT 2
- #define FRONT_CAMERA 7
- #define SHIFT_PLUS 8
- #define SHIFT_MINUS 9
- #define CAN_CS 10
- MCP_CAN CAN0(CAN_CS);
- byte HeldButtonCounter = 0;
- byte ForceRearCamera = 0;
- byte ShiftPlusButtonHeld = 0;
- byte ShiftMinusButtonHeld = 0;
- byte RequestCameraView = 0;
- int PowerLoops = 0;
- long unsigned int message_ID;
- unsigned char message_LENGTH = 0;
- unsigned char message_DATA[8];
- void setup() {
- pinMode(FRONT_CAMERA, OUTPUT);
- pinMode(SHIFT_PLUS, INPUT_PULLUP);
- pinMode(SHIFT_MINUS, INPUT_PULLUP);
- pinMode(CAN_INT, INPUT);
- digitalWrite(FRONT_CAMERA, HIGH); // Default to front camera
- Serial.begin(115200);
- Serial.println("XirallicBolts");
- Serial.println("Front camera module using small module");
- Serial.println("Shift Knob buttons");
- Serial.println("---");
- if(CAN0.begin(MCP_STDEXT, CAN_500KBPS, MCP_16MHZ) == CAN_OK)
- Serial.println("MCP2515 Initialized Succesfully");
- else
- Serial.println("Could not initialize MCP2515 (CS 10, INT 2, 500KBPS, 16MHz");
- CAN0.setMode(MCP_NORMAL);
- }
- void loop() {
- if(!digitalRead(CAN_INT))
- {
- CAN0.readMsgBuf(&message_ID, &message_LENGTH, message_DATA);
- // If it's in reverse (ID 0x109, 0x10 to 0x1F, or ForceRearCamera is on, disable the relay
- if((message_ID == 0x109 and message_DATA[2] >= 0x10 and message_DATA[2] <= 0x1F) or ForceRearCamera == 1)
- {
- Serial.print("Relay OFF. Current Camera: REAR. Gear: 0x");
- Serial.print(message_DATA[2],HEX);
- Serial.print(" ForceRearCamera: ");
- Serial.println(ForceRearCamera);
- digitalWrite(FRONT_CAMERA, LOW);
- }
- // If it's not in reverse, enable camera relay (switch to front camera)
- if((message_ID == 0x109 and (message_DATA[2] <= 0x0F or message_DATA[2] >= 0x20)) and ForceRearCamera == 0)
- {
- Serial.print("Relay ON. Current Camera: FRONT. Gear: 0x");
- Serial.print(message_DATA[2],HEX);
- Serial.print(" ForceRearCamera: ");
- Serial.println(ForceRearCamera);
- digitalWrite(FRONT_CAMERA, HIGH);
- }
- // If the camera is request, speed is low, and not in Park, send a fake Reverse signal
- if(message_ID == 0x109 and message_DATA[2] >= 0x10 and message_DATA[4] < 0x03 and RequestCameraView == 1)
- {
- Serial.println("Camera View requested, gear message just arrived.");
- Serial.println("Sending falsified Reverse signal...");
- message_DATA[2] = 0x11;
- CAN0.sendMsgBuf(message_ID, 0, message_LENGTH, message_DATA);
- Serial.println("Done. Resetting RequestCameraView");
- RequestCameraView = 0;
- }
- //
- //
- // If EJECT is held, activate driver seat and heated steering wheel
- //
- //
- if(message_ID == 0x2A0 and message_DATA[0] == 0x34 and message_DATA[4] == 0x10 and message_DATA[7] == 0x00)
- {
- Serial.println("Eject button HELD");
- HeldButtonCounter++;
- }
- if(message_ID == 0x2A0 and message_DATA[0] == 0x34 and message_DATA[4] == 0x00 and message_DATA[7] == 0x00)
- {
- Serial.print("Eject buton RELEASED. Counter: ");
- Serial.println(HeldButtonCounter);
- if(HeldButtonCounter >= 0) // was 3, wanted to make it a quick tap instead
- {
- Serial.println("Requesting: Driver Heated Seat");
- message_ID = 0x35B;
- message_DATA[0] = 0x00; message_DATA[1] = 0x00; message_DATA[2] = 0x01; message_DATA[3] = 0xFE; message_DATA[4] = 0x00; message_DATA[5] = 0x00; message_DATA[6] = 0x00; message_DATA[7] = 0x00;
- CAN0.sendMsgBuf(message_ID, 0, message_LENGTH, message_DATA);
- delay(1000);
- Serial.println("Requesting: Heated Steering Wheel");
- message_DATA[2] = 0x00; message_DATA[4] = 0x80;
- CAN0.sendMsgBuf(message_ID, 0, message_LENGTH, message_DATA);
- delay(500);
- }
- HeldButtonCounter = 0; // Reset counter regardless of length
- }
- //
- //
- // If SOUND is held, activate both seats and heated steering wheel
- //
- //
- if(message_ID == 0x2A0 and message_DATA[0] == 0x18 and message_DATA[4] == 0x10 and message_DATA[7] == 0x00)
- {
- Serial.println("Sound button HELD");
- HeldButtonCounter++;
- }
- if(message_ID == 0x2A0 and message_DATA[0] == 0x18 and message_DATA[4] == 0x00 and message_DATA[7] == 0x00)
- {
- Serial.print("Sound buton RELEASED. Counter: ");
- Serial.println(HeldButtonCounter);
- if(HeldButtonCounter >= 3)
- {
- Serial.println("Requesting: Return to Home Screen");
- message_ID = 0x2A0;
- message_DATA[0] = 0x5F; message_DATA[1] = 0xFF; message_DATA[2] = 0xFF; message_DATA[3] = 0xFF; message_DATA[4] = 0x10; message_DATA[5] = 0x00; message_DATA[6] = 0x1E; message_DATA[7] = 0x02;
- CAN0.sendMsgBuf(message_ID, 0, message_LENGTH, message_DATA); // Home PRESS
- delay(100);
- message_DATA[4] = 0x00; message_DATA[7] = 0x00;
- CAN0.sendMsgBuf(message_ID, 0, message_LENGTH, message_DATA); // Home RELEASE
- Serial.println("Requesting: Driver Heated Seat");
- message_ID = 0x35B;
- message_DATA[0] = 0x00; message_DATA[1] = 0x00; message_DATA[2] = 0x01; message_DATA[3] = 0xFE; message_DATA[4] = 0x00; message_DATA[5] = 0x00; message_DATA[6] = 0x00; message_DATA[7] = 0x00;
- CAN0.sendMsgBuf(message_ID, 0, message_LENGTH, message_DATA);
- delay(1000);
- Serial.println("Requesting: Passenger Heated Seat");
- message_DATA[2] = 0x03; message_DATA[4] = 0x00;
- CAN0.sendMsgBuf(message_ID, 0, message_LENGTH, message_DATA);
- delay(1000);
- Serial.println("Requesting: Heated Steering Wheel");
- message_DATA[2] = 0x00; message_DATA[4] = 0x80;
- CAN0.sendMsgBuf(message_ID, 0, message_LENGTH, message_DATA);
- }
- HeldButtonCounter = 0; // Reset counter regardless of length
- }
- //
- //
- // If POWER is held, turn the screen off
- //
- //
- if(message_ID == 0x2A0 and message_DATA[0] == 0x1F and message_DATA[4] == 0x10 and message_DATA[7] == 0x00)
- {
- Serial.println("Power button HELD");
- HeldButtonCounter++;
- }
- if(message_ID == 0x2A0 and message_DATA[0] == 0x1F and message_DATA[4] == 0x00 and message_DATA[7] == 0x00)
- {
- Serial.print("Power button RELEASED. Counter: ");
- Serial.println(HeldButtonCounter);
- if(HeldButtonCounter >= 3)
- {
- Serial.println("Requesting: Turn audio back on");
- message_ID = 0x2A0;
- message_DATA[0] = 0x1F; message_DATA[1] = 0xFF; message_DATA[2] = 0xFF; message_DATA[3] = 0xFF; message_DATA[4] = 0x10; message_DATA[5] = 0x00; message_DATA[6] = 0x1E; message_DATA[7] = 0x02;
- CAN0.sendMsgBuf(message_ID, 0, message_LENGTH, message_DATA); // Power PRESS
- delay(100);
- message_DATA[4] = 0x00; message_DATA[7] = 0x00;
- CAN0.sendMsgBuf(message_ID, 0, message_LENGTH, message_DATA); // Power RELEASE
- Serial.println("Requesting: Turn screen off");
- message_DATA[0] = 0x50; message_DATA[4] = 0x10; message_DATA[7] = 0x02;
- CAN0.sendMsgBuf(message_ID, 0, message_LENGTH, message_DATA); // Screen Off PRESS
- delay(50);
- message_DATA[4] = 0x00; message_DATA[7] = 0x00;
- CAN0.sendMsgBuf(message_ID, 0, message_LENGTH, message_DATA); // Screen Off RELEASE
- }
- HeldButtonCounter = 0;
- }
- //
- // Switch to USB if PHONE is pressed on steering wheel
- //
- if(message_ID == 0x081 and message_DATA[1] == 0x00 and message_DATA[2] == 0xC1 and message_DATA[3] == 0xFA)
- {
- Serial.println("Phone button RELEASED");
- delay(400);
- Serial.println("Requesting: Return to Home Screen");
- message_ID = 0x2A0;
- message_DATA[0] = 0x5F; message_DATA[1] = 0xFF; message_DATA[2] = 0xFF; message_DATA[3] = 0xFF; message_DATA[4] = 0x10; message_DATA[5] = 0x00; message_DATA[6] = 0x1E; message_DATA[7] = 0x02;
- CAN0.sendMsgBuf(message_ID, 0, message_LENGTH, message_DATA); // Home PRESS
- delay(100);
- message_DATA[4] = 0x00; message_DATA[7] = 0x00;
- CAN0.sendMsgBuf(message_ID, 0, message_LENGTH, message_DATA); // Home RELEASE
- Serial.println("Switch to USB");
- message_ID = 0x195;
- message_DATA[0] = 0x00;
- message_DATA[1] = 0x00;
- message_DATA[2] = 0x00;
- message_DATA[3] = 0x01;
- message_DATA[4] = 0x80;
- message_DATA[5] = 0x02;
- message_DATA[6] = 0x00;
- message_DATA[7] = 0x00;
- CAN0.sendMsgBuf(message_ID, 0, message_LENGTH, message_DATA);
- }
- } // END CAN-BUS MONITOR
- // Sense if the shift knob + or - are being pressed
- if(digitalRead(SHIFT_PLUS) == LOW)
- {
- ShiftPlusButtonHeld = 1;
- }
- if(digitalRead(SHIFT_MINUS) == LOW)
- {
- ShiftMinusButtonHeld = 1;
- }
- // React only when a shift button changes state
- if(digitalRead(SHIFT_PLUS) == HIGH and ShiftPlusButtonHeld == 1)
- {
- Serial.println("Shift Plus has been released.");
- Serial.println("Camera View will be requested on next Gear message if conditions are right.");
- ShiftPlusButtonHeld = 0;
- RequestCameraView = 1;
- }
- if(digitalRead(SHIFT_MINUS) == HIGH and ShiftMinusButtonHeld == 1)
- {
- Serial.println("Shift Minus has been released.");
- ShiftMinusButtonHeld = 0;
- ForceRearCamera = !ForceRearCamera;
- Serial.print("Toggling forced camera mode: ");
- if(ForceRearCamera){ Serial.println("True");}
- if(!ForceRearCamera){ Serial.println("False");}
- }
- }
Add Comment
Please, Sign In to add comment