/**************************************************************************** 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_NV_H #define IOT_BRM_NV_H /* os shim includes */ #include "os_types_api.h" /* iot common header files */ #include "iot_utils_api.h" #include "iot_config_api.h" /* branch management internal header files */ #include "iot_brm_common.h" #include "iot_brm_evt.h" /* define the length of the non-volatile region reserved for events*/ #define IOT_BRM_NV_EVT_RSVD_DATA_LEN 499 /* define the length of the non-volatile parameter */ #define IOT_BRM_NV_PARAMS_DATA_LEN 520 /* define branch detect identification code max len */ #define IOT_BRM_BRANCH_ID_CODE_MAX 16 #ifdef __cplusplus extern "C" { #endif #if (IOT_BRM_ENABLE && PLC_SUPPORT_STA_ROLE) /* non-volatile section ID */ typedef enum { /* node list section */ iot_brm_nv_id_node_list, /* assembly check info section */ iot_brm_nv_id_ass_chk_info, /* param section */ iot_brm_nv_id_param, /* power down info section */ iot_brm_nv_id_pd_info, /* evt info section */ iot_brm_nv_id_evt_info, /* max */ iot_brm_nv_id_max, } iot_brm_nv_id_t; #pragma pack(push) /* save the pack status */ #pragma pack(1) /* 1 byte align */ /* time parameter setting of freezing on monthly settlement date */ typedef struct { /* day */ uint8_t day; /* hour */ uint8_t hour; } iot_brm_msd_frozen_time_t; /* branch revceive config info valid mark magic */ #define IOT_BRM_BR_CFG_VALID_MARK 0x5A5A /* branch revceive confog mark */ typedef struct _iot_brm_br_cfg { /* load hw tsfm mode encode frequncy. unit: 0.01Hz */ uint32_t fc; /* characteristics data per bit duration time, unit: 1ms */ uint16_t chara_bit_dur; /* modulate pulse signal high duration time, unit: 1us */ uint16_t pulse_high_dur; /* modulate pulse signal low duration time, unit: 1us */ uint16_t pulse_low_dur; /* non fix code similarity threshold, uint is 0.1% */ uint16_t similarity_thr; /* fix code similarity threshold, uint is 0.1% */ uint16_t similarity_thr_fix; /* branch receive identification code len */ uint8_t id_code_len; /* branch receive identification code */ uint8_t id_code[IOT_BRM_BRANCH_ID_CODE_MAX]; /* reserved for further use */ uint8_t rsvd[7]; /* config info valid mark */ uint16_t valid_mark; } iot_brm_br_cfg_t; /* non-volatile parameter layout */ typedef struct _iot_brm_nv_params { /* longitude */ iot_brm_location_unit_t longitude; /* latitude */ iot_brm_location_unit_t latitude; /* threshold data of qiedian event */ iot_brm_evt_qd_thr_t qd_thr; /* voltage ratio */ uint32_t v_ratio; /* current ratio*/ uint32_t i_ratio; /* tsfm addr, little-endian */ uint8_t tsfm_addr[IOT_MAC_ADDR_LEN]; /* terminal information mode check */ uint8_t trans_inf_is_valid :1, /* terminal communication port number */ trans_port :2, /* terminal type, if 0: 3761 terminal, 1: 698 terminal */ is_698 :1, /* not used */ rsvd0 :4; /* 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; /* start time of curve recording */ uint32_t cr_rec_start; /* curve recording interval, uins is 1s */ uint16_t cr_rec_interval; /* threshold data of under voltage event */ iot_brm_evt_uv_thr_t uv_thr; /* threshold data of over voltage event */ iot_brm_evt_ov_thr_t ov_thr; /* threshold data of over current event */ iot_brm_evt_oi_thr_t oi_thr; /* threshold data of phase failure event */ iot_brm_evt_pf_thr_t pf_thr; /* threshold data of voltage unbalance event */ iot_brm_evt_unbalance_thr_t ubv_thr; /* threshold data of current unbalance event */ iot_brm_evt_unbalance_thr_t ubi_thr; /* current ratio coefficient, unit: 0.0001 */ uint32_t i_coeff; /* reserved */ uint8_t rsvd1[27]; /* demand slide interval unit: 1 minute */ uint8_t demand_slide_interval; /* demand period uint: 1 minute */ uint8_t demand_period; /* data format = DDhh. */ iot_brm_msd_frozen_time_t sday_time[IOT_BRM_SUPPORT_MSD_NUM]; /* devive asset management code */ uint8_t amc[32]; /* branch revceive parameter */ iot_brm_br_cfg_t br_cfg; /* reserved for further use */ uint8_t rsvd2[334]; } iot_brm_nv_params_t; /* node information list layout */ typedef struct _iot_brm_nv_node_list { /* reserved for further use */ uint8_t rsvd[12]; /* node information list */ iot_brm_nv_node_entry_t entry[IOT_BRM_SUPPORT_NODE_MAX]; } iot_brm_nv_node_list_t; /* node information list layout */ typedef struct _iot_brm_nv_pd_info { /* record number */ uint32_t rec_sn; /* not used. */ uint32_t reason :2, /* reserved for further use */ rsvd1 :30; /* reserved for further use */ uint32_t rsvd2; /* payload */ uint8_t e_data[sizeof(iot_brm_meter_energy_triphase_t) + sizeof(iot_brm_meter_energy_sigphase_t) * IOT_BRM_PHASE_C]; } iot_brm_nv_pd_info_t; /* node information list layout */ typedef struct _iot_brm_nv_evt_info { /* record number */ uint32_t rec_sn; /* not used. */ uint32_t rsvd[2]; /* payload */ uint8_t payload[IOT_BRM_NV_EVT_RSVD_DATA_LEN]; } iot_brm_nv_evt_info_t; /* node assembly check info descriptor */ typedef struct _iot_brm_ass_node_nv_entry { /* node addr, little-endian */ uint8_t addr[IOT_MAC_ADDR_LEN]; /* 1 - assembly ok, 0 assembly fail */ uint8_t ass_ok : 1, /* node proto type, see IOT_BRM_PROTO_TYPE_XXX */ pid : 3, /* node baud rate id, see IOT_BRM_BUAD_ID_XXX */ bid : 3, /* flag mark to the check by PLC link */ is_plc_chk : 1; } iot_brm_ass_node_nv_entry_t; /* assembly check info layout */ typedef struct _iot_brm_nv_ass_chk_info { /* record number */ uint32_t ts; /* time consuming, uint is 1s */ uint16_t time_cons; /* phase 1, wiring status, see PROTO_645_EXT_BRM_ASS_WIRE_XXX */ uint8_t phase1_wire_st; /* phase 2, wiring status, see PROTO_645_EXT_BRM_ASS_WIRE_XXX */ uint8_t phase2_wire_st; /* phase 3, wiring status, see PROTO_645_EXT_BRM_ASS_WIRE_XXX */ uint8_t phase3_wire_st; /* not used no.1 */ uint8_t rsvd1[3]; /* not used no.2 */ uint32_t rsvd2[2]; /* node assembly check nv info entry */ iot_brm_ass_node_nv_entry_t ent[IOT_BRM_SUPPORT_NODE_MAX]; } iot_brm_nv_ass_chk_info_t; #pragma pack(pop) /* 1 byte align */ /** * @brief iot_brm_nv_init() - initialization of non-volatile regions * @retval: ERR_OK - successfully, otherwise - error code */ uint32_t iot_brm_nv_init(void); /** * @brief iot_brm_nv_update_section() - gets the buffer pointer for the * specified section * @param id: seticon id, see iot_brm_nv_id_t * @retval: buffer pointer for the specified section */ void *iot_brm_nv_get_section(iot_brm_nv_id_t id); /** * @brief iot_brm_nv_update_section() - update the specified seticon to * non-volatile storage * @param id: seticon id, see iot_brm_nv_id_t */ void iot_brm_nv_update_section(iot_brm_nv_id_t id); #endif /* IOT_BRM_ENABLE && PLC_SUPPORT_STA_ROLE */ #ifdef __cplusplus } #endif #endif /* IOT_BRM_REC_H */