Files
kunlun/app/brm/inc/iot_brm_proto_devadp_645_ext.h
2024-09-28 14:24:04 +08:00

489 lines
19 KiB
C
Executable File

/****************************************************************************
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_BRM_PROTO_645_EXT_H
#define IOT_BRM_PROTO_645_EXT_H
#include "os_types_api.h"
#include "iot_utils_api.h"
#include "iot_pkt_api.h"
#include "proto_645.h"
#ifdef __cplusplus
extern "C" {
#endif
#define BRM_PROTO_645_EXT_DEBUG 1
/* pack for the structures in the whole file */
#pragma pack(push) /* save the pack status */
#pragma pack(1) /* 1 byte align */
/* Invalid di */
#define PROTO_645_EXT_INVALID_DI (0xffffffffu)
/* extended data item of extended 645-2007 frame */
/* read value of current and paramter of power threshold */
#define PROTO_645_EXT_CURRENT_AND_POWER_THR_DI (0x04400050u)
/* read counter of event in someday */
#define PROTO_645_EXT_EVT_COUNTER_DI (0x04400055u)
/* read record of event in someday */
#define PROTO_645_EXT_EVT_RECORD_DI (0x04400056u)
/* read diagram of load */
#define PROTO_645_EXT_LOAD_DIAGRAM_DI (0x04400057u)
/* read real time data */
#define PROTO_645_EXT_REAL_TIME_DATA_DI (0x04400058u)
/* read VMS-3006-WS-N01 external device humidity and temperature */
#define PROTO_645_EXT_READ_04400059_DI (0x04400059u)
/* collecting galactic thermostat humidity and temperature */
#define PROTO_645_EXT_READ_0440005A_DI (0x0440005Au)
/* read counts of event indication */
#define PROTO_645_EXT_EVT_IND_CNT_DI (0x03830000u)
/* read event indication */
#define PROTO_645_EXT_REQ_EVT_IND_DI (0x03830001u)
/* write value of meter bottom */
#define PROTO_645_EXT_METER_BOTTOM_VALUE_DI (0x0440002Eu)
#define proto_645_2007_ext_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)
typedef enum _proto_645_ext_event_e {
/* Event type, used to report the event. */
PROTO_645_EXT_EVENT_DEV_POWER_ON = 0x0,/* Device power on. */
PROTO_645_EXT_EVENT_DEV_WORK_START = 0x1,/* Device start working. */
PROTO_645_EXT_EVENT_DEV_WORK_STOP = 0x2,/* Device stop working. */
PROTO_645_EXT_EVENT_DEV_POWER_OFF = 0x3,/* Device power off. */
PROTO_645_EXT_EVENT_DEV_TRAP_START = 0x4,/* Device work in trap. */
PROTO_645_EXT_EVENT_DEV_TRAP_STOP = 0x5,/* Device restore from trap. */
PROTO_645_EXT_EVENT_INVALID
} proto_645_ext_event_e;
typedef struct _proto_645_ext_corr_time_t {
uint8_t second;
uint8_t minute;
uint8_t hour;
uint8_t day;
uint8_t month;
uint8_t year;
} proto_645_ext_corr_time_t;
typedef struct _proto_645_07_ext_time_t {
uint8_t second;
uint8_t minute;
uint8_t hour;
uint8_t week;
uint8_t day;
uint8_t month;
uint8_t year;
} proto_645_07_ext_time_t;
typedef struct _proto_645_07_ext_v {
/* voltage.use 2 bytes of BCD code to represent the voltage.
* for example, 220.0V uses 2 bytes of BCD code to represent
* the following 0x22, 0x00. */
uint8_t tenth:4, /* one-tenth unit. */
one:4; /* ont unit. */
uint8_t ten:4, /* ten unit. */
hundred:4; /* hundred unit. */
} proto_645_07_ext_v_t;
typedef struct _proto_645_07_ext_thrphase_v_t {
/* Concentrators support three-phase voltages and recently
* use only a single term. */
proto_645_07_ext_v_t A;
proto_645_07_ext_v_t B;
proto_645_07_ext_v_t C;
} proto_645_07_ext_thrphase_v_t;
typedef struct _proto_645_07_ext_a {
/* current.use 3 bytes of BCD code to represent the current.
* for example, 123.456A uses 3 bytes of BCD code to represent
* the following 0x12, 0x34, 0x56. */
uint8_t thousandth:4, /* one-thousandth unit. */
hundredth:4; /* one-hundredth unit. */
uint8_t tenth:4, /* ten unit. */
one:4; /* one unit. */
uint8_t ten:4, /* ten unit. */
hundred:3, /* hundred unit. */
s:1; /* sign bit, 1 for negative. */
} proto_645_07_ext_a_t;
typedef struct _proto_645_07_ext_thrphase_a_t {
/* Concentrators support three-phase currents and recently
* use only a single term. */
proto_645_07_ext_a_t A;
proto_645_07_ext_a_t B;
proto_645_07_ext_a_t C;
} proto_645_07_ext_thrphase_a_t;
typedef struct _proto_645_07_ext_p {
/* total power. use 3 bytes of BCD code to represent the active
* power. for example, 12.3456kW uses 3 bytes of BCD code to represent
* the following 0x12, 0x34, 0x56. */
uint8_t ten_thousandth:4, /* ten_thousandth unit. */
thousandth:4; /* one-hundredth unit. */
uint8_t hundredth:4, /* one-hundredth unit. */
tenth:4; /* one-tenth unit. */
uint8_t one:4, /* one unit. */
ten:2, /* ten unit. */
d:1, /* carry bit, 1 for need multiply by 10. */
s:1; /* sign bit, 1 for negative. */
} proto_645_07_ext_p_t;
typedef struct _proto_645_07_ext_thrphase_p_t {
/* Concentrators support three-phase power and recently
* use only a single term. */
proto_645_07_ext_p_t total;
proto_645_07_ext_p_t A;
proto_645_07_ext_p_t B;
proto_645_07_ext_p_t C;
} proto_645_07_ext_thrphase_p_t;
typedef struct _proto_645_07_ext_pf {
/* total power factor.use 2 bytes of BCD code to represent the power
* factor. for example, 0.999 uses 2 bytes of BCD code to represent
* the following 0x09, 0x99. */
uint8_t tenth:4, /* one-tenth unit. */
one:4; /* one unit. */
uint8_t ten:4, /* ten unit. */
hundred:3, /* hundred unit. */
s:1; /* sign bit, 1 for negative. */
} proto_645_07_ext_pf_t;
typedef struct _proto_645_07_ext_thrphase_pf_t {
/* Concentrators support three-phase power factor and recently
* use only a single term. */
proto_645_07_ext_pf_t total;
proto_645_07_ext_pf_t A;
proto_645_07_ext_pf_t B;
proto_645_07_ext_pf_t C;
} proto_645_07_ext_thrphase_pf_t;
typedef struct _proto_645_07_ext_w {
/* use 4 bytes of BCD code to represent bottom energy value. for example,
* 123456.78KWh uses 4 bytes of BCD code to represent the following
* 0x12, 0x34, 0x56, 0x78.
*/
uint8_t hundredth:4, /* one-hundredth unit. */
tenth:4; /* one-tenth unit. */
uint8_t one:4, /* one unit. */
ten:4; /* ten unit. */
uint8_t hundred:4, /* hundred unit. */
thousand:4; /* thousand unit. */
uint8_t ten_thousand:4, /* ten_thousand unit. */
hundred_thousand:4; /* hundred_thousand unit. */
} proto_645_07_ext_w_t;
/* Item of each power threshold item. */
typedef struct _proto_645_ext_power_record_item_t {
proto_645_07_ext_thrphase_v_t v; /* Voltage, V. */
proto_645_07_ext_thrphase_a_t i; /* Electrical current, A. */
proto_645_07_ext_thrphase_p_t p; /* Power, KW. */
proto_645_07_ext_thrphase_pf_t pf; /* Power factor, %. */
proto_645_07_ext_w_t w; /* Work(meter bottom value), KWH. */
} proto_645_ext_power_record_item_t;
/* Response read current and power limit parameters. */
typedef struct _proto_645_ext_resp_threashold_t {
proto_645_07_ext_a_t i_standby; /* Standby current threshold, A. */
proto_645_07_ext_a_t i_work; /* Working current threshold, A. */
proto_645_07_ext_p_t p_trap; /* Traped power threshold, KW. */
} proto_645_ext_resp_threashold_t;
/* Response read event counter. */
typedef struct _proto_645_ext_resp_event_counter_t {
proto_645_ext_corr_time_t start_time; /* The time of start querrying. */
uint16_t event_counter; /* Number of events queried. */
} proto_645_ext_resp_event_counter_t;
/* Item of each reported event record. */
typedef struct _proto_645_ext_event_record_item_t {
uint8_t type; /* Event record type. */
proto_645_ext_corr_time_t etime; /* Event record timestamp. */
proto_645_ext_power_record_item_t event_record_item; /* event record item. */
} proto_645_ext_event_record_item_t;
/* Item of each indication event count. */
typedef struct _proto_645_ext_resp_ind_event_cnt_t {
uint16_t count; /* count of indication Event */
uint8_t resv; /* reserved */
} proto_645_ext_resp_ind_event_cnt_t;
/* Item of each indication event count. */
typedef struct _proto_645_ext_resp_read_ind_event_t {
proto_645_ext_corr_time_t etime; /* Event record timestamp. */
proto_645_ext_power_record_item_t event_record_item; /* event record item. */
uint8_t type; /* Event record type. */
} proto_645_ext_resp_read_ind_event_t;
/* Event record command, used by query operation.
* Query event record of the day on timestamp.
*/
typedef struct _iot_brm_adp_cmd_event_record_query_t {
/* Timestamp for querying event record of a day. */
proto_645_ext_corr_time_t start_time;
/* Record start index. (0~511)*/
uint16_t start_idx;
/* The number of record to get(effective value: 1~5). */
uint16_t record_num;
} iot_brm_adp_cmd_event_record_query_t;
/* Response read event record. */
typedef struct _proto_645_ext_resp_event_record_t {
/* Start number of records.*/
uint16_t record_start_index;
/* The number of records reported this time. */
uint16_t record_num;
/* event record data. */
proto_645_ext_event_record_item_t record_data[0];
} proto_645_ext_resp_event_record_t;
/* read record load diagram counter. */
typedef struct _iot_brm_adp_cmd_load_record_query_t {
/* The time of start querrying. */
proto_645_ext_corr_time_t start_time;
/* Number of record. (1~5) */
uint16_t recode_counter;
} iot_brm_adp_cmd_load_record_query_t;
/* Item of each reported load diagram. */
typedef struct _proto_645_ext_load_diagram_item_t {
/* Event record timestamp. */
proto_645_ext_corr_time_t etime;
/* Load diagram. */
proto_645_ext_power_record_item_t load_diagram_item;
} proto_645_ext_load_diagram_item_t;
/* Response load diagram. */
typedef struct _proto_645_ext_resp_load_diagram_t {
/* The number of records at 15-minute intervals
* starting from the starting time. */
uint16_t record_num;
/* data of records. */
proto_645_ext_load_diagram_item_t load_diagram[0];
} proto_645_ext_resp_load_diagram_t;
/* Response realtime load diagram. */
typedef struct _proto_645_ext_realtime_load_data_t {
/* the current time. */
proto_645_ext_corr_time_t etime;
/* realtime load data. */
proto_645_ext_power_record_item_t realtime_load_data;
} proto_645_ext_realtime_load_data_t;
/* Meter bottom value. */
typedef struct _proto_645_ext_bottom_val_t
{
/* Meter bottom value. */
proto_645_07_ext_w_t bottom_val;
} proto_645_ext_bottom_val_t;
/* Response humidity and temperature for 0x04400059u. */
typedef struct _proto_645_ext_resp_humi_temp_t {
/* read temperature. */
int16_t temp;
/* read humidity.*/
uint16_t humi;
} proto_645_ext_resp_humi_temp_t;
/* Response collecting galactic thermostat data for 0x0440005Au. */
typedef struct _proto_645_ext_resp_coll_thermo_t {
/* read temperature. */
int32_t temp;
/* temperature setted. */
int32_t temp_setted;
/* read humidity.*/
uint32_t humi;
/* humidity setted.*/
uint32_t humi_setted;
/* run time.*/
uint32_t runs;
/* alarm state.*/
uint32_t alarm_state;
/* run state.*/
uint16_t run_state;
/* set temperature. */
int16_t set_temp;
/* set humidity. */
uint16_t set_humi;
} proto_645_ext_resp_coll_thermo_t;
/* read humidity and temperature modbus command. */
typedef struct _proto_modbus_read_humi_temp_t {
uint8_t add;
uint8_t fn;
uint16_t start_add;
uint8_t len_hi;
uint8_t len_low;
uint16_t crc16;
} proto_modbus_read_humi_temp_t;
/* resp read humidity and temperature modbus command. */
typedef struct _proto_modbus_resp_humi_temp_t {
uint8_t add;
uint8_t fn;
uint8_t len;
uint16_t humi;
int16_t temp;
uint16_t crc16;
} proto_modbus_resp_humi_temp_t;
#pragma pack(pop) /* restore the pack status */
/**
* @brief proto_handle_645_ext_req_read_threshold() - read current and power
* limit parameters.
* @param out_buf: point to the resp payload frame.
* @param out_len: the length of out_buf.
*/
void proto_handle_645_ext_req_read_threshold(uint8_t* out_buf,
uint8_t *out_len);
/**
* @brief proto_handle_645_ext_req_read_event_counter() - request counter of
* event in someday.
* @param payload: point to the request to adp.
* @param payload_len: the length of payload.
* @param out_buf: point to response buffer frame.
* @param out_len: the length of out_buf.
*/
void proto_handle_645_ext_req_read_event_counter(uint8_t *payload,
uint8_t payload_len, uint8_t* out_buf, uint8_t *out_len);
/**
* @brief proto_handle_645_ext_req_read_event_record() - request record of event
* in someday.
* @param payload: point to the request to adp.
* @param payload_len: the length of payload.
* @param out_buf: point to response buffer frame.
* @param out_len: the length of out_buf.
*/
void proto_handle_645_ext_req_read_event_record(uint8_t *payload,
uint8_t payload_len, uint8_t* out_buf, uint8_t *out_len);
/**
* @brief proto_handle_645_ext_req_read_load_diagram() - request diagram of load.
* @param payload: point to the request to adp.
* @param payload_len: the length of payload.
* @param out_buf: point to response buffer frame.
* @param out_len: the length of out_buf.
*/
void proto_handle_645_ext_req_read_load_diagram(uint8_t *payload,
uint8_t payload_len, uint8_t* out_buf, uint8_t *out_len);
/**
* @brief proto_handle_645_ext_req_read_realtime_load_data() - request
* real time data.
* @param out_buf: point to response buffer frame.
* @param out_len: the length of out_buf.
*/
void proto_handle_645_ext_req_read_realtime_load_data(uint8_t* out_buf,
uint8_t *out_len);
/**
* @brief proto_handle_645_ext_req_write_threshold() - request write current
* and power limit parameters
* @param data: point to the request to adp.
* @param data_len: the length of data.
*/
void proto_handle_645_ext_req_write_threshold(uint8_t* data, uint8_t data_len);
/**
* @brief proto_handle_645_ext_req_write_bottom_value() - request write
* bottom value.
* @param data: point to the request to adp.
* @param data_len: the length of data.
*/
void proto_handle_645_ext_req_write_bottom_value(uint8_t* data,
uint8_t data_len);
/**
* @brief iot_brm_proto_645_w_ext_data_hander() - handler write command.
* @param in_data: point to the request to adp.
* @param in_len: the length of in_data.
* @param di: the data item will be write.
* @param len: will response data len.
* @retval: success handler will response PROTO_645_2007_ERR_OK
*/
uint8_t iot_brm_proto_645_w_ext_data_hander(uint8_t *in_data, uint8_t in_len,
uint32_t di, uint8_t *len);
/**
* @brief iot_brm_proto_645_r_ext_data_hander() - handler read command.
* @param in_data: point to the request to adp.
* @param in_len: the length of in_data.
* @param out_buf: point to response data.
* @param len: will response data len.
* @retval: success handler will response PROTO_645_2007_ERR_OK
*/
uint8_t iot_brm_proto_645_r_ext_data_hander(uint8_t *in_data, uint8_t in_len,
uint8_t *out_buf, uint8_t *len);
/**
* @brief iot_brm_adp_trans_evt_to_resp() - Convert recorded event data to
* response data.
* @param event: adp event recorded data.
* @param data : the response data.
*/
void iot_brm_adp_trans_evt_to_resp(uint8_t *event, uint8_t *data);
/**
* @brief iot_brm_adp_load_resp_init() - init load recorded response data.
* @param data: point to the response data.
* @param ts: resp start ts.
* @param cnt: response load count;
*/
void iot_brm_adp_load_resp_init(uint8_t *data, uint32_t ts, uint8_t cnt);
/**
* @brief iot_brm_adp_trans_load_to_resp() - Convert load recorded data to
* response data.
* @param load: adp load recorded data.
* @param data: the response data.
*/
void iot_brm_adp_trans_load_to_resp(uint8_t *load, uint8_t *data);
/**
* @brief iot_brm_adp_read_ws_n01_humi_temp() - check the pkt is read
* VMS-3006-WS-N01 humidity
* and temperature.
* @param pkt: point to the pkt data, if read di is 0x04400059u,
* fill read VMS-3006-WS-N01 humidity and temperature.
* rs485 modbus command.
* @retval return ERR_OK if read di is 0x04400059u.
*/
uint8_t iot_brm_adp_read_ws_n01_humi_temp(iot_pkt_t *pkt);
/**
* @brief iot_brm_adp_resp_humi_temp() - response humidity and temperature.
* @param pkt: point to the pkt data include humidity and temperature
* from rs485 modbus.
* @retval response ws_n01 humidity and temperature successful return ERR_OK.
*/
uint8_t iot_brm_adp_resp_ws_n01_humi_temp(iot_pkt_t* pkt);
#ifdef __cplusplus
}
#endif
#endif /* IOT_BRM_PROTO_645_EXT_H */