rusEFI
The most advanced open source ECU
Loading...
Searching...
No Matches
can_dash_honda.cpp
Go to the documentation of this file.
1#include "pch.h"
2
3// can_dash_honda.cpp
4
5#if EFI_CAN_SUPPORT
6#include "can.h"
7#include "can_msg_tx.h"
8
9#define HONDA_SPEED_158 0x158
10#define HONDA_TACH_1DC 0x1DC
11#define HONDA_TEMP_324 0x324
12
13
14#define HONDA_IMA_166 0x166
15#define HONDA_AIRBAG_039 0x039
16#define HONDA_EPS_18E 0x18E
17#define HONDA_TPMS_333 0x333
18#define HONDA_CEL_17C 0x17C
19#define HONDA_VSA_1A4 0x1A4
20
21uint8_t calculateHondaChecksum(uint16_t canId, uint8_t length, uint8_t* data) {
22 int sum = 0;
23 // Sum all bytes except the checksum nibble
24 for (int i = 0; i < length; i++) {
25 // we only include the upper nibble in calculation
26 uint8_t value = (i == length - 1) ? (data[i] & 0xF0) : data[i];
27
28 sum += (value >> 4) & 0xF;
29 if (i < length - 1) {
30 sum += value & 0xF;
31 }
32 }
33
34 sum += (canId >> 8) & 0xF;
35 sum += (canId >> 4) & 0xF;
36 sum += (canId) & 0xF;
37 //Magic number bullshit
38 sum += 8;
39
40 // Calculate final checksum: 0x10 - (sum & 0xF) & 0xF
41 uint8_t checksum = (0x10 - (sum & 0xF)) & 0xF;
42
43 return checksum;
44}
45
47 static int rollingId = 0;
48
49 if (cycle.isInterval(CI::_20ms)) {
50 // RPM message (HONDA_TACH_1DC)
51 CanTxMessage msg(CanCategory::NBC, HONDA_TACH_1DC, 4);
52 msg[0] = 0x02; //This is constant i think
54 rollingId = (rollingId + 1) & 0x3;
55 msg[3] = (rollingId << 4);
56
57 uint8_t tempBuffer1[4];
58 for (int i = 0; i < 4; i++) {
59 tempBuffer1[i] = msg[i];
60 }
61
62 uint8_t checksum1 = calculateHondaChecksum(HONDA_TACH_1DC, 4, tempBuffer1);
63 msg[3] |= checksum1 & 0xF;
64
65 // Speed message (HONDA_SPEED_158)
66 CanTxMessage msg2(CanCategory::NBC, HONDA_SPEED_158, 8);
69 msg2[7] = (rollingId << 4);
70
71 uint8_t tempBuffer2[8];
72 for (int i = 0; i < 8; i++) {
73 tempBuffer2[i] = msg2[i];
74 }
75
76 uint8_t checksum2 = calculateHondaChecksum(HONDA_SPEED_158, 8, tempBuffer2);
77 msg2[7] |= checksum2 & 0xF;
78
79 // CEL message (HONDA_CEL_17C)
80 CanTxMessage msg3(CanCategory::NBC, HONDA_CEL_17C, 8);
81 msg3[0] = 0x00;
82 msg3[1] = 0xEA;
83 msg3[2] = 0x00;
84 msg3[3] = 0x00;
85 msg3[4] = 0x00;
86 msg3[5] = 0x00;
87 msg3[6] = 0x00;
88 rollingId = (rollingId + 1) & 0x3;
89 msg3[7] = (rollingId << 4);
90
91 uint8_t tempBuffer3[8];
92 for (int i = 0; i < 8; i++) {
93 tempBuffer3[i] = msg3[i];
94 }
95
96 uint8_t checksum3 = calculateHondaChecksum(0x17c, 8, tempBuffer3);
97 msg3[7] |= checksum3 & 0xF;
98
99 // IMA message (HONDA_IMA_166)
100 CanTxMessage msg4(CanCategory::NBC, HONDA_IMA_166, 4);
101 msg4[0] = 0x50;
102 msg4[1] = 0x1d;
103 msg4[2] = 0xec;
104 msg4[3] = (rollingId << 4);
105
106 uint8_t tempBuffer4[4];
107 for (int i = 0; i < 4; i++) {
108 tempBuffer4[i] = msg4[i];
109 }
110
111 uint8_t checksum4 = calculateHondaChecksum(HONDA_IMA_166, 4, tempBuffer4);
112 msg4[3] |= checksum4 & 0xF;
113
114 // Airbag message (HONDA_AIRBAG_039)
115 CanTxMessage msg5(CanCategory::NBC, HONDA_AIRBAG_039, 2);
116 msg5[0] = 0x00;
117 msg5[1] = (rollingId << 4);
118
119 uint8_t tempBuffer5[2];
120 for (int i = 0; i < 2; i++) {
121 tempBuffer5[i] = msg5[i];
122 }
123
124 uint8_t checksum5 = calculateHondaChecksum(HONDA_AIRBAG_039, 2, tempBuffer5);
125 msg5[1] |= checksum5 & 0xF;
126
127 // EPS message (HONDA_EPS_18E)
128 CanTxMessage msg6(CanCategory::NBC, HONDA_EPS_18E, 3);
129 msg6[0] = 0x00;
130 msg6[1] = 0x00;
131 msg6[2] = (rollingId << 4);
132
133 uint8_t tempBuffer6[3];
134 for (int i = 0; i < 3; i++) {
135 tempBuffer6[i] = msg6[i];
136 }
137
138 uint8_t checksum6 = calculateHondaChecksum(HONDA_EPS_18E, 3, tempBuffer6);
139 msg6[2] |= checksum6 & 0xF;
140
141 // TPMS message (HONDA_TPMS_333)
142 CanTxMessage msg7(CanCategory::NBC, HONDA_TPMS_333, 8);
143 msg7[0] = 0x00;
144 msg7[1] = 0x00;
145 msg7[2] = 0x00;
146 msg7[3] = 0x00;
147 msg7[4] = 0x00;
148 msg7[5] = 0x00;
149 msg7[6] = 0x00;
150 msg7[7] = (rollingId << 4);
151
152 uint8_t tempBuffer7[8];
153 for (int i = 0; i < 8; i++) {
154 tempBuffer7[i] = msg7[i];
155 }
156
157 uint8_t checksum7 = calculateHondaChecksum(HONDA_TPMS_333, 8, tempBuffer7);
158 msg7[7] |= checksum7 & 0xF;
159
160 // VSA message (HONDA_VSA_1A4)
161 CanTxMessage msg8(CanCategory::NBC, HONDA_VSA_1A4, 8);
162 msg8[7] = (rollingId << 4);
163
164 uint8_t tempBuffer8[8];
165 for (int i = 0; i < 8; i++) {
166 tempBuffer8[i] = msg8[i];
167 }
168
169 uint8_t checksum8 = calculateHondaChecksum(HONDA_VSA_1A4, 8, tempBuffer8);
170 msg8[7] |= checksum8 & 0xF;
171
172 // Temperature message (HONDA_TEMP_324)
173 CanTxMessage msg9(CanCategory::NBC, HONDA_TEMP_324, 8);
174 msg9[0] = Sensor::getOrZero(SensorType::Clt) + 40;
175 msg9[1] = Sensor::getOrZero(SensorType::Iat) + 40;
176 msg9[7] = (rollingId << 4);
177
178 uint8_t tempBuffer9[8];
179 for (int i = 0; i < 8; i++) {
180 tempBuffer9[i] = msg9[i];
181 }
182
183 uint8_t checksum9 = calculateHondaChecksum(HONDA_TEMP_324, 8, tempBuffer9);
184 msg9[7] |= checksum9 & 0xF;
185 }
186}
187
188#endif
uint8_t calculateHondaChecksum(uint16_t canId, uint8_t length, uint8_t *data)
void canDashboardHondaK(CanCycle cycle)
Definition can.h:83
bool isInterval(CanInterval interval)
Definition can.h:90
void setShortValueMsb(uint16_t value, size_t offset)
static float getOrZero(SensorType type)
Definition sensor.h:83