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