Files
kunlun/app/iot_cus_at_app/proto/app_proto_proc.h
2024-09-28 14:24:04 +08:00

394 lines
13 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 _APP_PROTO_PROC_H_
#define _APP_PROTO_PROC_H_
#include "app_types.h"
#include "app_proto.h"
#include "app_common.h"
#include "app_config.h"
#include "app_upg.h"
#ifdef __cplusplus
extern "C" {
#endif
#define PROTO_RET_CODE_SUCCESS 0x00
#define PROTO_RET_CODE_FAILED 0x01
/* Abnormal status code */
#define PROTO_REASON_NORMAL 0x00 /* The status is normal. */
#define PROTO_REASON_TIMEOUT 0x01 /* communication timeout */
#define PROTO_REASON_FORMAT 0x02 /* format error */
#define PROTO_REASON_BUSY 0x03 /* node busy */
#define PROTO_REASON_OTHER 0xFF /* Other errors */
#define PROTO_1S_CONVERT_MS 1000
#define PROTO_DELAY_MIN_TIME_MS 500
#define PROTO_PAD_LEN1 2
#define PROTO_PAD_LEN2 3
#define PROTO_CRC_HIGH_BIT_OFFSET 8
#define PROTO_MANU_CODE_LEN 2
#define PROTO_CHIP_TYPE_LEN 2
#define PROTO_MAX_RSP_DATA_LEN 512
typedef enum {
ID_PROTO_CMD_GET_VERSION = 0x0001,
ID_PROTO_CMD_GET_MAC_ADDR,
ID_PROTO_CMD_GET_DEV_ADDR,
ID_PROTO_CMD_SET_DEV_ADDR,
ID_PROTO_CMD_REBOOT_MODULE,
ID_PROTO_CMD_TRANS_FILE,
ID_PROTO_CMD_QRY_ONPOWER_TIME,
ID_PROTO_CMD_GET_WLIST_NUM = 0x0010,
ID_PROTO_CMD_GET_WLIST_INFO,
ID_PROTO_CMD_ADD_WLIST_NODE,
ID_PROTO_CMD_DEL_WLIST_NODE,
ID_PROTO_CMD_CLEAR_WLIST,
ID_PROTO_CMD_ENABLE_SELF_IDY,
ID_PROTO_CMD_SET_WLIST_STATE,
ID_PROTO_CMD_GET_WLIST_STATE,
ID_PROTO_CMD_GET_TOPO_NUM = 0x0020,
ID_PROTO_CMD_GET_TOPO_INFO,
ID_PROTO_CMD_GET_TOPO_INO_EX,
ID_PROTO_CMD_SET_GPIO = 0x0023,
ID_PROTO_CMD_GET_GPIO,
ID_PROTO_CMD_REPORT_ONOFFLINE = 0x0030,
ID_PROTO_CMD_GET_CALC_VALI = 0x0040,
ID_PROTO_CMD_GET_WORK_BAND = 0x0050, /* query work band */
ID_PROTO_CMD_SET_WORK_BAND, /* set work band */
ID_PROTO_CMD_GET_SCAN_BAND, /* query frequency band bitmap */
ID_PROTO_CMD_SET_SCAN_BAND, /* set frequency band bitmap */
ID_PROTO_CMD_GET_NBNET_INFO = 0x0060,
ID_PROTO_CMD_GET_UART_PARAM = 0x0070, /* query uart parameter */
ID_PROTO_CMD_SET_UART_PARAM, /* set uart parameter */
ID_PROTO_CMD_DATA_TRANS_TX = 0x0100,
ID_PROTO_CMD_DATA_TRANS_RX,
ID_PROTO_CMD_REMOTE_CMD_TX = 0x0110,
ID_PROTO_CMD_REMOTE_CMD_RX,
ID_PROTO_CMD_SYSCTRL_DATA_TRANS = 0x0120, /* for system control */
//ID_PROTO_CMD_DUT_SET_ADDR = 0x1000, /* set mac for dut, it will be lose after power-off */
//ID_PROTO_CMD_SET_WORK_MODE = 0x1201, /* set nv 0x3 revesed[0] */
ID_PROTO_CMD_GET_NV_MAC_ADDR = 0x1203, /* get nv 0x3 mac */
ID_PROTO_CMD_SET_NV_MAC_ADDR = 0x1204, /* set nv 0x3 mac */
} id_proto_cmd;
/* pack for the structures in the whole file */
#pragma pack(push) // save the pack status
#pragma pack(1) // 1 byte align
/* Acknowledgement/Negative acknowledgment structure */
typedef struct {
uint8_t ret_code; /* Error code. 0: success; 1: failure */
uint8_t reason; /* Cause of the error */
uint8_t reserved[PROTO_PAD_LEN1];
} proto_reply_ind;
/* Response structure for reading the version information */
typedef struct {
uint8_t manu_code[PROTO_MANU_CODE_LEN]; /* vendor code: HS (4853H) */
uint8_t chip_type[PROTO_CHIP_TYPE_LEN]; /* Chip model: 3011H */
uint16_t version; /* Version number */
uint16_t reserved;
} proto_get_version_ind;
/* Structure of the response to the request for reading the MAC address */
typedef struct {
uint8_t addr[IOT_MAC_ADDR_LEN]; /* address */
uint8_t reserved[PROTO_PAD_LEN1];
} proto_get_mac_addr_ind;
/* Structure of the response to set device address*/
typedef proto_reply_ind proto_set_dev_addr_ind;
/* Structure of the module restart request */
typedef struct {
uint8_t delay; /* Delay restart time, in seconds */
uint8_t reserved[PROTO_PAD_LEN2];
} proto_module_reboot_req;
/* Structure of the module restart response */
typedef proto_reply_ind proto_module_reboot_ind;
/* Structure of the response to the request for reading the MAC address */
typedef struct {
uint8_t addr[IOT_MAC_ADDR_LEN]; /* address */
uint16_t frame_index;
uint32_t on_power_ms_time;
} proto_qry_on_power_time_ind;
typedef struct {
uint8_t pin_num; /* GPIO pin */
uint8_t type; /* pin type <0:unknow, 1:GPIO, 2:PWM> */
uint8_t state; /* GPIO state <0:low level, 1:high level(pwm 0-100)> */
uint8_t pwm_freq; /* pwm frequency (unit:kHz) */
uint8_t pwm_ctl_mode; /* pwm ctl mode <0:real-time, 1:linear, 2:logar> */
uint8_t pwm_adjust_time; /* pwm gradient duration */
} proto_pin_info;
typedef struct {
uint8_t ret_code; /* status: 0-success, 1-failed */
uint8_t reason; /* failed reason */
uint8_t rsv[2];
} proto_set_gpio_ind;
typedef struct {
uint16_t cnt;
uint8_t rsv[2];
proto_pin_info gpio_info[0];
} proto_get_gpio_ind;
/*
* Channel forwarding command
* Structure of a data sending request
*/
typedef struct {
uint8_t dst_addr[IOT_MAC_ADDR_LEN]; /* destination communication address;
* FFFFFFFFFFFF indicates the network-wide broadcast */
uint16_t data_length; /* User data length */
uint8_t data[0]; /* User data */
} proto_data_transmit_tx_req;
/* Structure of the data transmission response */
typedef proto_reply_ind proto_data_transmit_tx_ind;
/* Structure of the request for receiving data */
typedef struct {
uint8_t src_addr[IOT_MAC_ADDR_LEN]; /* transmit device communication address */
uint16_t data_length; /* User data length */
uint8_t data[0]; /* User data */
} proto_data_transmit_rx_req;
typedef struct {
uint8_t dst_addr[IOT_MAC_ADDR_LEN]; /* destination communication address;
* FFFFFFFFFFFF indicates the network-wide broadcast */
uint16_t data_length; /* User data length */
uint8_t data[0]; /* User data */
} proto_sysctrl_data_from_uart;
typedef struct {
uint8_t src_addr[IOT_MAC_ADDR_LEN]; /* transmit device communication address */
uint16_t data_length; /* User data length */
uint8_t data[0]; /* User data */
} proto_sysctrl_data_to_uart;
/*
* Read the info of neibhourhood.
*/
typedef struct {
/* cco mac地址 */
uint8_t cco_mac[IOT_MAC_ADDR_LEN];
/* 当前网络的nid */
uint32_t nid;
/* 三相信噪比 */
int8_t snr[IOT_PLC_PHASE_CNT];
} iot_plc_nb_info;
/*
* Read all the info of cco nbnet.
*/
typedef struct {
uint8_t nb_num;
uint8_t rsv[3];
iot_plc_nb_info data[0];
} proto_get_nbnet_info_ind;
/*
* Whitelist operation
* Read the number of nodes in the whitelist.
*/
typedef struct {
uint16_t num; /* Number of Nodes */
uint16_t reserved;
} proto_get_whitelist_num_ind;
/* Number of nodes */
typedef struct {
uint16_t start; /* Start sequence number, starting from 1 */
uint16_t count; /* Number of nodes to be queried */
} proto_get_whitelist_info_req;
/* Structure of the response to the request for reading the whitelist information */
typedef struct {
uint16_t total; /* Total number of nodes */
uint16_t start; /* Start sequence number, starting from 1 */
uint16_t count; /* Number of nodes to be queried */
uint16_t reserved;
uint8_t data[0]; /* Length of the data reported by the current frame */
} proto_get_whitelist_info_ind;
/* Request structure for adding a node to the whitelist */
typedef struct {
uint16_t count; /* Number of nodes */
uint8_t data[0]; /* Whitelist data */
} proto_add_whitelist_req;
/* Response structure for adding a node to the whitelist */
typedef proto_reply_ind proto_add_whitelist_ind;
/* Response structure for deleting a node to the whitelist */
typedef proto_reply_ind proto_del_whitelist_ind;
/* Clear the whitelist response structure. */
typedef proto_reply_ind proto_clear_whitelist_ind;
/* Enable network identify response structure. */
typedef proto_reply_ind proto_enable_ni_ind;
/*whitelist state*/
typedef struct {
uint8_t state; /* whitelist state */
uint8_t rsv[3];
} proto_get_whitelist_state_ind;
/* Request structure for setting whitelist state */
typedef proto_get_whitelist_state_ind proto_set_whitelist_state_req;
/* Response structure for setting whitelist state */
typedef proto_reply_ind proto_set_whitelist_state_ind;
/*
* Topology operations
* Read the number of nodes in the topology.
*/
typedef proto_get_whitelist_num_ind proto_get_topo_num_ind;
/* Structure of the request for reading topology information */
typedef proto_get_whitelist_info_req proto_get_topo_info_req;
/* Structure of the response to the request for reading topology information */
typedef proto_get_whitelist_info_ind proto_get_topo_info_ind;
/* Structure of the response to the request for frequency band */
typedef struct {
uint8_t band; /* work band */
uint8_t rsv[3];
} proto_get_work_band_ind;
/* Request structure for setting frequency band */
typedef proto_get_work_band_ind proto_set_work_band_req;
/* Response structure for setting frequency band */
typedef proto_reply_ind proto_set_work_band_ind;
/* Structure of the response to the request for scan band bitmap */
typedef struct {
uint8_t fb_bitmap[IOT_PLC_BAND_BITMAP_SIZE];
} proto_get_fb_bitmap_ind;
/* Request structure for setting scan band bitmap */
typedef proto_get_fb_bitmap_ind proto_set_fb_bitmap_req;
/* Response structure for setting scan band bitmap */
typedef proto_reply_ind proto_set_fb_bitmap_ind;
/* Structure of the response to the request for reading calc data validity */
typedef struct {
uint8_t state;
uint8_t rsv[3];
} proto_get_calc_vali_ind;
/* Structure of the response to the request for uart parameter */
typedef struct {
uint32_t baudrate;
uint8_t data_bits;
uint8_t stop_bits;
uint8_t parity;
uint32_t threshold_value;
uint8_t rsv;
} proto_get_uart_param_ind;
/* Request structure for setting uart parameter */
typedef proto_get_uart_param_ind proto_set_uart_param_req;
/* Response structure for setting uart parameter */
typedef proto_reply_ind proto_set_uart_param_ind;
/* Structure of the response to the received data */
typedef proto_reply_ind proto_data_transmit_rx_ind;
typedef proto_data_transmit_rx_req proto_remote_cmd_rx_req;
typedef proto_data_transmit_rx_ind proto_remote_cmd_rx_ind;
typedef struct {
uint8_t mac[IOT_MAC_ADDR_LEN]; /* MAC address */
uint16_t tei; /* Node ID */
uint16_t proxy; /* Proxy node ID */
uint8_t level : 4; /* Network layer: 0 indicates layer 0, and so on. */
uint8_t role : 4; /* Network role. */
uint8_t reserved;
} proto_topo_node;
/*
* Remote commissioning command
* Remotely send a command.
*/
typedef proto_data_transmit_tx_req proto_remote_cmd_tx_req;
typedef proto_data_transmit_tx_ind proto_remote_cmd_tx_ind;
/* PLC frame data structure */
typedef struct {
uint16_t crc_16; /* CRC16 check: CRC16-CCITT */
uint16_t data_length; /* Data field length */
uint8_t data[0];
} app_plc_trans_frame;
typedef struct {
uint8_t dev_addr[6]; /* dev mac addr */
uint8_t status; /* 0:offline, 1:online */
uint8_t reserved;
} proto_onoffline_info;
/***************************** defination for upgrade ****************/
typedef struct {
uint8_t virsion1; /* virsion1 */
uint8_t virsion2; /* virsion2 */
uint16_t seq_num; /* sequence number */
uint8_t fun_code; /* function code */
uint8_t status_code; /* status code */
uint16_t dev_addr; /* device address */
uint8_t data[0]; /* data body */
} proto_sysctrl_data_header;
#pragma pack(pop) /* restore the pack status */
void fill_proto_frame_fixed_info(app_proto_frame_head *head, uint16_t cmd, uint16_t seq, uint16_t data_length);
uint16_t app_proto_get_nbnet_info(app_proto_frame_head *frame, uint8_t * out_buffer, uint16_t *length);
uint16_t app_proto_data_transmit(uint8_t * data, uint16_t data_length, uint8_t * src_addr);
uint16_t app_proto_sysctrl_data_process(uint8_t * data, uint16_t data_length, uint8_t * src_addr, uint8_t * dst_addr);
uint16_t app_proto_frame_rx(uint8_t * data, uint16_t data_length, app_source_e source, uint8_t * src_addr);
uint16_t app_proto_onoffline_report(uint8_t *mac, uint8_t flag);
#ifdef __cplusplus
}
#endif
#endif /* _APP_PROTO_PROC_H_ */