Skip to content

File syn_uds.h

File List > proto > syn_uds.h

Go to the documentation of this file

#ifndef SYN_UDS_H
#define SYN_UDS_H

#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef SYN_UDS_MAX_DIDS
#define SYN_UDS_MAX_DIDS 16U 
#endif
#ifndef SYN_UDS_MAX_SERVICE_OVERRIDES
#define SYN_UDS_MAX_SERVICE_OVERRIDES \
    8U 
#endif
#define SYN_UDS_SID_DIAGNOSTIC_SESSION_CONTROL 0x10U       
#define SYN_UDS_SID_ECU_RESET 0x11U                        
#define SYN_UDS_SID_CLEAR_DIAGNOSTIC_INFORMATION 0x14U     
#define SYN_UDS_SID_READ_DTC_INFORMATION 0x19U             
#define SYN_UDS_SID_READ_DATA_BY_IDENTIFIER 0x22U          
#define SYN_UDS_SID_READ_MEMORY_BY_ADDRESS 0x23U           
#define SYN_UDS_SID_READ_SCALING_DATA_BY_IDENTIFIER 0x24U  
#define SYN_UDS_SID_SECURITY_ACCESS 0x27U                  
#define SYN_UDS_SID_COMMUNICATION_CONTROL 0x28U            
#define SYN_UDS_SID_AUTHENTICATION 0x29U                   
#define SYN_UDS_SID_READ_DATA_BY_PERIODIC_IDENTIFIER 0x2AU 
#define SYN_UDS_SID_DYNAMICALLY_DEFINE_DATA_IDENTIFIER                                  \
    0x2CU                                          
#define SYN_UDS_SID_WRITE_DATA_BY_IDENTIFIER 0x2EU 
#define SYN_UDS_SID_INPUT_OUTPUT_CONTROL_BY_IDENTIFIER                                  \
    0x2FU                                           
#define SYN_UDS_SID_ROUTINE_CONTROL 0x31U           
#define SYN_UDS_SID_REQUEST_DOWNLOAD 0x34U          
#define SYN_UDS_SID_REQUEST_UPLOAD 0x35U            
#define SYN_UDS_SID_TRANSFER_DATA 0x36U             
#define SYN_UDS_SID_REQUEST_TRANSFER_EXIT 0x37U     
#define SYN_UDS_SID_REQUEST_FILE_TRANSFER 0x38U     
#define SYN_UDS_SID_WRITE_MEMORY_BY_ADDRESS 0x3DU   
#define SYN_UDS_SID_TESTER_PRESENT 0x3EU            
#define SYN_UDS_SID_ACCESS_TIMING_PARAMETER 0x83U   
#define SYN_UDS_SID_SECURED_DATA_TRANSMISSION 0x84U 
#define SYN_UDS_SID_CONTROL_DTC_SETTING 0x85U       
#define SYN_UDS_SID_RESPONSE_ON_EVENT 0x86U         
#define SYN_UDS_SID_LINK_CONTROL 0x87U              
#define SYN_UDS_RESET_HARD 0x01U                         
#define SYN_UDS_RESET_KEY_OFF_ON 0x02U                   
#define SYN_UDS_RESET_SOFT 0x03U                         
#define SYN_UDS_RESET_ENABLE_RAPID_POWER_SHUTDOWN 0x04U  
#define SYN_UDS_RESET_DISABLE_RAPID_POWER_SHUTDOWN 0x05U 
#define SYN_UDS_DTC_REPORT_NUMBER_BY_STATUS_MASK                                          \
    0x01U                                       
#define SYN_UDS_DTC_REPORT_BY_STATUS_MASK 0x02U 
#define SYN_UDS_DTC_REPORT_SNAPSHOT_IDENTIFICATION                                              \
    0x03U                                               
#define SYN_UDS_DTC_REPORT_SNAPSHOT_RECORD_BY_DTC 0x04U 
#define SYN_UDS_DTC_REPORT_STORED_DATA_BY_RECORD_NUM \
    0x05U                                               
#define SYN_UDS_DTC_REPORT_EXT_DATA_RECORD_BY_DTC 0x06U 
#define SYN_UDS_DTC_REPORT_NUMBER_BY_SEVERITY_MASK \
    0x07U                                          
#define SYN_UDS_DTC_REPORT_BY_SEVERITY_MASK 0x08U  
#define SYN_UDS_DTC_REPORT_SEVERITY_INFO 0x09U     
#define SYN_UDS_DTC_REPORT_SUPPORTED 0x0AU         
#define SYN_UDS_DTC_REPORT_FIRST_TEST_FAILED 0x0BU 
#define SYN_UDS_DTC_REPORT_FIRST_CONFIRMED 0x0CU   
#define SYN_UDS_DTC_REPORT_MOST_RECENT_TEST_FAILED                                             \
    0x0DU                                              
#define SYN_UDS_DTC_REPORT_MOST_RECENT_CONFIRMED 0x0EU 
#define SYN_UDS_DTC_REPORT_MIRROR_MEMORY_BY_STATUS_MASK \
    0x0FU                                               
#define SYN_UDS_DTC_REPORT_MIRROR_MEMORY_EXT_DATA 0x10U 
#define SYN_UDS_DTC_REPORT_NUMBER_MIRROR_MEMORY_BY_STATUS_MASK \
    0x11U 
#define SYN_UDS_DTC_REPORT_NUMBER_EMISSIONS_OBD_BY_STATUS_MASK \
    0x12U                                                     
#define SYN_UDS_DTC_REPORT_EMISSIONS_OBD_BY_STATUS_MASK 0x13U 
#define SYN_UDS_DTC_REPORT_FAULT_DETECTION_COUNTER 0x14U      
#define SYN_UDS_DTC_REPORT_WITH_PERMANENT_STATUS 0x15U 
#define SYN_UDS_DTC_REPORT_EXT_DATA_RECORD_BY_RECORD_NUM \
    0x16U 
#define SYN_UDS_DTC_REPORT_USER_DEF_MEMORY_BY_STATUS_MASK \
    0x17U 
#define SYN_UDS_DTC_REPORT_USER_DEF_MEMORY_SNAPSHOT_BY_DTC \
    0x18U 
#define SYN_UDS_DTC_REPORT_USER_DEF_MEMORY_EXT_DATA_BY_DTC \
    0x19U                                               
#define SYN_UDS_DTC_REPORT_WWH_OBD_BY_MASK_RECORD 0x42U 
#define SYN_UDS_DTC_REPORT_WWH_OBD_WITH_PERMANENT_STATUS \
    0x55U 
#define SYN_UDS_DTC_GROUP_EMISSIONS 0x000000U  
#define SYN_UDS_DTC_GROUP_POWERTRAIN 0x100000U 
#define SYN_UDS_DTC_GROUP_CHASSIS 0x400000U    
#define SYN_UDS_DTC_GROUP_BODY 0x800000U       
#define SYN_UDS_DTC_GROUP_NETWORK 0xC00000U    
#define SYN_UDS_DTC_GROUP_ALL 0xFFFFFFU        
#define SYN_UDS_RESPONSE_NEGATIVE 0x7FU 
#define SYN_UDS_NRC_SUCCESS 0x00U                   
#define SYN_UDS_NRC_SERVICE_NOT_SUPPORTED 0x11U     
#define SYN_UDS_NRC_SUBFUNCTION_NOT_SUPPORTED 0x12U 
#define SYN_UDS_NRC_INCORRECT_MESSAGE_LENGTH \
    0x13U 
#define SYN_UDS_NRC_RESPONSE_TOO_LONG 0x14U           
#define SYN_UDS_NRC_CONDITIONS_NOT_CORRECT 0x22U      
#define SYN_UDS_NRC_REQUEST_OUT_OF_RANGE 0x31U        
#define SYN_UDS_NRC_SECURITY_ACCESS_DENIED 0x33U      
#define SYN_UDS_NRC_INVALID_KEY 0x35U                 
#define SYN_UDS_NRC_EXCEEDED_NUMBER_OF_ATTEMPTS 0x36U 
#define SYN_UDS_NRC_REQUIRED_TIME_DELAY_NOT_EXPIRED \
    0x37U                                             
#define SYN_UDS_NRC_REQUEST_SEQUENCE_ERROR 0x24U      
#define SYN_UDS_NRC_TRANSFER_DATA_SUSPENDED 0x71U     
#define SYN_UDS_NRC_GENERAL_PROGRAMMING_FAILURE 0x72U 
#define SYN_UDS_NRC_WRONG_BLOCK_SEQUENCE_COUNTER 0x73U 
#define SYN_UDS_NRC_SUBFUNCTION_NOT_SUPPORTED_IN_ACTIVE_SESSION \
    0x7EU 
typedef enum {
    SYN_UDS_ADDR_PHYSICAL = 0U,  
    SYN_UDS_ADDR_FUNCTIONAL = 1U 
} SYN_UDS_AddrMode;

typedef enum {
    SYN_UDS_TRANSFER_IDLE = 0U,     
    SYN_UDS_TRANSFER_DOWNLOAD = 1U, 
    SYN_UDS_TRANSFER_UPLOAD = 2U    
} SYN_UDS_TransferState;

typedef enum {
    SYN_UDS_SESSION_DEFAULT = 0x01U,      
    SYN_UDS_SESSION_PROGRAMMING = 0x02U,  
    SYN_UDS_SESSION_EXTENDED = 0x03U,     
    SYN_UDS_SESSION_SAFETY_SYSTEM = 0x04U 
} SYN_UDS_Session;

#define SYN_UDS_SESSION_MASK_DEFAULT (1U << 0)     
#define SYN_UDS_SESSION_MASK_PROGRAMMING (1U << 1) 
#define SYN_UDS_SESSION_MASK_EXTENDED (1U << 2)    
#define SYN_UDS_SESSION_MASK_SAFETY (1U << 3)      
#define SYN_UDS_SESSION_MASK_ALL (0x0FU)           
#define SYN_UDS_SECURITY_MASK_NONE (1U << 0)    
#define SYN_UDS_SECURITY_MASK_LEVEL_1 (1U << 1) 
#define SYN_UDS_SECURITY_MASK_LEVEL_2 (1U << 2) 
#define SYN_UDS_SECURITY_MASK_LEVEL_3 (1U << 3) 
#define SYN_UDS_SECURITY_MASK_ALL (0xFFFFU)     
typedef struct {
    uint16_t did;           
    uint8_t *data;          
    uint16_t len;           
    bool writable;          
    uint8_t session_mask;   
    uint16_t security_mask; 
} SYN_UDS_DIDEntry;

typedef enum {
    SYN_UDS_SECURITY_LOCKED = 0x00U,    
    SYN_UDS_SECURITY_SEED_SENT = 0x01U, 
    SYN_UDS_SECURITY_UNLOCKED = 0x02U   
} SYN_UDS_SecurityState;

typedef enum {
    SYN_UDS_COMM_ENABLE_RX_AND_TX = 0x00U,      
    SYN_UDS_COMM_ENABLE_RX_DISABLE_TX = 0x01U,  
    SYN_UDS_COMM_DISABLE_RX_ENABLE_TX = 0x02U,  
    SYN_UDS_COMM_DISABLE_RX_AND_TX = 0x03U,     
    SYN_UDS_COMM_ENABLE_RX_TX_ENHANCED = 0x04U, 
    SYN_UDS_COMM_ENABLE_RX_ENHANCED = 0x05U     
} SYN_UDS_CommControlType;

typedef enum {
    SYN_UDS_TIMING_READ_EXTENDED = 0x01U,  
    SYN_UDS_TIMING_SET_TO_DEFAULT = 0x02U, 
    SYN_UDS_TIMING_READ_ACTIVE = 0x03U,    
    SYN_UDS_TIMING_SET_TO_GIVEN = 0x04U    
} SYN_UDS_AccessTimingType;

typedef bool (*SYN_UDS_CommControlHandler)(SYN_UDS_CommControlType control_type, uint8_t comm_type,
                                           void *ctx);

typedef bool (*SYN_UDS_AccessTimingHandler)(SYN_UDS_AccessTimingType timing_type,
                                            uint16_t *p2_max_ms, uint16_t *p2_star_max_10ms,
                                            void *ctx);

typedef bool (*SYN_UDS_SecuredDataHandler)(const uint8_t *in_data, uint16_t in_len,
                                           uint8_t *out_buf, uint16_t max_out_len,
                                           uint16_t *out_len, void *ctx);

typedef bool (*SYN_UDS_MemoryHandler)(bool is_write, uint32_t address, uint32_t size,
                                      uint8_t *data_buf, void *ctx);

typedef bool (*SYN_UDS_AuthHandler)(uint8_t subfunction, const uint8_t *in_data, uint16_t in_len,
                                    uint8_t *out_buf, uint16_t max_out_len, uint16_t *out_len,
                                    void *ctx);

typedef bool (*SYN_UDS_FileTransferHandler)(uint8_t mode, const char *file_path, uint16_t path_len,
                                            uint8_t *out_buf, uint16_t max_out_len,
                                            uint16_t *out_len, void *ctx);

typedef bool (*SYN_UDS_RoutineControlHandler)(uint8_t subfunction, uint16_t routine_id,
                                              const uint8_t *in_data, uint16_t in_len,
                                              uint8_t *out_buf, uint16_t max_out_len,
                                              uint16_t *out_len, void *ctx);

typedef bool (*SYN_UDS_IOControlHandler)(uint16_t did, uint8_t control_opt, const uint8_t *in_data,
                                         uint16_t in_len, uint8_t *out_buf, uint16_t max_out_len,
                                         uint16_t *out_len, void *ctx);

typedef bool (*SYN_UDS_LinkControlHandler)(uint8_t subfunction, const uint8_t *in_data,
                                           uint16_t in_len, uint8_t *out_buf, uint16_t max_out_len,
                                           uint16_t *out_len, void *ctx);

typedef bool (*SYN_UDS_ResponseOnEventHandler)(uint8_t subfunction, const uint8_t *in_data,
                                               uint16_t in_len, uint8_t *out_buf,
                                               uint16_t max_out_len, uint16_t *out_len, void *ctx);

typedef bool (*SYN_UDS_ScalingDataHandler)(uint16_t did, uint8_t *out_buf, uint16_t max_out_len,
                                           uint16_t *out_len, void *ctx);

typedef bool (*SYN_UDS_PeriodicDataHandler)(uint8_t mode, const uint8_t *in_data, uint16_t in_len,
                                            uint8_t *out_buf, uint16_t max_out_len,
                                            uint16_t *out_len, void *ctx);

typedef bool (*SYN_UDS_DynamicDIDHandler)(uint8_t subfunction, uint16_t dyn_did,
                                          const uint8_t *in_data, uint16_t in_len, uint8_t *out_buf,
                                          uint16_t max_out_len, uint16_t *out_len, void *ctx);

#ifndef SYN_UDS_MAX_DTCS
#define SYN_UDS_MAX_DTCS 32U 
#endif

#define SYN_UDS_DTC_STATUS_AVAILABILITY_MASK 0xFFU 
#define SYN_UDS_DTC_STATUS_TEST_FAILED (1U << 0) 
#define SYN_UDS_DTC_STATUS_TEST_FAILED_THIS_OP_CYCLE \
    (1U << 1)                                      
#define SYN_UDS_DTC_STATUS_PENDING_DTC (1U << 2)   
#define SYN_UDS_DTC_STATUS_CONFIRMED_DTC (1U << 3) 
#define SYN_UDS_DTC_STATUS_TEST_NOT_COMPLETED_SINCE_LAST_CLEAR \
    (1U << 4) 
#define SYN_UDS_DTC_STATUS_TEST_FAILED_SINCE_LAST_CLEAR (1U << 5) 
#define SYN_UDS_DTC_STATUS_TEST_NOT_COMPLETED_THIS_OP_CYCLE \
    (1U << 6) 
#define SYN_UDS_DTC_STATUS_WARNING_INDICATOR_REQUESTED \
    (1U << 7) 
#define SYN_UDS_DTC_SEVERITY_NO_SEVERITY (0x00U << 5)          
#define SYN_UDS_DTC_SEVERITY_MAINTENANCE_REQUIRED (0x01U << 5) 
#define SYN_UDS_DTC_SEVERITY_CHECK_AT_NEXT_HALT (0x02U << 5)   
#define SYN_UDS_DTC_SEVERITY_CHECK_IMMEDIATELY (0x03U << 5)    
#define SYN_UDS_DTC_SEVERITY_MASK (0x07U << 5)                 
#define SYN_UDS_DTC_CLASS_MASK (0x1FU)                         
#define SYN_UDS_DTC_FORMAT_ISO14229_1 0x00U   
#define SYN_UDS_DTC_FORMAT_ISO15031_6 0x01U   
#define SYN_UDS_DTC_FORMAT_SAE_J1939_73 0x02U 
#define SYN_UDS_DTC_FORMAT_ISO27145_4 0x03U   
typedef struct {
    uint32_t dtc;     
    uint8_t status;   
    uint8_t severity; 
    int8_t fault_cnt; 
} SYN_UDS_DTCEntry;

typedef bool (*SYN_UDS_DTCHandler)(uint8_t subfunction, const uint8_t *in_data, uint16_t in_len,
                                   uint8_t *out_buf, uint16_t max_out_len, uint16_t *out_len,
                                   void *ctx);

typedef void (*SYN_UDS_ResetHandler)(uint8_t reset_type, void *ctx);

typedef bool (*SYN_UDS_SessionTransitionHandler)(SYN_UDS_Session from_session,
                                                 SYN_UDS_Session to_session, void *ctx);

#ifndef SYN_UDS_S3_TIMEOUT_MS
#define SYN_UDS_S3_TIMEOUT_MS 5000U 
#endif

#ifndef SYN_UDS_SECURITY_MAX_ATTEMPTS
#define SYN_UDS_SECURITY_MAX_ATTEMPTS 3U 
#endif

#ifndef SYN_UDS_SECURITY_DELAY_MS
#define SYN_UDS_SECURITY_DELAY_MS 10000U 
#endif

#ifndef SYN_UDS_DEFAULT_RESET_TX_WAIT_MS
#define SYN_UDS_DEFAULT_RESET_TX_WAIT_MS 50U 
#endif
typedef struct {
    SYN_UDS_Session session;              
    SYN_UDS_SecurityState security_state; 
    uint8_t
        security_level;    
    uint32_t current_seed; 
    uint32_t active_seed;  
    uint8_t active_seed_subfunction;  
    bool use_aes128_security;         
    uint8_t aes_security_key[16];     
    uint8_t current_seed_bytes[16];   
    uint8_t active_seed_bytes[16];    
    uint32_t s3_timer_ms;             
    uint8_t security_error_count;     
    uint32_t security_delay_timer_ms; 
    SYN_UDS_CommControlType comm_control_state;   
    uint8_t comm_type;                            
    SYN_UDS_CommControlHandler comm_control_cb;   
    void *comm_control_ctx;                       
    uint16_t p2_max_ms;                           
    uint16_t p2_star_max_10ms;                    
    uint16_t active_p2_max_ms;                    
    uint16_t active_p2_star_max_10ms;             
    SYN_UDS_AccessTimingHandler timing_cb;        
    void *timing_ctx;                             
    SYN_UDS_SecuredDataHandler secured_data_cb;   
    void *secured_data_ctx;                       
    SYN_UDS_MemoryHandler memory_cb;              
    void *memory_ctx;                             
    SYN_UDS_AuthHandler auth_cb;                  
    void *auth_ctx;                               
    SYN_UDS_FileTransferHandler file_transfer_cb; 
    void *file_transfer_ctx;                    
    SYN_UDS_RoutineControlHandler routine_cb;   
    void *routine_ctx;                          
    SYN_UDS_IOControlHandler io_control_cb;     
    void *io_control_ctx;                       
    SYN_UDS_LinkControlHandler link_control_cb; 
    void *link_control_ctx;                     
    SYN_UDS_ResponseOnEventHandler roe_cb;      
    void *roe_ctx;                              
    SYN_UDS_ScalingDataHandler scaling_cb;      
    void *scaling_ctx;                          
    SYN_UDS_PeriodicDataHandler periodic_cb;    
    void *periodic_ctx;                         
    SYN_UDS_DynamicDIDHandler dynamic_did_cb;   
    void *dynamic_did_ctx;                      
    SYN_UDS_DTCHandler dtc_cb;                  
    void *dtc_ctx;                              
    SYN_UDS_ResetHandler reset_cb;              
    void *reset_ctx;                            
    uint16_t reset_tx_wait_ms;                  
    uint32_t reset_wait_elapsed_ms;             
    SYN_UDS_SessionTransitionHandler
        session_transition_cb;                    
    void *session_transition_ctx;                 
    SYN_UDS_DIDEntry did_table[SYN_UDS_MAX_DIDS]; 
    uint8_t did_count;                            
    SYN_UDS_DTCEntry dtc_table[SYN_UDS_MAX_DTCS]; 
    uint8_t dtc_count;                            
    SYN_UDS_TransferState transfer_state;         
    uint32_t transfer_address;                    
    uint32_t transfer_size;                       
    uint32_t transfer_bytes_processed;            
    uint8_t expected_block_seq;                   
    uint8_t reset_type_requested;                 
    uint8_t custom_session_sids[SYN_UDS_MAX_SERVICE_OVERRIDES];  
    uint8_t custom_session_masks[SYN_UDS_MAX_SERVICE_OVERRIDES]; 
    uint8_t custom_session_count; 
    uint8_t custom_security_sids[SYN_UDS_MAX_SERVICE_OVERRIDES]; 
    uint16_t
        custom_security_masks[SYN_UDS_MAX_SERVICE_OVERRIDES]; 
    uint8_t custom_security_count;                            
} SYN_UDS_Server;

bool syn_uds_enable_aes128_security(SYN_UDS_Server *server, const uint8_t key[16]);

bool syn_uds_disable_aes128_security(SYN_UDS_Server *server);

bool syn_uds_set_security_seed_bytes(SYN_UDS_Server *server, const uint8_t seed[16]);

uint8_t syn_uds_get_security_level(const SYN_UDS_Server *server);

bool syn_uds_init(SYN_UDS_Server *server);

void syn_uds_tick(SYN_UDS_Server *server, uint32_t dt_ms);

void syn_uds_set_session_transition_handler(SYN_UDS_Server *server,
                                            SYN_UDS_SessionTransitionHandler cb, void *ctx);

void syn_uds_set_reset_handler(SYN_UDS_Server *server, SYN_UDS_ResetHandler cb, void *ctx);

void syn_uds_set_reset_wait_ms(SYN_UDS_Server *server, uint16_t wait_ms);

uint8_t syn_uds_get_pending_reset(const SYN_UDS_Server *server);

void syn_uds_clear_pending_reset(SYN_UDS_Server *server);

bool syn_uds_register_did(SYN_UDS_Server *server, uint16_t did, uint8_t *data, uint16_t len,
                          bool writable);

bool syn_uds_register_did_ext(SYN_UDS_Server *server, uint16_t did, uint8_t *data, uint16_t len,
                              bool writable, uint8_t session_mask, uint16_t security_mask);

bool syn_uds_register_dtc(SYN_UDS_Server *server, uint32_t dtc, uint8_t status, uint8_t severity);

bool syn_uds_register_dtc_handler(SYN_UDS_Server *server, SYN_UDS_DTCHandler handler, void *ctx);

bool syn_uds_register_comm_control(SYN_UDS_Server *server, SYN_UDS_CommControlHandler handler,
                                   void *ctx);

bool syn_uds_register_access_timing(SYN_UDS_Server *server, SYN_UDS_AccessTimingHandler handler,
                                    void *ctx);

bool syn_uds_register_secured_data(SYN_UDS_Server *server, SYN_UDS_SecuredDataHandler handler,
                                   void *ctx);

bool syn_uds_register_memory_handler(SYN_UDS_Server *server, SYN_UDS_MemoryHandler handler,
                                     void *ctx);

bool syn_uds_register_auth_handler(SYN_UDS_Server *server, SYN_UDS_AuthHandler handler, void *ctx);

bool syn_uds_register_file_transfer(SYN_UDS_Server *server, SYN_UDS_FileTransferHandler handler,
                                    void *ctx);

bool syn_uds_register_routine_control(SYN_UDS_Server *server, SYN_UDS_RoutineControlHandler handler,
                                      void *ctx);

bool syn_uds_register_io_control(SYN_UDS_Server *server, SYN_UDS_IOControlHandler handler,
                                 void *ctx);

bool syn_uds_register_link_control(SYN_UDS_Server *server, SYN_UDS_LinkControlHandler handler,
                                   void *ctx);

bool syn_uds_register_roe_handler(SYN_UDS_Server *server, SYN_UDS_ResponseOnEventHandler handler,
                                  void *ctx);

bool syn_uds_register_scaling_data_handler(SYN_UDS_Server *server,
                                           SYN_UDS_ScalingDataHandler handler, void *ctx);

bool syn_uds_register_periodic_data_handler(SYN_UDS_Server *server,
                                            SYN_UDS_PeriodicDataHandler handler, void *ctx);

bool syn_uds_register_dynamic_did_handler(SYN_UDS_Server *server, SYN_UDS_DynamicDIDHandler handler,
                                          void *ctx);

bool syn_uds_set_service_session_mask(SYN_UDS_Server *server, uint8_t sid, uint8_t session_mask);

bool syn_uds_set_service_security_mask(SYN_UDS_Server *server, uint8_t sid, uint16_t security_mask);

bool syn_uds_process_request(SYN_UDS_Server *server, const uint8_t *req, uint16_t req_len,
                             uint8_t *resp_buf, uint16_t max_resp_len, uint16_t *resp_len,
                             SYN_UDS_AddrMode addr_mode);

bool syn_uds_is_sid_functional_supported(uint8_t sid);

bool syn_uds_dtc_report_test_result(SYN_UDS_Server *server, uint32_t dtc, bool failed);

bool syn_uds_dtc_start_operation_cycle(SYN_UDS_Server *server);

bool syn_uds_dtc_get_status(SYN_UDS_Server *server, uint32_t dtc, uint8_t *out_status);

#ifdef __cplusplus
}
#endif

#endif /* SYN_UDS_H */