As I got some PMs regarding how you can help,
I encourage you to read the topic from here:
viewtopic.php?f=10&t=155
I don't need full CAN dumps. We need to decode each CAN ID from MS-CAN. This can be done with any tool that can monitor only one CAN ID (apply filters) and then start playing with buttons, switches, settings, speed, gears.. and so on and see if something changes accordingly on that CAN ID.
Some of them are easy to be found - we already know the CAN ID for that module and the byte position and also you can do it while car is not moving, some are a little bit harder as there is a gateway between (ex: data from PCM (HS CAN) goes through BCM in order to be put on MS CAN) or they require to have a moving car or that "status" is mixed with other data in the same byte (ignition key position and brake pedal status).
First 8 CAN IDs from that Google Sheet are transformed to something like this in order to be used in the application:
Code: Select all
void MSCAN_010_BCM (CanController *controller, uint_fast8_t wipers) {
//50ms
//"0x00 = wiper off (home), 0x19 = wiper in motion, 0x09 = wipers in home position(?)
//Byte change order seems to be: 0x00 => 0x08 (0b0000 1000) => 0x09 (0b0000 1001) => 0x10 (0b0001 0000) => 0x19 (0b0001 1001)"
std::vector<uint_fast8_t> data = {wipers, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00};
controller->SendCAN(0x010, data);
}
void MSCAN_018_IPC (CanController *controller) {
//200ms
//PDC active, no obstacle
//light is on
std::vector<uint_fast8_t> data = {0x03, 0xFC, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00};
controller->SendCAN(0x018, data);
}
void MSCAN_024_EATC (CanController *controller) {
//200ms
std::vector<uint_fast8_t> data = {0x00, 0x00, 0xFF, 0x00, 0x3F, 0xFF, 0xFF, 0xFF};
controller->SendCAN(0x024, data);
}
void MSCAN_028_PDM (CanController *controller) {
//ms
std::vector<uint_fast8_t> data = {0x00, 0x81, 0x10, 0x00, 0x48, 0xFF, 0xFF, 0xFF};
controller->SendCAN(0x028, data);
}
void MSCAN_030_IPC (CanController *controller) {
//100ms
//Audio/Navigationsystem: D0 on = x4, off = x6
std::vector<uint_fast8_t> data = {0x84, 0x00, 0x00, 0x00, 0x0B, 0x0F, 0x07, 0x1E};
controller->SendCAN(0x030, data);
}
void MSCAN_035_RFA (CanController *controller) {
//60ms
//static?
std::vector<uint_fast8_t> data = {0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
controller->SendCAN(0x035, data);
}
void MSCAN_038_DDM (CanController *controller, uint_fast8_t wdf, uint_fast8_t wdr_f, uint_fast8_t wpfr) {
//60.000 / 220 / 40ms
//D5 Windows driver, front - wdf
//D6 Windows driver, rear - wdr_f
//D7 Front passenger window regulator - wpfr
//D7 Passenger window regulator, rear - wpfr
//D6 Electrically folding exterior mirrors - wdr_f
std::vector<uint_fast8_t> data = {0x00, 0x00, 0x00, 0x00, 0x00, wdf, wdr_f, wpfr};
controller->SendCAN(0x038, data);
}
void MSCAN_040_BCM (CanController *controller, uint_fast8_t light, uint_fast8_t dist, uint_fast8_t washer) {
//50ms
//D0 Light switch position: AutoOff =F8 / AutoParking =F9 / AutoLow =FA / AutoAuto =FB; Desk-BCM 10, 11, 12, 13
//D1 Distance covered (odometer in the IPC) - A value that increases between each transmission interval; increases the trip and total odometer. The difference serves as an indicator for the distance covered and can be max. 200 (0xC8). Larger values are ignored as implausible
//D3 Washer fluid: low = 0x80; !low = 0x00
std::vector<uint_fast8_t> data = {light, dist, 0x00, washer, 0x00, 0x01, 0xB0, 0x27};
controller->SendCAN(0x040, data);
}
We won't need all of them for IPC - for example the ones that are sent by IPC itself - ID 018 or 030, but I'm still going to define them in the application, maybe in the future will be useful for something else
![Smile :)](./images/smilies/icon_e_smile.gif)