Skip to content

File syn_kwp2000.h

File List > proto > syn_kwp2000.h

Go to the documentation of this file

#ifndef SYN_KWP2000_H
#define SYN_KWP2000_H

#include "../common/syn_defs.h"

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

#ifdef __cplusplus
extern "C" {
#endif

#ifndef SYN_KWP2000_MAX_LIDS
#define SYN_KWP2000_MAX_LIDS 16U 
#endif
#ifndef SYN_KWP2000_MAX_CIDS
#define SYN_KWP2000_MAX_CIDS 16U 
#endif
#define SYN_KWP2000_SID_START_DIAGNOSTIC_SESSION 0x10U     
#define SYN_KWP2000_SID_ECU_RESET 0x11U                    
#define SYN_KWP2000_SID_CLEAR_DIAGNOSTIC_INFORMATION 0x14U 
#define SYN_KWP2000_SID_READ_DTC_BY_STATUS 0x18U      
#define SYN_KWP2000_SID_READ_ECU_IDENTIFICATION 0x1AU 
#define SYN_KWP2000_SID_READ_DATA_BY_LOCAL_IDENTIFIER 0x21U   
#define SYN_KWP2000_SID_READ_DATA_BY_COMMON_IDENTIFIER 0x22U  
#define SYN_KWP2000_SID_SECURITY_ACCESS 0x27U                 
#define SYN_KWP2000_SID_WRITE_DATA_BY_COMMON_IDENTIFIER 0x2EU 
#define SYN_KWP2000_SID_START_ROUTINE_BY_LOCAL_IDENTIFIER \
    0x31U                                           
#define SYN_KWP2000_SID_REQUEST_DOWNLOAD 0x34U      
#define SYN_KWP2000_SID_TRANSFER_DATA 0x36U         
#define SYN_KWP2000_SID_REQUEST_TRANSFER_EXIT 0x37U 
#define SYN_KWP2000_SID_TESTER_PRESENT 0x3EU        
#define SYN_KWP2000_SID_NEGATIVE_RESPONSE 0x7FU     
#define SYN_KWP2000_SESSION_DEFAULT 0x81U     
#define SYN_KWP2000_SESSION_PROGRAMMING 0x85U 
#define SYN_KWP2000_SESSION_EXTENDED 0x86U    
#ifndef SYN_KWP2000_S3_TIMEOUT_MS
#define SYN_KWP2000_S3_TIMEOUT_MS 5000U 
#endif
#define SYN_KWP2000_NRC_SERVICE_NOT_SUPPORTED 0x11U     
#define SYN_KWP2000_NRC_SUBFUNCTION_NOT_SUPPORTED 0x12U 
#define SYN_KWP2000_NRC_INCORRECT_MESSAGE_LENGTH \
    0x13U 
#define SYN_KWP2000_NRC_CONDITIONS_NOT_CORRECT 0x22U      
#define SYN_KWP2000_NRC_REQUEST_OUT_OF_RANGE 0x31U        
#define SYN_KWP2000_NRC_SECURITY_ACCESS_DENIED 0x33U      
#define SYN_KWP2000_NRC_INVALID_KEY 0x35U                 
#define SYN_KWP2000_NRC_EXCEEDED_NUMBER_OF_ATTEMPTS 0x36U 
#define SYN_KWP2000_NRC_REQUIRED_TIME_DELAY_NOT_EXPIRED \
    0x37U 
#define SYN_KWP2000_NRC_RESPONSE_PENDING                    \
    0x78U 
typedef uint8_t SYN_KWP2000_Session;

typedef struct {
    uint8_t lid;      
    const void *data; 
    uint16_t len;     
    bool writable;    
} SYN_KWP2000_LID;

typedef struct {
    uint16_t cid;     
    const void *data; 
    uint16_t len;     
    bool writable;    
} SYN_KWP2000_CID;

typedef bool (*SYN_KWP2000_SessionHandler)(SYN_KWP2000_Session from_session,
                                           SYN_KWP2000_Session to_session, void *user_ctx);

typedef void (*SYN_KWP2000_ResetHandler)(uint8_t reset_type, void *user_ctx);

typedef bool (*SYN_KWP2000_SeedHandler)(uint8_t level, uint8_t *seed_buf, uint16_t *seed_len,
                                        void *user_ctx);

typedef bool (*SYN_KWP2000_KeyHandler)(uint8_t level, const uint8_t *key, uint16_t key_len,
                                       void *user_ctx);

typedef bool (*SYN_KWP2000_RoutineHandler)(uint8_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 *user_ctx);

typedef bool (*SYN_KWP2000_MemoryHandler)(bool is_write, uint32_t address, uint32_t size,
                                          uint8_t *data_buf, void *user_ctx);

typedef struct {
    SYN_KWP2000_Session current_session; 
    bool security_unlocked;              
    uint8_t security_level;              
    uint32_t s3_timer_ms;                
    SYN_KWP2000_LID lids[SYN_KWP2000_MAX_LIDS]; 
    uint16_t lid_count;                         
    SYN_KWP2000_CID cids[SYN_KWP2000_MAX_CIDS]; 
    uint16_t cid_count;                         
    SYN_KWP2000_SessionHandler session_cb; 
    void *session_ctx;                     
    SYN_KWP2000_ResetHandler reset_cb; 
    void *reset_ctx;                   
    uint8_t pending_reset_type;        
    uint32_t reset_wait_ms;            
    SYN_KWP2000_SeedHandler seed_cb; 
    SYN_KWP2000_KeyHandler key_cb;   
    void *security_ctx;              
    SYN_KWP2000_RoutineHandler routine_cb; 
    void *routine_ctx;                     
    SYN_KWP2000_MemoryHandler memory_cb; 
    void *memory_ctx;                    
    bool is_downloading;        
    uint32_t download_addr;     
    uint32_t download_size;     
    uint32_t download_received; 
} SYN_KWP2000_Server;

/* ── API Declarations ────────────────────────────────────────────────── */

SYN_Status syn_kwp2000_init(SYN_KWP2000_Server *server);

SYN_Status syn_kwp2000_register_lid(SYN_KWP2000_Server *server, uint8_t lid, const void *data,
                                    uint16_t len, bool writable);

SYN_Status syn_kwp2000_register_cid(SYN_KWP2000_Server *server, uint16_t cid, const void *data,
                                    uint16_t len, bool writable);

SYN_Status syn_kwp2000_set_session_handler(SYN_KWP2000_Server *server,
                                           SYN_KWP2000_SessionHandler cb, void *user_ctx);

SYN_Status syn_kwp2000_set_reset_handler(SYN_KWP2000_Server *server, SYN_KWP2000_ResetHandler cb,
                                         void *user_ctx);

SYN_Status syn_kwp2000_set_security_handler(SYN_KWP2000_Server *server,
                                            SYN_KWP2000_SeedHandler seed_cb,
                                            SYN_KWP2000_KeyHandler key_cb, void *user_ctx);

SYN_Status syn_kwp2000_set_routine_handler(SYN_KWP2000_Server *server,
                                           SYN_KWP2000_RoutineHandler cb, void *user_ctx);

SYN_Status syn_kwp2000_set_memory_handler(SYN_KWP2000_Server *server, SYN_KWP2000_MemoryHandler cb,
                                          void *user_ctx);

SYN_Status syn_kwp2000_process_request(SYN_KWP2000_Server *server, const uint8_t *req_buf,
                                       uint16_t req_len, uint8_t *resp_buf, uint16_t max_resp_len,
                                       uint16_t *resp_len);

void syn_kwp2000_tick(SYN_KWP2000_Server *server, uint32_t dt_ms);

#ifdef __cplusplus
}
#endif

#endif /* SYN_KWP2000_H */