164 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			164 lines
		
	
	
		
			5.6 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_188_H
 | |
| #define PROTO_188_H
 | |
| 
 | |
| #include "os_types_api.h"
 | |
| #include "iot_utils_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_188_START_CHAR                                0x68
 | |
| 
 | |
| /* frame end char definition */
 | |
| #define PROTO_188_END_CHAR                                  0x16
 | |
| 
 | |
| /* device type */
 | |
| #define PROTO_188_DEV_TYPE_COLD_WATER                       0x10
 | |
| #define PROTO_188_DEV_TYPE_HOT_WATER                        0x11
 | |
| #define PROTO_188_DEV_TYPE_DRINK_WATER                      0x12
 | |
| #define PROTO_188_DEV_TYPE_RECLAIMED_WATER                  0x13
 | |
| #define PROTO_188_DEV_TYPE_HEAT_CAPACITY                    0x20
 | |
| #define PROTO_188_DEV_TYPE_COOLING_CAPACITY                 0x21
 | |
| #define PROTO_188_DEV_TYPE_GAS                              0x30
 | |
| #define PROTO_188_DEV_TYPE_OTHERS                           0x40
 | |
| 
 | |
| /* control function code definition for CJ/T 188-2004 */
 | |
| #define PROTO_188_2004_FN_RESERVED                          0x00
 | |
| #define PROTO_188_2004_FN_READ_DATA                         0x01
 | |
| #define PROTO_188_2004_FN_READ_ADDR                         0x03
 | |
| #define PROTO_188_2004_FN_WRITE_DATA                        0x04
 | |
| #define PROTO_188_2004_FN_READ_KEY_VERSION                  0x05
 | |
| #define PROTO_188_2004_FN_WRITE_ADDR                        0x15
 | |
| #define PROTO_188_2004_FN_WRITE_SYNCHRONIZATION             0x16
 | |
| 
 | |
| /* communication state */
 | |
| #define PROTO_188_COMM_STATE_NORMAL                         (1)
 | |
| 
 | |
| /* Message direction: master->slave */
 | |
| #define PROTO_188_DIR_MASTER                                (0)
 | |
| /* Message direction: slave->master */
 | |
| #define PROTO_188_DIR_SLAVE                                 (1)
 | |
| 
 | |
| /* CJ/T 188-2004 mac address length */
 | |
| #define PROTO_188_ADDR_LEN                                  (7)
 | |
| 
 | |
| /* meter time length */
 | |
| #define PROTO_188_METER_TIME_LEN                            (6)
 | |
| 
 | |
| /* meter accumulative value length */
 | |
| #define PROTO_188_METER_ACC_VAL_LEN                         (4)
 | |
| 
 | |
| /* water meter report cmd type */
 | |
| #define PROTO_188_WATER_CMD                                 (0xC6)
 | |
| 
 | |
| typedef struct _proto_188_ctrl {
 | |
|     /* function code. see PROTO_188_2004_FN_XXX */
 | |
|     uint8_t     fn                  :6,
 | |
|     /* communication state, see PROTO_188_COMM_STATE_XXX */
 | |
|                 comm_flag           :1,
 | |
|     /* direction. see PROTO_188_DIR_XXX */
 | |
|                 dir                 :1;
 | |
| } proto_188_ctrl_t;
 | |
| 
 | |
| typedef struct _proto_188_header {
 | |
|     /* start char, see PROTO_188_START_CHAR */
 | |
|     uint8_t                 start_char;
 | |
|     /* device type, see PROTO_188_DEV_TYPE_XXX */
 | |
|     uint8_t                 dev_type;
 | |
|     /* target mac address, little endian */
 | |
|     uint8_t                 addr[PROTO_188_ADDR_LEN];
 | |
|     /* control code */
 | |
|     proto_188_ctrl_t        control;
 | |
|     /* data length */
 | |
|     uint8_t                 len;
 | |
|     /* cmd type */
 | |
|     uint8_t                 cmd;
 | |
|     /* data */
 | |
|     uint8_t                 data[0];
 | |
| } proto_188_header_t;
 | |
| 
 | |
| typedef struct _proto_188_tailer {
 | |
|     /* reserved */
 | |
|     uint8_t    rsvd;
 | |
|     /* check by accumulation sum */
 | |
|     uint8_t    cs;
 | |
|     /* end char. see PROTO_188_END_CHAR */
 | |
|     uint8_t    end_char;
 | |
| } proto_188_tailer_t;
 | |
| 
 | |
| typedef struct _proto_188_lp_meter_report_data {
 | |
|     /* meter time */
 | |
|     uint8_t     meter_time[PROTO_188_METER_TIME_LEN];
 | |
|     /* meter type */
 | |
|     uint8_t     meter_type;
 | |
|     /* accumulative value */
 | |
|     uint8_t     acc_value[PROTO_188_METER_ACC_VAL_LEN];
 | |
|     /* statistical time */
 | |
|     uint8_t     stat_time;
 | |
|     /* last month accumulative value */
 | |
|     uint8_t     last_mon_acc_value[PROTO_188_METER_ACC_VAL_LEN];
 | |
|     /* meter undervoltage */
 | |
|     uint8_t     uvp:1,
 | |
|     /* reserved */
 | |
|                 rsvd:7;
 | |
|     /* release date */
 | |
|     uint8_t     release_date;
 | |
| } proto_188_lp_meter_report_data_t;
 | |
| 
 | |
| #pragma pack(pop)   /* restore the pack status */
 | |
| 
 | |
| /* proto_188_calc_cs() - calculate checksum for 188  protocol
 | |
|  * @app_id:     pointer to the 188 protocol header
 | |
|  *
 | |
|  * return
 | |
|  *  calculated checksum value
 | |
|  */
 | |
| uint8_t proto_188_calc_cs(proto_188_header_t *hdr);
 | |
| 
 | |
| /* proto_188_format_check() - 188 protocol format check
 | |
|  * @data:   pointer to protocol data buffer
 | |
|  * @len:    data length
 | |
|  * @dir:    message direction--see PROTO_188_DIR_XXX
 | |
|  * return
 | |
|  *    NULL      -- Incorrect protocol format.
 | |
|  *    otherwise -- pointer to the 188 protocol header
 | |
|  */
 | |
| proto_188_header_t *proto_188_format_check(uint8_t *data,
 | |
|     uint32_t len, uint32_t dir);
 | |
| 
 | |
| /**
 | |
|  * @brief:           check if the mac is 188 broadcast mac
 | |
|  * @param dst:       the mac address to be checked
 | |
|  * @return           1 is 188 broadcast mac
 | |
|  * @return           0 NOT a 188 broadcast mac
 | |
|  */
 | |
| uint8_t proto_188_is_bcast(uint8_t* dst);
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #endif /* PROTO_188_H */
 | |
| 
 |