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

886 lines
31 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_COMMON_H
#define IOT_BRM_COMMON_H
/* os shim includes */
#include "os_types_api.h"
#include "iot_config_api.h"
#include "iot_utils_api.h"
#include "iot_pkt_api.h"
#include "proto_645.h"
#include "iot_rtc_api.h"
#include "iot_sg_ext_sta_api.h"
#ifdef __cplusplus
extern "C" {
#endif
#define iot_brm_printf iot_printf
#define IOT_BRM_MOVE_DEV_ENABLE 0
/* enable and disable cache functions */
#define IOT_BRM_CACHE_ENABLE 1
/* define the maximum number of nodes supported by branch management devices */
#define IOT_BRM_SUPPORT_NODE_MAX 32
/* define periodic timer interval, uint is 1ms */
#define IOT_BRM_PERIOND_TIMER_INTERVAL 1000
/* define the maximum number of baud rates supported */
#define IOT_BRM_SUPPORT_BAUD_MAX 5
/* brm module protocol type definition */
#define IOT_BRM_PROTO_TYPE_TRANSPARENT 0
#define IOT_BRM_PROTO_TYPE_645_1997 1
#define IOT_BRM_PROTO_TYPE_645_2007 2
#define IOT_BRM_PROTO_TYPE_69845 3
/* this is an abstract protocol type, which is used to forward 645-2007
* messages through 376.1.
*/
#define IOT_BRM_PROTO_TYPE_645_2007_BY_3761 4
/* this is an abstract protocol type, which is used to forward 645-2007
* messages through 698.45.
*/
#define IOT_BRM_PROTO_TYPE_645_2007_BY_69845 5
/* this is an abstract protocol type, which is used to forward 698.45
* messages through 698.45.
*/
#define IOT_BRM_PROTO_TYPE_69845_BY_3761 6
/* this is an abstract protocol type, which is used to forward 698.45
* messages through 376.1.
*/
#define IOT_BRM_PROTO_TYPE_69845_BY_69845 7
#define IOT_BRM_PROTO_TYPE_MAX \
(IOT_BRM_PROTO_TYPE_69845_BY_69845 + 1)
/* this define is the receive message timeout time parameter for proxy transfer
* command request
*/
#define IOT_BRM_PROXY_TRANS_TIMEOUT 3
/* define the port where the node is located */
#define IOT_BRM_PORT_RS485 0
#define IOT_BRM_PORT_PLC_WEAK 1
#define IOT_BRM_PORT_PLC 2
/* the module and BRM are in the same network, but the module is from other
* vendor, and cannot be collected by PLC.
*/
#define IOT_BRM_PORT_PLC_WEAK_NOT_SAME_VENDOR 3
#define IOT_BRM_PORT_MAX \
(IOT_BRM_PORT_PLC_WEAK_NOT_SAME_VENDOR + 1)
/* define operator */
#define IOT_BRM_OPERATOR_EXT 0
#define IOT_BRM_OPERATOR_INTERNAL 1
#define IOT_BRM_OPERATOR_CCO 2
#define IOT_BRM_OPERATOR_MAX (IOT_BRM_OPERATOR_CCO + 1)
/* defined phase value for BRM */
#define IOT_BRM_PHASE_ALL 0
#define IOT_BRM_PHASE_A 1
#define IOT_BRM_PHASE_B 2
#define IOT_BRM_PHASE_C 3
#define IOT_BRM_PHASE_MAX (IOT_BRM_PHASE_C + 1)
/* quadrant1: active power is positive, reactive power is positive. */
#define IOT_BRM_METER_QUAD_1 0
/* quadrant2: active power is negative, reactive power is positive. */
#define IOT_BRM_METER_QUAD_2 1
/* quadrant3: active power is negative, reactive power is negative. */
#define IOT_BRM_METER_QUAD_3 2
/* quadrant3: active power is positive, reactive power is negative. */
#define IOT_BRM_METER_QUAD_4 3
/* read meter time state */
#define IOT_BRM_READ_METER_TIME_STATE_INIT 0
#define IOT_BRM_READ_METER_TIME_STATE_DATA 1
/* define support rates */
#define IOT_BRM_METER_RATE_MAX 4
/* define minimum effective voltage, unit is 0.1V */
#define IOT_BRM_VALID_VOLTAGE_MIN 100
/* define support max node info count */
#define IOT_BRM_PROTO_GET_INFO_CNT 16
/* calibration idle status */
#define IOT_BRM_ONESHOT_CALIBRATE_IDLE (0)
/* calibration doing status */
#define IOT_BRM_ONESHOT_CALIBRATE_DOING (1)
/* calibration successful status */
#define IOT_BRM_ONESHOT_CALIBRATE_SUCCESS (2)
/* calibration fail status */
#define IOT_BRM_ONESHOT_CALIBRATE_FAIL (3)
/* define current transformer ratio number */
#define IOT_BRM_METER_I_RATIO_DEFAULT (0)
#define IOT_BRM_METER_I_RATIO_4000 (1)
#define IOT_BRM_METER_I_RATIO_8000 (2)
#define IOT_BRM_METER_I_RATIO_10000 (3)
#define IOT_BRM_METER_I_RATIO_12000 (4)
/* snr calculation factor. this value defined the proportion
* of the snr of the new snr while calculate the final snr
* based on the snr history. set this value to x means the new
* snr only contribute to 1/x to the final snr.
*/
#define IOT_BRM_NW_SNR_FACTOR (8)
/* give smallest number, which is -128 */
#define IOT_BRM_INVALID_SNR (-128)
/* give largest number, which is 127 */
#define IOT_BRM_MAX_SNR (127)
/* highest available snr */
#define IOT_BRM_SNR_HIGHEST (90)
/* lowest available snr */
#define IOT_BRM_SNR_LOWEST (-10)
/* update snr max threshold value */
#define IOT_BRM_MAX_FD_SNR (35)
/* update snr min threshold value */
#define IOT_BRM_MIN_FD_SNR (-10)
/* demand max slide interval, unit: 1 minute */
#define IOT_BRM_METER_DEMAND_SLIDE_INTERVAL_MAX (5)
/* demand default slide interval, unit: 1 minute */
#define IOT_BRM_METER_DEMAND_SLIDE_INTERVAL_DEF (1)
/* max demand period, unit: 1 minute */
#define IOT_BRM_METER_DEMAND_PERIOD_MAX (60)
/* default demand period, unit: 1 minute */
#define IOT_BRM_METER_DEMAND_PERIOD_DEF (15)
/* how many settlement dates can be set each month */
#define IOT_BRM_SUPPORT_MSD_NUM (3)
/* come from of the data transfer road */
typedef enum _iot_brm_data_owner {
/* data is come from sg app */
iot_brm_data_owner_sg_app = 0,
/* data is come from rs485 */
iot_brm_data_owner_rs485,
/* data is come from multifunction rs485 */
iot_brm_data_owner_mf_rs485,
/* owner limit */
iot_brm_data_owner_max,
} iot_brm_data_owner_t;
/* three-phase energy-type meter data structure */
typedef struct _iot_brm_meter_energy_triphase {
/* combined active energy, total ~ rates 1-4, uint is 1/ec kWh */
uint32_t ept_comp[IOT_BRM_METER_RATE_MAX + 1];
/* positive active energy, total ~ rates 1-4, uint is 1/ec kwh */
uint32_t ept_pos[IOT_BRM_METER_RATE_MAX + 1];
/* negative active energy, total ~ rates 1-4, uint is 1/ec kwh */
uint32_t ept_neg[IOT_BRM_METER_RATE_MAX + 1];
/* positive reactive energy, total ~ rates 1-4, uint is 1/ec kvarh */
uint32_t eqt_pos[IOT_BRM_METER_RATE_MAX + 1];
/* negative reactive energy, total ~ rates 1-4, uint is 1/ec kvarh */
uint32_t eqt_neg[IOT_BRM_METER_RATE_MAX + 1];
/* positive apparent energy, total ~ rates 1-4, uint is 1/ec kVAh */
uint32_t est_pos[IOT_BRM_METER_RATE_MAX + 1];
/* negative apparent energy, total ~ rates 1-4, uint is 1/ec kVAh */
uint32_t est_neg[IOT_BRM_METER_RATE_MAX + 1];
/* quad reactive energy, uint is 1/ec kvarh */
uint32_t eqt_quad[IOT_BRM_METER_QUAD_4 + 1][IOT_BRM_METER_RATE_MAX + 1];
} iot_brm_meter_energy_triphase_t;
typedef struct _iot_brm_meter_max_demand {
/* max demand */
uint32_t max_demand;
/* max demand time */
uint32_t ts;
} iot_brm_meter_max_demand_t;
/* three-phase energy-type meter demand data structure */
typedef struct _iot_brm_meter_triphase_max_demand {
/* max positive active energy demand, total ~ rates 1-4, uint: kw */
iot_brm_meter_max_demand_t ept_pos[IOT_BRM_METER_RATE_MAX + 1];
/* max negative active energy demand, total ~ rates 1-4, uint: kw */
iot_brm_meter_max_demand_t ept_neg[IOT_BRM_METER_RATE_MAX + 1];
/* max positive reactive energy demand, total ~ rates 1-4, uint: kvar */
iot_brm_meter_max_demand_t eqt_pos[IOT_BRM_METER_RATE_MAX + 1];
/* max negative reactive energy demand, total ~ rates 1-4, uint: kvar */
iot_brm_meter_max_demand_t eqt_neg[IOT_BRM_METER_RATE_MAX + 1];
/* max positive apparent energy demand, total ~ rates 1-4, uint: kVA */
iot_brm_meter_max_demand_t est_pos[IOT_BRM_METER_RATE_MAX + 1];
/* max negative apparent energy demand, total ~ rates 1-4, uint: kVA */
iot_brm_meter_max_demand_t est_neg[IOT_BRM_METER_RATE_MAX + 1];
/* quad reactive energy demand, uint: kvar */
iot_brm_meter_max_demand_t
eqt_quad[IOT_BRM_METER_QUAD_4 + 1][IOT_BRM_METER_RATE_MAX + 1];
} iot_brm_meter_triphase_max_demand_t;
/* sig-phase energy-type meter data structure */
typedef struct _iot_brm_meter_sigphase_max_demand {
/* positive active energy demand, uint: kW */
iot_brm_meter_max_demand_t ept_pos;
/* negative active energy demand, uint: kW */
iot_brm_meter_max_demand_t ept_neg;
/* positive reactive energy demand, uint: kvar */
iot_brm_meter_max_demand_t eqt_pos;
/* negative reactive energy demand, uint: kvar */
iot_brm_meter_max_demand_t eqt_neg;
/* positive apparent energy, uint: kVAh */
iot_brm_meter_max_demand_t est_pos;
/* negative apparent energy, uint: kVAh */
iot_brm_meter_max_demand_t est_neg;
/* quad reactive energy demand, uint: kvar */
iot_brm_meter_max_demand_t eqt_quad[IOT_BRM_METER_QUAD_4 + 1];
} iot_brm_meter_sigphase_max_demand_t;
/* sig-phase energy-type meter data structure */
typedef struct _iot_brm_meter_energy_sigphase {
/* positive active energy, uint is 1/ec kwh */
uint32_t ept_pos;
/* negative active energy, uint is 1/ec kwh */
uint32_t ept_neg;
/* positive reactive energy, uint is 1/ec kvarh */
uint32_t eqt_pos;
/* negative reactive energy, uint is 1/ec kvarh*/
uint32_t eqt_neg;
/* positive apparent energy, uint is 1/ec kVAh */
uint32_t est_pos;
/* negative apparent energy, uint is 1/ec kVAh */
uint32_t est_neg;
/* quad reactive energy, uint is 1/ec kvarh */
uint32_t eqt_quad[IOT_BRM_METER_QUAD_4 + 1];
} iot_brm_meter_energy_sigphase_t;
/* variable-type meter data structure */
typedef struct _iot_brm_meter_var {
/* EC constant */
uint16_t ec;
/* power line frequency, uint is 0.01Hz */
uint16_t freq;
/* temperature, uint is 0.1 centigrade */
int16_t temperature;
/* humidity, unit is 0.1 %RH */
int16_t humidity;
/* voltage angle between phaseA and phaseB. unit: 1degrees */
int16_t angle_ua_ub;
/* voltage angle between phaseA and phaseC. unit: 1degrees */
int16_t angle_ua_uc;
/* voltage angle between phaseB and phaseC. unit: 1degrees */
int16_t angle_ub_uc;
/* voltage RMS, uint is 0.1V */
uint16_t v[IOT_BRM_PHASE_C];
/* phase current RMS, uint is 0.001A */
int32_t i[IOT_BRM_PHASE_C];
/* N line current RMS, uint is 0.001A */
int32_t i_n;
/* high-precision phase current RMS, uint is 0.00001A */
int32_t i_high[IOT_BRM_PHASE_C];
/* active power, uint is 0.0001 KW */
int32_t p[IOT_BRM_PHASE_MAX];
/* high-precision active power RMS, uint is 0.000001 KW */
int32_t p_high[IOT_BRM_PHASE_MAX];
/* reactive power, uint is 0.0001 Kvar */
int32_t q[IOT_BRM_PHASE_MAX];
/* high-precision reactive power RMS, uint is 0.000001 Kvar */
int32_t q_high[IOT_BRM_PHASE_MAX];
/* apparent power, uint is 0.0001 KVA */
int32_t s[IOT_BRM_PHASE_MAX];
/* high-precision apparent power RMS, uint is 0.000001 KVA */
int32_t s_high[IOT_BRM_PHASE_MAX];
/* power factor, uint is 0.001 */
int16_t pf[IOT_BRM_PHASE_MAX];
/* voltage and current phase angle, uint is 0.1 degrees*/
uint16_t ui_anglep[IOT_BRM_PHASE_C];
/* quadrant of current work */
uint8_t quad[IOT_BRM_PHASE_MAX];
} iot_brm_meter_var_t;
/* node sampling data structure */
typedef struct {
/* voltage, uint is 0.1V */
uint16_t v[IOT_BRM_PHASE_C];
/* current, uint is 0.001A */
int32_t i[IOT_BRM_PHASE_C];
/* active power, uint is 0.1W */
int32_t p[IOT_BRM_PHASE_MAX];
/* N-line current, uint is 0.001A */
int32_t i_n;
/* meter time difference uint is 1s */
int32_t tm_diff;
/* meter time */
iot_time_tm_t tm;
/* number of opening covers */
uint32_t open_cover_n;
/* meter time difference is valid or not, 0 - invalid, 1 - valid */
uint8_t tm_diff_valid : 1,
/* meter time difference is state, see IOT_BRM_READ_METER_XXX */
tm_state : 2,
/* correct time is start, see IOT_BRM_CORRECT_TIME_XXX */
correct_time_state : 2,
/* correct time retry number, only 698.45 meter valid */
retry_cnt : 3;
/* status words */
uint16_t words[PROTO_645_07_MAX_STATUS_WORDS_INDEX];
/* flag to mark if the power information is updated */
uint32_t p_update : 1,
/* reserved for further use */
rsvd : 31;
} iot_brm_node_samp_t;
/* max min voltage recording formats */
typedef struct {
/* voltage, uint is 0.1v */
uint16_t v;
/* time of occurrence mix or min */
uint32_t ts;
} iot_brm_max_min_v_t;
/* max min current recording formats */
typedef struct {
/* current, uint is 0.001A */
int32_t i;
/* time of occurrence mix or min */
uint32_t ts;
} iot_brm_max_min_i_t;
/* day statistical infomation recording formats */
typedef struct {
/* The state of max voltage */
iot_brm_max_min_v_t max_v[IOT_BRM_PHASE_C];
/* The state of min voltage */
iot_brm_max_min_v_t min_v[IOT_BRM_PHASE_C];
/* The state of max current */
iot_brm_max_min_i_t max_i[IOT_BRM_PHASE_C];
/* The state of min current */
iot_brm_max_min_i_t min_i[IOT_BRM_PHASE_C];
} iot_brm_meter_day_stat_info_t;
/* meter info structure */
typedef struct _iot_brm_meter_info {
/* voltage ratio */
uint32_t v_ratio;
/* current ratio */
uint32_t i_ratio;
/* current coefficient unit: 0.0001 */
uint32_t i_ratio_coeff;
/* variable-type meter data */
iot_brm_meter_var_t var;
/* three-phase total energy data structure*/
iot_brm_meter_energy_triphase_t e_t;
/* sig-phase energy metering data, A/B/C */
iot_brm_meter_energy_sigphase_t e_s[IOT_BRM_PHASE_C];
/* meter day statistical infomation recording formats */
iot_brm_meter_day_stat_info_t day_stat;
/* total three-phase total energy max demand data structure*/
iot_brm_meter_triphase_max_demand_t e_t_max_demand;
/* sig-phase energy metering max demand data, A/B/C */
iot_brm_meter_sigphase_max_demand_t e_s_max_demand[IOT_BRM_PHASE_C];
} iot_brm_meter_info_t;
/* define curve config structure */
typedef struct _iot_brm_curve_cfg {
/* flag to mark if "rec_start" valid */
uint16_t rec_start_valid : 1,
/* flag to mark if "interval" valid */
interval_valid : 1,
/* reserved for further use */
rsvd : 14;
/* starting base time of curve record */
iot_time_tm_t rec_start;
/* interval of curve recording, uint is 1s */
uint16_t interval;
} iot_brm_curve_cfg_t;
/* define terminal config structure */
typedef struct _iot_brm_terminal_cfg {
/* terminal communication port number, see PROTO_PORT_RS485_X. */
uint8_t trans_port :2,
/* terminal type, if 0: 3761 terminal, 1: 698 terminal. */
is_698 :1,
/* reserved for further use. */
rsvd :5;
/* terminal address configuration. */
union {
/* terminal address 698, little-endian */
uint8_t trans_698_addr[IOT_MAC_ADDR_LEN];
struct{
/* administrative region code */
uint16_t area_code;
/* terminal address region */
uint16_t dev_addr;
} trans_3761;
} terminal_addr;
} iot_brm_terminal_cfg_t;
#pragma pack(push) /* save the pack status */
#pragma pack(1) /* 1 byte align */
/* node info descriptor */
typedef struct _iot_brm_node_info {
/* node addr */
uint8_t addr[IOT_MAC_ADDR_LEN];
/* node porto type, see IOT_BRM_PROTO_TYPE_XXX */
uint8_t proto_type : 3,
/* node port, see IOT_BRM_PORT_XXX */
port : 3,
/* reserved for further use */
rsvd : 2;
/* PT ratio, uint is x1 */
uint8_t v_ratio;
/* CT ratio, uint is x1 */
uint16_t i_ratio;
/* assembly number */
uint8_t ass_pos : 6,
/* reserved for further use */
rsvd2 : 2;
/* node baud */
uint32_t baud;
/* TODO: adding more information */
} iot_brm_node_info_t;
typedef struct _iot_brm_location_unit {
/* location unit seconds : BCD code */
uint16_t sec_0 : 4,
sec_1 : 4,
sec_2 : 4,
sec_3 : 4;
/* location unit min : BCD code */
uint8_t min_0 : 4,
min_1 : 4;
/* location unit degree : BCD code */
uint16_t degree_0 : 4,
degree_1 : 4,
degree_2 : 4,
degree_4_rsvd : 4;
} iot_brm_location_unit_t;
/* node information entry descriptor */
typedef struct iot_brm_pm_node_entry {
/* node address */
uint8_t addr[IOT_MAC_ADDR_LEN];
/* protocol type, see IOT_BRM_PROTO_TYPE_XXX */
uint16_t proto_type : 4,
/* port type. see IOT_BRM_PORT_XXX */
port : 3,
/* baud rate id */
bid : 4,
/* creator of node, see IOT_BRM_OPERATOR_XXX */
creator : 2,
/* reserved for further use */
rsvd : 3;
/* current transformer ratio of node, uint is x1 */
uint16_t i_ratio;
/* voltage transformer ratio of node, uint is x1 */
uint8_t v_ratio;
/* assembly number */
uint8_t ass_pos : 6,
/* reserved for future */
rsvd1 : 2;
/* reserved for further use */
uint8_t rsvd2[19];
} iot_brm_nv_node_entry_t;
/* convert ntb to ms. in HW, the ntb clock freq is 25 mhz. */
#define IOT_BRM_NTB_TO_MS(ntb) ((ntb) / (25 * 1000))
/* convert ms to ntb. in HW, the ntb clock freq is 25 mhz. */
#define IOT_BRM_MS_TO_NTB(ms) ((ms) * (25 * 1000))
#pragma pack(pop)
#if IOT_BRM_ENABLE
/**
* @brief iot_brm_data_print() - print data, format is hex.
* @param str: a short string to be printed before data
* @param buf: buffer contain data to be printed
* @param len: length of data in the buffer
*/
void iot_brm_data_print(const char* str, uint8_t* buf, uint32_t len);
/**
* @brief iot_brm_post_msg() - post messages to brm app queue
* @param msg_type: message type, see IOT_BRM_MSG_TYPE_XXXX.
* @param msg_id: message id, see IOT_BRM_MSG_ID_XXXX.
* @param prio: message prio, see IOT_BRM_MSG_QUEUE_XXXX.
* @param data: data pointer carried by message
* @param data2: integer data carried by messages
*/
void iot_brm_post_msg(uint16_t msg_type, uint16_t msg_id,
uint8_t prio, void *data, uint32_t data2);
/**
* @brief iot_brm_clean_msg() - clean messages in brm app queue.
* @param msg_type: message type, see IOT_BRM_MSG_TYPE_XXXX.
* @param msg_id: message id, see IOT_BRM_MSG_ID_XXXX
*/
void iot_brm_clean_msg(uint16_t msg_type, uint16_t msg_id);
/**
* @brief iot_brm_calc_nw_snr() - calculate new snr
* @param orig_snr: orig snr
* @param new_snr: new snr
* @retval current snr
*/
int8_t iot_brm_calc_nw_snr(int8_t orig_snr, int8_t new_snr);
/**
* @brief iot_brm_send_mr_cmd() - send meter reading message to PLC.
* @param dest_addr: destination address.
* @param sn: seq number to be used by message.
* @param proto_type: proto type of messages, see IOT_BRM_PROTO_TYPE_XXXX
* @param data: point to the content of meter reading message.
* @param len: length of meter reading message.
* @param ppm_fix: current transmission PPM fix value.
*/
void iot_brm_send_mr_cmd(uint8_t *dest_addr, uint16_t sn,
uint8_t proto_type, uint8_t *data, uint16_t len, int8_t ppm_fix);
/**
* @brief iot_brm_send_mr_cmd() - load meter info data.
* @retval: pointer to meter info.
*/
iot_brm_meter_info_t *iot_brm_load_meter_info(void);
/**
* @brief iot_brm_data_handler() - handle data massage.
* @param pkt: data packet.
* @param recv_from: where is the data from, see iot_brm_data_owner_t
*/
void iot_brm_data_handler(iot_pkt_t *pkt, iot_brm_data_owner_t recv_from);
/**
* @brief iot_brm_node_add() - adding nodes.
* @param addr: node address, little Endian.
* @param prot: prot type. see IOT_BRM_PORT_XXX
* @param proto_type: node protocol type, see IOT_BRM_PROTO_TYPE_645_XXX.
* @param baud: node baud rate.
* @param i_ratio: pointer to current ratio.
* @param v_ratio: pointer to voltage ratio.
* @param pos: assembly number.
* @param operator: operator, see IOT_BRM_OPERATOR_XXX.
* @retval ERR_OK - for success case, othersie - error code.
*/
uint8_t iot_brm_node_add(uint8_t *addr, uint8_t prot,
uint8_t proto_type, uint32_t baud, uint16_t *i_ratio, uint8_t *v_ratio,
uint8_t *pos, uint8_t operator);
/**
* @brief iot_brm_node_rm() - delete node.
* @param addr: the address of the node to be deleted, little Endian.
*/
void iot_brm_node_rm(uint8_t *addr);
/**
* @brief iot_brm_node_rm_by_creator() - delete all nodes of the specified
* creator.
* @param bm_creator: bitmap for creator of node,
* mean of bit see IOT_BRM_OPERATOR_XXX
* @retval: node cnt.
*/
void iot_brm_node_rm_by_creator(uint8_t bm_creator);
/**
* @brief iot_brm_data_init() - initialize branch management app data.
*/
void iot_brm_data_init(void);
/**
* @brief iot_brm_get_dev_addr() - get device address.
* @addr: return device address, little Endian.
*/
void iot_brm_get_dev_addr(uint8_t *addr);
/**
* @brief iot_brm_set_dev_addr() - set device address.
* @addr: src device address, little Endian.
*/
void iot_brm_set_dev_addr(uint8_t *addr);
/**
* @brief iot_brm_get_node_cnt() - get node cnt.
* @retval: node cnt.
*/
uint8_t iot_brm_get_node_cnt();
/**
* @brief iot_brm_get_node_cnt_by_creator() - get node cnt of the specified
* creator.
* @param bm_creator: bitmap for creator of node,
* mean of bit see IOT_BRM_OPERATOR_XXX
* @retval: node cnt.
*/
uint8_t iot_brm_get_node_cnt_by_creator(uint8_t bm_creator);
/**
* @brief iot_brm_get_node_info() - iot_brm_get_node_info.
* @param start_seq: node start seq number to be queried.
* @param cnt: number of nodes to be queried.
* @param info: buffer from node information.
* @param info_cnt: info buffer count.
* @param bm_creator: bitmap for creator of node,
* mean of bit see IOT_BRM_OPERATOR_XXX
* @retval: number of nodes actually queried.
*/
uint8_t iot_brm_get_node_info(uint8_t start_seq, uint8_t cnt,
iot_brm_node_info_t *info, uint8_t info_cnt, uint8_t bm_creator);
/**
* @brief iot_brm_find_nv_node() - get node info from nv region.
* @param addr: node addr.
* @retval: pointer to nv node information.
* @retval: null faill.
*/
iot_brm_nv_node_entry_t *iot_brm_find_nv_node(uint8_t *addr);
/**
* @brief iot_brm_get_node_samp_info() - get samp info of nodes.
* @param idx: node idx.
* @retval: return samp info of nodes.
*/
iot_brm_node_samp_t *iot_brm_get_node_samp_info(uint8_t idx);
/**
* @brief iot_brm_send_pkt_to_sg_app() - send pkt to sg app.
* @param pkt: pointer to pkt to be sent.
*/
void iot_brm_send_pkt_to_sg_app(iot_pkt_t *pkt);
/**
* @brief iot_brm_send_resp_pkt() - send response pkt.
* @param pkt : pointer to pkt to be sent.
* @param send_to: send the pkt back, see iot_brm_data_owner_t.
*/
void iot_brm_send_resp_pkt(iot_pkt_t *pkt, iot_brm_data_owner_t send_to);
/**
* @brief iot_brm_rs485_set_check_state() - set 485 bus to enter check state.
* in this state, 485 will not forward SG app and internal meter reading
* message, which is specially used for assembling check.
*/
void iot_brm_rs485_set_check_state(void);
/**
* @brief iot_brm_rs485_send() - send data to 485 bus.
* @param pkt: iot_pkt to be send.
*/
void iot_brm_rs485_send(iot_pkt_t *pkt);
/**
* @brief iot_brm_rs485_config_buad_internal() - configure RS485 baud rate and
* protocol type.
* @param buad: baud value.
* @param proto_type: protocol type, see IOT_BRM_PROTO_TYPE_XXX.
*/
void iot_brm_rs485_config_buad_internal(uint32_t buad,
uint8_t proto_type);
/**
* @brief iot_brm_get_addr_from_message() - get address from message
* @param data: message data.
* @param len: message data length.
* @param addr[out]: the address.
* @param proto_type[out]: protocol type, see IOT_BRM_PROTO_TYPE_XXX.
* @retuval: if success return ERR_OK, else return ERR_FAIL.
*/
uint32_t iot_brm_get_addr_from_message(uint8_t *data,
uint16_t len, uint8_t *addr, uint8_t *proto_type);
/**
* @brief iot_brm_baud_to_bid() - convert baud rate to bid.
* @param baud: baud rate to be converted.
* @retuval: baud id.
*/
uint8_t iot_brm_baud_to_bid(uint32_t baud);
/**
* @brief iot_brm_baud_to_bid() - convert baud id to baud.
* @param baud: baud id to be converted.
* @retuval: baud value.
*/
uint32_t iot_brm_bid_to_baud(uint8_t bid);
/**
* @brief iot_brm_set_gps_info() - setting GPS information, longitude
* and latitude.
* @param latitude: pointer to latitude.
* @param longitude: pointer to longitude.
*/
void iot_brm_set_gps_info(iot_brm_location_unit_t *latitude,
iot_brm_location_unit_t *longitude);
/**
* @brief iot_brm_get_gps_info() - get GPS information, longitude
* and latitude.
* @param latitude: return latitude.
* @param longitude: return longitude.
*/
void iot_brm_get_gps_info(iot_brm_location_unit_t *latitude,
iot_brm_location_unit_t *longitude);
/**
* @brief iot_brm_set_meter_ratio() - set the meetr transformation ratio
* @param v_ratio: voltage ratio.
* @param i_ratio: current ratio.
*/
void iot_brm_set_meter_ratio(uint32_t v_ratio, uint32_t i_ratio);
/**
* @brief iot_brm_send_config_cmd() - set the meter transformation ratio
* @param dest_addr: target address to be configuration.
* @param band: target band to be configuration.
* @param dur: duration for which the configuration takes effect, uint is 1s.
* @param is_sta: if set, the target address to be configured is sta
*/
void iot_brm_send_config_cmd(uint8_t *dest_addr, uint8_t band,
uint8_t dur, uint8_t is_sta);
/**
* @brief iot_brm_set_whitelist_enable() - enable whitelist
*/
void iot_brm_set_whitelist_enable();
/**
* @brief iot_brm_set_fb() - set working frequency band
* @param band_id: target band to be set, see PLC_LIB_FREQ_BAND_X.
*/
void iot_brm_set_fb(uint8_t band_id);
/**
* @brief iot_brm_e_to_proto_645() - cal energy data then transfer to 645 format
* @param e: energy
* @param ec: EC constant.
* @param: pointer of target 645 format data
* @retuval: lenth of 645 format data
*/
uint8_t iot_brm_e_to_proto_645(uint32_t e, uint16_t ec, uint8_t * out_buf);
/**
* @brief iot_brm_get_plc_state() - get PLC status
* @retuval: 0--not joined, 1--joined
*/
uint8_t iot_brm_get_plc_state(void);
/**
* @brief iot_brm_get_cco_addr() - get PLC cco address
* @param addr[out] cco address
*/
uint8_t *iot_brm_get_cco_addr(void);
/**
* @brief iot_brm_sync_node_list_to_sg_app() - synchronize rs485 node to sg app
*/
void iot_brm_sync_node_list_to_sg_app();
/**
* @brief iot_brm_send_resp_data() - brm send response data to recv from.
* @param data: response data ptr.
* @param len: response data length.
* @param send_to: dealwith data recv from, see iot_brm_data_owner_t.
*/
void iot_brm_send_resp_data(uint8_t *data, uint32_t len,
iot_brm_data_owner_t send_to);
/**
* @brief iot_brm_port_is_exist() - check whether the corresponding port exists
* @param port: port number, see IOT_BRM_PORT_XXX.
* @retuval: 1 -- exist, 0 -- not.
*/
uint8_t iot_brm_port_is_exist(uint8_t port);
/**
* @brief iot_brm_node_is_exist() - check whether the corresponding node exist
* @param addr: node addr.
* @retuval: 1 -- exist, 0 -- not.
*/
uint8_t iot_brm_node_is_exist(uint8_t *addr);
/**
* @brief iot_brm_485_mode_setting() - set 485 slave/master mode.
* @param slave_flag: 1 - set 485 slave mode, 0 - set 485 master mode.
* @param baudrate: 485 baudrate slave mode.
* @param hold_time: 485 slave mode hold time, unit - 1ms.
*/
void iot_brm_485_mode_setting(uint8_t slave_flag, uint32_t baudrate,
uint32_t hold_time);
/**
* @brief iot_brm_set_curve_cfg() - curve recording configuration.
* @param cfg: pointer to curve record configuration information.
* @retval ERR_OK - for success case, othersie - error code
*/
uint32_t iot_brm_set_curve_cfg(iot_brm_curve_cfg_t *cfg);
/**
* @brief iot_brm_get_curve_cfg() - get curve recording configuration info.
* @param cfg: 1 - return curve recording configuration info.
*/
void iot_brm_get_curve_cfg(iot_brm_curve_cfg_t *cfg);
/**
* @brief iot_brm_get_terminal_cfg() - get terminal configuration info.
* @param cfg: return terminal configuration info.
* @retval ERR_OK - for success case, ERR_INVAL - no set case.
*/
uint8_t iot_brm_get_terminal_cfg(iot_brm_terminal_cfg_t *cfg);
/**
* @brief iot_brm_set_terminal_cfg() - set terminal configuration info.
* @param cfg: set terminal configuration info.
* @retval ERR_OK - for success case, othersie - error code
*/
uint32_t iot_brm_set_terminal_cfg(iot_brm_terminal_cfg_t *cfg);
/**
* @brief iot_brm_is_brk() - device is breaker.
* @retval 1 - is breaker, 0 - is not breaker.
*/
uint8_t iot_brm_is_brk();
/**
* @brief iot_brm_mr_698_get_apdu_sn() - get and update 698 proto seq number.
* @retval: 698 proto seq number.
*/
uint8_t iot_brm_mr_698_get_apdu_sn();
/**
* @brief iot_brm_oneshot_calibration_req() - req oneshot calibration.
* @param i: calibration current param unit - 0.01A.
* @param u: calibration voltage param unit - 0.1V.
* @param ec: EC constant.
* @param i_rate: current channel transfer rate.
* @param i_sample: current channel sample resistance value. unit: ohm.
* @param u_rate: voltage channel transfer rate.
* @param max_smpl: max sample times.
* @retval: ERR_OK - success oneshot calibration, others - fail.
*/
uint32_t iot_brm_oneshot_calibration_req(uint16_t i, uint16_t u, uint32_t ec,
uint32_t i_rate, uint32_t i_sample, uint32_t u_rate, uint16_t max_smpl);
/**
* @brief iot_brm_oneshot_calibration_query() - query oneshot calibration status.
* @param fail_code: calibration fail code when calibration fail.
* @retval: calibration status, see - IOT_BRM_ONESHOT_CALIBRATE_XXX.
*/
uint8_t iot_brm_get_oneshot_calibration_status(uint8_t *fail_code);
#endif /* IOT_BRM_ENABLE */
#ifdef __cplusplus
}
#endif
#endif /* IOT_BRM_COMMON_H */