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

290 lines
9.9 KiB
C
Executable File

/****************************************************************************
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_SG_CTRL_H_
#define _IOT_SG_CTRL_H_
#include "iot_task_api.h"
#include "os_timer_api.h"
#include "iot_uart_api.h"
#include "iot_addr_hash_table_api.h"
#include "iot_plc_api.h"
#include "iot_cli_sg_api.h"
#include "iot_sg_ctrl_api.h"
#include "iot_sg_ctrl_fr.h"
#ifdef __cplusplus
extern "C" {
#endif
/* define priorities for message to be handle */
#define IOT_SG_CTRL_TASK_QUEUE_HP 0
#define IOT_SG_CTRL_TASK_QUEUE_MAX_PRIO 1
#define IOT_SG_CTRL_TASK_POOL_SIZE 128
/* UART received buffer size */
#define IOT_SG_CTRL_UART_RECV_BUF_SIZE 2048
/* message type */
#define IOT_SG_CTRL_MSG_TYPE_PLC 0
#define IOT_SG_CTRL_MSG_TYPE_TIME 1
#define IOT_SG_CTRL_MSG_TYPE_UART 2
#define IOT_SG_CTRL_MSG_TYPE_CLI 3
/* message id for timer */
#define IOT_SG_CTRL_MSG_ID_TIMER_CHECK 1 /* check cache data in buffer */
#define IOT_SG_CTRL_MSG_ID_PLC_RECV 2
#define IOT_SG_CTRL_MSG_ID_UART_RECV 3
#define IOT_SG_CTRL_MSG_ID_CLI 4
/* check cache data in sendq interval, unit is ms */
#define IOT_SG_CTRL_PERIODIC_TIMER_INTERVAL (250)
/* Macro to define msdu pkt pool number */
#define IOT_SG_CTRL_POOL_NUM 8
/* Macro to define ul sn buffer size */
#define IOT_SG_CTRL_UL_SIZE 16
/* max life-span cnt, which decide how long will the buff keep the frame info */
#define IOT_SG_CTRL_MAX_LIFE_SPAN_CNT 24
/* rerty invterval , unit is IOT_SG_CTRL_APP_MAX_RETRY_INTV_CNT */
#define IOT_SG_CTRL_APP_RETRY_INTV_CNT 8
/* scan node check periodic max count
* periodis value is IOT_SG_CTRL_PERIODIC_TIMER_INTERVAL ms
*/
#define IOT_SG_CTRL_MAX_CHECK_PERIODIC (0x0f)
/* scan node entry max age- unit :
* (IOT_SG_CTRL_PERIODIC_TIMER_INTERVAL * IOT_SG_CTRL_MAX_CHECK_PERIODIC) ms
*/
#define IOT_SG_CTRL_MAX_AGE (60)
/* define scan node hash table size */
#define IOT_SG_CTRL_SCAN_HASH_TABLE_SIZE 7
/* scan node max count */
#define IOT_SG_CTRL_SCAN_MAX_CNT (255)
/* define type of gw app ctrl proto */
#define IOT_SG_APP_CTRL_PROTO_GW 0
/* define type of nw app ctrl proto */
#define IOT_SG_APP_CTRL_PROTO_NW 1
/* define the max inner num */
#define GPIO_PIN_NUMBER_INNER_MAX 48
/* phy num of plc led */
#define IOT_EXT_PLC_LED_GPIO (1)
/* phy num of warn led */
#define IOT_EXT_WARN_LED_GPIO (2)
/* the logic num of inner gpio is 0 ~ 48, the num of external gpio is 49 ~ 64
* logic num of plc led
*/
#define IOT_EXT_PLC_LED_GPIO_LOGIC (GPIO_PIN_NUMBER_INNER_MAX + 2)
/* logic num of warn led */
#define IOT_EXT_WARN_LED_GPIO_LOGIC (GPIO_PIN_NUMBER_INNER_MAX + 3)
/* led on */
#define LED_ON (0)
/* led off */
#define LED_OFF (1)
enum gpio_type_e {
/* plc led blink num */
EXT_LED_PLC = 0,
/* crash led blink num */
EXT_LED_WARRING,
EXT_LED_MAX,
};
typedef struct _ckb_led_blink_ctrl_t {
/* is the led need blink */
uint8_t blink_flag;
/* the last state of the blinking led */
uint8_t last_state;
} net_led_ctrl_t;
typedef struct _iot_ctrl_task_msg {
/* standard iot_task message */
iot_task_msg_t msg;
/* pointer to message data */
void *data;
} iot_ctrl_task_msg_t;
/* frame infor extracted from the frame */
typedef struct _frame_info_t {
/* command type, see PROTO_CTRL_CMD_TYPE_XXX */
uint8_t cmd_type;
/* pkt been sent counter, 0 means the buffer is not used */
uint8_t send_cnt;
/* life-span counter */
uint16_t span_cnt;
/* app sequence number */
uint16_t app_sn;
/* sent pkt */
iot_pkt_t *send_pkt;
} frame_info_t;
/* frame infor pool */
typedef struct _info_pool_t {
/* how many buffers are not used */
uint8_t remain_cnt;
/* infor extracted from the frame */
frame_info_t frm_info[IOT_SG_CTRL_POOL_NUM];
} info_pool_t;
/* scan node info */
typedef struct _scan_node_info {
iot_addr_hash_entry_t entry;
/* index of entry list */
uint8_t index;
/* age of the entry. It's updated periodically.
* The entry shall be removed when its age reach certain value. */
uint8_t age;
/* node information */
ctrl_node_info_t node_info;
} scan_node_info_t;
/* scan node info */
typedef struct _scan_node_handle {
/* scan running */
uint8_t scan_runing;
/* refresh node periodic 250ms * 16 = 4s */
uint8_t scan_period;
/* hash table for scan node entry. */
iot_addr_hash_table_h table;
/* scan total node count */
uint8_t total_scan_cnt;
/* pointer array point to hash table entry for iteration. */
scan_node_info_t **scan_node_list;
} scan_node_handle_t;
typedef struct _iot_sg_ctrl_test_task_data {
/* app sending sequence number for msdu */
uint16_t app_sn;
/* handle of the sg_ctrl iot_task */
iot_task_h task_handle;
/* a flag indicating if app registered successfully */
uint8_t app_registered;
/* indication for device is ready for data transmition or not */
uint8_t dev_ready;
/* mac address of local device */
uint8_t local_mac_addr[IOT_MAC_ADDR_LEN];
/* mac address of destination device*/
uint8_t dst_mac_addr[IOT_MAC_ADDR_LEN];
/* handle of this app */
iot_plc_app_h app_handle;
/* timer to call api periodically */
timer_id_t ctrl_timer;
/* com for upper host */
iot_uart_h uart_h;
/* cli interface for sg ctrl */
iot_cli_sg_interface_t cli_sg_interface;
/* connect role ,see IOT_PLC_DEV_ROLE_XXX */
uint8_t connect_role;
/* frame infor pool */
info_pool_t info_pool;
/* ul sn buffer */
uint16_t ul_sn[IOT_SG_CTRL_UL_SIZE];
/* ul sn buffer index */
uint8_t ul_sn_index;
/* translate packet proto type, see - IOT_CTRL_PROTO_XXX */
uint8_t proto_type;
/* app ctrl proto type fro PLC translate, see - IOT_SG_APP_CTRL_PROTO_XXX */
uint8_t app_proto;
/* ckq frequence band, see - PLC_LIB_FREQ_BAND_XXX */
uint8_t freq_band;
/* app set ckq frequence band, see - PLC_LIB_FREQ_BAND_XXX */
uint8_t config_freq_band;
/* connected sequence */
uint8_t connect_seq;
/* ckq drv array */
iot_ctrl_drv_t *ctrl_drv;
/* scan node handle */
scan_node_handle_t scan_handle;
}iot_sg_ctrl_global_t;
extern iot_sg_ctrl_global_t *sg_ctrl_global;
/**
* @brief iot_sg_ctrl_get_ckq_data_sn() - get ckq data sequence number and
* check master or slave.
* @param data: ckq source data from host.
* @param app_sn: sequence number ptr.
* @retval: 1 - is report data(master).
* 0 - is response data(slave).
*/
uint8_t iot_sg_ctrl_get_ckq_data_sn(uint8_t *proto_header, uint8_t *app_sn);
/**
* @brief iot_sg_ctrl_ul_sn_exist() - check sequence number is exist in ul
* buffer, record sequence number.
* @param app_sn: sequence number.
* @retval: 1 - exist.
* 0 - no exist and record sn.
*/
uint8_t iot_sg_ctrl_ul_sn_exist(uint16_t app_sn);
/**
* @brief iot_sg_ctrl_pool_sn_exist() - check sequence number is exist in dl
* pool buffer.
* @param pool: pool buffer.
* @param app_sn: sequence number.
* @param clr_flag: 1 - clean sn frm data. 0 - no clean sn frm data.
* @retval: 1 - exist.
* 0 - no exist.
*/
uint8_t iot_sg_ctrl_pool_sn_exist(info_pool_t *pool, uint16_t app_sn,
uint8_t clr_flag);
/**
* @brief iot_sg_ctrl_rpt_sta_data() - report sta meter data to host.
* @param data: report data ptr.
* @param data_len: report data length.
* @param msg_id: msg id see - IOT_CTRL_EVENT_XXX
*/
void iot_sg_ctrl_rpt_sta_data(uint8_t *data, uint16_t data_len, uint8_t msg_id);
/**
* @brief iot_sg_ctrl_rpt_cco_data() - report cco data to host.
* @param rev_pkt: report pkt, is consumed.
*/
void iot_sg_ctrl_rpt_cco_data(iot_pkt_t *rev_pkt);
/**
* @brief iot_sg_ctrl_id_info_rpt() - report id information
* @param id: id information
* @param len: id data length
* @param id_type: id type, see PROTO_CTRL_ID_INFO_TYPE_XXX.
* @param dev_type: device type, see IOT_PLC_DEV_TYPE_XXX.
*/
void iot_sg_ctrl_id_info_rpt(uint8_t *id, uint8_t len, uint8_t id_type,
uint8_t dev_type);
/**
* @brief iot_sg_ctrl_data_rpt_drv() - report data to driver
* @param sn: sequence number for a packet.
* @param evt_type: report event type, see IOT_CTRL_EVENT_XXX.
* @param data: report data.
* @param data_len: report data length.
*/
void iot_sg_ctrl_data_rpt_drv(uint8_t sn, uint8_t evt_type, uint8_t *data,
uint16_t data_len);
#ifdef __cplusplus
}
#endif
#endif //_IOT_SG_CTRL_H_