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