Files
kunlun/app/grapp/iot_edge_compute.h
2024-09-28 14:24:04 +08:00

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 */