290 lines
9.9 KiB
C
Executable File
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_
|