#include "stdint.h" #include "string.h" #include "mod_candataprocess.h" #include "mod_spi.h" #include "sys_log.h" #include "sys_common.h" #include "lib_iso15765.h" #include "hal_can.h" #include "hal_timer.h" #define CAN_PAYLOAD_MAX_LEN 8 #define SEND_CAN_BUF_MAX_LEN 64 #define UINT32_DEFAULT_VAL 0xFFFFFFFF static uint8_t g_s_can_index; static uint8_t g_s_send_can_buf[SEND_CAN_BUF_MAX_LEN]; /******************ISO15765**********************************/ typedef struct { uint32_t frame_id; iso15765_t* process_handler; }HANDLER_T; static uint32_t getms() { return HAL_SysGetTickMs();; } static void on_error(n_rslt err_type) { DLOG_E("15765 parse err:%04x", err_type); } static uint8_t send_frame_via_can(cbus_id_type id_type, uint32_t id, cbus_fr_format fr_fmt, uint8_t dlc, uint8_t *dt) { //暂时没看到啥用处. return 0; } static void parse_finish_callback(n_indn_t *info) { if(0 == info->rslt) { DLOG_I("parse success.rslt:0x%x,frame_id:0x%x,msg_sz:0x%x,data:", info->rslt, (info->n_ai.n_sa<<8)|(info->n_ai.n_ta), info->msg_sz); for (int i = 0; i < info->msg_sz; i++) { printf("%02X", info->msg[i]); } printf("\r\n"); } else { DLOG_I("parse fail.rslt:0x%x,frame_id:0x%x", info->rslt, (info->n_ai.n_sa<<8)|(info->n_ai.n_ta)); } } static iso15765_t handler0 = { .addr_md = N_ADM_BMW, .fr_id_type = CBUS_ID_T_STANDARD, .clbs.send_frame = send_frame_via_can, .clbs.on_error = on_error, .clbs.get_ms = getms, .clbs.indn = parse_finish_callback, .config.stmin = 0x3, .config.bs = 0x0f, .config.n_bs = 100, .config.n_cr = 3 }; static iso15765_t handler1 = { .addr_md = N_ADM_BMW, .fr_id_type = CBUS_ID_T_STANDARD, .clbs.send_frame = send_frame_via_can, .clbs.on_error = on_error, .clbs.get_ms = getms, .clbs.indn = parse_finish_callback, .config.stmin = 0x3, .config.bs = 0x0f, .config.n_bs = 100, .config.n_cr = 3 }; static iso15765_t handler2 = { .addr_md = N_ADM_BMW, .fr_id_type = CBUS_ID_T_STANDARD, .clbs.send_frame = send_frame_via_can, .clbs.on_error = on_error, .clbs.get_ms = getms, .clbs.indn = parse_finish_callback, .config.stmin = 0x3, .config.bs = 0x0f, .config.n_bs = 100, .config.n_cr = 3 }; static iso15765_t handler3 = { .addr_md = N_ADM_BMW, .fr_id_type = CBUS_ID_T_STANDARD, .clbs.send_frame = send_frame_via_can, .clbs.on_error = on_error, .clbs.get_ms = getms, .clbs.indn = parse_finish_callback, .config.stmin = 0x3, .config.bs = 0x0f, .config.n_bs = 100, .config.n_cr = 3 }; HANDLER_T data_process_handler_list[] = { { .frame_id = UINT32_DEFAULT_VAL, .process_handler = &handler0, }, { .frame_id = UINT32_DEFAULT_VAL, .process_handler = &handler1, }, { .frame_id = UINT32_DEFAULT_VAL, .process_handler = &handler2, }, { .frame_id = UINT32_DEFAULT_VAL, .process_handler = &handler3, }, }; int MOD_CanIso15765ParseInit(void) { //初始化15765解析句柄. int init_ret = N_OK; for (int i=0; i>24)&0xFF; tmp_len += 1; g_s_send_can_buf[tmp_len] = (can_id>>16)&0xFF; tmp_len += 1; g_s_send_can_buf[tmp_len] = (can_id>>8)&0xFF; tmp_len += 1; g_s_send_can_buf[tmp_len] = can_id&0xFF; tmp_len += 1; g_s_send_can_buf[tmp_len] = can_payload_len; tmp_len += 1; memcpy(&g_s_send_can_buf[tmp_len], &can_payload_buf, can_payload_len); tmp_len += can_payload_len; MOD_SpiDataSend(BLE_CMD_TRANSFER, g_s_send_can_buf, tmp_len); }