File syn_j1939.h¶
File List > proto > syn_j1939.h
Go to the documentation of this file
#ifndef SYN_J1939_H
#define SYN_J1939_H
#if __has_include("syn_config.h")
#include "syn_config.h"
#endif
#if !defined(SYN_USE_J1939) || SYN_USE_J1939
#include "../common/syn_defs.h"
#include "../drivers/syn_can.h"
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
#define SYN_J1939_ADDR_GLOBAL 0xFFU
#define SYN_J1939_ADDR_NULL 0xFEU
#define SYN_J1939_PGN_REQUEST 59904U
#define SYN_J1939_PGN_TP_DT 60160U
#define SYN_J1939_PGN_TP_CM 60416U
#define SYN_J1939_PGN_ADDR_CLAIM 60928U
#define SYN_J1939_PGN_PROPRIETARY_A 61184U
#define SYN_J1939_PGN_EEC1 61444U
#define SYN_J1939_PGN_DM1 65226U
#define SYN_J1939_PGN_DM2 65227U
#define SYN_J1939_PGN_DM3 65228U
#define SYN_J1939_PGN_DM11 65235U
#define SYN_J1939_PGN_BMS 65251U
#define SYN_J1939_PGN_ET1 65262U
#define SYN_J1939_PGN_PROPRIETARY_B 65280U
#define SYN_J1939_TP_CTRL_RTS 16U
#define SYN_J1939_TP_CTRL_CTS 17U
#define SYN_J1939_TP_CTRL_ACK 19U
#define SYN_J1939_TP_CTRL_BAM 32U
#define SYN_J1939_TP_CTRL_ABORT 255U
typedef struct {
uint8_t priority;
uint8_t dp;
uint8_t pf;
uint8_t ps;
uint8_t sa;
uint8_t da;
uint32_t pgn;
bool is_pdu1;
} SYN_J1939_Header;
typedef struct {
uint32_t identity_number;
uint16_t manufacturer_code;
uint8_t ecu_instance;
uint8_t function_instance;
uint8_t function;
uint8_t vehicle_system;
uint8_t vehicle_system_inst;
uint8_t
industry_group;
bool arbitrary_addr_cap;
} SYN_J1939_Name;
typedef struct {
uint32_t spn;
uint8_t fmi;
uint8_t occurrence_count;
uint8_t conversion_method;
} SYN_J1939_DTC;
typedef enum {
SYN_J1939_STATE_UNCLAIMED = 0,
SYN_J1939_STATE_CLAIMING = 1,
SYN_J1939_STATE_CLAIMED = 2,
SYN_J1939_STATE_CANNOT_CLAIM = 3
} SYN_J1939_AddressState;
typedef struct {
bool active;
bool is_bam;
uint8_t sa;
uint8_t da;
uint32_t pgn;
uint16_t total_bytes;
uint8_t total_packets;
uint8_t next_seq;
uint8_t received_packets;
uint8_t data[1785];
} SYN_J1939_TpRxSession;
typedef struct {
uint8_t sa;
SYN_J1939_Name name;
SYN_J1939_AddressState state;
SYN_J1939_TpRxSession tp_rx;
} SYN_J1939_Node;
uint32_t syn_j1939_id_pack(uint8_t priority, uint32_t pgn, uint8_t sa, uint8_t da);
SYN_Status syn_j1939_id_unpack(uint32_t can_id, SYN_J1939_Header *header);
uint32_t syn_j1939_calc_pgn(uint8_t dp, uint8_t pf, uint8_t ps);
void syn_j1939_name_encode(const SYN_J1939_Name *name, uint8_t buf[8]);
void syn_j1939_name_decode(const uint8_t buf[8], SYN_J1939_Name *name);
SYN_Status syn_j1939_node_init(SYN_J1939_Node *node, uint8_t sa, const SYN_J1939_Name *name);
SYN_Status syn_j1939_build_address_claim(const SYN_J1939_Node *node, SYN_CAN_Frame *frame);
SYN_Status syn_j1939_build_request(uint8_t sa, uint8_t da, uint32_t requested_pgn,
SYN_CAN_Frame *frame);
SYN_Status syn_j1939_build_tp_bam(uint8_t sa, uint32_t pgn, uint16_t total_bytes,
SYN_CAN_Frame *frame);
SYN_Status syn_j1939_build_tp_dt(uint8_t sa, uint8_t sequence, const uint8_t *payload,
size_t payload_len, SYN_CAN_Frame *frame);
size_t syn_j1939_encode_dm1(uint8_t *buf, size_t buf_size, const SYN_J1939_DTC *dtc_list,
size_t dtc_count, uint8_t mil_lamp_status);
SYN_Status syn_j1939_process_frame(SYN_J1939_Node *node, const SYN_CAN_Frame *frame,
uint32_t *out_pgn, const uint8_t **out_data, size_t *out_len);
size_t syn_j1939_encode_dm2(uint8_t *buf, size_t buf_size, const SYN_J1939_DTC *dtc_list,
size_t dtc_count, uint8_t mil_lamp_status);
#ifndef SYN_J1939_MAX_LOGGED_DTCS
#define SYN_J1939_MAX_LOGGED_DTCS 16
#endif
typedef struct {
SYN_J1939_DTC active_dtcs[SYN_J1939_MAX_LOGGED_DTCS];
size_t active_count;
SYN_J1939_DTC prev_dtcs[SYN_J1939_MAX_LOGGED_DTCS];
size_t prev_count;
} SYN_J1939_DTCLog;
void syn_j1939_dtc_log_init(SYN_J1939_DTCLog *log);
SYN_Status syn_j1939_dtc_add_active(SYN_J1939_DTCLog *log, uint32_t spn, uint8_t fmi);
SYN_Status syn_j1939_dtc_clear_active(SYN_J1939_DTCLog *log, uint32_t spn, uint8_t fmi);
void syn_j1939_dtc_clear_dm3(SYN_J1939_DTCLog *log);
void syn_j1939_dtc_clear_dm11(SYN_J1939_DTCLog *log);
#ifdef __cplusplus
}
#endif
#endif /* SYN_USE_J1939 */
#endif /* SYN_J1939_H */