568 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			568 lines
		
	
	
		
			20 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 IOT_PROTO_DL645_H
 | 
						|
#define IOT_PROTO_DL645_H
 | 
						|
 | 
						|
#include "iot_grapp.h"
 | 
						|
#include "iot_proto_common.h"
 | 
						|
 | 
						|
#ifdef __cplusplus
 | 
						|
extern "C" {
 | 
						|
#endif
 | 
						|
 | 
						|
#pragma pack(push)  // save the pack status
 | 
						|
#pragma pack(1)     // 1 byte align
 | 
						|
 | 
						|
/* frame start char definition */
 | 
						|
#define PROTO_645_START_CHAR                    0x68
 | 
						|
 | 
						|
/* frame end char definition */
 | 
						|
#define PROTO_645_END_CHAR                      0x16
 | 
						|
 | 
						|
#define PROTO_645_CONTROL_POS                   (8)
 | 
						|
 | 
						|
/* the second start char position */
 | 
						|
#define PROTO_645_SECOND_HEAD_POS               (7)
 | 
						|
 | 
						|
/* meter address read  frame length for DL/T 645-2007 */
 | 
						|
#define PROTO_645_2007_READ_DATA_PKT_LEN        16
 | 
						|
 | 
						|
/* data identification length for DL/T 645-2007 */
 | 
						|
#define PROTO_645_2007_DI_LEN                   (4)
 | 
						|
 | 
						|
/* Message direction: master->slave */
 | 
						|
#define PROTO_645_DIR_MASTER                    0
 | 
						|
 | 
						|
/* Message direction: slave->master */
 | 
						|
#define PROTO_645_DIR_SLAVE                     1
 | 
						|
 | 
						|
/* control function code definition for DL/T 645-2007 */
 | 
						|
/* for cco report sta join or leave */
 | 
						|
#define PROTO_645_2007_FN_REPORT_STA_STATE      0x07
 | 
						|
 | 
						|
/* read data control */
 | 
						|
#define PROTO_645_2007_FN_READ_DATA             0x11
 | 
						|
 | 
						|
/* read data have Subsequent data frames */
 | 
						|
#define PROTO_645_2007_FN_READ_DATA_C           0x12
 | 
						|
 | 
						|
#define PROTO_645_2007_FN_READ_ADDR             0x13
 | 
						|
 | 
						|
#define PROTO_645_2007_FN_WRITE_DATA            0x14
 | 
						|
 | 
						|
#define PROTO_645_2007_ERR_OK                   0
 | 
						|
#define PROTO_645_2007_ERR_OTHER                0x01
 | 
						|
 | 
						|
/* Follow data flag: means following data available */
 | 
						|
#define DL645_FOLLOW_AVAILABLE                  (1)
 | 
						|
/* Follow data flag: means no following data */
 | 
						|
#define DL645_FOLLOW_INVALID                    (0)
 | 
						|
 | 
						|
/* value of resv set to 2 means DL645 frame*/
 | 
						|
#define DL645_07_RESV0_RESV                     0x02
 | 
						|
 | 
						|
/* Invalid di */
 | 
						|
#define PROTO_645_INVALID_DI                    (0xffffffffu)
 | 
						|
 | 
						|
#define DL645_PARSE_FRM_MIN_LEN                 (12)
 | 
						|
#define DL645_PARSE_FRM_MAX_LEN                 (255 + DL645_PARSE_FRM_MIN_LEN)
 | 
						|
#define DL645_PREB_DATA_LEN                     (4)
 | 
						|
#define DL645_FRM_DATA_MAX_LEN                  (GE_FRM_MAX_LEN)
 | 
						|
 | 
						|
/* nack frame length for DL/T 645-2007 */
 | 
						|
#define DL645_NACK_FRM_LEN                      (13)
 | 
						|
/* ack frame length for DL/T 645-2007 */
 | 
						|
#define DL645_ACK_FRM_LEN                       (12)
 | 
						|
 | 
						|
#define DL645_DI_LEN                            4
 | 
						|
 | 
						|
/************ local command, not open to customers ***********/
 | 
						|
/* close hardware watchdog */
 | 
						|
#define DL645_07_DI_CLOSE_HW_WATCHDOG           (0x07000001u)
 | 
						|
/* enable ckq read mode to handle ckq reading 645 meter data */
 | 
						|
#define DL645_07_DI_CKQ_READ_MODE_EN            (0x07000002u)
 | 
						|
/* read 645 meter data in cqk mode */
 | 
						|
#define DL645_07_DI_CKQ_MODE_READ               (0x07000003u)
 | 
						|
/* read 645 edge start time、starting/stopping time
 | 
						|
    each overtime handle */
 | 
						|
#define DL645_07_DI_EDGE_TIME_PARAM_INNER       (0x07000004u)
 | 
						|
 | 
						|
/*************************************************************/
 | 
						|
 | 
						|
/************ local command, open to customers ***************/
 | 
						|
/* trans dl645 */
 | 
						|
#define DL645_07_DI_DL645_TYPE                  (0x0800000Au)
 | 
						|
/* trans modbus */
 | 
						|
#define DL645_07_DI_MODBUS_TYPE                 (0x0800000Bu)
 | 
						|
/* set/query uart config param */
 | 
						|
#define DL645_07_DI_UART_PARAM                  (0x08000010u)
 | 
						|
/* conrol voltage output */
 | 
						|
#define DL645_07_DI_CTRL_VOUT                   (0x08000011u)
 | 
						|
/* query device boot information */
 | 
						|
#define DL645_07_DI_QUERY_BOOT_INFO             (0x08000012u)
 | 
						|
/* read monitor signal open/close */
 | 
						|
#define DL645_07_DI_READ_MONITOR_SIGNAL         (0x08000013u)
 | 
						|
/* get delaytime */
 | 
						|
#define DL645_07_DI_DELAYTIME                   (0x08000016u)
 | 
						|
/* set/query edge interval time and overtime */
 | 
						|
#define DL645_07_DI_EDGE_TIME_PARAM             (0x08000020u)
 | 
						|
/* query edge cmd count */
 | 
						|
#define DL645_07_DI_QUERY_EDGE_CMD_CNT          (0x08000021u)
 | 
						|
/* set/query edge 645 cmd */
 | 
						|
#define DL645_07_DI_EDGE_645_MIN_CMD            (0x08000022u)
 | 
						|
/* set/query edge 645 cmd */
 | 
						|
#define DL645_07_DI_EDGE_645_MAX_CMD            (0x0800002Bu)
 | 
						|
/* set/query edge MODBUS cmd */
 | 
						|
#define DL645_07_DI_EDGE_MODBUS_MIN_CMD         (0x08000040u)
 | 
						|
/* set/query edge MODBUS cmd */
 | 
						|
#define DL645_07_DI_EDGE_MODBUS_MAX_CMD         (0x08000049u)
 | 
						|
/* set/query edge cmd buadrate */
 | 
						|
#define DL645_07_DI_EDGE_CMD_BAUD               (0x08000050u)
 | 
						|
 | 
						|
/*************************************************************/
 | 
						|
 | 
						|
#define DL645_ERR_OK                            (0)
 | 
						|
#define DL645_ERR_OTHER_ERROR                   (0x1 << 0)
 | 
						|
#define DL645_ERR_NO_REQ_DATA                   (0x1 << 1)
 | 
						|
#define DL645_ERR_PARAMETER_ERROR               (0x1 << 3)
 | 
						|
 | 
						|
#define DL645_LOCALMODE_CACHE_MAX_NUM           (6)
 | 
						|
 | 
						|
#define HPLC_3P0_JY_EN_OUT12V_PIN               (22)
 | 
						|
#define HPLC_3P0_JY_EN_OUT3V3_PIN               (23)
 | 
						|
#define HPLC_3P0_JY_MONITOR_PIN                 (9)
 | 
						|
#define HPLC_3P0_JY_HW_WDG_PIN                  (28)
 | 
						|
 | 
						|
/* to calc adc volt to rela data */
 | 
						|
#define HPLC_3P0_JY_VOUT12V_RATE                (11)
 | 
						|
#define HPLC_3P0_JY_VOUT3V3_RATE                (2)
 | 
						|
 | 
						|
#define HPLC_3P0_JY_VOUT_ON                     0xAA
 | 
						|
#define HPLC_3P0_JY_VOUT_OFF                    0x55
 | 
						|
#define HPLC_3P0_JY_INVALID_VOL                 0xFF
 | 
						|
 | 
						|
#define HPLC_3P0_JY_MONITOR_OPEN                0xAA
 | 
						|
#define HPLC_3P0_JY_MONITOR_CLOSE               0x55
 | 
						|
 | 
						|
#define HPLC_3P0_JY_CLOSE_HW_WDG                0x55
 | 
						|
 | 
						|
#define proto_645_2007_di_to_byte(di, ptr)                  \
 | 
						|
    do { \
 | 
						|
        ((uint8_t *)(ptr))[3]  = (uint8_t)((di) >> 24);     \
 | 
						|
        ((uint8_t *)(ptr))[2]  = (uint8_t)((di) >> 16);     \
 | 
						|
        ((uint8_t *)(ptr))[1]  = (uint8_t)((di) >> 8);      \
 | 
						|
        ((uint8_t *)(ptr))[0]  = (uint8_t)((di) & 0xff);    \
 | 
						|
    } while(0)
 | 
						|
 | 
						|
#define proto_645_2007_byte_to_di(ptr, di)                  \
 | 
						|
    do { \
 | 
						|
        di = (((uint8_t *)(ptr))[3] << 24) +                \
 | 
						|
            (((uint8_t *)(ptr))[2] << 16) +                 \
 | 
						|
            (((uint8_t *)(ptr))[1] << 8) +                  \
 | 
						|
            ((uint8_t *)(ptr))[0];                          \
 | 
						|
    } while(0)
 | 
						|
 | 
						|
#define iot_sta_check_extend_645_di(di)                     \
 | 
						|
    ((di == DL645_07_DI_DL645_TYPE) || (di == DL645_07_DI_MODBUS_TYPE))
 | 
						|
/* no local cmd now */
 | 
						|
/* TO DO */
 | 
						|
#define iot_sta_check_local_645_di(di)                                  \
 | 
						|
    ((di == DL645_07_DI_UART_PARAM)                                  || \
 | 
						|
    (di == DL645_07_DI_CTRL_VOUT)                                    || \
 | 
						|
    (di == DL645_07_DI_QUERY_BOOT_INFO)                              || \
 | 
						|
    (di == DL645_07_DI_READ_MONITOR_SIGNAL)                          || \
 | 
						|
    (di == DL645_07_DI_CLOSE_HW_WATCHDOG)                            || \
 | 
						|
    (di == DL645_07_DI_EDGE_TIME_PARAM)                              || \
 | 
						|
    (di == DL645_07_DI_QUERY_EDGE_CMD_CNT)                           || \
 | 
						|
    ((di >= DL645_07_DI_EDGE_645_MIN_CMD)                            && \
 | 
						|
    (di <= DL645_07_DI_EDGE_645_MAX_CMD))                            || \
 | 
						|
    ((di >= DL645_07_DI_EDGE_MODBUS_MIN_CMD)                         && \
 | 
						|
    (di <= DL645_07_DI_EDGE_MODBUS_MAX_CMD))                         || \
 | 
						|
    (di == DL645_07_DI_EDGE_CMD_BAUD)                                || \
 | 
						|
    (di == DL645_07_DI_EDGE_TIME_PARAM_INNER))
 | 
						|
 | 
						|
#define iot_sta_check_local_mode_645_di(di)                 \
 | 
						|
    (di == DL645_07_DI_CKQ_MODE_READ)
 | 
						|
 | 
						|
enum proto_645_local_mode_state_e {
 | 
						|
    DL645_LOCAL_MODE_INIT                       = 0,
 | 
						|
    DL645_LOCAL_MODE_STARTED                    = 1
 | 
						|
};
 | 
						|
 | 
						|
typedef struct _proto_645_ctrl
 | 
						|
{
 | 
						|
    /* function code. see PROTO645_2007(1997)_FN_XXX */
 | 
						|
    uint8_t     fn      :5,
 | 
						|
    /* 0 means no following data. 1 means following data available.
 | 
						|
     * see PROTO_645_FOLLOW_XXX
 | 
						|
     */
 | 
						|
                follow  :1,
 | 
						|
    /* 0 means normal ack. 1 means abnormal ack.
 | 
						|
     * see PROTO_645_ACK_XXX
 | 
						|
     */
 | 
						|
                ack     :1,
 | 
						|
    /* direction. 1 means from primary to secondary. 0 means from secondary
 | 
						|
     * to primary,see PROTO_645_DIR_XXX
 | 
						|
     */
 | 
						|
                dir     :1;
 | 
						|
} proto_645_ctrl_t;
 | 
						|
 | 
						|
typedef struct _proto_645_set_uart_param_t
 | 
						|
{
 | 
						|
    /* di */
 | 
						|
    uint32_t di;
 | 
						|
    /* password */
 | 
						|
    uint32_t passwd;
 | 
						|
    uint32_t user_code;
 | 
						|
    uint32_t baudrate;
 | 
						|
    uint8_t  parity;
 | 
						|
    uint8_t  data_bit;
 | 
						|
    uint8_t  stop_bit;
 | 
						|
} proto_645_set_uart_param_t;
 | 
						|
 | 
						|
typedef struct _proto_645_resp_uart_param_t
 | 
						|
{
 | 
						|
    /* di */
 | 
						|
    uint32_t di;
 | 
						|
    uint32_t baudrate;
 | 
						|
    uint8_t  parity;
 | 
						|
    uint8_t  data_bit;
 | 
						|
    uint8_t  stop_bit;
 | 
						|
} proto_645_resp_uart_param_t;
 | 
						|
 | 
						|
typedef struct _proto_645_write_vout_param_t
 | 
						|
{
 | 
						|
    /* di */
 | 
						|
    uint32_t di;
 | 
						|
    /* password */
 | 
						|
    uint32_t passwd;
 | 
						|
    uint32_t user_code;
 | 
						|
    uint8_t  v3p3_on_off;
 | 
						|
    uint8_t  v12_on_off;
 | 
						|
} proto_645_write_vout_param_t;
 | 
						|
 | 
						|
typedef struct _proto_645_resp_vol_info_t
 | 
						|
{
 | 
						|
    /* di */
 | 
						|
    uint32_t di;
 | 
						|
    uint8_t  v3p3_on_off;
 | 
						|
    /* unit: 100mv */
 | 
						|
    uint8_t  v3p3_vol;
 | 
						|
    uint8_t  v12_on_off;
 | 
						|
    /* unit: 100mv */
 | 
						|
    uint8_t  v12_vol;
 | 
						|
} proto_645_resp_vol_info_t;
 | 
						|
 | 
						|
typedef struct _proto_645_resp_boot_info_t
 | 
						|
{
 | 
						|
    /* di */
 | 
						|
    uint32_t di;
 | 
						|
    uint32_t total_boot_cnt;
 | 
						|
    uint8_t  last_reboot_reason;
 | 
						|
} proto_645_resp_boot_info_t;
 | 
						|
 | 
						|
typedef struct _proto_645_resp_monitor_signal_t
 | 
						|
{
 | 
						|
    /* di */
 | 
						|
    uint32_t di;
 | 
						|
    uint8_t  signal;
 | 
						|
} proto_645_resp_monitor_signal_t;
 | 
						|
 | 
						|
typedef struct _proto_645_close_hw_wdg_t
 | 
						|
{
 | 
						|
    /* di */
 | 
						|
    uint32_t di;
 | 
						|
    /* password */
 | 
						|
    uint32_t passwd;
 | 
						|
    uint32_t user_code;
 | 
						|
    uint8_t  close_wdg;
 | 
						|
    uint8_t  src_mac[IOT_MAC_ADDR_LEN];
 | 
						|
} proto_645_close_hw_wdg_t;
 | 
						|
 | 
						|
typedef struct _proto_645_set_edge_time_t
 | 
						|
{
 | 
						|
    /* di */
 | 
						|
    uint32_t di;
 | 
						|
    /* password */
 | 
						|
    uint32_t passwd;
 | 
						|
    uint32_t user_code;
 | 
						|
    /* unit:ms */
 | 
						|
    uint16_t cmd_inverval;
 | 
						|
    /* unit:ms */
 | 
						|
    uint16_t cmd_tol_tm;
 | 
						|
} proto_645_set_edge_time_t;
 | 
						|
 | 
						|
typedef struct _edge_inner_time_info_t
 | 
						|
{
 | 
						|
    /* delay time for starting polling */
 | 
						|
    uint16_t  edge_start_tm;
 | 
						|
    /* time for starting and stopping state delay */
 | 
						|
    uint16_t  cmd_starting_stopping_tm;
 | 
						|
    /* for each uart rx wait time */
 | 
						|
    uint16_t  cmd_each_tm;
 | 
						|
} edge_inner_time_info_t;
 | 
						|
 | 
						|
typedef struct _proto_645_set_edge_time_inner_t
 | 
						|
{
 | 
						|
    /* di */
 | 
						|
    uint32_t di;
 | 
						|
    /* password */
 | 
						|
    uint32_t passwd;
 | 
						|
    uint32_t user_code;
 | 
						|
    edge_inner_time_info_t time_info;
 | 
						|
} proto_645_set_edge_time_inner_t;
 | 
						|
 | 
						|
typedef struct _proto_645_edge_dev_cmd_t
 | 
						|
{
 | 
						|
    /* di */
 | 
						|
    uint32_t di;
 | 
						|
    /* password */
 | 
						|
    uint32_t passwd;
 | 
						|
    uint32_t user_code;
 | 
						|
    uint8_t  data[0];
 | 
						|
} proto_645_edge_dev_cmd_t;
 | 
						|
 | 
						|
typedef struct _parse_645_data_t
 | 
						|
{
 | 
						|
    uint16_t frm_len;
 | 
						|
    uint16_t data_len;
 | 
						|
    uint16_t pos;
 | 
						|
    /* control code */
 | 
						|
    uint8_t  control;
 | 
						|
    /* di */
 | 
						|
    uint32_t di;
 | 
						|
    /* checksum */
 | 
						|
    uint8_t  cs;
 | 
						|
    uint8_t  mac[IOT_MAC_ADDR_LEN];
 | 
						|
    uint32_t passwd;
 | 
						|
    uint32_t user_code;
 | 
						|
    uint8_t  data[0];
 | 
						|
}  parse_645_data_t;
 | 
						|
 | 
						|
typedef struct _proto_645_header {
 | 
						|
    /* start char, see 645_START_CHAR */
 | 
						|
    uint8_t                 start_char_1;
 | 
						|
    /* target mac address */
 | 
						|
    uint8_t                 addr[IOT_MAC_ADDR_LEN];
 | 
						|
    /* start char, see 645_START_CHAR */
 | 
						|
    uint8_t                 start_char_2;
 | 
						|
    /* control code */
 | 
						|
    proto_645_ctrl_t        control;
 | 
						|
    /* data length */
 | 
						|
    uint8_t                 len;
 | 
						|
    /* data */
 | 
						|
    uint8_t                 data[0];
 | 
						|
} proto_645_header_t;
 | 
						|
 | 
						|
typedef struct _proto_645_tailer
 | 
						|
{
 | 
						|
     /* check sum */
 | 
						|
     uint8_t     cs;
 | 
						|
     /* end char. see 645_END_CHAR */
 | 
						|
     uint8_t     end_char;
 | 
						|
} proto_645_tailer_t;
 | 
						|
 | 
						|
typedef struct _proto_645_localmode_data
 | 
						|
{
 | 
						|
    /* di */
 | 
						|
    uint32_t     di;
 | 
						|
    /* mac address */
 | 
						|
    uint8_t      mac[IOT_MAC_ADDR_LEN];
 | 
						|
    /* record the data from meter*/
 | 
						|
    uint8_t      data[DL645_PARSE_FRM_MAX_LEN];
 | 
						|
} proto_645_localmode_data_t;
 | 
						|
 | 
						|
typedef struct _proto_645_localmode_data_cache
 | 
						|
{
 | 
						|
    uint8_t      head;
 | 
						|
    uint8_t      tail;
 | 
						|
    proto_645_localmode_data_t    meter_data[DL645_LOCALMODE_CACHE_MAX_NUM];
 | 
						|
} proto_645_localmode_data_cache_t;
 | 
						|
 | 
						|
typedef struct _devtest_645_cmd_cache
 | 
						|
{
 | 
						|
    /* if the cmd is valid or not */
 | 
						|
    uint8_t     cmd_valid;
 | 
						|
    /* buffer to hold 645 cmd */
 | 
						|
    uint8_t     cmd_buf[DL645_PARSE_FRM_MAX_LEN];
 | 
						|
    /* destination mac address */
 | 
						|
    uint8_t     dst_mac[IOT_MAC_ADDR_LEN];
 | 
						|
} devtest_645_cmd_cache_t;
 | 
						|
 | 
						|
#pragma pack(pop)
 | 
						|
 | 
						|
uint8_t iot_proto_645_calc_cs(proto_645_header_t *hdr);
 | 
						|
 | 
						|
/* creat frame to query mac */
 | 
						|
void iot_proto_dl645_read_addr(uint8_t *data);
 | 
						|
 | 
						|
/**
 | 
						|
 * @brief iot_proto_645_format_check() - To pickup DL645 frames from a buffer
 | 
						|
 * @param recv_data:    point to the buffer data
 | 
						|
 * @param pdata:        point to ge data get the struct which will reseive the
 | 
						|
                        ge frames
 | 
						|
 * @param ret_size:     point to the data length of ge_buf, if a dl645 frame is
 | 
						|
                        checked, the data length of ge_buf should add the frame
 | 
						|
                        length.
 | 
						|
 * @ge_len_out:         point to the ge length if it exist
 | 
						|
 * @retval: -           check result, GET_NO_FRAME, GET_ONE_FRAME or
 | 
						|
                        GET_HALF_FRAME
 | 
						|
 */
 | 
						|
uint8_t iot_proto_645_format_check(mcu_data_handle_t *recv_data,
 | 
						|
    uint8_t *pdata, uint16_t *ret_size, uint16_t *ge_len_out);
 | 
						|
 | 
						|
/**
 | 
						|
 * @brief iot_pack_dl645_to_ge() - To pack a dl645 frame into a ge FEA0 frame,
 | 
						|
                                   then sned to plc
 | 
						|
 * @param data_input:   point to the data frame, dl645, if the value is NULL,
 | 
						|
                        need not to copy the dl645 data to ge data field
 | 
						|
 * @param pdata:        point to the ge data buffer
 | 
						|
 * @param data_len:     point the data length of input frame
 | 
						|
                        when output means length of the ge frame
 | 
						|
 * @param mac:          point to the destination mac
 | 
						|
 * @param b_conless:    tx type of ge frame, connless or not
 | 
						|
 */
 | 
						|
void iot_pack_dl645_to_ge(uint8_t* data_input, uint8_t *pdata,
 | 
						|
    uint16_t *data_len, uint8_t* mac, bool_t b_conless);
 | 
						|
 | 
						|
/**
 | 
						|
 * @brief iot_proto_645_frm_format_check()     check the data is 645 frame or not.
 | 
						|
 * @param data:                  point to the data
 | 
						|
 * @param len:                   len of the data
 | 
						|
 * @param integrity              the integrity of 645 frm, see
 | 
						|
                                 proto_check_frame_result_e
 | 
						|
 * @param retval:                0:645 frame,others:not 645 frame
 | 
						|
 */
 | 
						|
uint8_t iot_proto_645_frm_format_check(uint8_t *data, uint16_t len,
 | 
						|
    uint8_t *integrity);
 | 
						|
 | 
						|
#if PLC_SUPPORT_STA_ROLE
 | 
						|
/**
 | 
						|
 * @brief iot_proto_pack_data_to_dl645() - To pack data into a dl645 frame,
 | 
						|
 * @param data_input:   point to the data frame to be packed
 | 
						|
 * @param dl645_data:   point to the output dl645 data buffer
 | 
						|
 * @param data_len:     point the data length of input frame
 | 
						|
                        when output means length of the dl645 frame
 | 
						|
 * @param di:           di of dl645 frame
 | 
						|
 * @param mac:          mac of dl645 frame
 | 
						|
 * @param fn:           fn of dl645 frame
 | 
						|
 * @param dir:          dir of dl645 frame
 | 
						|
 */
 | 
						|
void iot_proto_pack_data_to_dl645(uint8_t *data_input, uint8_t *dl645_data,
 | 
						|
    uint16_t *data_len, uint32_t di, uint8_t *mac, uint8_t fn, uint8_t dir);
 | 
						|
 | 
						|
/**
 | 
						|
 * @brief iot_handle_ge_to_dl645() - check the FEA0 frame is include a
 | 
						|
                                     collector ii or not, if exist, pick the
 | 
						|
                                     collector ii dl645 or modbus frame out, if
 | 
						|
                                     it is not exist, pick the dl645 frame out.
 | 
						|
 * @param data_input:   point to the FEA0 frame witch need to be check, if dl645
 | 
						|
                        or modbus frame exist, copy the modbus or dl645 frame
 | 
						|
                        to the head of data_output
 | 
						|
 * @param data_output:  point to the position the dl645 frame should copy to
 | 
						|
 * @retval:             the data length of unpacked frame
 | 
						|
 */
 | 
						|
uint8_t iot_handle_ge_to_dl645(uint8_t *data_input, uint8_t *data_output);
 | 
						|
 | 
						|
/**
 | 
						|
 * @brief iot_sta_pack_extend_dl645_to_ge() - To pack a dl645 or modbus frame
 | 
						|
                                              into a dl645 frame, then pack the
 | 
						|
                                              dl645 frame into a ge frame
 | 
						|
 * @param data_input:   point to the data frame, dl645 or modbus frame
 | 
						|
 * @param ge_data:      point to the ge data
 | 
						|
 * @param data_len:     when input means length of the dl645 or modbus frame
 | 
						|
                        when output means length of the ge frame
 | 
						|
 * @param protcotype:   type of data MODBUS or DL645.
 | 
						|
                        MODBUS - DI1-DI4 will be 0x0800000B
 | 
						|
                        DL645 - DI1-DI4 will be 0x0800000A
 | 
						|
 * @return:             err or not
 | 
						|
 */
 | 
						|
uint8_t iot_sta_pack_extend_dl645_to_ge(uint8_t *data_input,
 | 
						|
    uint8_t *ge_data, uint16_t *data_len, uint8_t protcotype);
 | 
						|
 | 
						|
/**
 | 
						|
 * @brief iot_proto_645_local_mode_timer_handler() - To get out the 645 local
 | 
						|
                                                   read mode and clear the cache
 | 
						|
 */
 | 
						|
void iot_proto_645_local_mode_timer_handler(void);
 | 
						|
 | 
						|
#else
 | 
						|
 | 
						|
/**
 | 
						|
 * @brief iot_handle_cco_delay_tm_pack_ge_to_dl645() - cco handle the delay time
 | 
						|
                                                       message from plc
 | 
						|
 * @param data_input:    data in ptr
 | 
						|
 * @param data_output:   data out ptr
 | 
						|
 * @return:              dl645 frm len
 | 
						|
 */
 | 
						|
uint8_t iot_handle_cco_delay_tm_pack_ge_to_dl645(uint8_t *data_input,
 | 
						|
    uint8_t *data_output);
 | 
						|
 | 
						|
#endif /* PLC_SUPPORT_STA_ROLE */
 | 
						|
 | 
						|
void iot_proto_645_header_init(proto_645_header_t *hdr,
 | 
						|
    uint8_t *addr, uint8_t fn, uint8_t dir, uint8_t ack, uint8_t follow);
 | 
						|
 | 
						|
void iot_proto_645_tail_init(proto_645_header_t *hdr);
 | 
						|
 | 
						|
/**
 | 
						|
 * @brief iot_proto_edge_msg_output_msg_handler() - proto handle the message from
 | 
						|
                                                    edge
 | 
						|
 * @param msg_id:    the message id
 | 
						|
 * @param arg:       the msg
 | 
						|
 */
 | 
						|
void iot_proto_edge_msg_output_msg_handler(uint8_t msg_id, void *arg);
 | 
						|
 | 
						|
/**
 | 
						|
 * @brief iot_proto_645_ext_sub33_handle() -   sub 0x33 of the every data in the
 | 
						|
 *                                             645 protocol data field.
 | 
						|
 * @param ds:                                  pointer to data field.
 | 
						|
 * @param size:                                length of data field.
 | 
						|
 */
 | 
						|
void iot_proto_645_ext_sub33_handle(uint8_t *ds, uint32_t size);
 | 
						|
 | 
						|
/**
 | 
						|
 * @brief iot_proto_645_ext_add33_handle() -   add 0x33 of the every data in the
 | 
						|
 *                                             645 protocol data field.
 | 
						|
 * @param ds:                                  pointer to data field.
 | 
						|
 * @param size:                                length of data field.
 | 
						|
 */
 | 
						|
void iot_proto_645_ext_add33_handle(uint8_t *ds, uint32_t size);
 | 
						|
 | 
						|
/**
 | 
						|
 * @brief iot_proto_645_get_di_by_sub33() -    get di from a 645 frame.
 | 
						|
 * @param data:                                pointer to data field of 645 frame.
 | 
						|
 * @param len:                                 length of data field.
 | 
						|
 * @param di:                                  di of 645 frame.
 | 
						|
 */
 | 
						|
uint32_t iot_proto_645_get_di_by_sub33(uint8_t *data, uint8_t len, uint32_t *di);
 | 
						|
 | 
						|
/**
 | 
						|
 * @brief iot_proto_645_build_resp_msg()     dl645 pack response frame.
 | 
						|
 * @param hdr:                          point to data which should pack a frame.
 | 
						|
 * @param in_data:                      to fill in the data of 645 fram
 | 
						|
 * @param len:                          in_data len
 | 
						|
 * @param reason:                       error reason, 0 is no error
 | 
						|
 * @param fn:                           function control code
 | 
						|
 */
 | 
						|
void iot_proto_645_build_resp_msg(proto_645_header_t *hdr,
 | 
						|
    uint8_t *in_data, uint8_t len, uint8_t reason, uint8_t fn);
 | 
						|
 | 
						|
#ifdef __cplusplus
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
#endif /* end IOT_PROTO_DL645_H */
 |