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