/**************************************************************************** * * 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 _INCLUDE_IOT_BRM_ADP_H_ #define _INCLUDE_IOT_BRM_ADP_H_ #define IOT_EM_REPORT_EVENT_RECORD_MAX (5) /* Report 5 event records at a time. */ #define IOT_EM_REPORT_LOAD_RECORD_MAX (5) /* Report 5 load records at a time. */ #define IOT_BRM_RECORD_PHASE (3) /* record three phase data. */ #define IOT_BRM_RECORD_PHASE_MAX (4) /* record three phase and total data. */ #define IOT_BRM_FSM_REQ_CFM_CNT (3) /* Event of plug-in device and our brm. */ typedef enum _iot_dm_event_e { /* Customer event start. Customer care about those events. */ DM_EVENT_DEV_POWER_ON = 0x0,/* Device power on. I > I(standby). */ DM_EVENT_DEV_POWER_OFF = 0x1,/* Device power off. I <= I(standby). */ DM_EVENT_DEV_WORK_START = 0x2,/* Device start working. I > I(work). */ DM_EVENT_DEV_WORK_STOP = 0x3,/* Device stop working. I <= I(work). */ DM_EVENT_DEV_TRAP_START = 0x4,/* Device work in trap. P > P(trap). */ DM_EVENT_DEV_TRAP_STOP = 0x5,/* Device restore from trap. P <= P(trap). */ /* Customer event end. */ DM_EVENT_INVALID } iot_dm_event_e; /* State of plug-in device. */ typedef enum _iot_dm_dev_state_e { /* No device plug into our brm. */ DM_STATE_DEV_OFFLINE = 0x00, /* Device plug into our brm, staying in standby. */ DM_STATE_DEV_STANDBY = 0x01, /* Device plug into our brm, working right. */ DM_STATE_DEV_WORKING = 0x02, /* Device plug into our brm, running in trouble. */ DM_STATE_DEV_TRAPING = 0x03, DM_STATE_DEV_MAX = 0x0F } iot_dm_dev_state_e; /* Seconds have passed since 1970, Reference Unix time.*/ typedef uint32_t iot_brm_time_t; /* Item of each reported load record. */ typedef struct _iot_brm_load_record_item_t { uint16_t event; /* Event type. see iot_dm_event_e. */ uint16_t v[IOT_BRM_RECORD_PHASE]; /* Voltage, uint is 0.1V. */ int32_t i[IOT_BRM_RECORD_PHASE]; /* Electrical current, uint is 0.001A. */ int32_t p[IOT_BRM_RECORD_PHASE_MAX]; /* Active power, uint is 0.0001 KW. */ uint16_t f[IOT_BRM_RECORD_PHASE_MAX]; /* Power factor, uint is 0.001. */ uint32_t w; /* Work(meter bottom value), uint is 0.0001 KWH. */ } iot_brm_load_record_t; /* Item of each reported event record. */ typedef struct _iot_brm_event_record_item_t { uint32_t state; /* State type. see iot_dm_dev_state_e*/ iot_brm_time_t time; /* Load record timestamp.*/ iot_brm_load_record_t rcd_data; /* load record. */ } iot_brm_event_record_t; /* The device state of energy meter adapter. Reference to iot_dm_dev_state_e. */ typedef uint8_t brm_adp_dev_state_e; /* The device finite state machine handle. */ typedef brm_adp_dev_state_e(*brm_adp_dev_fsm_handle_t)(uint32_t event, iot_brm_event_record_t *p_event_record); /* Threshold data. */ typedef struct _iot_brm_threshold_t { int32_t i_standby; /* Current threshold for standby.*/ int32_t i_work; /* Current threshold for working.*/ int32_t p_trap; /* Power threshold for runing in trap.*/ } iot_brm_threshold_t; /* The table of device finite state machine handle. */ typedef struct _brm_adp_dev_fsm_table_t { brm_adp_dev_fsm_handle_t *handle; } brm_adp_dev_fsm_table_t; /* Energy meter adapter device finite state machine. */ typedef struct _brm_adp_dev_fsm_t { /* Previous state */ brm_adp_dev_state_e prev_state; /* Current state */ brm_adp_dev_state_e cur_state; /* The table of device finite state machine handle */ brm_adp_dev_fsm_table_t table; /* counter of request to change state */ uint16_t chg_req_cnt; /* bitmap of request to change state */ uint16_t chg_req_bitmp; } brm_adp_dev_fsm_t; /* The energy meter adapter context. */ typedef struct _brm_adp_context_t { /* Device finite state machine. */ brm_adp_dev_fsm_t dev_fsm; /* Threshold saved in local. */ iot_brm_threshold_t threshold; /* Meter bottom value saved in local, WH. */ uint32_t meter_bottom_val; /* PLC network status: 0--not joined, 1--joined*/ uint16_t link_ready; /* flag to indicate whether already send event report once joining nw*/ uint16_t evt_on_join; } brm_adp_context_t; /* Event record command, used by response operation. * Response query event record of the day on timestamp. */ typedef struct _iot_brm_adp_cmd_event_record_resp_t { uint32_t start_idx; /* Record start index. */ uint32_t record_num; /* Number of records reported. */ iot_brm_event_record_t record_buf[0]; /* Buffer that stores records. */ } iot_brm_adp_cmd_event_record_resp_t; /* Process corresponding event for device finite state machine. * Compare ADC data with threshold, trigger event, * call process state function. */ void iot_brm_adp_fsm_event_process(void); /* load the energy meter adapter threshold value. */ uint8_t iot_brm_adp_threshold_load(void); /** * @brief iot_brm_adp_get_threshold() - get threshold. * @retval : return the threshold. */ iot_brm_threshold_t *iot_brm_adp_get_threshold(void); /** * @brief iot_brm_adp_save_threshold() - save the energy meter adapter * threshold value.. * @param threshold : the threshold to save. */ void iot_brm_adp_threshold_save(iot_brm_threshold_t *threshold); /* load the energy meter adapter bottom value. */ uint8_t iot_brm_adp_bottom_val_load(void); /* @brief iot_brm_adp_bottom_val_save() - save the energy meter adapter * bottom value. * @param bottom_val: the bottom value to save. */ void iot_brm_adp_bottom_val_save(uint32_t bottom_val); /** * @brief iot_brm_get_adp_evt_entry_size() - get event record entry size. * @retval : return event record entry size. */ uint8_t iot_brm_get_adp_evt_entry_size(void); /** * @brief iot_brm_adp_evt_save() - record adp eventing data. * @param p_evt_rec: adp eventing record data. */ void iot_brm_adp_evt_save(iot_brm_event_record_t *p_evt_rec); /** * @brief iot_brm_read_adp_evt_daily_cnt() - get event record count by time. * @param ts : find record event time * @retval : return event record count. */ uint8_t iot_brm_read_adp_evt_daily_cnt(uint32_t ts); /** * @brief iot_brm_adp_evt_load() - load record adp eventing data. * @param ts : find record event time * @param start_inx : find record event time start index * @param cnt : find record event time count from start index * @param pkt : adp event record data. * @retval : response event data count. */ uint8_t iot_brm_adp_evt_load(uint32_t ts, uint8_t start_inx, uint8_t cnt, iot_pkt_t **pkt); /** * @brief iot_brm_adp_evt_load() - load the latest event record from flash. * @param pkt : adp event record data. * @retval : 0--no err, 1--err. */ uint8_t iot_brm_adp_latest_evt_load(iot_pkt_t **pkt); /** * @brief iot_brm_adp_load_data() - load record adp load data. * @param ts : find record load start time * @param cnt : find record load count from ts * @param pkt : adp load record data. * @retval : response load data count. */ uint8_t iot_brm_adp_load_data(uint32_t ts, uint8_t cnt, iot_pkt_t **pkt); /* Initialize the energy meter adapter module. */ uint32_t iot_brm_adp_init(void); #endif /* _INCLUDE_IOT_BRM_ADP_H_ */