Files
kunlun/export/inc/sg_lib/proto_188.h
2024-09-28 14:24:04 +08:00

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