146 lines
6.1 KiB
C
146 lines
6.1 KiB
C
/*
|
||
* Copyright (c) @CompanyNameMagicTag 2021-2021. All rights reserved.
|
||
* Description: transmit data
|
||
* This file should be changed only infrequently and with great care.
|
||
*/
|
||
#ifndef TRANSMIT_ITEM_H
|
||
#define TRANSMIT_ITEM_H
|
||
|
||
#include "transmit_st.h"
|
||
#include "diag.h"
|
||
|
||
#ifdef __cplusplus
|
||
#if __cplusplus
|
||
extern "C" {
|
||
#endif /* __cplusplus */
|
||
#endif /* __cplusplus */
|
||
|
||
#define TRANSMIT_OUT_TIME 30
|
||
#define TRANSMIT_RETRY_TIME 1
|
||
|
||
#define DEFAULT_TRANSMIT_BLOCK_NUMBER 8 /* 默认每次请求的数据包数量 */
|
||
#define DEFAULT_TRANSMIT_BLOCK_SIZE 0x100 /* 默认每个包发送数据最大值 */
|
||
|
||
typedef enum {
|
||
TRANSMIT_LOCAL_TYPE_SAVE_FILE,
|
||
TRANSMIT_LOCAL_TYPE_READ_FILE,
|
||
TRANSMIT_LOCAL_TYPE_READ_DATA,
|
||
TRANSMIT_LOCAL_TYPE_WRITE_DATA,
|
||
TRANSMIT_LOCAL_TYPE_SAVE_OTA_IMG,
|
||
TRANSMIT_LOCAL_TYPE_READ_OTA_IMG,
|
||
} transmit_local_type_t;
|
||
|
||
typedef enum {
|
||
TRANSMIT_STEP_START,
|
||
TRANSMIT_STEP_TRANSMIT,
|
||
} transmit_step_t;
|
||
|
||
typedef enum {
|
||
TRANSMIT_DISABLE_TIME_OUT,
|
||
TRANSMIT_DISABLE_RECV_INVALID_ID,
|
||
TRANSMIT_DISABLE_RECV_FINISH,
|
||
TRANSMIT_DISABLE_RECV_ALL_DATA,
|
||
TRANSMIT_DISABLE_USER_STOP,
|
||
} transmit_disable_reason_t;
|
||
|
||
typedef struct transmit_item_t {
|
||
uint32_t transmit_id;
|
||
uint32_t used : 1;
|
||
uint32_t init_fail : 1; /* init fail,may get resource fail */
|
||
uint32_t permanent : 1; /* not need free resource */
|
||
uint32_t local_start : 1; /* 本地为上位机置1 */
|
||
uint32_t local_src : 1; /* 本地为源端(数据发送方)置1 */
|
||
uint32_t remote_type : 4; /* see transmit_type_t */
|
||
uint32_t local_type : 4; /* see transmit_local_type_t */
|
||
uint32_t down_machine : 1;
|
||
uint32_t enable : 1;
|
||
uint32_t step : 2;
|
||
uint32_t re_trans : 1;
|
||
uint32_t pm_veto : 1;
|
||
uint32_t resvered : 13;
|
||
|
||
uint16_t data_block_number; /* 每组传输次数 */
|
||
uint16_t data_block_size; /* 每次传输数据大小 */
|
||
uint32_t received_size;
|
||
uint32_t request_size;
|
||
uint32_t total_size;
|
||
uintptr_t write_read; /* see transmit_write_hook and transmit_read_hook */
|
||
uintptr_t usr_wr_data;
|
||
uint32_t bus_addr;
|
||
char *file_name;
|
||
int32_t file_fd;
|
||
uint32_t expiration;
|
||
uint32_t last_rcv_pkt_time;
|
||
uint32_t last_send_pkt_time;
|
||
diag_option_t option;
|
||
uintptr_t result_hook; /* transmit_result_hook */
|
||
} transmit_item_t;
|
||
|
||
typedef struct {
|
||
uint32_t id_start;
|
||
uint32_t id_end;
|
||
uint32_t used;
|
||
uintptr_t hook;
|
||
} transmit_msg_proc_t;
|
||
|
||
typedef int32_t (*transmit_write_hook)(uintptr_t usr_data, uint32_t offset, uint8_t *buf, uint32_t size);
|
||
typedef int32_t (*transmit_read_hook)(uintptr_t usr_data, uint32_t offset, uint8_t *buf, uint32_t size);
|
||
typedef errcode_t (*transmit_result_hook)(bool is_finished, uintptr_t usr_data);
|
||
typedef errcode_t (*transmit_register_hook)(uint32_t msg_id, const uint8_t *msg, uint32_t msg_len);
|
||
|
||
transmit_item_t *transmit_item_match_id(uint32_t transmit_id);
|
||
transmit_item_t *transmit_item_match_type_and_dst(transmit_type_t transmit_type, diag_addr dst);
|
||
|
||
/* init functions */
|
||
transmit_item_t *transmit_item_init(uint32_t transmit_id);
|
||
void transmit_item_init_permanent(transmit_item_t *item, bool permanent);
|
||
void transmit_item_init_local_start(transmit_item_t *item, bool local_start);
|
||
void transmit_item_init_local_src(transmit_item_t *item, bool local_src);
|
||
void transmit_item_init_remote_type(transmit_item_t *item, transmit_type_t remote_type);
|
||
void transmit_item_init_local_type(transmit_item_t *item, transmit_local_type_t local_type);
|
||
void transmit_item_init_write_handler(transmit_item_t *item, transmit_write_hook handler, uintptr_t usr_data);
|
||
void transmit_item_init_read_handler(transmit_item_t *item, transmit_read_hook handler, uintptr_t usr_data);
|
||
void transmit_item_init_result_handler(transmit_item_t *item, transmit_result_hook handler, uintptr_t usr_data);
|
||
void transmit_item_init_local_bus_addr(transmit_item_t *item, uint32_t bus_addr);
|
||
void transmit_item_init_file_name(transmit_item_t *item, const char *file_name, uint16_t name_len);
|
||
void transmit_item_init_option(transmit_item_t *item, diag_option_t *option);
|
||
void transmit_item_init_down_machine(transmit_item_t *item, bool down_machine);
|
||
void transmit_item_init_received_size(transmit_item_t *item, uint32_t offset);
|
||
void transmit_item_init_total_size(transmit_item_t *item, uint32_t total_size);
|
||
void transmit_item_init_re_trans(transmit_item_t *item, bool re_trans);
|
||
void transmit_item_init_data_block_size(transmit_item_t *item, uint16_t data_block_size);
|
||
void transmit_item_init_data_block_number(transmit_item_t *item, uint16_t data_block_number);
|
||
bool transmit_item_init_is_success(const transmit_item_t *item);
|
||
void transmit_item_deinit(transmit_item_t *item);
|
||
void transmit_timer_start(void);
|
||
|
||
/* en-disable process of this item */
|
||
void transmit_item_disable(transmit_item_t *item, transmit_disable_reason_t reason);
|
||
void transmit_item_enable(transmit_item_t *item);
|
||
void transmit_item_finish(transmit_item_t *item, transmit_disable_reason_t reason);
|
||
|
||
/* send pkt functions */
|
||
errcode_t transmit_send_invalid_id(uint32_t transmit_id, diag_option_t *option, bool down_machine);
|
||
errcode_t transmit_send_finish_pkt(uint32_t transmit_id, diag_option_t *option, bool down_machine);
|
||
errcode_t transmit_send_failed_pkt(uint32_t transmit_id, diag_option_t *option, bool down_machine);
|
||
|
||
/* process pkt frame */
|
||
void transmit_item_process_notify_frame(transmit_state_notify_pkt_t *pkt, diag_option_t *option,
|
||
bool from_upper_machine);
|
||
|
||
/* get pkt buf functions */
|
||
void *transmit_item_get_pkt_buf(const transmit_item_t *item, uint32_t buf_size);
|
||
void transmit_item_free_pkt_buf(const transmit_item_t *item, const void *buf);
|
||
|
||
errcode_t transmit_item_module_init(void);
|
||
|
||
errcode_t transmit_msg_proc_hook_register(uint32_t msg_id_start, uint32_t msg_id_end, transmit_register_hook hook);
|
||
errcode_t transmit_msg_proc_hook_unregister(transmit_register_hook hook);
|
||
|
||
#ifdef __cplusplus
|
||
#if __cplusplus
|
||
}
|
||
#endif /* __cplusplus */
|
||
#endif /* __cplusplus */
|
||
#endif /* TRANSMIT_ITEM_H */
|