27#ifndef PROTOCORE_J1939_H
28#define PROTOCORE_J1939_H
39#define J1939_PGN_TP_CM 0x00EC00u
40#define J1939_PGN_TP_DT 0x00EB00u
41#define J1939_PGN_ADDRESS_CLAIM 0x00EE00u
42#define J1939_PGN_REQUEST 0x00EA00u
43#define J1939_ADDR_GLOBAL 0xFFu
44#define J1939_ADDR_NULL 0xFEu
45#define J1939_PDU2_THRESHOLD 240u
48#define J1939_TP_CM_RTS 0x10u
49#define J1939_TP_CM_CTS 0x11u
50#define J1939_TP_CM_EOM_ACK 0x13u
51#define J1939_TP_CM_BAM 0x20u
52#define J1939_TP_CM_ABORT 0xFFu
54#define J1939_TP_DT_LEN 7u
69enum class J1939TpResult : uint8_t
88 uint8_t buf[PC_J1939_TP_MAX];
94bool pc_j1939_encode_id(uint32_t *
id, uint8_t priority, uint32_t pgn, uint8_t sa, uint8_t da);
97bool pc_j1939_decode_id(uint32_t
id, J1939Id *out);
102bool pc_j1939_build_message(
CanFrame *out, uint8_t priority, uint32_t pgn, uint8_t sa, uint8_t da,
const uint8_t *data,
106bool pc_j1939_build_request(
CanFrame *out, uint8_t sa, uint8_t da, uint32_t requested_pgn);
109bool pc_j1939_build_address_claim(
CanFrame *out, uint8_t sa, uint64_t name);
112uint64_t pc_j1939_build_name(
bool arbitrary_address_capable, uint8_t industry_group, uint8_t vehicle_system_instance,
113 uint8_t vehicle_system, uint8_t function, uint8_t function_instance, uint8_t ecu_instance,
114 uint16_t manufacturer_code, uint32_t identity_number);
119uint8_t pc_j1939_tp_num_packets(uint16_t total_size);
122bool pc_j1939_build_bam_cm(
CanFrame *out, uint8_t sa, uint32_t pgn, uint16_t total_size);
125bool pc_j1939_build_tp_dt(
CanFrame *out, uint8_t sa, uint8_t da, uint8_t seq,
const uint8_t *chunk, uint8_t chunk_len);
128void pc_j1939_tp_reset(J1939TpRx *rx);
131J1939TpResult pc_j1939_tp_feed(J1939TpRx *rx,
const CanFrame *f);
139#define J1939_PGN_EEC1 0x00F004u
140#define J1939_PGN_ET1 0x00FEEEu
141#define J1939_PGN_LFE 0x00FEF2u
142#define J1939_PGN_AMB 0x00FEF5u
143#define J1939_PGN_IC1 0x00FEF6u
144#define J1939_PGN_VD 0x00FEE0u
145#define J1939_PGN_CCVS 0x00FEF1u
146#define J1939_PGN_DM1 0x00FECAu
152 int16_t drivers_demand_torque_pct;
153 int16_t actual_engine_torque_pct;
154 bool engine_speed_valid;
155 float engine_speed_rpm;
159#define J1939_TORQUE_NA ((int16_t)0x7FFF)
165 float coolant_temp_c;
176bool pc_j1939_decode_eec1(
const CanFrame *f, J1939Eec1 *out);
182bool pc_j1939_decode_et1(
const CanFrame *f, J1939Et1 *out);
187 bool fuel_rate_valid;
189 bool instant_econ_valid;
190 float instant_econ_kmpl;
201bool pc_j1939_decode_lfe(
const CanFrame *f, J1939Lfe *out);
212 bool ambient_temp_valid;
213 float ambient_temp_c;
214 bool inlet_temp_valid;
216 bool road_temp_valid;
224bool pc_j1939_decode_amb(
const CanFrame *f, J1939Amb *out);
230 bool trap_inlet_valid;
231 float trap_inlet_kpa;
234 bool intake_temp_valid;
236 bool air_inlet_valid;
238 bool air_filter_valid;
239 float air_filter_kpa;
240 bool exhaust_temp_valid;
241 float exhaust_temp_c;
242 bool coolant_filter_valid;
243 float coolant_filter_kpa;
250bool pc_j1939_decode_ic1(
const CanFrame *f, J1939Ic1 *out);
266bool pc_j1939_decode_vd(
const CanFrame *f, J1939Vd *out);
274 float wheel_speed_kmh;
283bool pc_j1939_decode_ccvs(
const CanFrame *f, J1939Ccvs *out);
299 uint8_t amber_warning;
311bool pc_j1939_decode_dm1(
const uint8_t *body,
size_t len, J1939Dm1 *out, J1939Dtc *out_dtcs,
size_t max);
Shared CAN 2.0 frame type for the CAN-based industrial codecs (one source of truth).
User-facing configuration for ProtoCore.