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