280 lines
8.7 KiB
C
280 lines
8.7 KiB
C
/****************************************************************************
|
|
|
|
Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
|
|
|
|
This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
|
|
be copied by any method or incorporated into another program without
|
|
the express written consent of Aerospace C.Power. This Information or any portion
|
|
thereof remains the property of Aerospace C.Power. The Information contained herein
|
|
is believed to be accurate and Aerospace C.Power assumes no responsibility or
|
|
liability for its use in any way and conveys no license or title under
|
|
any patent or copyright and makes no representation or warranty that this
|
|
Information is free from patent or copyright infringement.
|
|
|
|
****************************************************************************/
|
|
|
|
#ifndef IOT_EDGE_COMPUTE_H
|
|
#define IOT_EDGE_COMPUTE_H
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* the max cache number */
|
|
#define EDGECOM_MAX_CMD (10)
|
|
/* the max lenth of tx data */
|
|
#define EDGECOM_CACHE_TXDATA_MAX_LEN (32)
|
|
/* the max lenth of rx data */
|
|
#define EDGECOM_CACHE_RXDATA_MAX_LEN (255)
|
|
/* edge uart respond timeover each send(ms) */
|
|
#define UART_RX_TIMEOUT (500)
|
|
/* edge uart respond max overtime(ms) */
|
|
#define UART_MAX_TIMEOUT (1000)
|
|
/* edge starting and stopping state wait before go into next state(ms) */
|
|
#define EDGE_STARTING_STOPPING_TIMEOUT (500)
|
|
/* timer between two cache cmd(ms) */
|
|
#define UART_NEXT_CACHE_TIMEOUT (100)
|
|
/* timer for another edge start(ms) */
|
|
#define UART_MONITOR_START_TIMEOUT (1000)
|
|
|
|
/* edge command timeout time */
|
|
#define UART_RX_MAX_TIMEOUT_MIN (500) // utils:ms
|
|
#define UART_RX_MAX_TIMEOUT_MAX (5000) // utils:ms
|
|
/* edge command interve time */
|
|
#define EDGE_CMD_INTERVE_MIN (20) // utils:ms
|
|
#define EDGE_CMD_INTERVE_MAX (3000) // utils:ms
|
|
/* monitor start time */
|
|
#define UART_MONITOR_START_MIN (20) // utils:ms
|
|
#define UART_MONITOR_START_MAX (20000) // utils:ms
|
|
/* edge starting stopping time */
|
|
#define EDGE_STARTING_STOPPING_MIN (20) // utils:ms
|
|
#define EDGE_STARTING_STOPPING_MAX (3000) // utils:ms
|
|
/* edge each command interve time */
|
|
#define UART_RX_TIMEOUT_MIN (500) // utils:ms
|
|
#define UART_RX_TIMEOUT_MAX (5000) // utils:ms
|
|
|
|
/* edge baudrate index max count */
|
|
#define EDGE_BAUD_IDX_CNT (5)
|
|
|
|
#define INPUT_PROTO_CHECK(msg_id) \
|
|
((msg_id == EDGE_INPUT_DEL_CACHE_ID) ||\
|
|
(msg_id == EDGE_INPUT_ADD_CACHE_ID) ||\
|
|
(msg_id == EDGE_INPUT_QUERY_CACHE_INFO_ID) ||\
|
|
(msg_id == EDGE_INPUT_SET_DELAY_TIME_ID) ||\
|
|
(msg_id == EDGE_INPUT_QUERY_DELAY_TIME_ID) ||\
|
|
(msg_id == EDGE_INPUT_QUERY_CACHE_CNT_ID) ||\
|
|
(msg_id == EDGE_INPUT_SET_DELAY_TIME_INNER_ID) ||\
|
|
(msg_id == EDGE_INPUT_QUERY_DELAY_TIME_INNER_ID)||\
|
|
(msg_id == EDGE_INPUT_SET_BAUD_ID) ||\
|
|
(msg_id == EDGE_INPUT_QUERY_BAUD_ID))
|
|
|
|
enum
|
|
{
|
|
/* edge uart receive msg */
|
|
EDGE_UART_RX_MSG = 0x10,
|
|
/* msg input to edge */
|
|
EDGE_INPUT_MSG,
|
|
/* edge timer msg */
|
|
EDGE_TIMER_MSG,
|
|
/* edge inner msg */
|
|
EDGE_INTERNAL_MSG,
|
|
/* msg edge output to proto */
|
|
EDGE_OUTPUT_MSG,
|
|
};
|
|
|
|
/* input edge id */
|
|
enum
|
|
{
|
|
EDGE_INPUT_REQ_START_ID = 0x1,
|
|
EDGE_INPUT_REQ_STOPID_ID,
|
|
EDGE_INPUT_ADD_CACHE_ID,
|
|
EDGE_INPUT_DEL_CACHE_ID,
|
|
EDGE_INPUT_QUERY_CACHE_INFO_ID,
|
|
EDGE_INPUT_QUERY_CACHE_CNT_ID,
|
|
EDGE_INPUT_SET_DELAY_TIME_ID,
|
|
EDGE_INPUT_QUERY_DELAY_TIME_ID,
|
|
EDGE_INPUT_SET_DELAY_TIME_INNER_ID,
|
|
EDGE_INPUT_QUERY_DELAY_TIME_INNER_ID,
|
|
EDGE_INPUT_SET_BAUD_ID,
|
|
EDGE_INPUT_QUERY_BAUD_ID,
|
|
};
|
|
|
|
/* output edge id */
|
|
enum
|
|
{
|
|
EDGE_OUTPUT_STOPPED_ID = 0x1,
|
|
EDGE_OUTPUT_DL645_PKT_ID,
|
|
EDGE_OUTPUT_RESP_CACHE_INFO_ID,
|
|
EDGE_OUTPUT_RESP_CACHE_CNT_ID,
|
|
EDGE_OUTPUT_RESP_DELAY_TIME_ID,
|
|
EDGE_OUTPUT_RESP_DELAY_TIME_INNER_ID,
|
|
EDGE_OUTPUT_RESP_BAUD_ID,
|
|
};
|
|
|
|
typedef enum {
|
|
EDGE_RESP_TIME_PARAM = 0,
|
|
EDGE_RESP_EDGE_CMD_CNT,
|
|
EDGE_RESP_EDGE_CMD_INFO,
|
|
EDGE_RESP_TIME_PARAM_INNER,
|
|
EDGE_RESP_CMD_BAUD,
|
|
} edge_resp_type_e;
|
|
|
|
typedef enum {
|
|
EDGE_QUERY_EDGE_CMD_645 = 0,
|
|
EDGE_QUERY_EDGE_CMD_MODBUS,
|
|
} edge_query_type_e;
|
|
|
|
#pragma pack(push) // save the pack status
|
|
#pragma pack(1) // 1 byte align
|
|
|
|
/* used by EDGE_INPUT_SET_DELAY_TIME_ID and EDGE_OUTPUT_RESP_DELAY_TIME_ID */
|
|
typedef struct _edge_delay_time_info_t
|
|
{
|
|
uint16_t cmd_inverval;
|
|
uint16_t cmd_tol_tm;
|
|
} edge_delay_time_info_t;
|
|
|
|
typedef struct _baud_info_t
|
|
{
|
|
/* baudrate */
|
|
uint8_t baud_idx;
|
|
/* parity */
|
|
uint8_t parity;
|
|
} baud_info_t;
|
|
|
|
typedef struct _edge_baud_cmd_t
|
|
{
|
|
/* edge cmd index*/
|
|
uint8_t index;
|
|
/* baudrate info */
|
|
baud_info_t baud_info;
|
|
} edge_baud_cmd_t;
|
|
|
|
/* used by EDGE_INPUT_SET_DELAY_TIME_INNER_ID and
|
|
EDGE_OUTPUT_RESP_DELAY_TIME_INNER_ID */
|
|
typedef struct _edge_delay_time_info_inner_t
|
|
{
|
|
/* time for starting and stopping state delay */
|
|
uint16_t cmd_starting_stopping_tm;
|
|
/* time for each one receive time out */
|
|
uint16_t cmd_each_tm;
|
|
} edge_delay_time_info_inner_t;
|
|
|
|
/* used by EDGE_INPUT_ADD_CACHE_ID, EDGE_INPUT_DEL_CACHE_ID and
|
|
EDGE_OUTPUT_RESP_CACHE_INFO_ID*/
|
|
typedef struct _edge_cache_cmd_info_t
|
|
{
|
|
/* the type of cache command */
|
|
uint8_t cmd_type;
|
|
/* the index of cache command */
|
|
uint8_t idx;
|
|
/* the data of the cache command */
|
|
uint8_t data[0];
|
|
} edge_cache_cmd_info_t;
|
|
|
|
/* used by EDGE_OUTPUT_RESP_CACHE_CNT_ID */
|
|
typedef struct _edge_cmd_cnt_t
|
|
{
|
|
/* the count of cache command */
|
|
uint8_t cnt;
|
|
} edge_cmd_cnt_t;
|
|
|
|
/* command info */
|
|
typedef struct _edgecom_cmd_t {
|
|
/* send cmd length, need less than EDGECOM_CACHE_TXDATA_MAX_LEN */
|
|
uint8_t tx_len;
|
|
/* send buffer */
|
|
uint8_t tx_buf[EDGECOM_CACHE_TXDATA_MAX_LEN];
|
|
/* read cmd len need less than EDGECOM_CACHE_TXDATA_MAX_LEN */
|
|
uint8_t rx_len;
|
|
/* receive buffer */
|
|
uint8_t rx_buf[EDGECOM_CACHE_RXDATA_MAX_LEN];
|
|
} edgecom_cmd_t;
|
|
|
|
/* this struct will be saved to flash */
|
|
typedef struct edgecom_flash_info_t
|
|
{
|
|
uint32_t magic_start;
|
|
/* one edge command total time */
|
|
uint32_t cmd_tol_tm;
|
|
/* edge command interval time */
|
|
uint32_t cmd_inverval;
|
|
/* for each uart rx wait time */
|
|
uint32_t cmd_each_tm;
|
|
/* delay time for comming in or out edge_stated state */
|
|
uint32_t cmd_starting_stopping_tm;
|
|
/* record whitch place of cache has cmd */
|
|
uint32_t edge_cmd_sign;
|
|
edgecom_cmd_t cmd_list[EDGECOM_MAX_CMD];
|
|
/* edge commmand baud info */
|
|
baud_info_t baud_info[EDGECOM_MAX_CMD];
|
|
uint32_t magic_end;
|
|
} edgecom_flash_info_t;
|
|
|
|
typedef struct _debug_statistic
|
|
{
|
|
/* the count receive data during stopping state */
|
|
uint32_t stopping_rxuart_cnt;
|
|
} debug_statistic;
|
|
|
|
typedef struct _edge_obj_t
|
|
{
|
|
/* edge_state_idle etc */
|
|
uint8_t edge_state;
|
|
/* uart hdl, need to be check if it is NULL before send msg */
|
|
void* uart_hdl;
|
|
/* which cmd is polling */
|
|
uint8_t cmd_bit_idx;
|
|
/* every loop, which cmd is not poll yet */
|
|
uint32_t loop_cache_sign;
|
|
/* the total time edge uart wait for respond each cmd */
|
|
uint32_t uart_rx_total_time;
|
|
/* to count debug statistic during polling */
|
|
debug_statistic debug_statistic_cnt;
|
|
/* starting and stopping timer */
|
|
timer_id_t edge_monitor_start_stop_tmr;
|
|
/* timer for interval between two cache cmd */
|
|
timer_id_t next_cache_tmr;
|
|
/* timer for uart respond */
|
|
timer_id_t uart_rx_tmr;
|
|
/* cache info, will save to flash */
|
|
edgecom_flash_info_t cache_info;
|
|
} edge_obj_t;
|
|
|
|
#pragma pack(pop)
|
|
|
|
void iot_edge_init(void);
|
|
uint8_t iot_edge_tmr_init(void);
|
|
|
|
/**
|
|
* @brief iot_edge_state_machine() - to handle the edge state machine of edge
|
|
* @param msg: message type
|
|
* @param msg_id: message id
|
|
* @param arg: point to the data
|
|
*/
|
|
void iot_edge_state_machine(uint8_t msg, uint8_t msg_id, void *arg);
|
|
|
|
/**
|
|
* @brief iot_os_stop_timer_handle() - to stop the timer and clear msg of the
|
|
timer
|
|
* @param tmr: the timer id
|
|
* @param msg: the msg
|
|
* @param msg_id: the message id
|
|
*/
|
|
void iot_os_stop_timer_handle(timer_id_t tmr, uint16_t msg, uint8_t msg_id);
|
|
|
|
/**
|
|
* @brief proto_post_data_to_edge_msg_handle() - proto post data message to edge
|
|
* @param msg_id: the message id
|
|
* @param data: the msg data
|
|
* @param data_len: the msg data len
|
|
*/
|
|
void proto_post_data_to_edge_msg_handle(uint8_t msg_id, void *data,
|
|
uint16_t data_len);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* end IOT_EDGE_COMPUTE_H */
|