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