GCC Code Coverage Report


Directory: ./
File: safety/safety_volkswagen_common.h
Date: 2025-02-27 09:09:49
Exec Total Coverage
Lines: 24 24 100.0%
Functions: 3 3 100.0%
Branches: 11 12 91.7%

Line Branch Exec Source
1 #pragma once
2
3 extern const uint16_t FLAG_VOLKSWAGEN_LONG_CONTROL;
4 const uint16_t FLAG_VOLKSWAGEN_LONG_CONTROL = 1;
5
6 static uint8_t volkswagen_crc8_lut_8h2f[256]; // Static lookup table for CRC8 poly 0x2F, aka 8H2F/AUTOSAR
7
8 extern bool volkswagen_longitudinal;
9 bool volkswagen_longitudinal = false;
10
11 extern bool volkswagen_set_button_prev;
12 bool volkswagen_set_button_prev = false;
13
14 extern bool volkswagen_resume_button_prev;
15 bool volkswagen_resume_button_prev = false;
16
17
18 #define MSG_LH_EPS_03 0x09F // RX from EPS, for driver steering torque
19 #define MSG_ESP_19 0x0B2 // RX from ABS, for wheel speeds
20 #define MSG_ESP_05 0x106 // RX from ABS, for brake switch state
21 #define MSG_TSK_06 0x120 // RX from ECU, for ACC status from drivetrain coordinator
22 #define MSG_MOTOR_20 0x121 // RX from ECU, for driver throttle input
23 #define MSG_ACC_06 0x122 // TX by OP, ACC control instructions to the drivetrain coordinator
24 #define MSG_HCA_01 0x126 // TX by OP, Heading Control Assist steering torque
25 #define MSG_GRA_ACC_01 0x12B // TX by OP, ACC control buttons for cancel/resume
26 #define MSG_ACC_07 0x12E // TX by OP, ACC control instructions to the drivetrain coordinator
27 #define MSG_ACC_02 0x30C // TX by OP, ACC HUD data to the instrument cluster
28 #define MSG_LDW_02 0x397 // TX by OP, Lane line recognition and text alerts
29 #define MSG_MOTOR_14 0x3BE // RX from ECU, for brake switch status
30
31
32 4091 static uint32_t volkswagen_mqb_meb_get_checksum(const CANPacket_t *to_push) {
33 4091 return (uint8_t)GET_BYTE(to_push, 0);
34 }
35
36 8182 static uint8_t volkswagen_mqb_meb_get_counter(const CANPacket_t *to_push) {
37 // MQB/MEB message counters are consistently found at LSB 8.
38 8182 return (uint8_t)GET_BYTE(to_push, 1) & 0xFU;
39 }
40
41 4091 static uint32_t volkswagen_mqb_meb_compute_crc(const CANPacket_t *to_push) {
42 4091 int addr = GET_ADDR(to_push);
43 4091 int len = GET_LEN(to_push);
44
45 // This is CRC-8H2F/AUTOSAR with a twist. See the OpenDBC implementation
46 // of this algorithm for a version with explanatory comments.
47
48 4091 uint8_t crc = 0xFFU;
49
2/2
✓ Branch 0 taken 28637 times.
✓ Branch 1 taken 4091 times.
32728 for (int i = 1; i < len; i++) {
50 28637 crc ^= (uint8_t)GET_BYTE(to_push, i);
51 28637 crc = volkswagen_crc8_lut_8h2f[crc];
52 }
53
54 4091 uint8_t counter = volkswagen_mqb_meb_get_counter(to_push);
55
2/2
✓ Branch 0 taken 4026 times.
✓ Branch 1 taken 65 times.
4091 if (addr == MSG_LH_EPS_03) {
56 4026 crc ^= (uint8_t[]){0xF5,0xF5,0xF5,0xF5,0xF5,0xF5,0xF5,0xF5,0xF5,0xF5,0xF5,0xF5,0xF5,0xF5,0xF5,0xF5}[counter];
57
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 47 times.
65 } else if (addr == MSG_ESP_05) {
58 18 crc ^= (uint8_t[]){0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07}[counter];
59
2/2
✓ Branch 0 taken 16 times.
✓ Branch 1 taken 31 times.
47 } else if (addr == MSG_TSK_06) {
60 16 crc ^= (uint8_t[]){0xC4,0xE2,0x4F,0xE4,0xF8,0x2F,0x56,0x81,0x9F,0xE5,0x83,0x44,0x05,0x3F,0x97,0xDF}[counter];
61
2/2
✓ Branch 0 taken 22 times.
✓ Branch 1 taken 9 times.
31 } else if (addr == MSG_MOTOR_20) {
62 22 crc ^= (uint8_t[]){0xE9,0x65,0xAE,0x6B,0x7B,0x35,0xE5,0x5F,0x4E,0xC7,0x86,0xA2,0xBB,0xDD,0xEB,0xB4}[counter];
63
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
9 } else if (addr == MSG_GRA_ACC_01) {
64 9 crc ^= (uint8_t[]){0x6A,0x38,0xB4,0x27,0x22,0xEF,0xE1,0xBB,0xF8,0x80,0x84,0x49,0xC7,0x9E,0x1E,0x2B}[counter];
65 } else {
66 // Undefined CAN message, CRC check expected to fail
67 }
68 4091 crc = volkswagen_crc8_lut_8h2f[crc];
69
70 4091 return (uint8_t)(crc ^ 0xFFU);
71 }
72