316 lines
11 KiB
C
316 lines
11 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 PROTO_3761_H
|
|
#define PROTO_3761_H
|
|
|
|
#include "os_types_api.h"
|
|
#include "iot_pkt_api.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* pack for the structures in the whole file */
|
|
#pragma pack(push) /* save the pack status */
|
|
#pragma pack(1) /* 1 byte align */
|
|
|
|
/* frame start char definition */
|
|
#define PROTO_3761_START_CHAR (0x68)
|
|
|
|
/* frame end char definition */
|
|
#define PROTO_3761_END_CHAR (0x16)
|
|
|
|
/* define administrative region code length */
|
|
#define PROTO_3761_AREA_CODE_LEN (2)
|
|
|
|
/* broadcast address of device(terminal) */
|
|
#define PROTO_3761_BCAST_DEV_ADRR 0xFFFF
|
|
|
|
/* define proto 3761 pass word length */
|
|
#define PROTO_3761_PW_LEN 16
|
|
|
|
/* define seq number max value */
|
|
#define PROTO_3761_SN_MAX 0xF
|
|
|
|
/* definition of function code of starting station */
|
|
#define PROTO_3761_FN_P_RESET_CMD 1
|
|
#define PROTO_3761_FN_P_USER_DATA 4
|
|
#define PROTO_3761_FN_P_REQ_LINK_TEST 9
|
|
#define PROTO_3761_FN_P_REQ_CLASS1_DATA 10
|
|
#define PROTO_3761_FN_P_REQ_CLASS2_DATA 11
|
|
|
|
/* definition of function code of slave station */
|
|
#define PROTO_3761_FN_S_CONFIRM 0
|
|
#define PROTO_3761_FN_S_RSP_USER_DATA 8
|
|
#define PROTO_3761_FN_S_RSP_NON_DATA 9
|
|
#define PROTO_3761_FN_S_RSP_LINK_TEST 11
|
|
|
|
/* define message direction */
|
|
#define PROTO_3761_DIR_SLAVE 1
|
|
#define PROTO_3761_DIR_MASTER 0
|
|
|
|
/* define info point and info type length */
|
|
#define PROTO_3761_PN_LEN 2
|
|
#define PROTO_3761_FN_LEN 2
|
|
|
|
/* some definitions of information points */
|
|
#define PROTO_3761_PN_0 (0)
|
|
#define PROTO_3761_PN_MAX (2040)
|
|
#define PROTO_3761_PN_ALL (0xFF00)
|
|
|
|
/* app function number definition */
|
|
#define PROTO_3761_AFN_10 (0x10)
|
|
|
|
/* define communication port number */
|
|
#define PROTO_3761_PORT_RS485_1 1
|
|
#define PROTO_3761_PORT_RS485_2 2
|
|
#define PROTO_3761_PORT_LOCAL_COMM 31
|
|
|
|
/* define the number of UART data bits */
|
|
#define PROTO_3761_UART_DATA_5_BIT 0
|
|
#define PROTO_3761_UART_DATA_6_BIT 1
|
|
#define PROTO_3761_UART_DATA_7_BIT 2
|
|
#define PROTO_3761_UART_DATA_8_BIT 3
|
|
|
|
/* define the number of UART stop bits */
|
|
#define PROTO_3761_UART_STOP_1_BIT 0
|
|
#define PROTO_3761_UART_STOP_2_BIT 1
|
|
|
|
/* define UART baud id */
|
|
#define PROTO_3761_UART_BAUD_ID_300 0
|
|
#define PROTO_3761_UART_BAUD_ID_600 1
|
|
#define PROTO_3761_UART_BAUD_ID_1200 2
|
|
#define PROTO_3761_UART_BAUD_ID_2400 3
|
|
#define PROTO_3761_UART_BAUD_ID_4800 4
|
|
#define PROTO_3761_UART_BAUD_ID_7200 5
|
|
#define PROTO_3761_UART_BAUD_ID_9600 6
|
|
#define PROTO_3761_UART_BAUD_ID_19200 7
|
|
#define PROTO_3761_UART_BAUD_ID_MAX 8
|
|
|
|
/* protocol 3761 header layout */
|
|
typedef struct _proto_3761_hdr {
|
|
/* start character 1 */
|
|
uint8_t start_char1;
|
|
/* protocol coding 1, it must be 2 */
|
|
uint16_t proto_code1 : 2,
|
|
/* data length 1 */
|
|
len1 : 14;
|
|
/* protocol coding 2, it must be 2 */
|
|
uint16_t proto_code2 : 2,
|
|
/* data length 2 */
|
|
len2 : 14;
|
|
/* start character 2 */
|
|
uint8_t start_char2;
|
|
/* data payload */
|
|
uint8_t data[0];
|
|
} proto_3761_hdr_t;
|
|
|
|
/* control field defined */
|
|
typedef struct _proto_3761_ctrl {
|
|
/* function code, see PROTO_3761_FN_XXXX */
|
|
uint8_t fn : 4,
|
|
/* up load: rsvd.
|
|
* down link: frame connter valid bit.
|
|
*/
|
|
fcv : 1,
|
|
/* up load:
|
|
* request access bit: 1 - there are important events requesting access,
|
|
* 0 - not.
|
|
* down link:
|
|
* frame connter bit.
|
|
*/
|
|
fcb_acd : 1,
|
|
/* start flag bit: 1 - from starting station, 0 - from slave station */
|
|
prm : 1,
|
|
/* message direction, see PROTO_3761_DIR_XXX.
|
|
* 0 - downlink from main station, 1 - up to main station.
|
|
*/
|
|
dir : 1;
|
|
} proto_3761_ctrl_t;
|
|
|
|
/* address field defined */
|
|
typedef struct _proto_3761_addr {
|
|
/* administrative region code - BCD */
|
|
uint8_t area_code[PROTO_3761_AREA_CODE_LEN];
|
|
/* terminal device address */
|
|
uint16_t dev_addr;
|
|
/* group address identification */
|
|
uint8_t is_group :1,
|
|
/* master addr */
|
|
msa :7;
|
|
} proto_3761_addr_t;
|
|
|
|
/* user data layout */
|
|
typedef struct _proto_3761_user_data {
|
|
/* control field */
|
|
proto_3761_ctrl_t ctrl;
|
|
/* address field */
|
|
proto_3761_addr_t addr_filed;
|
|
/* data payload */
|
|
uint8_t data[0];
|
|
} proto_3761_user_data_t;
|
|
|
|
/* application header layout */
|
|
typedef struct proto_3761_app_hdr {
|
|
/* application function code */
|
|
uint8_t afn;
|
|
/* seq number */
|
|
uint8_t seq :4,
|
|
/* flag to mark if need to confirm */
|
|
con :1,
|
|
/* flag to mark if finish frame */
|
|
fin :1,
|
|
/* flag to mark if first frame */
|
|
fir :1,
|
|
/* Time label valid flag */
|
|
tpv :1;
|
|
/* data payload */
|
|
uint8_t data[0];
|
|
} proto_3761_app_hdr_t;
|
|
|
|
/* data unit layout */
|
|
typedef struct proto_3761_data_uint {
|
|
/* data unit identification - information point */
|
|
uint8_t pn[PROTO_3761_PN_LEN];
|
|
/* data unit identification - information type */
|
|
uint8_t fn[PROTO_3761_FN_LEN];
|
|
/* data unit */
|
|
uint8_t data[0];
|
|
} proto_3761_data_uint_t;
|
|
|
|
/* protocol 3761 tail layout */
|
|
typedef struct _proto_3761_tail {
|
|
/* check sum */
|
|
uint8_t cs;
|
|
/* end character */
|
|
uint8_t end_char;
|
|
} proto_3761_tail_t;
|
|
|
|
/* AFN = 10H, FN = 1: Transparent forwarding downlink message layout */
|
|
typedef struct proto_3761_afn10f1_dl_t {
|
|
/* communication port number, see PROTO_3761_PORT_XXX */
|
|
uint8_t port;
|
|
/* uart frame format -- data bit num, see PROTO_3761_UART_DATA_X_BIT */
|
|
uint8_t data_bit_num : 2,
|
|
/* uart frame format -- parity flag: 1 - odd, 0 - even */
|
|
parity : 1,
|
|
/* parity bit valid flag */
|
|
parity_valid : 1,
|
|
/* uart frame format -- stop bit num, see PROTO_3761_UART_STOP_X_BIT */
|
|
stop_bit_num : 1,
|
|
/* baud id, see PROTO_3761_UART_BAUD_ID_XXX */
|
|
buad_id : 3;
|
|
/* timeout waiting for message */
|
|
uint8_t timeout1 : 7,
|
|
/* if set, the timeout1 of a field is 1s */
|
|
uint_is_sec : 1;
|
|
/* timeout per byte interval, uint is 10 ms */
|
|
uint8_t timeout2;
|
|
/* data length to be forwarded */
|
|
uint16_t len;
|
|
/* data payload to be forwarded */
|
|
uint8_t data[0];
|
|
} proto_3761_afn10f1_dl_t;
|
|
|
|
/* AFN = 10H, FN = 1: transparent forwarding uplink message layout */
|
|
typedef struct proto_3761_afn10f1_ul {
|
|
/* communication port number */
|
|
uint8_t port;
|
|
/* data length to be forwarded */
|
|
uint16_t len;
|
|
/* data payload to be forwarded */
|
|
uint8_t data[0];
|
|
} proto_3761_afn10f1_ul_t;
|
|
|
|
#pragma pack(pop) /* save the pack status */
|
|
|
|
/* app message descriptor */
|
|
typedef struct proto_3761_app_desc {
|
|
/* address field */
|
|
proto_3761_addr_t addr_filed;
|
|
/* start flag bit: 1 - from starting station, 0 - from slave station */
|
|
uint8_t prm : 1,
|
|
/* message direction, see PROTO_3761_DIR_XXX.
|
|
* 0 - downlink from main station, 1 - up to main station.
|
|
*/
|
|
dir : 1,
|
|
/* reserved for further use */
|
|
rsvd : 6;
|
|
/* application function code */
|
|
uint8_t afn;
|
|
/* seq number */
|
|
uint8_t seq;
|
|
/* pointer to app data*/
|
|
uint8_t *data;
|
|
/* data length */
|
|
uint16_t len;
|
|
} proto_3761_app_data_desc_t;
|
|
|
|
/**
|
|
* @brief proto_3761_parse() - check and parse 376.1 data frame
|
|
* @param data: pointer to the start of the original data frame.
|
|
* @param len: len len the original data frame.
|
|
* @param app_desc: if the app info description is returned successfully.
|
|
* @retval: 0 -- for success case, otherwise -- error code
|
|
*/
|
|
uint32_t proto_3761_parse(uint8_t *data, uint16_t len,
|
|
proto_3761_app_data_desc_t *app_desc);
|
|
|
|
/**
|
|
* @brief proto_3761_du_parse() - parse data unit
|
|
* @param pn: info point.
|
|
* @param fn: info type.
|
|
* @param data: pointer to pointer to the start of the original data.
|
|
* @param len: pointer to the len of the original data.
|
|
* @retval: 0 -- for success case, otherwise -- error code
|
|
*/
|
|
uint32_t proto_3761_du_parse(uint16_t *pn, uint16_t *fn, uint8_t **data,
|
|
uint16_t *len);
|
|
|
|
/**
|
|
* @brief proto_3761_build_afn10f01_dl_msg() - build create an afn19f01(
|
|
* transparent forwarding) downlink message.
|
|
* @param ds: pointer to data to be transparently forwarded.
|
|
* @param len: data len to be transparently forwarded.
|
|
* @param buud: baud for transparent forwarding.
|
|
* @param port: port number of transparent forwarding, see PROTO_PORT_RS485_X.
|
|
* @param parity: uart frame format - parity bit type, see IOT_UART_PARITY_XX.
|
|
* @param timeout: timeout for transparent forwarding to wait for response, uint
|
|
* is 1s.
|
|
* @param mid: module id of Creator.
|
|
* @param dev_addr: administrative region code.
|
|
* @param area_code: terminal address region.
|
|
* @param sn: maessage seq number.
|
|
* @retval: NULL -- for failure.
|
|
* @retval: pkt -- the iot pkt buffer for message.
|
|
*/
|
|
iot_pkt_t *proto_3761_build_afn10f01_dl_msg(uint8_t *ds,
|
|
uint16_t len, uint32_t baud, uint8_t port,
|
|
uint8_t parity, uint8_t timeout, module_id_t mid,
|
|
uint16_t *dev_addr, uint16_t *area_code, uint8_t sn);
|
|
|
|
/**
|
|
* @brief proto_3761_get_sn() - get and update message seq number
|
|
* @retval: message seq number.
|
|
*/
|
|
uint8_t proto_3761_get_sn(void);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* PROTO_3761_H */
|
|
|