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