2945 lines
106 KiB
C
2945 lines
106 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 IOT_SG_STA_H
|
|
#define IOT_SG_STA_H
|
|
|
|
/* os shim includes */
|
|
#include "os_types_api.h"
|
|
#include "os_timer_api.h"
|
|
|
|
/* common includes */
|
|
#include "iot_addr_hash_table_api.h"
|
|
#include "iot_plc_msg_sta_api.h"
|
|
#include "iot_rtc_api.h"
|
|
|
|
/* smart grid internal includes */
|
|
#include "iot_sg_msg.h"
|
|
#include "proto_gw_app.h"
|
|
#include "proto_645.h"
|
|
#include "proto_645_fj.h"
|
|
#include "iot_sg_cfg.h"
|
|
#include "iot_sg_sta_drv_api.h"
|
|
#include "iot_sg_flash.h"
|
|
#include "iot_sg_sta_cfg_flash.h"
|
|
#include "iot_sg_sta_flash.h"
|
|
#include "iot_sg_upgrade.h"
|
|
#include "iot_sg_sta_tsfm.h"
|
|
#include "iot_sg_sta_topo.h"
|
|
#include "iot_sg_ext_sta_api.h"
|
|
#include "iot_sg_sta_ext_mf.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* define max secondary node supported */
|
|
#define IOT_SG_STA_SEC_NODE_MAX 32
|
|
|
|
/* define secondary node hash table size */
|
|
#define IOT_SG_STA_SEC_NODE_HASH_TABLE_SIZE 4
|
|
|
|
/* define max black listed secondary node supported */
|
|
#define IOT_SG_STA_SEC_NODE_BL_MAX 100
|
|
|
|
/* define black listed secondary node hash table size */
|
|
#define IOT_SG_STA_SEC_NODE_BL_HASH_TABLE_SIZE 4
|
|
|
|
/* define size of the invalid mac address list */
|
|
#define IOT_SG_STA_INVALID_ADDR_LIST_SIZE 16
|
|
|
|
/* define invalid mac address listed valid mac duration. unit is 1s */
|
|
#define IOT_SG_STA_VALID_ADDR_DUR (30 * 60)
|
|
|
|
/* define invalid mac address listed invalid mac duration. unit is 1s */
|
|
#define IOT_SG_STA_INVALID_ADDR_DUR (8 * 60)
|
|
|
|
/* define the min interval with the last node register result. unit is 1min */
|
|
#define IOT_SG_STA_LAST_NODE_REG_RESULT_INTERVAL (30)
|
|
|
|
/* define max request queue size. */
|
|
#define IOT_SG_STA_REQ_QUEUE_SIZE 16
|
|
|
|
/* dfining the priority of the request queue */
|
|
#define IOT_SG_STA_REQ_QUEUE_HP 0
|
|
#define IOT_SG_STA_REQ_QUEUE_MP 1
|
|
#define IOT_SG_STA_REQ_QUEUE_LP 2
|
|
|
|
/* define max 645 frames per concurrent meter read request from cco */
|
|
#define IOT_SG_STA_MAX_FRAME_PER_READ GW_APP_CON_MR_MAX_MSG_CNT
|
|
/* defines the max message length of a non-645 message in a concurrent
|
|
* meter read.
|
|
*/
|
|
#define IOT_SG_STA_MAX_MR_MSG_LEN GW_APP_CON_MR_MAX_MSG_LEN
|
|
|
|
/* define max response buffer size */
|
|
#define IOT_SG_STA_RESPONSE_MAX_SIZE IOT_SG_STA_MAX_MR_MSG_LEN
|
|
|
|
/* define max last response buffer size */
|
|
#define IOT_SG_STA_LAST_RESPONSE_MAX_SIZE 1000
|
|
|
|
/* in the status, sta isn't power off */
|
|
#define IOT_SG_STA_POWEROFF_IDLE (0)
|
|
/* in the status, sta isn't power off and receive power off event
|
|
* messages published by neighbor nodes.
|
|
*/
|
|
#define IOT_SG_STA_POWEROFF_COLLECT (1)
|
|
/* in the status, sta is power off, start report power off event */
|
|
#define IOT_SG_STA_POWEROFF_REPORT (2)
|
|
|
|
/* define effective duration of power down for fujian, uint is 1s */
|
|
#define IOT_SG_STA_FJ_PD_EVT_VALID_TIME_MIN (1)
|
|
#define IOT_SG_STA_FJ_PD_EVT_VALID_TIME_MAX (15)
|
|
#define IOT_SG_STA_FJ_PD_EVT_VALID_TIME_DFT (5)
|
|
|
|
/* defines error code of meter reading */
|
|
/* meter reading issuing fail -- no memory */
|
|
#define IOT_SG_STA_MR_ERR_ISSUE_NMEM (0)
|
|
/* initial allocation of memory failure in concurrent meter reading. */
|
|
#define IOT_SG_STA_MR_ERR_CON_NMEM_1 (1)
|
|
/* memory expansion failure of concurrent meter reading. */
|
|
#define IOT_SG_STA_MR_ERR_CON_NMEM_2 (2)
|
|
/* meter reading response message size exceeds maximum limit in concurrent
|
|
* meter reading.
|
|
*/
|
|
#define IOT_SG_STA_MR_ERR_CON_NMEM_3 (3)
|
|
/* concurrent meter reading timeout */
|
|
#define IOT_SG_STA_MR_ERR_CON_TO (4)
|
|
/* concurrent reading received NACK response */
|
|
#define IOT_SG_STA_MR_ERR_CON_NACK (5)
|
|
/* non concurrent meter reading timeout */
|
|
#define IOT_SG_STA_MR_ERR_NON_CON_TO (6)
|
|
/* concurrent meter reading loss data items */
|
|
#define IOT_SG_STA_MR_ERR_CON_LOST_ITEM (7)
|
|
/* meter reading issuing fail -- drive busy */
|
|
#define IOT_SG_STA_MR_ERR_DRV_BUSY (8)
|
|
#define IOT_SG_STA_MR_ERR_MAX (IOT_SG_STA_MR_ERR_DRV_BUSY)
|
|
|
|
/* define the number of pm checked */
|
|
#define IOT_SG_STA_PD_CHECK_PM_NUM (6)
|
|
|
|
/* define the number of buffer used to collect addr version power down info */
|
|
#define IOT_SG_STA_PD_ADDRS_BUF_CNT 8
|
|
|
|
/* define the size of buffer used to collect addr version power down info */
|
|
#define IOT_SG_STA_PD_ADDRS_BUF_SIZE (450)
|
|
|
|
/* define type of low layer link type, PLC */
|
|
#define IOT_SG_LINK_TYPE_PLC 0
|
|
/* define type of low layer link type, SWC */
|
|
#define IOT_SG_LINK_TYPE_SWC 1
|
|
/* define type of low layer link type, PLC connectionless */
|
|
#define IOT_SG_LINK_TYPE_PLC_CONN_LESS 2
|
|
/* define type of low layer link type, PLC CTRL */
|
|
#define IOT_SG_LINK_TYPE_PLC_CTRL 3
|
|
/* define type of low layer link type, APP */
|
|
#define IOT_SG_LINK_TYPE_APP 4
|
|
/* define type of low layer link type, BRM */
|
|
#define IOT_SG_LINK_TYPE_PLC_BRM 5
|
|
/* define type of low layer link type, CUS */
|
|
#define IOT_SG_LINK_TYPE_CUS 6
|
|
|
|
/* the lifetime of the last meter reading result of the cache. uint is 1ms */
|
|
#define IOT_SG_STA_LAST_MR_CACHE_LIFE (180 * 1000)
|
|
|
|
/* define maximum retry count of non concurrent meter reading.
|
|
* when the cert test behavior is detected, the retry function will be disabled.
|
|
*/
|
|
#define IOT_SG_STA_RETRY_CNT_NON_CON_MR 1
|
|
|
|
/* if the station with collector type, first n times reading were
|
|
* unsuccessful, terminate the concurrent reading as the target power
|
|
* meter may not be connected with local device.
|
|
*/
|
|
#define IOT_SG_STA_KILL_CON_READ_N_FOR_CT 2
|
|
|
|
/* define default meter read timeout. uint is 1ms */
|
|
#define IOT_SG_STA_MR_TIMEOUT (1600)
|
|
|
|
/* define start secondary node register reason */
|
|
#define IOT_SG_STA_NODE_REG_REASON_START (0)
|
|
#define IOT_SG_STA_NODE_REG_REASON_QUERY (1)
|
|
#define IOT_SG_STA_NODE_REG_REASON_DRV (2)
|
|
|
|
/* define sta meter reading req source id, max id is 7 */
|
|
#define IOT_SG_STA_MR_SRC_ID_COLLECT_FEATURE (0)
|
|
#define IOT_SG_STA_MR_SRC_ID_EXT_READ (1)
|
|
#define IOT_SG_STA_MR_SRC_ID_EXT_CLCT_TASK (2)
|
|
#define IOT_SG_STA_MR_SRC_ID_SCORE (3)
|
|
#define IOT_SG_STA_MR_SRC_ID_DATA_CLCT (4)
|
|
#define IOT_SG_STA_MR_SRC_ID_DATA_FREEZE (5)
|
|
#define IOT_SG_STA_MR_SRC_ID_NW_LC (6)
|
|
#define IOT_SG_STA_MR_SRC_ID_NLI_DETECT (7)
|
|
/* define sta meter reading req ext source id, id is 8 - 15 */
|
|
#define IOT_SG_STA_MR_SRC_ID_EXT_AI_TOPO (8)
|
|
#define IOT_SG_STA_MR_SRC_ID_EXT_AI_LL (9)
|
|
#define IOT_SG_STA_MR_SRC_ID_EXT_GW_CLCT (10)
|
|
#define IOT_SG_STA_MR_SRC_ID_EXT_EC (11)
|
|
#define IOT_SG_STA_MR_SRC_ID_EXT_UPGRADE (12)
|
|
|
|
/* define sta joining nid list max number */
|
|
#define IOT_SG_STA_JOINING_NID_LIST_MAX_NUM (5)
|
|
|
|
/* define invalid mac address report count for switch address */
|
|
#define IOT_SG_STA_INVALID_MAC_RPT_CNT (2)
|
|
|
|
/* define sta load curve data id max cnt */
|
|
#define IOT_SG_STA_EXT_LR_DI_CNT_MAX 22
|
|
|
|
/* define the max value of xi'an time delta, uint is 1s */
|
|
#define IOT_SG_STA_TM_DELTA_MAX_XIAN (24 * 60 * 60)
|
|
/* define the max value of hebei time delta, uint is 1s */
|
|
#define IOT_SG_STA_TM_DELTA_MAX_HEBEI (24 * 60 * 60)
|
|
/* define the max value of guangdong time delta, uint is 1s */
|
|
#define IOT_SG_STA_TM_DELTA_MAX_GUANGDONG (10 * 60)
|
|
/* define max cnt of correct time in 12 hours */
|
|
#define IOT_SG_STA_CORRECT_TIME_CNT_MAX (2)
|
|
/* define the max time delta value between cctt and sta in collect task,
|
|
* uint is 1s
|
|
*/
|
|
#define IOT_SG_STA_TM_DELTA_MAX_CLCT_TASK (5 * 60)
|
|
|
|
/* define network lock time, 0 means no lock. uint is 1min */
|
|
#define IOT_SG_STA_NW_NOR_LOCK_TIME (360)
|
|
/* define lock time of abnormal leave network, 0 means no lock.
|
|
* uint is 1min
|
|
*/
|
|
#define IOT_SG_STA_NW_ABN_LOCK_TIME (15)
|
|
|
|
/* define tei map length */
|
|
#define IOT_SG_STA_MAP_BYTE_LEN ((PLC_NETWORK_SCALE / 8) + 1)
|
|
|
|
/* define max cnt of support collection di in collection task */
|
|
#define IOT_SG_EXT_CLCT_TASK_DI_CNT_MAX 4
|
|
|
|
/* define max cnt of support task in meter */
|
|
#define IOT_SG_EXT_CLCT_TASK_CNT_MAX 5
|
|
|
|
/* define report event type */
|
|
#define IOT_SG_STA_RPT_METER_NORMAL_EVT 0
|
|
#define IOT_SG_STA_RPT_MODULE_PHASE_EVT 1
|
|
#define IOT_SG_STA_RPT_MODULE_SCORE_EVT 2
|
|
#define IOT_SG_STA_RPT_MODULE_CLOCK_EVT 3
|
|
#define IOT_SG_STA_RPT_MODULE_SEQ_EVT 4
|
|
#define IOT_SG_STA_RPT_MODULE_NLI_EVT 5
|
|
#define IOT_SG_STA_RPT_MODULE_EC_EVT 6
|
|
|
|
/* define event report mode for fujian */
|
|
#define IOT_SG_STA_FJ_EVT_RPT_MODE_GW 0
|
|
#define IOT_SG_STA_FJ_EVT_RPT_MODE_EXT 1
|
|
|
|
/* define event report type for fujian */
|
|
/* just report when event occur */
|
|
#define IOT_SG_STA_FJ_EVT_RPT_TYPE_OCCUR 0
|
|
/* report when event occur and recover */
|
|
#define IOT_SG_STA_FJ_EVT_RPT_TYPE_BOTH 1
|
|
|
|
/* define uart state */
|
|
#define IOT_SG_STA_UART_STATE_NORMAL 0
|
|
#define IOT_SG_STA_UART_STATE_ONCE_ABNORMAL 1
|
|
#define IOT_SG_STA_UART_STATE_ABNORMAL 2
|
|
|
|
/* define query neighbor node infomation request from plc */
|
|
#define IOT_SG_STA_QUERY_NEIG_NODE_FROM_PLC (1)
|
|
/* define query neighbor node infomation request from STA */
|
|
#define IOT_SG_STA_QUERY_NEIG_NODE_FROM_STA (2)
|
|
|
|
/* define collect data report state, only for jangsu */
|
|
#define IOT_SG_STA_COLL_DATA_RPT_STATE_IDLE 0
|
|
#define IOT_SG_STA_COLL_DATA_RPT_STATE_MF 1
|
|
#define IOT_SG_STA_COLL_DATA_RPT_STATE_DF 2
|
|
#define IOT_SG_STA_COLL_DATA_RPT_STATE_15MIN 3
|
|
#define IOT_SG_STA_COLL_DATA_RPT_STATE_1MIN 4
|
|
#define IOT_SG_STA_COLL_DATA_RPT_STATE_END 5
|
|
|
|
/* define collection data report meter info max count */
|
|
#define IOT_SG_STA_CLCT_METER_INFO_MAX_CNT 12
|
|
|
|
/* define collection data last rpt info type */
|
|
#define IOT_SG_STA_CLCT_LAST_RPT_INVALID 0
|
|
#define IOT_SG_STA_CLCT_LAST_RPT_SIG_METER 1
|
|
#define IOT_SG_STA_CLCT_LAST_RPT_MULT_METER 2
|
|
|
|
/* define search meter event report state */
|
|
#define IOT_SG_STA_SM_EVT_REPORT_IDLE 0
|
|
#define IOT_SG_STA_SM_EVT_REPORTING 1
|
|
#define IOT_SG_STA_SM_EVT_REPORT_DONE 2
|
|
|
|
/* define correct time message type */
|
|
#define IOT_SG_STA_CORR_TYPE_UNKNOWN 0
|
|
#define IOT_SG_STA_CORR_TYPE_645 1
|
|
#define IOT_SG_STA_CORR_TYPE_698 2
|
|
|
|
/* convert ntb to ms. in HW, the ntb clock freq is 25 mhz. */
|
|
#define IOT_SG_STA_NTB_TO_MS(ntb) ((ntb) / (25 * 1000))
|
|
/* convert ms to ntb. in HW, the ntb clock freq is 25 mhz. */
|
|
#define IOT_SG_STA_MS_TO_NTB(ms) ((ms) * (25 * 1000))
|
|
|
|
/* define freeze task cfg info max lengtht */
|
|
#define IOT_SG_STA_EXT_FJ_FREEZE_TASK_CFG_MAX_LEN 100
|
|
/* define freeze task max cnt */
|
|
#define IOT_SG_STA_EXT_FJ_FREEZE_TASK_MAX_CNT 16
|
|
/* define freeze task data max lengtht */
|
|
#define IOT_SG_STA_EXT_FJ_FREEZE_TASK_DATA_MAX_LEN 128
|
|
|
|
/* define meter read operation done source. */
|
|
#define IOT_SG_STA_MR_DONE_BY_DRIVE (0)
|
|
#define IOT_SG_STA_MR_DONE_BY_FRAMEWORK (1)
|
|
|
|
/* define type of meter read. */
|
|
#define IOT_SG_STA_MR_TYPE_DEF (0)
|
|
#define IOT_SG_STA_MR_TYPE_CONCENTRATOR (1)
|
|
#define IOT_SG_STA_MR_TYPE_ROUTE (2)
|
|
#define IOT_SG_STA_MR_TYPE_CONCENTRATOR_P (3)
|
|
#define IOT_SG_STA_MR_TYPE_HISTORY (4)
|
|
|
|
#if IOT_FOREIGN_QSXJ_PM_ENABLE
|
|
/* define black list max count */
|
|
#define IOT_SG_STA_BLACK_LIST_MAX_CNT (16)
|
|
#else
|
|
/* define black list max count */
|
|
#define IOT_SG_STA_BLACK_LIST_MAX_CNT (1)
|
|
#endif
|
|
|
|
/* define ai module topo data cache max count */
|
|
#define IOT_SG_STA_EXT_AI_TOPO_DATA_MAX (71)
|
|
/* define ai module topo data di max count */
|
|
#define IOT_SG_STA_EXT_AI_TOPO_DI_MAX (3)
|
|
/* define ai module line lose data di max count */
|
|
#define IOT_SG_STA_EXT_AI_LL_DI_MAX (17)
|
|
|
|
/* define gw v2.8 data collection task max cnt */
|
|
#define IOT_SG_STA_EXT_GW_V28_CLCT_TASK_MAX_CNT (8)
|
|
|
|
/* define gw v2.8 data collection report cache pkt count */
|
|
#define IOT_SG_STA_EXT_GW_V28_CACHE_PKT_CNT (4)
|
|
|
|
/* define gw v2.8 data collection report unit count */
|
|
#define IOT_SG_STA_EXT_GW_V28_RPT_UNIT_CNT (12)
|
|
|
|
/* check sta vendor id is ZH */
|
|
#define IOT_SG_STA_VENDOR_ID_IS_ZH(vendor_id) (vendor_id == 0x5753 || \
|
|
vendor_id == 0x5357 || vendor_id == 0x5754)
|
|
|
|
/* pack for the structures in the whole file */
|
|
#pragma pack(push) /* save the pack status */
|
|
#pragma pack(1) /* 1 byte align */
|
|
|
|
/* phase sequence report cache info */
|
|
typedef struct _iot_sg_phase_seq_status_cache_info {
|
|
/* event type, see GW_APP_EVENT_TYPE_XXX */
|
|
uint8_t evt_type;
|
|
/* three phase meter addr */
|
|
uint8_t pm_addr[IOT_MAC_ADDR_LEN];
|
|
/* phase_sequence_status, see GW_APP_PHASE_SEQUENCE_STAUS_XXX */
|
|
uint8_t phase_seq_status;
|
|
} iot_sg_phase_seq_status_cache_info_t;
|
|
|
|
/* local power down pm info structure, same as gw_app_power_evt_pm_info_t */
|
|
typedef struct _iot_sg_sta_pd_addrs_info {
|
|
/* power meter mac address */
|
|
uint8_t mac[IOT_MAC_ADDR_LEN];
|
|
/* 0 - power off, 1- power on */
|
|
uint8_t power_state;
|
|
} iot_sg_sta_pd_addrs_info_t;
|
|
|
|
#pragma pack(pop) /* restore the pack status */
|
|
|
|
/* collection data report cache structure */
|
|
typedef struct _iot_sg_sta_ext_clct_rpt_desc {
|
|
/* meter address */
|
|
uint8_t addr[IOT_MAC_ADDR_LEN];
|
|
/* flag of three phase */
|
|
uint8_t flag_3p;
|
|
/* data type, see IOT_SG_STA_METER_DATA_TYPE_JS_XXX */
|
|
uint8_t data_type;
|
|
/* start index */
|
|
uint16_t start_index;
|
|
/* end index */
|
|
uint16_t end_index;
|
|
/* rpt cnt */
|
|
uint16_t cnt;
|
|
/* oad bit map */
|
|
uint32_t oad_map;
|
|
} iot_sg_sta_ext_clct_rpt_desc_t;
|
|
|
|
/* collection data report meter info */
|
|
typedef struct _iot_sg_sta_ext_clct_meter_info {
|
|
/* rpt cnt */
|
|
uint16_t cnt;
|
|
/* meter address */
|
|
uint8_t addr[IOT_MAC_ADDR_LEN];
|
|
/* start index */
|
|
uint16_t start_index;
|
|
/* end index */
|
|
uint16_t end_index;
|
|
} iot_sg_sta_ext_clct_meter_info_t;
|
|
|
|
/* collection data multi meter report cache structure */
|
|
typedef struct _iot_sg_sta_ext_clct_multi_rpt_desc {
|
|
/* flag of three phase */
|
|
uint8_t flag_3p;
|
|
/* data type, see IOT_SG_STA_METER_DATA_TYPE_JS_XXX */
|
|
uint8_t data_type;
|
|
/* meter info count */
|
|
uint8_t meter_info_cnt;
|
|
/* meter info */
|
|
iot_sg_sta_ext_clct_meter_info_t
|
|
meter_info[IOT_SG_STA_CLCT_METER_INFO_MAX_CNT];
|
|
/* oad bit map */
|
|
uint32_t oad_map;
|
|
} iot_sg_sta_ext_clct_multi_rpt_desc_t;
|
|
|
|
/* smart grid sta role persistant storage structure */
|
|
typedef struct _iot_sg_sta_ps {
|
|
/* driver id. read only. See IOT_SG_STA_DRV_ID_XXX */
|
|
uint16_t drv_id;
|
|
} iot_sg_sta_ps_t;
|
|
|
|
/* sta device states */
|
|
typedef enum {
|
|
iot_sg_sta_state_invalid = 0,
|
|
iot_sg_sta_state_init,
|
|
iot_sg_sta_state_starting,
|
|
iot_sg_sta_state_started,
|
|
/* always keep this as the last state */
|
|
iot_sg_sta_state_max,
|
|
} iot_sg_sta_state_t;
|
|
|
|
/* state machine callback */
|
|
typedef iot_sg_sta_state_t (*iot_sg_sta_sm_func_t)(iot_sg_msg_t *msg);
|
|
|
|
/* sta role state machine */
|
|
typedef struct _iot_sg_sta_sm {
|
|
/* previous state */
|
|
iot_sg_sta_state_t prev_state;
|
|
/* current state */
|
|
iot_sg_sta_state_t cur_state;
|
|
/* function pointer of each state */
|
|
iot_sg_sta_sm_func_t func[iot_sg_sta_state_max];
|
|
} iot_sg_sta_sm_t;
|
|
|
|
typedef struct _iot_sg_sta_mr_stats {
|
|
/* sta received valid concurrent meter reading pkt cnt */
|
|
uint32_t rec_valid_con_mr_cnt;
|
|
/* sta response concurrent meter reading pkt cnt */
|
|
uint32_t con_mr_sus_cnt;
|
|
/* sta received valid router meter reading pkt cnt */
|
|
uint32_t rec_valid_rt_mr_cnt;
|
|
/* sta response router meter reading pkt cnt */
|
|
uint32_t rt_mr_sus_cnt;
|
|
/* sta received valid cctt meter reading pkt cnt */
|
|
uint32_t rec_valid_cctt_mr_cnt;
|
|
/* sta response cctt meter reading pkt cnt */
|
|
uint32_t cctt_mr_sus_cnt;
|
|
/* black listed meter read request */
|
|
uint32_t mr_bl_cnt;
|
|
/* cached meter read request hit count */
|
|
uint32_t mr_cache_cnt;
|
|
/* sta received correct time pkt cnt */
|
|
uint32_t rec_correct_cnt;
|
|
/* sta drv send correct time cnt */
|
|
uint32_t drv_send_correct_cnt;
|
|
/* count of time the STA joined network */
|
|
uint16_t join_cnt;
|
|
/* count of time the STA left network */
|
|
uint16_t leave_cnt;
|
|
/* meter reading error counters */
|
|
uint8_t mr_err_cnts[IOT_SG_STA_MR_ERR_MAX + 1];
|
|
} iot_sg_sta_mr_stats_t;
|
|
|
|
/* request */
|
|
typedef struct _iot_sg_sta_req {
|
|
/* pointer to iot packet of the request */
|
|
iot_pkt_t *pkt;
|
|
/* pointer to massage header */
|
|
uint8_t *hdr;
|
|
/* power meter addr, it has not yet been used */
|
|
uint8_t pm_addr[IOT_MAC_ADDR_LEN];
|
|
/* type of lower layer link, see IOT_SG_LINK_TYPE_XXX */
|
|
uint8_t link_type : 6,
|
|
/* flag to mark the request is connectionless forwarding msg */
|
|
is_conn_fwd : 1,
|
|
/* flag to mark the request is correct time msg */
|
|
is_corr_time : 1;
|
|
} iot_sg_sta_req_t;
|
|
|
|
/* reqeust */
|
|
typedef struct _iot_sg_sta_req_entry {
|
|
/* link of req queue */
|
|
iot_list_head_t link;
|
|
/* request info */
|
|
iot_sg_sta_req_t req;
|
|
} iot_sg_sta_req_entry_t;
|
|
|
|
/* reqeust queue */
|
|
typedef struct _iot_sg_sta_req_queue {
|
|
/* head of req queue */
|
|
iot_list_head_t head[IOT_SG_STA_REQ_QUEUE_LP + 1];
|
|
/* momery pool of req queue */
|
|
iot_mem_pool_t *q_pool;
|
|
/* handle cnt of req queue */
|
|
uint8_t cnt[IOT_SG_STA_REQ_QUEUE_LP + 1];
|
|
} iot_sg_sta_req_queue_t;
|
|
|
|
/* sta extended load curve info */
|
|
typedef struct _iot_sg_sta_node_lr_info {
|
|
/* next read time */
|
|
iot_time_tm_t tm;
|
|
/* flag to mark if multi di is detect done */
|
|
uint8_t multi_di_detect_done : 1,
|
|
/* flag to mark if multi di is supported, 0 is not supported */
|
|
multi_di_supported : 1,
|
|
/* reserved for future */
|
|
reserved : 6;
|
|
} iot_sg_sta_node_lr_info_t;
|
|
|
|
/* sta extended collection task info */
|
|
typedef struct _iot_sg_sta_node_clct_task_info {
|
|
/* next collect time */
|
|
uint16_t tm_year;
|
|
uint8_t tm_mon;
|
|
uint8_t tm_mday;
|
|
uint8_t tm_hour;
|
|
uint8_t tm_min;
|
|
/* task id */
|
|
uint8_t id;
|
|
/* flag of done */
|
|
uint8_t flag_done;
|
|
} iot_sg_sta_node_clct_task_info_t;
|
|
|
|
/* sta extended data collection task info for jiangsu proto protocol */
|
|
typedef struct _iot_sg_sta_node_data_clct_info {
|
|
/* day freeze next read time */
|
|
iot_time_tm_t df_tm;
|
|
/* month freeze next read time */
|
|
iot_time_tm_t mf_tm;
|
|
/* 1 minute curve next read time */
|
|
iot_time_tm_t cur_1m_tm;
|
|
/* 15 minute curve next read time */
|
|
iot_time_tm_t cur_15m_tm;
|
|
/* time of last collection success */
|
|
iot_time_tm_t last_clct_tm;
|
|
/* collection failure times */
|
|
uint8_t clct_fail_times;
|
|
/* collection task success bitmap, see IOT_SG_STA_METER_JS_CFG_XXX */
|
|
uint16_t task_suc_bm;
|
|
/* latest rpt index of monthly frozen data in flash */
|
|
uint16_t mf_rpt_index;
|
|
/* monthly frozen data cnt */
|
|
uint16_t mf_cnt;
|
|
/* latest rpt index of day frozen data in flash */
|
|
uint16_t df_rpt_index;
|
|
/* day frozen data cnt */
|
|
uint16_t df_cnt;
|
|
/* latest rpt index of 15min frozen data in flash */
|
|
uint16_t min15_rpt_index;
|
|
/* 15min frozen data cnt */
|
|
uint16_t min15_cnt;
|
|
/* latest rpt index of 1min frozen data in flash */
|
|
uint16_t min1_rpt_index;
|
|
/* 1min frozen data in flash */
|
|
uint16_t min1_cnt;
|
|
} iot_sg_sta_node_data_clct_info_t;
|
|
|
|
/* sta extended collection task info */
|
|
typedef struct _iot_sg_sta_node_clct_info {
|
|
/* node task info */
|
|
iot_sg_sta_node_clct_task_info_t task_info[IOT_SG_EXT_CLCT_TASK_CNT_MAX];
|
|
} iot_sg_sta_node_clct_info_t;
|
|
|
|
/* sta extended data freeze info fujian protocol */
|
|
typedef struct _iot_sg_sta_node_freeze_info {
|
|
/* task execution time */
|
|
iot_time_tm_t task_tm[IOT_SG_STA_EXT_FJ_FREEZE_TASK_MAX_CNT];
|
|
} iot_sg_sta_node_freeze_info_t;
|
|
|
|
/* sta extended gw data collection task info */
|
|
typedef struct _iot_sg_sta_node_gw_clct_info {
|
|
/* task execution time */
|
|
iot_time_tm_t task_tm[IOT_SG_STA_EXT_GW_V28_CLCT_TASK_MAX_CNT];
|
|
} iot_sg_sta_node_gw_clct_info_t;
|
|
|
|
typedef struct _iot_sg_sta_node_edge_computing_info {
|
|
/* count of continuous overvoltage events */
|
|
uint8_t overvoltage_cnt;
|
|
/* count of continuous undervoltage events */
|
|
uint8_t undervoltage_cnt;
|
|
/* maximum overvoltage value per phase */
|
|
uint16_t max_va;
|
|
uint16_t max_vb;
|
|
uint16_t max_vc;
|
|
/* minimum undervoltage value per phase */
|
|
uint16_t min_va;
|
|
uint16_t min_vb;
|
|
uint16_t min_vc;
|
|
/* flag meter overvoltage event need upload */
|
|
uint8_t overvoltage : 1,
|
|
/* flag meter undervoltage event need upload */
|
|
undervoltage: 1,
|
|
/* flag meter health event need upload */
|
|
health : 1,
|
|
/* reserve */
|
|
rsvd : 5;
|
|
} iot_sg_sta_node_ec_info_t;
|
|
|
|
/* secondary node descriptor */
|
|
typedef struct _iot_sg_sta_node_desc {
|
|
/* hash table entry */
|
|
iot_addr_hash_entry_t entry;
|
|
/* data type being used by the node. See IOT_SG_STA_DATA_TYPE_XXX */
|
|
uint8_t data_type :3,
|
|
/* flag to mark if node is double protocol */
|
|
double_proto :1,
|
|
/* flag of neutralwire and livewire abnormal function enable */
|
|
nli_en :1,
|
|
/* flag of gw data collection enable */
|
|
gw_clclt_en :1,
|
|
/* flag to mark if meter support edge computing function */
|
|
ec_en :1,
|
|
/* flag to mark if the node is in neighbor state */
|
|
is_neighbor :1;
|
|
/* module type of the node. IOT_SG_STA_DEV_TYPE_XXX */
|
|
uint8_t module_type :2,
|
|
/* flag to mark if the node is Q/GDW 354-2009 meter */
|
|
is_09_rule :1,
|
|
/* flag to mark if the meter is three phase meter */
|
|
is_three_phase :1,
|
|
/* phase of the device, bit0-2 means phaseA/B/C, set "1" to
|
|
* indicate which phase the device belongs to.
|
|
*/
|
|
phase :3,
|
|
/* flag to mark if voltage reverse phase sequence */
|
|
v_rps :1;
|
|
/* flag to mark if physical phase identification done */
|
|
uint8_t phase_ident :1,
|
|
/* flag to mark if the node is obsolete. when the flag is set, the node
|
|
* can't be queried
|
|
*/
|
|
obsolete :1,
|
|
/* flag of load curve collection enable */
|
|
lr_en :1,
|
|
/* sm event report state, see IOT_SG_STA_SM_EVT_REPORT_XXX */
|
|
sm_rpt_state :2,
|
|
/* flag of data freeze function enable for FUJIAN proto */
|
|
data_freeze_en :1,
|
|
/* flag of load cure function enable for NW proto */
|
|
nw_lc_en :1,
|
|
/* flag of is neutralwire and livewire abnormal exec
|
|
* neutralwire and livewire current detected.
|
|
*/
|
|
nli_detected :1;
|
|
/* flag to mark if the meter support load record */
|
|
uint8_t supp_lr :1,
|
|
/* flag to mark if the meter support collection task */
|
|
clct_task_en :1,
|
|
/* flag of state score enable */
|
|
ss_en :1,
|
|
/* flag of data collection enable */
|
|
data_clct_en :1,
|
|
/* suspected status of the meter, 1 - power off, 0 - power on */
|
|
sus_pof :1,
|
|
/* flag to mark if node time abnormal */
|
|
time_abnormal :1,
|
|
/* flag to mark if need to collect last day frozen data after power on */
|
|
clct_last_df :1,
|
|
/* flag to mark if if abnormal load record reading is detected */
|
|
lr_rec_abnormal :1;
|
|
union {
|
|
/* sta extended load curve info */
|
|
iot_sg_sta_node_lr_info_t lr_info;
|
|
/* sta extended collect task info */
|
|
iot_sg_sta_node_clct_info_t clct_info;
|
|
/* sta extended data collection info for jiangsu proto protocol */
|
|
iot_sg_sta_node_data_clct_info_t data_clct_info;
|
|
/* sta extended data freeze info fujian protocol */
|
|
iot_sg_sta_node_freeze_info_t freeze_info;
|
|
/* sta extended data collection info for gw proto protocol */
|
|
iot_sg_sta_node_gw_clct_info_t gw_node_clct_info;
|
|
} ext;
|
|
#if IOT_SMART_GRID_EDGE_COMPUTING_ENABLE
|
|
union {
|
|
iot_sg_sta_node_ec_info_t ec_info;
|
|
} ext_1;
|
|
#endif
|
|
} iot_sg_sta_node_desc_t;
|
|
|
|
/* black listed secondary node descriptor */
|
|
typedef struct _iot_sg_sta_node_bl_desc {
|
|
/* hash table entry */
|
|
iot_addr_hash_entry_t entry;
|
|
/* time stamp to remove the node from black list, unit is 1s */
|
|
uint32_t rm_ts;
|
|
} iot_sg_sta_node_bl_desc_t;
|
|
|
|
/* sta joining nid info */
|
|
typedef struct _iot_sg_sta_joining_nid_info {
|
|
/* network id */
|
|
uint32_t nid :24,
|
|
/* sta joining count */
|
|
join_cnt :8;
|
|
} iot_sg_sta_joining_nid_info_t;
|
|
|
|
/* invalid mac address descriptor */
|
|
typedef struct _iot_sg_sta_invalid_addr_entry {
|
|
/* mac address */
|
|
uint8_t addr[IOT_MAC_ADDR_LEN];
|
|
/* flag of invalid mac address */
|
|
uint8_t invalid_mac;
|
|
/* sta joining nid info count */
|
|
uint8_t nid_cnt;
|
|
/* sta joining nid info */
|
|
iot_sg_sta_joining_nid_info_t nid_list[IOT_SG_STA_JOINING_NID_LIST_MAX_NUM];
|
|
/* time stamp to remove the node from invalid mac list, unit is 1s */
|
|
uint32_t rm_ts;
|
|
} iot_sg_sta_invalid_addr_entry_t;
|
|
|
|
/* power off event bitmap */
|
|
typedef struct _iot_sg_sta_power_off_bm {
|
|
/* flag of updated */
|
|
uint8_t updated;
|
|
/* bitmap of node that's power off */
|
|
uint8_t map[IOT_SG_STA_MAP_BYTE_LEN];
|
|
} iot_sg_sta_power_off_bm_t;
|
|
|
|
/* buffer of power down information of addr version */
|
|
typedef struct _iot_sg_sta_pd_addrs_buf {
|
|
/* the iot_pkt for caching power down info */
|
|
iot_pkt_t *pkt;
|
|
/* rpt seq */
|
|
uint16_t seq;
|
|
/* the number of valid meter info contained in iot_pkt */
|
|
uint8_t pm_cnt;
|
|
/* flag to mark if power down info is updated */
|
|
uint8_t updated;
|
|
} iot_sg_sta_pd_addrs_buf_t;
|
|
|
|
/* power off event addrmap check ctrl descriptor */
|
|
typedef struct _iot_sg_sta_pd_addrs_ctrl {
|
|
/* cnt of node checked*/
|
|
uint8_t check_cnt;
|
|
/* index of node checked in node list */
|
|
uint8_t check_index;
|
|
/* check cnt */
|
|
uint8_t check_pm_cnt : 4,
|
|
/* check max cnt */
|
|
check_pm_cnt_max: 4;
|
|
/* flag mark to if report started */
|
|
uint8_t started;
|
|
/* local power down check results */
|
|
iot_sg_sta_pd_addrs_info_t local[IOT_SG_STA_SEC_NODE_MAX];
|
|
/* address version power down info buffer */
|
|
iot_sg_sta_pd_addrs_buf_t addrs_buf[IOT_SG_STA_PD_ADDRS_BUF_CNT];
|
|
} iot_sg_sta_pd_addrs_ctrl_t;
|
|
|
|
/* power off event bitmap descriptor */
|
|
typedef struct _iot_sg_sta_pd_bitmap_desc {
|
|
/* the tei of the fisrt power off node in bitmap */
|
|
uint16_t first_tei;
|
|
/* the tei of the last power off node in bitmap */
|
|
uint16_t last_tei;
|
|
/* length of bitmap, uint is 1 byte */
|
|
uint16_t length;
|
|
} iot_sg_sta_pd_bitmap_desc_t;
|
|
|
|
/* power on event addrmap descriptor */
|
|
typedef struct _iot_sg_sta_power_on_addrmap_desc {
|
|
/* cnt of node checked */
|
|
uint8_t check_cnt;
|
|
/* flag to mark if check completed */
|
|
uint8_t complete;
|
|
} iot_sg_sta_power_on_addrmap_desc_t;
|
|
|
|
/* hw tsfm info descriptor */
|
|
typedef struct _iot_sg_sta_hw_tsfm {
|
|
/* uart handle for read hw tsfm info form extenal IC */
|
|
iot_uart_h uart_tsfm_h;
|
|
/* flag to mark tsfm mode. 1 is hardware support tsfm, 0 is normal */
|
|
uint8_t tsfm_mode : 2,
|
|
/* cnt of read tsfm info */
|
|
read_cnt : 6;
|
|
/* tsfm topo rec phase info
|
|
* bit0 represent phase A
|
|
* bit1 represent phase B
|
|
* bit2 represent phase C
|
|
*/
|
|
uint8_t topo_phase_rec;
|
|
/* tsfm topo rec energy */
|
|
uint32_t topo_energy_rec[IOT_PLC_PHASE_CNT];
|
|
/* tsfm topo info */
|
|
iot_sg_sta_topo_info_t tsfm_topo_info;
|
|
/* tsfm send control information */
|
|
iot_sg_sta_tsfm_send_ctrl_t tsfm_send_ctrl;
|
|
/* tsfm report control infomation */
|
|
iot_sg_sta_tsfm_rpt_ctrl_t tsfm_rpt_ctrl;
|
|
} iot_sg_sta_hw_tsfm_t;
|
|
|
|
/* descriptor for node register request */
|
|
typedef struct _iot_sg_sta_node_reg_global {
|
|
/* flag to mark if secondary node register is ongoing */
|
|
uint8_t node_reg_on :1,
|
|
/* flag to mark if last_node_reg_s_seq is valid */
|
|
last_node_reg_s_seq_valid :1,
|
|
/* reserved for future */
|
|
reserved :6;
|
|
/* the timestamp of the last node register result, unit is 1ms */
|
|
uint64_t last_node_reg_ts;
|
|
/* last node reg start request sequence. used to detect duplicate request */
|
|
uint32_t last_node_reg_s_seq;
|
|
} iot_sg_sta_node_reg_global_t;
|
|
|
|
/* sta upgrade info */
|
|
typedef struct _iot_sg_sta_upgrade_info {
|
|
/* drive upgrade state, see IOT_SG_STA_DRV_UPGRADE_STATE_XXX */
|
|
uint8_t drv_upgrde_state :1,
|
|
/* need upgrade external device flag */
|
|
ext_dev_need_upgrade_flag :1,
|
|
/* reserved for future */
|
|
reserved :6;
|
|
/* upgrading block size */
|
|
uint32_t block_size;
|
|
/* received block count */
|
|
uint32_t rec_blk_cnt;
|
|
/* total block count of the upgrading file */
|
|
uint32_t block_cnt;
|
|
/* upgrading file size */
|
|
uint32_t file_size;
|
|
/* CRC of the whole upgrading file from CCo */
|
|
uint32_t file_crc;
|
|
/* it's upgrade id in gw proto, while file id in nw proto.
|
|
* for file id is regarded as upgrade id for nw upgrading.
|
|
*/
|
|
uint32_t upgrade_id;
|
|
/* upgrade time window in minutes */
|
|
uint16_t upgrade_time_win;
|
|
/* wait duration for reset */
|
|
uint16_t reset_wait_dur;
|
|
/* trail run duration */
|
|
uint32_t trail_run_dur;
|
|
/* timer to handle upgrade window / reset wait duration / reset duration */
|
|
timer_id_t upgrade_timer;
|
|
/* upgrade state */
|
|
uint16_t state;
|
|
/* CRC calculated from received data block */
|
|
uint32_t calc_crc;
|
|
/* pkt to cache the 1st block. alloc when
|
|
* upgrading and free when upgrade finish.
|
|
*/
|
|
iot_pkt_t *cache;
|
|
/* current running partition info */
|
|
uint32_t current_crc; /* crc of running partition */
|
|
uint32_t current_len; /* length of running partition */
|
|
uint32_t current_part; /* current running part */
|
|
uint32_t current_bk_size;/* upgrade block size in current runing part */
|
|
/* upgrade sequence number for nw protocol */
|
|
uint16_t upgrade_sn;
|
|
/* indicate if STA shall skip upgrading because of
|
|
* invalid upgrading file.
|
|
*/
|
|
uint8_t skip :1,
|
|
/* if STA received the 1st data block. */
|
|
header_recved :1,
|
|
exit_reason :3, /* current upgrade exit reason */
|
|
/* upgrade session type see - IOT_SG_STA_UPGRADE_SESSION_TYPE_XXX */
|
|
session_type :3;
|
|
#if IOT_SG_STA_UPGRADE_EXT_DEV_ENABLE
|
|
/* timer to handle upgrade external device */
|
|
timer_id_t ext_dev_upgrade_timer;
|
|
/* external device upgrade start offset */
|
|
uint32_t ext_dev_start_offset;
|
|
/* external device upgrade last send length */
|
|
uint32_t ext_dev_last_send_len;
|
|
/* external device upgrade send data lenght */
|
|
uint32_t ext_dev_send_len;
|
|
/* external device upgrade file size */
|
|
uint32_t ext_dev_file_size;
|
|
/* external device upgrade file crc */
|
|
uint32_t ext_dev_file_crc;
|
|
/* external device upgrade send block index */
|
|
uint16_t ext_dev_upgrade_block_index;
|
|
/* external device upgrade command retry count */
|
|
uint8_t ext_dev_upgrade_retry_cnt;
|
|
/* if the external upgrade fail restart again */
|
|
uint8_t ext_dev_restart_flag :1,
|
|
/* external device upgrade state */
|
|
ext_dev_state :7;
|
|
#endif /* IOT_SG_STA_UPGRADE_EXT_DEV_ENABLE */
|
|
}iot_sg_sta_upgrade_info_t;
|
|
|
|
/* smart grid sta meter read global descriptor */
|
|
typedef struct _iot_sg_sta_mr_global {
|
|
/* flag to mark if meter read is ongoing */
|
|
uint32_t meter_read_on :1,
|
|
/* flag to mark if resend the 645 frame if no response */
|
|
timeout_retry :1,
|
|
/* flag to mark if resend the 645 frame if get nack */
|
|
nack_retry :1,
|
|
/* max retry count allowed */
|
|
max_retry :4,
|
|
/* current frame retry count */
|
|
retry_cnt :4,
|
|
/* flag to mark if last successful meter reading */
|
|
last_mr_valid :1,
|
|
/* meter reading data type. see GW_APP_DATA_TYPE_XXX */
|
|
data_type :4,
|
|
/* flag to mark if connectionless last meter reading valid */
|
|
last_conn_less_mr_valid :1,
|
|
/* flag to mark if crtl last meter reading valid */
|
|
last_crtl_mr_valid :1,
|
|
/* flag to mark if enable address filtering when reading */
|
|
addr_filter_en :1,
|
|
/* reserved for future */
|
|
reserved :13;
|
|
/* meter reading baud rate */
|
|
uint32_t mr_baud;
|
|
/* meter reading timeout, uint is 1ms */
|
|
uint32_t mr_timeout;
|
|
/* min meter reading timeout, uint is 1ms */
|
|
uint32_t mr_timeout_min;
|
|
/* meter reading interval, uint is 1ms */
|
|
uint16_t mr_interval;
|
|
/* total 645 frames in current meter read request */
|
|
uint8_t frame_cnt;
|
|
/* current frames being handled */
|
|
uint8_t frame_idx;
|
|
/* type of the last successful meter reading */
|
|
uint8_t last_mr_type;
|
|
/* the sequence number of the last successful meter reading */
|
|
uint16_t last_mr_seq;
|
|
/* the timestamp of the last successful meter reading */
|
|
uint64_t last_mr_ts;
|
|
/* the data pkt for the last successful meter reading */
|
|
iot_pkt_t *last_mr_data_pkt;
|
|
/* meter read ack status. each bit reflect ack status for a frame.
|
|
* the lowest bit corresponding to the first frame in the read request.
|
|
*/
|
|
uint16_t read_ack;
|
|
/* frame pointer array for each read request */
|
|
uint8_t* frame_data[IOT_SG_STA_MAX_FRAME_PER_READ];
|
|
/* frame length array for each read request */
|
|
uint16_t frame_len[IOT_SG_STA_MAX_FRAME_PER_READ];
|
|
/* the last connectionless meter reading src address */
|
|
uint8_t last_conn_less_src[IOT_MAC_ADDR_LEN];
|
|
/* connectionless last meter address */
|
|
uint8_t last_conn_less_mr_addr[IOT_MAC_ADDR_LEN];
|
|
/* pending meter read respond packet */
|
|
iot_pkt_t *read_rsp;
|
|
/* pointer to app_header_t in read_rsp */
|
|
uint8_t *app_hdr;
|
|
/* meter read related statistics */
|
|
iot_sg_sta_mr_stats_t mr_info;
|
|
} iot_sg_sta_mr_global_t;
|
|
|
|
/* smart grid sta query local plc info descriptor */
|
|
typedef struct _iot_sg_sta_query_plc_global {
|
|
/* flag to mark if query neighbor node is ongoing */
|
|
uint8_t neig_info_query_on :1,
|
|
/* flag to mark if request is broadcast, only for nw protocol */
|
|
flag_broadcast :1,
|
|
/* query neighbor node timeout, uint is 1s */
|
|
neig_info_timeout :6;
|
|
} iot_sg_sta_query_plc_global_t;
|
|
|
|
/* smart grid event global descriptor */
|
|
typedef struct _iot_sg_sta_evt_global {
|
|
/* flag to mark if event report is pending */
|
|
uint8_t event_rpt_pending :1,
|
|
/* flag to mark if event report is enable */
|
|
event_rpt_on :1,
|
|
/* flag to mark if power on event report is pending */
|
|
power_on_rpt_pending :1,
|
|
/* power on event report cnt */
|
|
power_on_rpt_cnt :5;
|
|
/* sm done event report counter */
|
|
uint8_t sm_done_rpt_cnt :7,
|
|
/* sm done flag */
|
|
sm_done :1;
|
|
/* all aa sm done flag */
|
|
uint8_t aa_sm_done :1,
|
|
/* power on event reporting in progress */
|
|
power_on_reporting :1,
|
|
/* flag to mark if production test is detected */
|
|
pt_detected :1,
|
|
/* reserved for future */
|
|
reserved :5;
|
|
/* power down event valid time for fujian, uint is 1s */
|
|
uint8_t fj_pd_valid_time;
|
|
/* sm done event report sequence */
|
|
uint16_t sm_done_evt_rpt_seq;
|
|
/* event report sequence. used to detect obsolete cco response */
|
|
uint16_t event_rpt_seq;
|
|
/* meter event report sequence. used to detect obsolete cco response */
|
|
uint16_t pm_evt_rpt_seq;
|
|
/* power off event report status, see IOT_SG_STA_POWEROFF_XXX */
|
|
uint8_t power_off_rpt_status;
|
|
/* power off event report cnt */
|
|
uint8_t power_off_send_cnt;
|
|
/* power on event report or forward sequence. used to repeat report */
|
|
uint16_t power_off_rpt_seq;
|
|
/* power on event report sequence. used to repeat report */
|
|
uint16_t power_on_rpt_seq;
|
|
/* sta power off event bitmap */
|
|
iot_sg_sta_power_off_bm_t power_off_bm;
|
|
/* address version power down information control structure */
|
|
iot_sg_sta_pd_addrs_ctrl_t pd_addr_ctrl;
|
|
/* power on event addrmap descriptor */
|
|
iot_sg_sta_power_on_addrmap_desc_t pu_addr_ctrl;
|
|
/* module event report retry cnt */
|
|
uint8_t retry_cnt :2,
|
|
/* abnormal phase sequence in Three-phase power meter.
|
|
* if lack phase first bit setting 1, for example 0x001.
|
|
* if reversed phase second bit setting 1, for example 0x010.
|
|
* if L/N reversed third bit setting 1, for example 0x100.
|
|
*/
|
|
abn_ps :3,
|
|
/* historical records of abnormal phase sequences */
|
|
his_abn_ps :3;
|
|
/* historical records of the zc status report sn */
|
|
uint8_t his_zc_status_sn;
|
|
/* number of meters to be reported scoring results */
|
|
uint8_t score_rpt_cnt;
|
|
/* report event type, see IOT_SG_STA_RPT_XXX_XXX_EVT */
|
|
uint8_t rpt_type;
|
|
/* clock skew interval between concentrator and meter */
|
|
int64_t clock_interval;
|
|
/* event report mode for fujian, see IOT_SG_STA_FJ_EVT_RPT_MODE_XXX */
|
|
uint8_t fj_evt_rpt_mode :2,
|
|
/* event report type for fujian, see IOT_SG_STA_FJ_EVT_RPT_TYPE_XXX */
|
|
fj_evt_rpt_type :1,
|
|
/* enable event report or not when report mode is external, 1 - enable */
|
|
fj_evt_rpt_en :1,
|
|
/* reserved for future */
|
|
reserved_2 :4;
|
|
} iot_sg_sta_evt_global_t;
|
|
|
|
/* smart grid sta properties descriptor */
|
|
typedef struct _iot_sg_sta_properties_global {
|
|
/* physical phase of the device, bit0-2 means phaseA/B/C, set "1" to
|
|
* indicate which phase the device belongs to.
|
|
*/
|
|
uint8_t phase :3,
|
|
/* flag to mark if L/N reversed in Single-phase power meter or phase
|
|
* sequence reversed in Three-phase power meter.
|
|
*/
|
|
opposite_phase :1,
|
|
/* flag to mark if physical phase identification done */
|
|
detect_state :1,
|
|
/** logical phase of the device, see IOT_PLC_PHASE_XXX */
|
|
logic_phase :2,
|
|
/** flag to mark if L/N reversed in Three-phase power meter */
|
|
opposite_3p :1;
|
|
/* connection position of N-wire if L/N of three-phase meter is reversed.
|
|
* see IOT_PLC_PHASE_XXX.
|
|
* Note: the position refers to the physical phase terminal.
|
|
*/
|
|
uint8_t opposite_3p_pos :2,
|
|
/* flag to mark if the 3phase device have the zc repeat phase */
|
|
zc_repeat_3p :1,
|
|
/* reserved for future */
|
|
reserved1 :5;
|
|
} iot_sg_sta_properties_global_t;
|
|
|
|
/* meter data */
|
|
typedef struct _iot_sg_sta_ext_meter_data {
|
|
/* voltage */
|
|
proto_645_v_t v;
|
|
/* current */
|
|
proto_645_07_a_t a;
|
|
/* GND current */
|
|
uint8_t gnd_a[PROTO_645_07_A_LEN];
|
|
/* active power */
|
|
proto_645_07_p_t ap;
|
|
/* reactive power */
|
|
proto_645_07_p_t rp;
|
|
/* apparent power */
|
|
proto_645_07_p_t atp;
|
|
/* power factor */
|
|
proto_645_07_pf_t pf;
|
|
/* positive active energy */
|
|
proto_645_07_energy_data_t pae;
|
|
/* negative active energy */
|
|
proto_645_07_energy_data_t nae;
|
|
/* combined active energy */
|
|
proto_645_07_energy_data_t cae;
|
|
/* combined reactive energy data 1 */
|
|
proto_645_07_energy_data_t cre1;
|
|
/* combined reactive energy data 2 */
|
|
proto_645_07_energy_data_t cre2;
|
|
/* reactive energy data in the first quadrant */
|
|
proto_645_07_energy_data_t re_1st;
|
|
/* reactive energy data in the second quadrant */
|
|
proto_645_07_energy_data_t re_2st;
|
|
/* reactive energy data in the third quadrant */
|
|
proto_645_07_energy_data_t re_3st;
|
|
/* reactive energy data in the fourth quadrant */
|
|
proto_645_07_energy_data_t re_4st;
|
|
/* current active power demand */
|
|
uint8_t ept_demand[PROTO_645_07_P_LEN];
|
|
/* current reactive power demand */
|
|
uint8_t eqt_demand[PROTO_645_07_P_LEN];
|
|
/* current total pos-active power demand data with time */
|
|
iot_sg_meter_max_demand_and_ht_t pos_ap_demand;
|
|
/* current total neg-active power demand data with time */
|
|
iot_sg_meter_max_demand_and_ht_t neg_ap_demand;
|
|
/* current total combined reactive 1 demand data with time */
|
|
iot_sg_meter_max_demand_and_ht_t cre1_demand;
|
|
/* current total combined reactive 2 demand data with time */
|
|
iot_sg_meter_max_demand_and_ht_t cre2_demand;
|
|
/* frozen time */
|
|
proto_645_07_frozen_time_t frozen_time;
|
|
/* current meter time */
|
|
proto_645_07_time_t time;
|
|
/* running status word */
|
|
iot_sg_meter_rs_word_t rs_word;
|
|
/* phase angle */
|
|
proto_645_07_phase_angle_t phase_angle;
|
|
/* voltage waveform distortion */
|
|
proto_645_07_waveform_dis_t v_waveform_dis;
|
|
/* current waveform distortion */
|
|
proto_645_07_waveform_dis_t i_waveform_dis;
|
|
/* a phase voltage harmonic content */
|
|
proto_645_07_harmonic_cont_t a_v_hc;
|
|
/* b phase voltage harmonic content */
|
|
proto_645_07_harmonic_cont_t b_v_hc;
|
|
/* c phase voltage harmonic content */
|
|
proto_645_07_harmonic_cont_t c_v_hc;
|
|
/* a current voltage harmonic content */
|
|
proto_645_07_harmonic_cont_t a_i_hc;
|
|
/* b current voltage harmonic content */
|
|
proto_645_07_harmonic_cont_t b_i_hc;
|
|
/* c current voltage harmonic content */
|
|
proto_645_07_harmonic_cont_t c_i_hc;
|
|
/* frequency data */
|
|
proto_645_freq_t freq;
|
|
/* 1 min average power */
|
|
uint8_t average_p[PROTO_645_07_P_LEN];
|
|
/* apparent power demand */
|
|
uint8_t at_demand[PROTO_645_07_P_LEN];
|
|
/* temperature */
|
|
uint8_t temperature[PROTO_645_TEMPERATURE_LEN];
|
|
/* clock battery voltage */
|
|
uint8_t clock_battery_v[PROTO_645_V_LEN];
|
|
/* meter read battery voltage */
|
|
uint8_t mr_battery_v[PROTO_645_V_LEN];
|
|
/* interior battery work time */
|
|
uint8_t work_time[PROTO_645_INTER_BATTERY_TIME_LEN];
|
|
/* positive active a phase energy */
|
|
uint8_t pos_a[PROTO_645_07_ENERGY_DATA_LEN];
|
|
/* positive active b phase energy */
|
|
uint8_t pos_b[PROTO_645_07_ENERGY_DATA_LEN];
|
|
/* positive active c phase energy */
|
|
uint8_t pos_c[PROTO_645_07_ENERGY_DATA_LEN];
|
|
} iot_sg_sta_ext_meter_data_t;
|
|
|
|
/* sta extended load curve configuration structure */
|
|
typedef struct _iot_sg_sta_ext_lc_cfg {
|
|
/* start time */
|
|
iot_time_tm_t tm;
|
|
/* acquisition interval, unit is 1s */
|
|
uint16_t interval;
|
|
/* load curve data id cnt in di_buf */
|
|
uint8_t cnt;
|
|
/* load curve data id buf */
|
|
uint32_t di_buf[IOT_SG_STA_EXT_LR_DI_CNT_MAX];
|
|
} iot_sg_sta_ext_lc_cfg_t;
|
|
|
|
/* sta extended load curve info */
|
|
typedef struct _iot_sg_sta_ext_lc_info {
|
|
/* default cfg id */
|
|
uint8_t cfg_index;
|
|
/* last broadcast froze time */
|
|
iot_time_tm_t last_froze_tm;
|
|
/* broadcast froze time */
|
|
iot_time_tm_t froze_tm;
|
|
/* configuration information */
|
|
const iot_sg_sta_ext_lc_cfg_t *cfg;
|
|
/* current lr id index in di_buf */
|
|
uint8_t index;
|
|
/* 698 msg last lr id index in di_buf */
|
|
uint8_t last_index_698;
|
|
/* current state */
|
|
uint8_t state;
|
|
/* read time cnt, unit is IOT_SG_STA_EXT_SM_DELAY */
|
|
uint8_t timeout_cnt;
|
|
/* flag of repeat cnt */
|
|
uint8_t repeat_cnt : 2,
|
|
/* flag of response */
|
|
flag_resp : 1,
|
|
/* reserved for future */
|
|
reserved : 5;
|
|
} iot_sg_sta_ext_lc_info_t;
|
|
|
|
/* sta extended collect param */
|
|
typedef struct _iot_sg_sta_ext_clct_param {
|
|
/* flag of update */
|
|
uint8_t flag_update : 1,
|
|
/* 0 - disabled, 1 - enabled */
|
|
enabled : 1,
|
|
/* resever */
|
|
resever : 6;
|
|
/* collect configuration cache structure */
|
|
iot_sg_sta_ext_lc_cfg_t cfg_cache;
|
|
/* collect configuration structure */
|
|
iot_sg_sta_ext_lc_cfg_t cfg;
|
|
} iot_sg_sta_ext_clct_param;
|
|
|
|
typedef struct _iot_sg_sta_ext_clct_di_desc {
|
|
/* control code */
|
|
uint8_t control_code;
|
|
/* length of collection data */
|
|
uint8_t len_data;
|
|
/* di of collection data */
|
|
uint32_t di;
|
|
} iot_sg_sta_ext_clct_di_desc_t;
|
|
|
|
/* sta extended collect task descriptor */
|
|
typedef struct _iot_sg_sta_ext_clct_task_desc {
|
|
/* task id */
|
|
uint8_t id;
|
|
/* start time */
|
|
iot_time_tm_t tm;
|
|
/* protocol type, see IOT_SG_EXT_CLCT_TASK_PROTO_TYPE_XXX */
|
|
uint8_t proto_type;
|
|
/* period type, see IOT_SG_EXT_CLCT_TASK_PERIOD_XXX */
|
|
uint8_t period_type;
|
|
/* current di index in di_buf */
|
|
uint8_t idx;
|
|
/* clct task info di cnt in di_buf */
|
|
uint8_t cnt;
|
|
/* clct task info di buf */
|
|
iot_sg_sta_ext_clct_di_desc_t di_buf[IOT_SG_EXT_CLCT_TASK_DI_CNT_MAX];
|
|
} iot_sg_sta_ext_clct_task_desc_t;
|
|
|
|
typedef struct _iot_sg_sta_ext_clct_task_info {
|
|
/* current collection task state */
|
|
uint8_t state;
|
|
/* current collection task timeout, unit is IOT_SG_STA_EXT_SM_DELAY */
|
|
uint8_t timeout_cnt;
|
|
/* flag of response */
|
|
uint8_t flag_resp;
|
|
/* current task cfg info */
|
|
iot_sg_sta_ext_clct_task_desc_t task_info;
|
|
/* current task response data */
|
|
iot_pkt_t *resp_pkt;
|
|
} iot_sg_sta_ext_clct_task_info_t;
|
|
|
|
/* sta extended state score info */
|
|
typedef struct _iot_sg_sta_ext_state_score {
|
|
/* enable */
|
|
uint8_t enable;
|
|
/* score di index */
|
|
uint8_t di_index;
|
|
/* timeout count */
|
|
uint8_t timeout_cnt;
|
|
/* flag of response */
|
|
uint8_t flag_resp;
|
|
/* send count */
|
|
uint8_t send_cnt;
|
|
/* meter complete state score count */
|
|
uint8_t complete_cnt;
|
|
/* fault flag */
|
|
uint8_t v_fault :1,
|
|
/* program enable */
|
|
program_en :1,
|
|
/* power down frequently */
|
|
pd_freq :1,
|
|
/* reserved for future */
|
|
reserved :5;
|
|
/* number of meters to be reported scoring results */
|
|
uint8_t score_rpt_cnt;
|
|
/* state score enable time stamp, unit is 1s */
|
|
uint64_t score_en_ts;
|
|
/* use 4 bytes of BCD code to represent last total energy value */
|
|
uint8_t last_total[PROTO_645_07_ENERGY_DATA_LEN];
|
|
/* state score bit map */
|
|
iot_sg_sta_drv_score_bit_map_t bit_map;
|
|
} iot_sg_sta_ext_state_score_t;
|
|
|
|
/* sta current data collection config for jiangsu protocol */
|
|
typedef struct _iot_sg_sta_ext_data_clct_config {
|
|
/* flag of collection config is latest */
|
|
uint8_t cfg_is_latest : 1,
|
|
/* reserved for future */
|
|
reserved :6;
|
|
/* current function */
|
|
uint8_t cur_func;
|
|
/* start time */
|
|
iot_time_tm_t start_time;
|
|
/* execution interval */
|
|
int64_t exe_inter;
|
|
/* collection delay time */
|
|
uint16_t delay;
|
|
/* collection data identification bitmap,
|
|
* see IOT_SG_STA_METER_TASK_DI_XXX.
|
|
*/
|
|
uint32_t di_bitmap;
|
|
} iot_sg_sta_ext_data_clct_config_t;
|
|
|
|
/* collection task monitoring for jiangsu protocol */
|
|
typedef struct _iot_sg_sta_ext_data_clct_monitor {
|
|
/* the number of messages sent */
|
|
uint16_t msg_send_num;
|
|
/* the number of messages receive */
|
|
uint16_t msg_recv_num;
|
|
} iot_sg_sta_ext_data_clct_monitor_t;
|
|
|
|
/* sta current data collection info for jiangsu protocol */
|
|
typedef struct _iot_sg_sta_ext_data_clct_info {
|
|
/* current collection task state */
|
|
uint8_t cur_state;
|
|
/* read time cnt, unit is IOT_SG_STA_EXT_SM_DELAY */
|
|
uint8_t timeout_cnt :4,
|
|
/* current collection group di table index */
|
|
group_di_idx :4;
|
|
/* current collection di, see IOT_SG_STA_METER_TASK_DI_XXX */
|
|
uint8_t cur_clct_di;
|
|
/* flag of repeat cnt */
|
|
uint8_t repeat_cnt : 2,
|
|
/* flag of response */
|
|
flag_resp : 1,
|
|
/* flag of day freeze collection task enable */
|
|
df_en : 1,
|
|
/* flag of month freeze collection task enable */
|
|
mf_en : 1,
|
|
/* flag of 1 minute curve collection task enable */
|
|
cur_1m_en : 1,
|
|
/* flag of 15 minute curve collection task enable */
|
|
cur_15m_en : 1,
|
|
/* flag of data collection task initialization */
|
|
task_init : 1;
|
|
/* flag of day freeze collection task executed. */
|
|
uint8_t df_done : 1,
|
|
/* flag of month freeze collection task executed. */
|
|
mf_done : 1,
|
|
/* flag of 15 minute curve collection task executed. */
|
|
cur_15m_done: 1,
|
|
/* flag of 15 minute curve collection task executed. */
|
|
cur_1m_done : 1,
|
|
/* flag to mark if search meter complete */
|
|
sm_complete : 1,
|
|
/* flag to mark if last frozen time valid */
|
|
ft_valid : 1,
|
|
/* current collection di is group di */
|
|
is_group_di : 1,
|
|
/* reserved for future */
|
|
reserved : 1;
|
|
/* sta current data collection config */
|
|
iot_sg_sta_ext_data_clct_config_t config;
|
|
/* collection task monitoring */
|
|
iot_sg_sta_ext_data_clct_monitor_t monitor[IOT_SG_STA_METER_JS_CFG_TYPE_MAX];
|
|
} iot_sg_sta_ext_data_clct_info_t;
|
|
|
|
/* sta collect data report info for jiangsu protocol */
|
|
typedef struct _iot_sg_sta_ext_clct_rpt_info {
|
|
/* current rpt state, see IOT_SG_STA_COLL_DATA_RPT_STATE_XXX */
|
|
uint8_t cur_state;
|
|
/* current seq */
|
|
uint8_t seq;
|
|
/* last rpt info type, see IOT_SG_STA_CLCT_LAST_RPT_XXX */
|
|
uint8_t last_rpt_type;
|
|
/* last rpt info */
|
|
iot_sg_sta_ext_clct_rpt_desc_t last_rpt_info;
|
|
/* last multi meter rpt info */
|
|
iot_sg_sta_ext_clct_multi_rpt_desc_t last_multi_rpt_info;
|
|
} iot_sg_sta_ext_clct_rpt_info_t;
|
|
|
|
/* freeze task comment report cfg info structure for fujian protocol */
|
|
typedef struct _iot_sg_sta_ext_freeze_task_comm_rpt_cfg {
|
|
/* task id */
|
|
uint8_t id;
|
|
/* multiple report cnt */
|
|
uint8_t cnt;
|
|
} iot_sg_sta_ext_freeze_task_comm_rpt_cfg_t;
|
|
|
|
/* freeze task comment cfg info structure for fujian protocol */
|
|
typedef struct _iot_sg_sta_ext_freeze_task_comm_cfg {
|
|
/* task data record unit max length */
|
|
uint8_t unit_max_len;
|
|
/* task report max cnt within 24h */
|
|
uint8_t report_max_cnt;
|
|
/* rpt random time, percentage of task cycles, uint is 1%, range 10~90 */
|
|
uint8_t random_rpt_time;
|
|
/* num of retrans of frozen tasks whose cycle is less than 5 minutes. */
|
|
uint8_t retry_freeze : 4,
|
|
/* num of retrans of non frozen or frozen tasks whose cycle is greater
|
|
* than 5 minutes.
|
|
*/
|
|
retry_nonfreeze : 4;
|
|
/* meter multiple data item
|
|
* 0 meter nonsupport multiple data item
|
|
* 1 meter support multiple data item
|
|
*/
|
|
uint8_t mult_data_item : 4,
|
|
/* module report mode
|
|
* 0 mean dl/t-645 protocol mode;
|
|
* 1 mean dl/t-69845 protocol mode;
|
|
*/
|
|
rpt_mode : 4;
|
|
/* meter add for multiple data item, little endian. */
|
|
uint8_t mult_di_addr[IOT_MAC_ADDR_LEN];
|
|
/* task cnt in task_rpt */
|
|
uint8_t cnt;
|
|
/* task report config */
|
|
iot_sg_sta_ext_freeze_task_comm_rpt_cfg_t task_rpt[
|
|
IOT_SG_STA_EXT_FJ_FREEZE_TASK_MAX_CNT];
|
|
} iot_sg_sta_ext_freeze_task_comm_cfg_t;
|
|
|
|
/* freeze task cfg info structure for fujian protocol */
|
|
typedef struct _iot_sg_sta_ext_freeze_task_merge_uint {
|
|
/* merge pkt */
|
|
iot_pkt_t *merge_pkt;
|
|
/* message cnt in merge pkt */
|
|
uint8_t msg_cnt : 7,
|
|
/* report mode */
|
|
mode : 1;
|
|
/* task id */
|
|
uint8_t task_id;
|
|
/* meter address */
|
|
uint8_t addr[IOT_MAC_ADDR_LEN];
|
|
} iot_sg_sta_ext_freeze_task_merge_uint_t;
|
|
|
|
/* freeze task cfg info structure for fujian protocol */
|
|
typedef struct _iot_sg_sta_ext_freeze_task_rpt_uint {
|
|
/* report pkt */
|
|
iot_pkt_t *rpt_pkt;
|
|
/* report cnt */
|
|
uint8_t rpt_cnt : 7,
|
|
/* report mode
|
|
* 0 mean dl/t-645 protocol mode;
|
|
* 1 mean dl/t-69845 protocol mode;
|
|
*/
|
|
mode : 1;
|
|
/* task id */
|
|
uint8_t task_id;
|
|
/* report message cnt in rpt_pkt for dl/t-69845 protocol mode */
|
|
uint8_t msg_cnt;
|
|
/* meter address */
|
|
uint8_t addr[IOT_MAC_ADDR_LEN];
|
|
/* random report time, uint is 1s */
|
|
uint16_t random_rpt_tm;
|
|
/* report sequence number */
|
|
uint16_t seq;
|
|
/* add time stamp, uint is 1s */
|
|
uint32_t tm;
|
|
/* report time stamp, uint is 1s */
|
|
uint32_t rpt_tm;
|
|
} iot_sg_sta_ext_freeze_task_rpt_uint_t;
|
|
|
|
/* freeze exe cnt reamin info */
|
|
typedef struct _iot_sg_sta_ext_freeze_task_exe_cnt {
|
|
/* freeze task id */
|
|
uint8_t task_id;
|
|
/* last response data cnt in last_data */
|
|
uint8_t data_cnt;
|
|
/* valid data length in last data */
|
|
uint8_t valid_len;
|
|
/* number of remaining executable tasks */
|
|
uint16_t count;
|
|
/* number of trigger tasks */
|
|
uint16_t trigger_cnt;
|
|
/* report total cnt */
|
|
uint16_t rpt_total_cnt;
|
|
/* report cnt */
|
|
uint16_t rpt_cnt;
|
|
/* last data, see iot_sg_sta_drv_meter_fj_unit_data_t */
|
|
uint8_t last_data[IOT_SG_STA_METER_FJ_TASK_RECORD_UINT_LEN];
|
|
}iot_sg_sta_ext_freeze_task_exe_cnt_t;
|
|
|
|
typedef struct _iot_sg_sta_ext_freeze_task_reset {
|
|
/* reset task cnt */
|
|
uint8_t cnt;
|
|
/* current reset task index */
|
|
uint8_t cur_idx;
|
|
/* reset task id */
|
|
uint8_t task_id[IOT_SG_STA_EXT_FJ_FREEZE_TASK_MAX_CNT];
|
|
} iot_sg_sta_ext_freeze_task_reset_t;
|
|
|
|
/* sta data freeze info for fujian protocol */
|
|
typedef struct _iot_sg_sta_ext_freeze_task_t {
|
|
/* current task state, see IOT_SG_STA_EXT_FREEZR_STATE_XXX */
|
|
uint8_t cur_state;
|
|
/* current task id 1 - 253 */
|
|
uint8_t cur_task_id;
|
|
/* current di index */
|
|
uint8_t cur_di_idx;
|
|
/* current mr di count */
|
|
uint8_t cur_mr_di_cnt;
|
|
/* read time cnt, unit is IOT_SG_STA_EXT_SM_DELAY */
|
|
uint16_t timeout_cnt :4,
|
|
/* flag of repeat cnt */
|
|
repeat_cnt :2,
|
|
/* flag of response */
|
|
flag_resp :1,
|
|
/* flag of nack response */
|
|
flag_nack_resp :1,
|
|
/* flag of freeze data report */
|
|
flag_rpt :1,
|
|
/* flag of cur task end */
|
|
task_end :1,
|
|
/* flag of report task first execute */
|
|
first_rpt_task :1,
|
|
/* led blink enable counter, unit is 1 refresh interval */
|
|
led_blink_en_cnt :2,
|
|
/* reserved */
|
|
rsvd :3;
|
|
/* freeze task handle bitmap */
|
|
uint16_t task_bm;
|
|
/* task stop dur, unit is 1s */
|
|
uint32_t stop_dur :24,
|
|
/* init task id */
|
|
init_task_id :8;
|
|
/* current task response data */
|
|
iot_pkt_t *resp_pkt;
|
|
/* task comment cfg info */
|
|
iot_sg_sta_ext_freeze_task_comm_cfg_t comm_cfg;
|
|
/* task reset */
|
|
iot_sg_sta_ext_freeze_task_reset_t reset;
|
|
/* task cfg valid id */
|
|
uint8_t valid_id[IOT_SG_STA_EXT_FJ_FREEZE_TASK_MAX_CNT];
|
|
/* Number of times the corresponding task can be executed */
|
|
iot_sg_sta_ext_freeze_task_exe_cnt_t
|
|
exe_cnt_remain[IOT_SG_STA_EXT_FJ_FREEZE_TASK_MAX_CNT];
|
|
/* task rpt merge data */
|
|
iot_sg_sta_ext_freeze_task_merge_uint_t merge_list[
|
|
IOT_SG_STA_EXT_FJ_FREEZE_TASK_MAX_CNT];
|
|
/* task rpt data */
|
|
iot_sg_sta_ext_freeze_task_rpt_uint_t rpt_list[
|
|
IOT_SG_STA_EXT_FJ_FREEZE_TASK_MAX_CNT];
|
|
} iot_sg_sta_ext_freeze_task_t;
|
|
|
|
/* sta extended load curve info for nw protocol */
|
|
typedef struct iot_sg_sta_ext_lc_info_nw {
|
|
/* current state */
|
|
uint8_t state;
|
|
/* read time cnt, unit is IOT_SG_STA_EXT_SM_DELAY */
|
|
uint8_t timeout_cnt;
|
|
/* flag of repeat cnt */
|
|
uint8_t repeat_cnt : 2,
|
|
/* flag of response */
|
|
flag_resp : 1,
|
|
/* flag of multi di read response */
|
|
flag_multi_resp : 1,
|
|
/* reserved for future */
|
|
reserved : 4;
|
|
/* current lr id index */
|
|
uint8_t di_idx;
|
|
/* multi di msg last lr id index in di_buf */
|
|
uint8_t last_di_idx;
|
|
} iot_sg_sta_ext_lc_info_nw_t;
|
|
|
|
/* sta extend neutralwire and livewire abnormal info */
|
|
typedef struct _iot_sg_sta_ext_nli_info {
|
|
/* flag of repeat cnt */
|
|
uint8_t repeat_cnt : 2,
|
|
/* flag of response */
|
|
flag_resp : 1,
|
|
/* current state */
|
|
state : 2,
|
|
/* reserved */
|
|
reserved : 3;
|
|
/* read time cnt, unit is IOT_SG_STA_EXT_SM_DELAY */
|
|
uint8_t timeout_cnt;
|
|
/* data read step, see IOT_SG_STA_EXT_NLI_READ_XXX */
|
|
uint8_t di_idx;
|
|
/* next exec timestamp, uint is 1ms */
|
|
uint64_t next_time;
|
|
}iot_sg_sta_ext_nli_info_t;
|
|
|
|
/* abnormal electric current data for neutralwire and livewire */
|
|
typedef struct _iot_sg_sta_ext_nli_evt_data {
|
|
/* power meter address, little endian */
|
|
uint8_t pm_addr[IOT_MAC_ADDR_LEN];
|
|
/* A phase 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 phase_electric[GW_APP_ELECTRIC_CURRENT_LEN];
|
|
/* neutralwire electric current. bcd format, little endian */
|
|
uint8_t neutralwire_electric[GW_APP_ELECTRIC_CURRENT_LEN];
|
|
/* electric current for neutralwire and livewire, bcd format, little endian */
|
|
uint8_t nl_electric[GW_APP_ELECTRIC_CURRENT_LEN];
|
|
/* abnormal time, bcd format, little endian */
|
|
uint8_t time[GW_APP_ABNORMAL_TIME_DATA_LEN];
|
|
} iot_sg_sta_ext_nli_evt_data_t;
|
|
|
|
typedef struct _iot_sg_sta_ext_nli_evt_data_field {
|
|
/* report cnt */
|
|
uint16_t rpt_cnt;
|
|
/* abnormal data for neutralwire and livewire */
|
|
iot_sg_sta_ext_nli_evt_data_t nli_data[0];
|
|
} iot_sg_sta_ext_nli_evt_data_field_t;
|
|
|
|
/* sta extend neutralwire and livewire abnormal report info */
|
|
typedef struct _iot_sg_sta_ext_nli_evt_rpt_info {
|
|
/* neutralwire and livewire abnormal event report sequence.
|
|
* used to repeat report.
|
|
*/
|
|
uint16_t seq;
|
|
/* report timeout count */
|
|
uint8_t timeout_cnt;
|
|
/* report report count */
|
|
uint8_t report_cnt;
|
|
/* neutralwire and livewire abnormal event data package */
|
|
iot_pkt_t *pkt;
|
|
}iot_sg_sta_ext_nli_evt_rpt_info_t;
|
|
|
|
/* sta ai management module topo data unit */
|
|
typedef struct _iot_sg_sta_ext_ai_topo_data_unit {
|
|
/* voltage */
|
|
proto_645_v_t v;
|
|
/* current */
|
|
proto_645_07_a_t i;
|
|
/* power factor */
|
|
proto_645_07_pf_t pf;
|
|
} iot_sg_sta_ext_ai_topo_data_unit_t;
|
|
|
|
/* sta ai management module topo cfg info */
|
|
typedef struct _iot_sg_sta_ext_ai_topo_cfg {
|
|
/* collection interval, unit is 1s. */
|
|
uint8_t interval;
|
|
/* collected cnt */
|
|
uint16_t collected_cnt;
|
|
/* flag of collection data */
|
|
uint8_t flag_v : 1,
|
|
flag_i : 1,
|
|
flag_pf : 1,
|
|
/* reserved for future */
|
|
reserved : 5;
|
|
/* start tm */
|
|
iot_time_tm_t start_tm;
|
|
} iot_sg_sta_ext_ai_topo_cfg_t;
|
|
|
|
/* sta ai management module topo collect data */
|
|
typedef struct _iot_sg_sta_ext_ai_topo_data {
|
|
/* start idx data time stamp */
|
|
iot_time_tm_t first_tm;
|
|
/* start index in list */
|
|
uint8_t start_idx;
|
|
/* current index in list */
|
|
uint8_t end_idx;
|
|
/* collect data */
|
|
iot_sg_sta_ext_ai_topo_data_unit_t list[
|
|
IOT_SG_STA_EXT_AI_TOPO_DATA_MAX];
|
|
} iot_sg_sta_ext_ai_topo_data_t;
|
|
|
|
/* sta ai management module topo data info */
|
|
typedef struct _iot_sg_sta_ext_ai_topo_info {
|
|
/* flag of topo collection */
|
|
uint8_t flag_enable : 1,
|
|
/* flag of repeat cnt */
|
|
repeat_cnt : 2,
|
|
/* flag of response */
|
|
flag_resp : 1,
|
|
/* reserved for future */
|
|
reserved : 4;
|
|
/* current cfg */
|
|
iot_sg_sta_ext_ai_topo_cfg_t curr_cfg;
|
|
/* collection cnt */
|
|
uint16_t cnt;
|
|
/* current seq */
|
|
uint16_t seq;
|
|
/* state */
|
|
uint8_t state;
|
|
/* response timeout, unit is 1s */
|
|
uint8_t timeout;
|
|
/* 698 msg last lr id index in di_buf */
|
|
uint8_t last_idx;
|
|
/* current di index in di_list */
|
|
uint8_t di_idx;
|
|
/* di cnt */
|
|
uint8_t di_cnt;
|
|
/* data */
|
|
uint32_t di_list[IOT_SG_STA_EXT_AI_TOPO_DI_MAX];
|
|
/* the timestamp of the next collection start */
|
|
iot_time_tm_t collect_tm;
|
|
/* response cache data */
|
|
iot_sg_sta_ext_ai_topo_data_unit_t resp_data;
|
|
/* collect data */
|
|
iot_sg_sta_ext_ai_topo_data_t topo_data;
|
|
} iot_sg_sta_ext_ai_topo_info_t;
|
|
|
|
/* sta ai management module line loss data info */
|
|
typedef struct _iot_sg_sta_ext_ai_ll_cfg {
|
|
/* delta between meter clock and AI module clock, unit is 1s */
|
|
uint32_t delta : 30,
|
|
/* flag with negative delta. 0 mean that delta is a positive number,
|
|
* 1 mean that delta is a negative number
|
|
*/
|
|
neg_delta: 1,
|
|
/* valid flag of delta. 0 mean that delta is invalid,
|
|
* 1 mean that delta is valid
|
|
*/
|
|
valid : 1;
|
|
/* collection interval, unit is 1s. */
|
|
uint16_t interval;
|
|
/* collected cnt */
|
|
uint16_t collected_cnt;
|
|
/* flag of collection data */
|
|
uint8_t flag_p : 1,
|
|
flag_i : 1,
|
|
flag_gi : 1,
|
|
flag_v : 1,
|
|
flag_pf : 1,
|
|
flag_pos : 1,
|
|
flag_neg : 1,
|
|
flag_qtr : 1;
|
|
/* start tm */
|
|
iot_time_tm_t start_tm;
|
|
} iot_sg_sta_ext_ai_ll_cfg_t;
|
|
|
|
/* meter data */
|
|
typedef struct _iot_sg_sta_ext_ai_ll_cache_data {
|
|
/* voltage */
|
|
proto_645_v_t v;
|
|
/* current */
|
|
proto_645_07_a_t i;
|
|
/* GND current */
|
|
uint8_t gnd_a[PROTO_645_07_A_LEN];
|
|
/* active power */
|
|
proto_645_07_p_t ap;
|
|
/* power factor */
|
|
proto_645_07_pf_t pf;
|
|
/* positive active total energy */
|
|
uint8_t pos_total[PROTO_645_07_ENERGY_DATA_LEN];
|
|
/* positive active a phase energy */
|
|
uint8_t pos_a[PROTO_645_07_ENERGY_DATA_LEN];
|
|
/* positive active b phase energy */
|
|
uint8_t pos_b[PROTO_645_07_ENERGY_DATA_LEN];
|
|
/* positive active c phase energy */
|
|
uint8_t pos_c[PROTO_645_07_ENERGY_DATA_LEN];
|
|
/* negative active total energy */
|
|
uint8_t neg_total[PROTO_645_07_ENERGY_DATA_LEN];
|
|
/* negative active a phase energy */
|
|
uint8_t neg_a[PROTO_645_07_ENERGY_DATA_LEN];
|
|
/* negative active b phase energy */
|
|
uint8_t neg_b[PROTO_645_07_ENERGY_DATA_LEN];
|
|
/* negative active c phase energy */
|
|
uint8_t neg_c[PROTO_645_07_ENERGY_DATA_LEN];
|
|
/* reactive total energy in the first quadrant */
|
|
uint8_t re_1st_total[PROTO_645_07_ENERGY_DATA_LEN];
|
|
/* reactive total energy in the second quadrant */
|
|
uint8_t re_2st_total[PROTO_645_07_ENERGY_DATA_LEN];
|
|
/* reactive total energy in the third quadrant */
|
|
uint8_t re_3st_total[PROTO_645_07_ENERGY_DATA_LEN];
|
|
/* reactive total energy in the fourth quadrant */
|
|
uint8_t re_4st_total[PROTO_645_07_ENERGY_DATA_LEN];
|
|
} iot_sg_sta_ext_ai_ll_cache_data_t;
|
|
|
|
/* sta ai management module line lose data info */
|
|
typedef struct _iot_sg_sta_ext_ai_ll_collect_info {
|
|
/* flag of topo collection */
|
|
uint8_t flag_enable : 1,
|
|
/* flag of repeat cnt */
|
|
repeat_cnt : 2,
|
|
/* flag of response */
|
|
flag_resp : 1,
|
|
/* reserved for future */
|
|
reserved : 4;
|
|
/* collection cnt */
|
|
uint16_t cnt;
|
|
/* current seq */
|
|
uint16_t seq;
|
|
/* state */
|
|
uint8_t state;
|
|
/* response timeout, unit is 1s */
|
|
uint8_t timeout;
|
|
/* 698 msg last lr id index in di_buf */
|
|
uint8_t last_idx;
|
|
/* current di index in di_list */
|
|
uint8_t di_idx;
|
|
/* di cnt */
|
|
uint8_t di_cnt;
|
|
/* data */
|
|
uint32_t di_list[IOT_SG_STA_EXT_AI_LL_DI_MAX];
|
|
/* the timestamp of the next collection start */
|
|
iot_time_tm_t collect_tm;
|
|
/* response cache data */
|
|
iot_sg_sta_ext_ai_ll_cache_data_t resp_data;
|
|
} iot_sg_sta_ext_ai_ll_collect_info_t;
|
|
|
|
/* sta ai management module line lose data info */
|
|
typedef struct _iot_sg_sta_ext_ai_ll_info {
|
|
/* flag of recover */
|
|
uint8_t flag_recover;
|
|
/* cfg info */
|
|
iot_sg_sta_ext_ai_ll_cfg_t cfg;
|
|
/* line lose collection data info */
|
|
iot_sg_sta_ext_ai_ll_collect_info_t collect_info;
|
|
} iot_sg_sta_ext_ai_ll_info_t;
|
|
|
|
/* sta ai management module topo data info */
|
|
typedef struct _iot_sg_sta_ext_ai_time {
|
|
/* the time of system timestamp */
|
|
iot_time_tm_t sys_time;
|
|
/* the timestamp of system, unit is 1s */
|
|
uint32_t sys_ts;
|
|
} iot_sg_sta_ext_ai_time_t;
|
|
|
|
/* sta ai management module function data structure */
|
|
typedef struct _iot_sg_sta_ext_ai_module {
|
|
/* sta ai management module time data */
|
|
iot_sg_sta_ext_ai_time_t time;
|
|
/* sta ai management module topo data info */
|
|
iot_sg_sta_ext_ai_topo_info_t topo_info;
|
|
/* sta ai management module line lose data info */
|
|
iot_sg_sta_ext_ai_ll_info_t ll_info;
|
|
} iot_sg_sta_ext_ai_module_t;
|
|
|
|
/* sta data collection report unit info */
|
|
typedef struct _iot_sg_sta_ext_gw_clct_report_unit_info {
|
|
/* point to unit head */
|
|
uint8_t *data;
|
|
/* unit data report state, see IOT_SG_STA_EXT_GW_V28_UNIT_RPT_XXX */
|
|
uint32_t report_state : 2,
|
|
/* 698 msg count */
|
|
msg_cnt : 6,
|
|
/* unit data length */
|
|
len : 10,
|
|
/* sequence of report data,
|
|
* only for report_state == IOT_SG_STA_EXT_GW_V28_UNIT_RPT_ONGOING
|
|
*/
|
|
seq : 14;
|
|
/* converge end time stamp, unit is 1s */
|
|
uint32_t end_ts;
|
|
} iot_sg_sta_ext_gw_clct_report_unit_info_t;
|
|
|
|
/* sta data collection report info */
|
|
typedef struct _iot_sg_sta_ext_gw_clct_report_info {
|
|
/* timer used for report msg */
|
|
timer_id_t rpt_timer;
|
|
/* report state, see IOT_SG_STA_EXT_GW_RPT_STATE_XXX */
|
|
uint8_t state : 7,
|
|
/* flag of report enable */
|
|
flag_en : 1;
|
|
/* report fail cnt */
|
|
uint8_t fail_cnt;
|
|
/* report sequence */
|
|
uint16_t seq;
|
|
/* report end ts, unit is 1ms */
|
|
uint64_t end_ts;
|
|
/* report unit info */
|
|
iot_sg_sta_ext_gw_clct_report_unit_info_t
|
|
unit_info[IOT_SG_STA_EXT_GW_V28_RPT_UNIT_CNT];
|
|
/* cache pkt */
|
|
iot_pkt_t *pkt[IOT_SG_STA_EXT_GW_V28_CACHE_PKT_CNT];
|
|
} iot_sg_sta_ext_gw_clct_report_info_t;
|
|
|
|
/* sta current data collection info for gw protocol */
|
|
typedef struct _iot_sg_sta_ext_gw_clct_info {
|
|
/* current task id 1 - 8 */
|
|
uint8_t cur_task_id;
|
|
/* current lr id index in di_buf */
|
|
uint8_t index;
|
|
/* 698 msg last lr id index in di_buf */
|
|
uint8_t last_index_698;
|
|
/* read time cnt, unit is IOT_SG_STA_EXT_SM_DELAY */
|
|
uint8_t timeout_cnt;
|
|
/* flag of repeat cnt */
|
|
uint8_t repeat_cnt : 2,
|
|
/* flag of response */
|
|
flag_resp : 1,
|
|
/* current state, see IOT_SG_STA_EXT_GW_CLCT_STATE_XXX */
|
|
state : 5;
|
|
/* current 698 freeze msg seq */
|
|
uint8_t seq_698_msg;
|
|
/* current 698 freeze msg pkt */
|
|
iot_pkt_t *freeze_698_pkt;
|
|
/* current collection config */
|
|
iot_sg_sta_drv_meter_gw_clct_task_info_t cur_clct_cfg;
|
|
/* freeze msg report info */
|
|
iot_sg_sta_ext_gw_clct_report_info_t report_info;
|
|
} iot_sg_sta_ext_gw_clct_info_t;
|
|
|
|
/* cache for current power meter edge computing */
|
|
typedef struct _iot_sg_sta_ext_ec_cache {
|
|
/* use 4 bytes of BCD code to represent last total energy value */
|
|
uint8_t last_total[PROTO_645_07_ENERGY_DATA_LEN];
|
|
/* fault flag */
|
|
uint8_t v_fault : 1,
|
|
/* program enable */
|
|
program_en : 1,
|
|
/* power down frequently */
|
|
pd_freq : 1,
|
|
/* reserved for future */
|
|
reserved : 5;
|
|
/* score bitmaps */
|
|
iot_sg_sta_drv_score_bit_map_t bitmap;
|
|
} iot_sg_sta_ext_ec_cache_t;
|
|
|
|
typedef struct _iot_sg_sta_ext_ec_evt {
|
|
/* current reported power meter address */
|
|
uint8_t addr[IOT_MAC_ADDR_LEN];
|
|
/* current upload event message serial number */
|
|
uint16_t seq;
|
|
/* remain event message send count */
|
|
uint8_t send_cnt : 3,
|
|
/* flag if event message in sending */
|
|
busy : 1,
|
|
/* reserved bits */
|
|
rsvd : 4;
|
|
/* current event message overtime, uint is 1s */
|
|
uint32_t rpt_tm;
|
|
} iot_sg_sta_ext_ec_event_t;
|
|
|
|
typedef struct _iot_sg_sta_ext_edge_computing {
|
|
/* flag if overvoltage function enable */
|
|
uint32_t overvoltage_enable : 1,
|
|
/* flag if undervoltage function enable */
|
|
undervoltage_enable : 1,
|
|
/* flag if health check function enable */
|
|
health_enable : 1,
|
|
/* flag if pulse check function enable */
|
|
pulse_check_enable : 1,
|
|
/* flag of response */
|
|
respond : 1,
|
|
/* current read di index */
|
|
index : 4,
|
|
/* read di timeout count */
|
|
timeout : 4,
|
|
/* count of edge computing dis */
|
|
di_cnt : 4,
|
|
/* count of current package sent */
|
|
send_cnt : 3,
|
|
/* flag if egde computing running */
|
|
health_run : 1,
|
|
/* flag if undervoltage check running */
|
|
undervoltage_run : 1,
|
|
/* flag if overvoltage check running */
|
|
overvoltage_run : 1,
|
|
/* flag module second pulse event happend */
|
|
pulse_event : 1,
|
|
/* flag undervoltage event happend */
|
|
undervoltage_event : 1,
|
|
/* flag overvoltage event happend */
|
|
overvoltage_event : 1,
|
|
/* flag health event happend */
|
|
health_event : 1,
|
|
/* count of pulse exec times */
|
|
pulse_count : 3,
|
|
/* flag if pulse check running */
|
|
pulse_run : 1;
|
|
/* clock second pulse period difference value */
|
|
uint32_t pulse_err_value;
|
|
/* next health check time */
|
|
iot_time_tm_t next_health_time;
|
|
/* next pulse exec time, unit is 1s */
|
|
iot_time_tm_t next_pulse_time;
|
|
/* next overvoltage check time, unit is 1s */
|
|
uint32_t next_ov_time;
|
|
/* next undervoltage check time, unit is 1s */
|
|
uint32_t next_uv_time;
|
|
/* health check complete meter count */
|
|
uint8_t health_complete_cnt;
|
|
/* overvoltage check complete meter count */
|
|
uint8_t ov_complete_cnt;
|
|
/* undervoltage check complete meter count */
|
|
uint8_t uv_complete_cnt;
|
|
/* cache for current power meter edge computing */
|
|
iot_sg_sta_ext_ec_cache_t cache;
|
|
/* event info for health */
|
|
iot_sg_sta_ext_ec_event_t health_evt_info;
|
|
/* event info for overvoltage */
|
|
iot_sg_sta_ext_ec_event_t ov_evt_info;
|
|
/* event info for undervoltage */
|
|
iot_sg_sta_ext_ec_event_t uv_evt_info;
|
|
/* event info for pulse */
|
|
iot_sg_sta_ext_ec_event_t pulse_evt_info;
|
|
} iot_sg_sta_ext_ec_t;
|
|
|
|
/* sta extended neutralwire and livewire current abnormal detect info */
|
|
typedef struct _iot_sg_sta_ext_info {
|
|
/* flag of sta extended function init */
|
|
uint8_t ext_init : 1,
|
|
/* flag of sta extended function disabled */
|
|
ext_dis : 1,
|
|
/* reserved for future */
|
|
rsvd : 6;
|
|
/* timer to drive data extended function */
|
|
timer_id_t ext_timer;
|
|
/* current meter mac */
|
|
uint8_t addr[IOT_MAC_ADDR_LEN];
|
|
/* current meter data */
|
|
iot_sg_sta_ext_meter_data_t meter_data;
|
|
/* used for internal meter read with 698 protocol */
|
|
uint8_t sn_proto_698;
|
|
/* flag of extend function time reset */
|
|
uint8_t flag_tm_reset : 1,
|
|
/* flag to mark if meter data is frozen data */
|
|
frozen_data_flag : 1,
|
|
/* reserved for future */
|
|
reserved : 6;
|
|
/* sta extended load curve info */
|
|
iot_sg_sta_ext_lc_info_t lc_info;
|
|
/* sta extended load curve collect param */
|
|
iot_sg_sta_ext_clct_param clct_param;
|
|
/* sta current collection task info */
|
|
iot_sg_sta_ext_clct_task_info_t task_clct_info;
|
|
/* state score info */
|
|
iot_sg_sta_ext_state_score_t score_info;
|
|
/* sta current data collection info for jiangsu protocol */
|
|
iot_sg_sta_ext_data_clct_info_t data_clct;
|
|
/* sta current data report info for jiangsu protocol */
|
|
iot_sg_sta_ext_clct_rpt_info_t data_rpt;
|
|
/* freeze task info for fujian protocol,
|
|
* only support single meter freeze task info
|
|
*/
|
|
iot_sg_sta_ext_freeze_task_t *freeze_task_info;
|
|
/* sta extended load curve info for nw protocol */
|
|
iot_sg_sta_ext_lc_info_nw_t lc_info_nw;
|
|
/* sta extended neutralwire and livewire abnormal detect info,
|
|
* for xian protocol.
|
|
*/
|
|
iot_sg_sta_ext_nli_info_t nli_info;
|
|
/* sta extend nli event report info, for xian protocol */
|
|
iot_sg_sta_ext_nli_evt_rpt_info_t nli_rpt_info;
|
|
/* sta extend ai management module support, for xian protocol */
|
|
iot_sg_sta_ext_ai_module_t *ai_module_info;
|
|
/* sta current data collection info for gw protocol */
|
|
iot_sg_sta_ext_gw_clct_info_t *gw_clct_info;
|
|
/* edge computing info */
|
|
iot_sg_sta_ext_ec_t *ec_info;
|
|
} iot_sg_sta_ext_info_t;
|
|
|
|
/* power meter score info */
|
|
typedef struct _iot_sg_sta_pm_score_info {
|
|
/* assessment score */
|
|
uint8_t score;
|
|
/* trouble data item, 4 byte to 32 bit.
|
|
* each bit corresponding to trouble data item.
|
|
* example: D0 is trouble, set bit0 is 1.
|
|
*/
|
|
uint32_t err_bm;
|
|
/* power meter mac address, little endian */
|
|
uint8_t pm_mac[IOT_MAC_ADDR_LEN];
|
|
} iot_sg_sta_pm_score_info_t;
|
|
|
|
/* uart check info */
|
|
typedef struct _iot_sg_sta_uart_check_info {
|
|
/* consecutive send cnt */
|
|
uint8_t send_cnt;
|
|
/* once uart state, see 0 mean uart is normal,
|
|
* 1 mean uart is abnormal
|
|
*/
|
|
uint8_t once_uart_state : 1,
|
|
/* current uart state, see 0 mean uart is normal,
|
|
* 1 mean uart is abnormal.
|
|
*/
|
|
curr_uart_state : 1,
|
|
/* reserved for future */
|
|
reserved : 6;
|
|
} iot_sg_sta_uart_check_info_t;
|
|
|
|
/* sta state score info */
|
|
typedef struct _iot_sg_sta_score_info {
|
|
/* meter score info count */
|
|
uint8_t meter_cnt;
|
|
/* power meter score info */
|
|
iot_sg_sta_pm_score_info_t pm_info[0];
|
|
} iot_sg_sta_score_info_t;
|
|
|
|
/* sta correct time record */
|
|
typedef struct _iot_sg_sta_ct_record {
|
|
/* year */
|
|
uint16_t year;
|
|
/* month */
|
|
uint8_t mon;
|
|
/* day */
|
|
uint8_t day;
|
|
} iot_sg_sta_ct_record_t;
|
|
|
|
/* time management info */
|
|
typedef struct _iot_sg_sta_tm_info {
|
|
/* 698 meter correct time mode, see IOT_SG_STA_698_CORR_TIME_MODE_XXX */
|
|
uint8_t tm_mode_698;
|
|
/* cache time */
|
|
iot_time_tm_t cache_time;
|
|
/* the timestamp of get cache time, uint is 1s */
|
|
uint32_t cache_time_ts;
|
|
/* auto correct time flag */
|
|
uint8_t auto_flag;
|
|
/* report time skew flag */
|
|
uint8_t rpt_flag;
|
|
/* delta threshold, uint is 1s */
|
|
uint16_t threshold;
|
|
/* auto correct delay time, uint is 1s */
|
|
uint32_t auto_delay;
|
|
/* report time skew delay time, uint is 1s */
|
|
uint32_t rpt_delay;
|
|
} iot_sg_sta_tm_info_t;
|
|
|
|
/* zero-crossing detection info */
|
|
typedef struct iot_sg_sta_zc_check {
|
|
/* total check time(unit is us) */
|
|
uint32_t total_time[IOT_PLC_PHASE_CNT];
|
|
/* last gpio trig ticks */
|
|
uint32_t pre_tick[IOT_PLC_PHASE_CNT];
|
|
/* gpio trig count */
|
|
uint8_t trig_cnt[IOT_PLC_PHASE_CNT];
|
|
/* gpio zc started flags */
|
|
uint8_t started_zc_bm;
|
|
} iot_sg_sta_zc_check_t;
|
|
|
|
/* cco black list infomation */
|
|
typedef struct _iot_sg_sta_cco_black_list_info {
|
|
/* invalid time count, uint is 1min */
|
|
uint32_t invalid_tm_cnt;
|
|
/* cco addr */
|
|
uint8_t addr[IOT_MAC_ADDR_LEN];
|
|
} iot_sg_sta_cco_black_list_info_t;
|
|
|
|
/* periodic monitoring data of second pulse signal */
|
|
typedef struct _iot_sg_sta_ext_sec_pulse_info {
|
|
/* callback when MF stop */
|
|
iot_sg_sta_ext_mf_sec_pulse_finish_handle callback;
|
|
/* second start tick value, unit is 1us */
|
|
uint32_t start_tick;
|
|
/* flag the second pulse cycle value is valid identification */
|
|
uint8_t complete : 1,
|
|
/* start ticks valid */
|
|
valid : 1,
|
|
/* reserve */
|
|
rsvd : 6;
|
|
} iot_sg_sta_ext_sec_pulse_info_t;
|
|
|
|
/* pulse signal counting information */
|
|
typedef struct _iot_sg_sta_ext_pulse_info {
|
|
/* remaining execution time, unit is second */
|
|
uint32_t remain_time;
|
|
/* currnt save index */
|
|
uint32_t index : 31,
|
|
/* pulse count start pending waitting for timer */
|
|
pending : 1;
|
|
/* pointer to periodic storage space */
|
|
uint32_t *buffer;
|
|
/* cycle point count max */
|
|
uint32_t buffer_cnt;
|
|
/* callback function when stopped */
|
|
iot_sg_sta_ext_mf_pulse_finish_handle callback;
|
|
} iot_sg_sta_ext_pulse_info_t;
|
|
|
|
/* define multifunctional data structure */
|
|
typedef struct _iot_sg_sta_ext_mf_glb {
|
|
/* gpio number of multifunction signal input */
|
|
uint8_t gpio_num;
|
|
/* is last ticks valid */
|
|
uint8_t tick_valid : 1,
|
|
/* current check mode, @see IOT_SG_STA_EXT_MF_MODE_XXXX */
|
|
mode : 3,
|
|
/* is multifunctional running now */
|
|
running : 1,
|
|
/* reserve */
|
|
rsvd : 3;
|
|
/* count of pulse since startup */
|
|
uint32_t pulse_count;
|
|
/* last gpio interrupt tick value, unit is 1us */
|
|
uint32_t last_ticks;
|
|
/* last gpio rising tick value, unit is 1us */
|
|
uint32_t rising_ticks;
|
|
/* second pulse info or pulse count info */
|
|
union {
|
|
/* cache in IOT_SG_STA_EXT_MF_MODE_PPS_CYCLE mode */
|
|
iot_sg_sta_ext_sec_pulse_info_t sec_pulse;
|
|
/* cache in IOT_SG_STA_EXT_MF_MODE_PULSE_COUNT mode */
|
|
iot_sg_sta_ext_pulse_info_t pulse;
|
|
} info;
|
|
} iot_sg_sta_ext_mf_glb_t;
|
|
|
|
/* smart grid sta role global descriptor */
|
|
typedef struct _iot_sg_sta_global {
|
|
/* sta app proto type, see IOT_SG_STA_APP_PROTO_XX */
|
|
uint8_t proto;
|
|
/* if the pib's esp is IOT_SG_STA_ESP_AUTO
|
|
* then this esp is driver detecting value,
|
|
* see IOT_SG_STA_ESP_XXX
|
|
*/
|
|
uint8_t real_esp;
|
|
/* network sn */
|
|
uint8_t network_sn;
|
|
/* number of sta_out gpio num */
|
|
uint8_t sta_out_gpio_num;
|
|
/* mac address of CCo that STA last joined. */
|
|
uint8_t cco_addr[IOT_MAC_ADDR_LEN];
|
|
/* driver address type, see IOT_SG_STA_DRV_ADDR_TYPE_XXX */
|
|
uint8_t addr_type;
|
|
/* nid that the STA last joined. */
|
|
uint32_t local_nid;
|
|
/* sta pib handle */
|
|
iot_sg_sta_app_pib_t pib;
|
|
/* state machine */
|
|
iot_sg_sta_sm_t sm;
|
|
/* timer used for device detecting */
|
|
timer_id_t detect_timer;
|
|
/* timer used by driver request */
|
|
timer_id_t driver_timer;
|
|
/* timer used by read tsfm info */
|
|
timer_id_t read_tsfm_timer;
|
|
/* timer used for event report */
|
|
timer_id_t event_rpt_timer;
|
|
/* general timer fired regularly */
|
|
timer_id_t refresh_timer;
|
|
/* timer used for power off event report */
|
|
timer_id_t power_off_timer;
|
|
/* timer used for power on event report */
|
|
timer_id_t power_on_timer;
|
|
/* timer used for sm done event report and check */
|
|
timer_id_t sm_evt_chk_timer;
|
|
/* timer used for collect feature data */
|
|
timer_id_t collect_timer;
|
|
/* timer used for STA-PIN output */
|
|
timer_id_t sta_out_timer;
|
|
/* round count of detect device */
|
|
uint32_t detect_round;
|
|
/* secondary node is in neighbor state query counter,
|
|
* unit is 1min refresh interval
|
|
*/
|
|
uint8_t neighbor_cnt;
|
|
/* poll time output counter, unit is 1 refresh interval */
|
|
uint8_t poll_cnt;
|
|
/* debug info output counter, unit is 1 poll interval */
|
|
uint8_t debug_cnt;
|
|
/* flag to mark if the address list of power meter have been changed */
|
|
uint8_t addr_list_change :1,
|
|
/** flag to mark if the joined cco is from the same vendor as us for sta */
|
|
same_vendor :1,
|
|
/* flag to mark if sta get into software record state */
|
|
soft_record_state:1,
|
|
/* flag to mark if accur_corr_seq is valid */
|
|
flag_accur_valid :1,
|
|
/* reserved for future */
|
|
rsvd0 :4;
|
|
/* sta software record mode refresh counter, unit is 1s refresh interval */
|
|
uint8_t soft_record_cnt;
|
|
/* last request id of setting address */
|
|
uint8_t last_addr_reqid;
|
|
/* meter time output counter, unit is 1s */
|
|
uint32_t time_cnt;
|
|
/* current driver indext that is detecting the device */
|
|
uint8_t detect_idx;
|
|
/* flag indicate if swc link is ready */
|
|
uint8_t swc_link_ready;
|
|
/* flag of get meter time done */
|
|
uint8_t get_time_done :1,
|
|
/* flag of sta system time, 1 mean time is valid, 0 mean time is invalid */
|
|
time_flag :1,
|
|
/* image crc check result, 0 mean succeed, 1 mean fail */
|
|
img_check_result :1,
|
|
/* flag of image crc check done, 1 mean done */
|
|
flag_img_check :1,
|
|
/* correct time count */
|
|
correct_time_cnt :2,
|
|
/* flag to mark if ever tried to get meter time, 1 - tried, 0 - not tried */
|
|
pm_tm_tried :1,
|
|
/* flag to mark if controller is connected to sta */
|
|
ctrl_proto_connected :1;
|
|
/* sequence of last push data */
|
|
uint16_t seq_last_push;
|
|
/* correct time receive counter, unit is 1 poll interval */
|
|
uint16_t sta_time_cnt;
|
|
/* sequence of lock time command */
|
|
uint8_t lock_seq;
|
|
/* sequence of accurate correcting time command */
|
|
uint8_t accur_corr_seq;
|
|
/* controller transformation sequence number */
|
|
uint8_t ctrl_proto_sn;
|
|
/* module pulled out msg last sequences number */
|
|
uint8_t pull_out_last_sn;
|
|
/* module pulled out msg current sequences number */
|
|
uint8_t pull_out_cur_sn;
|
|
/* pulled out check output counter, unit is 1 refresh interval */
|
|
uint8_t pull_out_cnt;
|
|
/* moudle pulled out check start time stamp, uint is 1ms */
|
|
uint32_t pull_out_start_ts;
|
|
/* sta joined time stamp */
|
|
uint64_t joined_ts;
|
|
/* simple pair passcode value, little endian */
|
|
uint16_t passcode;
|
|
/* module timer source type, default source type is net timer source
|
|
* according to FJ, see PROTO_645_FJ_MOD_TM_SOC_XXX
|
|
*/
|
|
uint8_t tm_soc :1,
|
|
/* flag to mark if br2 function enable, 0 - disabled, 1 - enable. */
|
|
br2_enable :1,
|
|
/* flag to mark if br2 record init, 0 - uninitialized, 1 - initialized */
|
|
br2_record_init :1,
|
|
/* flag to mark if rtc timer has synchronized with cctt timer,
|
|
* 1 - sync, 0 - not sync
|
|
*/
|
|
rtc_sync_flag :1,
|
|
/* flag to mark if cco black list update */
|
|
cco_bl_update_flag :1,
|
|
/* flag to mark if Nanwang product testing is run */
|
|
nw_pt_detected :1,
|
|
/* reserved for future */
|
|
rsvd :2;
|
|
/* module correct time duration, unit is 1min */
|
|
uint16_t ct_dur;
|
|
/* time stamp of the last general correct time, unit is 1s */
|
|
uint32_t last_gen_ct_ts;
|
|
/* time stamp of the last ntb correct time, unit is 1s */
|
|
uint32_t last_ntb_ct_ts;
|
|
/* cco black list invalid time, uint is 1min */
|
|
uint32_t cco_bl_invalid_time;
|
|
/* cco black list infomation */
|
|
iot_sg_sta_cco_black_list_info_t cco_bl[IOT_SG_STA_BLACK_LIST_MAX_CNT];
|
|
/* sta correct time record */
|
|
iot_sg_sta_ct_record_t ct_rec;
|
|
/* current meter time, get the time of meter every 10 minutes*/
|
|
iot_sg_sta_drv_time_t meter_time;
|
|
/* pending request queue */
|
|
iot_sg_sta_req_queue_t queue;
|
|
/* current req */
|
|
iot_sg_sta_req_t req;
|
|
/* meter read info descriptor */
|
|
iot_sg_sta_mr_global_t mr;
|
|
/* event info descriptor */
|
|
iot_sg_sta_evt_global_t evt;
|
|
/* secondary node hash table */
|
|
iot_addr_hash_table_h node_table;
|
|
/* black listed secondary node hash table */
|
|
iot_addr_hash_table_h node_bl_table;
|
|
/* secondary node pointer array */
|
|
iot_sg_sta_node_desc_t *node_list[IOT_SG_STA_SEC_NODE_MAX];
|
|
/* invalid mac addr entry */
|
|
iot_sg_sta_invalid_addr_entry_t
|
|
invalid_addr_list[IOT_SG_STA_INVALID_ADDR_LIST_SIZE];
|
|
/* driver descriptor being used if driver id in persistent storage
|
|
* is invalid, will dynamically trigger each supported driver to detect
|
|
* the device connected locally. once a device detected, the corresponding
|
|
* driver will be used.
|
|
*/
|
|
iot_sg_sta_drv_t *drv;
|
|
/* node register descriptor */
|
|
iot_sg_sta_node_reg_global_t node_reg;
|
|
/* upgrade info */
|
|
iot_sg_sta_upgrade_info_t upgrade_info;
|
|
/* hw tsfm info */
|
|
iot_sg_sta_hw_tsfm_t hw_tsfm_info;
|
|
/* sta roperties info */
|
|
iot_sg_sta_properties_global_t node_properties;
|
|
/* sta flash config info */
|
|
iot_sg_sta_flash_cfg_info_t flash_cfg_info;
|
|
/* sta flash info */
|
|
iot_sg_sta_flash_info_t flash_info;
|
|
/* tsfm status from plc lib */
|
|
iot_plc_tsfm_status_rpt_t tsfm_status;
|
|
/* tsfm collect feature info */
|
|
iot_sg_sta_tsfm_collect_info_t tsfm_collect_info;
|
|
/* sta extended function info */
|
|
iot_sg_sta_ext_info_t ext_info;
|
|
/* sta uart state info */
|
|
iot_sg_sta_uart_check_info_t uart_state_info;
|
|
/* local plc info query */
|
|
iot_sg_sta_query_plc_global_t plc_query;
|
|
/* time management info */
|
|
iot_sg_sta_tm_info_t tm_info;
|
|
/* zero-crossing detection info */
|
|
iot_sg_sta_zc_check_t check;
|
|
/* multifunctional data */
|
|
iot_sg_sta_ext_mf_glb_t *mf;
|
|
} iot_sg_sta_global_t;
|
|
|
|
#if (PLC_SUPPORT_STA_ROLE && IOT_SMART_GRID_ENABLE)
|
|
|
|
/*
|
|
* iot_sg_sta_init() - init smart grid sta role device specific operation
|
|
*
|
|
* return:
|
|
* 0 - for scuccess case
|
|
* otherwise - error number
|
|
*/
|
|
uint32_t iot_sg_sta_init();
|
|
|
|
/*
|
|
* iot_sg_sta_init() - deinit smart grid sta role device specific operation
|
|
*/
|
|
void iot_sg_sta_deinit();
|
|
|
|
/**
|
|
* @brief: iot_sg_sta_handle_cus_cfg() - handling configuration info from
|
|
* customer app.
|
|
* @cfg node: pointer to the parameter to be configured.
|
|
*/
|
|
void iot_sg_sta_handle_cus_cfg(iot_sg_ext_cus_cfg_t *cfg);
|
|
|
|
/**
|
|
* @brief: iot_sg_sta_handle_cus_sync_node_list() - handling synchronize node
|
|
* list from customer app.
|
|
* @param node_list: pointer to the node list.
|
|
*/
|
|
void iot_sg_sta_handle_cus_sync_node_list(
|
|
iot_sg_ext_node_list_sync_t *node_list);
|
|
|
|
/**
|
|
* @brief: iot_sg_sta_report_nli_event() - sta nli event report to CCO.
|
|
* @param data: nli abnormal info.
|
|
*/
|
|
uint32_t iot_sg_sta_report_nli_event(iot_sg_sta_ext_nli_evt_data_field_t *data);
|
|
|
|
#else /* PLC_SUPPORT_STA_ROLE && IOT_SMART_GRID_ENABLE */
|
|
|
|
#define iot_sg_sta_init() (ERR_NOSUPP)
|
|
|
|
#define iot_sg_sta_deinit()
|
|
|
|
#define iot_sg_sta_handle_cus_cfg(cfg) ((void)cfg)
|
|
|
|
#define iot_sg_sta_handle_cus_sync_node_list(node_list) ((void)node_list)
|
|
|
|
#define iot_sg_sta_report_nli_event(data) (ERR_NOSUPP)
|
|
|
|
#endif /* PLC_SUPPORT_STA_ROLE && IOT_SMART_GRID_ENABLE */
|
|
|
|
/**
|
|
* @brief: function callback to allow read tsfm info driver to request
|
|
* smart grid app to start the read tsfm timer.
|
|
* @param dur: duration of the timer. the unit is 1 ms.
|
|
* @retval: 0 - for timer started successfully case
|
|
* @retval: otherwise - error code
|
|
*/
|
|
uint32_t iot_sg_sta_start_read_tsfm_timer(uint32_t dur);
|
|
|
|
/**
|
|
* @brief: function callback to allow read tsfm infodriver to request
|
|
* smart grid app to stop the tsfm timer.
|
|
*/
|
|
void iot_sg_sta_stop_read_tsfm_timer();
|
|
|
|
/**
|
|
* @brief: iot_sg_sta_get_rw_pib - gets the entry position of station in PIB.
|
|
* @retval: otherwise - the entry position of station in PIB
|
|
* @retval: NULL - fail.
|
|
*/
|
|
iot_sg_sta_app_info_t *iot_sg_sta_get_rw_pib(void);
|
|
|
|
/**
|
|
* @brief: iot_sg_send_msdu - send a msdu to mac layer. It consumed the msdu_pkt.
|
|
* @param msdu_pkt: an iot_pkt allocate by iot_plc_alloc_msdu.
|
|
* @param prefer_link: preferred link type on which to send the msdu,
|
|
* see IOT_SG_LINK_TYPE_XXX.
|
|
* @retval: ERR_OK for success case. Other for failed case.
|
|
*/
|
|
uint32_t iot_sg_send_msdu(iot_pkt_t* msdu_pkt, uint32_t prefer_link);
|
|
|
|
/**
|
|
* @brief: check if cached data for the meter read request exist.
|
|
* @param seq: sequence of the meter read request.
|
|
* @param src_addr: original source mac address in the meter read request.
|
|
* @param link_type: link type, see IOT_SG_LINK_TYPE_XXX.
|
|
* @param mr_type: type of meter read request, IOT_SG_STA_MR_TYPE_XXX.
|
|
* @retval: ERR_OK -- cache not exist
|
|
* @retval: ERR_EXIST -- cache exist
|
|
*/
|
|
uint32_t iot_sg_sta_mr_cache_check(uint16_t seq, uint8_t *src_addr,
|
|
uint8_t link_type, uint8_t mr_type);
|
|
|
|
/**
|
|
* @brief: parse a buffer to abstract mutiple 645 frames from the buffer.
|
|
* @param data: pointer to the buffer.
|
|
* @param len: length of buffer data.
|
|
* @retval: ERR_OK -- parse buffer successfully
|
|
* @retval: ERR_INVAL -- parse buffer failure
|
|
*/
|
|
uint32_t iot_sg_sta_parse_frame(uint8_t *data, uint16_t len);
|
|
|
|
/**
|
|
* @brief: iot_sg_sta_issue_frame - send an 645 frame to driver.
|
|
*/
|
|
uint32_t iot_sg_sta_issue_frame(void);
|
|
|
|
/**
|
|
* @brief: iot_sg_sta_start_next_app_other - start next request in the queue.
|
|
*/
|
|
void iot_sg_sta_start_next_app_other(void);
|
|
|
|
/**
|
|
* @brief: iot_sg_sta_node_reg_clear_all_obsolete - clear all obsolete node.
|
|
*/
|
|
void iot_sg_sta_node_reg_clear_all_obsolete(void);
|
|
|
|
/**
|
|
* @brief: iot_sg_sta_bitmap_merge - received bitmap merge to local bitmap.
|
|
* @param bm: received bitmap.
|
|
* @param first_tei: first tei in received bitmap.
|
|
* @param length: length of received bitmap.
|
|
* @param local_bm: local bitmap.
|
|
*/
|
|
void iot_sg_sta_bitmap_merge(uint8_t *bm, uint16_t first_tei,
|
|
uint16_t length, iot_sg_sta_power_off_bm_t *local_bm);
|
|
|
|
/**
|
|
* @brief: power off pm address info merge to local power off pm address info.
|
|
* @param pm: pointer to the header of pm info marged.
|
|
* @param cnt: pm cnt.
|
|
* @retval: 1 -- merge successfully
|
|
* @retval: 0 -- merge false
|
|
*/
|
|
uint32_t iot_sg_sta_pd_addrs_merge(
|
|
iot_sg_sta_pd_addrs_info_t *pm, uint16_t cnt);
|
|
|
|
/**
|
|
* @brief : get sequence number of event report message.
|
|
* @retval: sequence number.
|
|
*/
|
|
uint16_t iot_sg_sta_get_event_rpt_seq();
|
|
|
|
/**
|
|
* @brief: check sequence number of event report ack from cco.
|
|
* @param seq: sequence number of event report ack from cco.
|
|
* @retval: true -- sequence number is true.
|
|
* @retval: false -- sequence number is false.
|
|
*/
|
|
bool_t iot_sg_sta_check_pm_event_rpt_seq(uint16_t seq);
|
|
|
|
/**
|
|
* @brief: iot_sg_sta_get_pd_bitmap_info - get sta power off bitmap info
|
|
* @param bitmap: pointer to bitmap info cache.
|
|
* @param update: pointer to flag of bitmap update.
|
|
* @retval: ERR_OK -- get bitmap info successfully.
|
|
* @retval: ERR_FAIL -- get bitmap info false.
|
|
*/
|
|
uint32_t iot_sg_sta_get_pd_bitmap_info(
|
|
iot_sg_sta_pd_bitmap_desc_t *bitmap, uint8_t *update);
|
|
|
|
/**
|
|
* @brief: iot_sg_sta_event_ack_handle - handle event ack from cco.
|
|
* @param fn: function of event ack from cco, see IOT_SG_STA_EVENT_RPT_XXX.
|
|
* @retval: ERR_OK -- handle successfully
|
|
* @retval: otherwise -- handle false, see ERR_XXX.
|
|
*/
|
|
uint32_t iot_sg_sta_event_ack_handle(uint8_t fn);
|
|
|
|
/**
|
|
* @brief: check whether sta is power off or not.
|
|
* @retval: 1 -- sta is power off.
|
|
* @retval: 0 -- sta isn't power off.
|
|
*/
|
|
uint8_t iot_sg_sta_power_off_check(void);
|
|
|
|
/**
|
|
* @brief: handle meter read request from cco.
|
|
* this function always consume the pkt.
|
|
* @param pkt: the iot_pkt with application protocol data in it.
|
|
* @param hdr: the pointer to header of application protocol data.
|
|
* @retval: ERR_PENDING and ERR_OK -- handle successfully
|
|
* @retval: otherwise -- handle false, see ERR_XXX.
|
|
*/
|
|
uint32_t iot_sg_sta_meter_read(iot_pkt_t *pkt, uint8_t *hdr);
|
|
|
|
/**
|
|
* @brief: send get meter time request to driver.
|
|
*/
|
|
void iot_sg_sta_start_get_time();
|
|
|
|
/**
|
|
* @brief: queue other port request.
|
|
* this function always consume the pkt.
|
|
* @param pkt: the iot_pkt with application protocol data in it.
|
|
* @param link_type: type of low layer link type, see IOT_SG_LINK_TYPE_XXX.
|
|
* @retval: ERR_OK -- handle success.
|
|
* @retval: otherwise -- handle false, see ERR_XXX.
|
|
*/
|
|
uint32_t iot_sg_sta_queue_app_other(iot_pkt_t *pkt, uint8_t link_type);
|
|
|
|
/**
|
|
* @brief: handle app protocol for GW_APP_PORT_UPGRADE
|
|
* this function always consume the pkt.
|
|
* @param pkt: the iot_pkt with gw upgrade data in it.
|
|
*/
|
|
void iot_sg_sta_handle_app_upgrade(iot_pkt_t *pkt);
|
|
|
|
/**
|
|
* @brief: send a start ack reply to CCo
|
|
* @param id: upgrading session id
|
|
* @param msg_type: type for sending the message
|
|
* @param result: result to the start upgrading command
|
|
*/
|
|
void iot_sg_sta_send_start_ack(uint32_t id, uint8_t msg_type,
|
|
uint32_t result);
|
|
|
|
/**
|
|
* @brief: send query reply to STA
|
|
* @param id: upgrading session id
|
|
* @param start_seq: sn of the 1st block being queried
|
|
* @param status: STA's upgrading status
|
|
* @param cnt: number of available block in the bitmap
|
|
* @param bitmap_pkt: an iot_pkt with bitmap in its data block
|
|
* @param msg_type: msg_type used to send the reply
|
|
* @param session_type: query upgrade status session proto type,
|
|
* see - IOT_SG_STA_UPGRADE_SESSION_TYPE_XXX
|
|
*/
|
|
void iot_sg_sta_send_query_reply(uint32_t id, uint32_t start_seq,
|
|
uint16_t status, uint16_t cnt, iot_pkt_t *bitmap_pkt, uint8_t msg_type,
|
|
uint8_t session_type);
|
|
|
|
/**
|
|
* @brief: sta send meter reading response.
|
|
* @param seq: sequence of meter reading response.
|
|
* @param mr_type: type of meter reading response, IOT_SG_STA_MR_TYPE_XXX.
|
|
*/
|
|
void iot_sg_sta_send_mr_rsp(uint16_t seq, uint8_t mr_type);
|
|
|
|
/**
|
|
* @brief: start secondary node register.
|
|
* @param reason: reason of start secondary node register.
|
|
* see IOT_SG_STA_NODE_REG_REASON_XXX.
|
|
*/
|
|
void iot_sg_sta_start_sec_node_reg(uint8_t reason);
|
|
|
|
/**
|
|
* @brief: stop secondary node register.
|
|
*/
|
|
void iot_sg_sta_stop_sec_node_reg(void);
|
|
|
|
/**
|
|
* @brief: find node by meter mac address.
|
|
* @param addr: node mac address.
|
|
* @retval: otherwise -- the entry position of node.
|
|
* @retval: NULL -- handle false.
|
|
*/
|
|
iot_sg_sta_node_desc_t *iot_sg_sta_node_find_by_addr(uint8_t *addr);
|
|
|
|
/**
|
|
* @brief: handle correct time pkt.
|
|
* @param pkt: the iot_pkt with DL/T 645 correct
|
|
* time data in it. function won't free the pkt.
|
|
* @retval ERR_OK: handle success.
|
|
* @retval ERR_FAIL: handle false.
|
|
*/
|
|
uint32_t iot_sg_sta_correct_time(iot_pkt_t *pkt);
|
|
|
|
/**
|
|
* @brief: delete request in queue by link_type.
|
|
* @param link_type: type of low layer link type, see IOT_SG_LINK_TYPE_XXX.
|
|
*/
|
|
void iot_sg_sta_queue_app_del_by_type(uint8_t link_type);
|
|
|
|
/**
|
|
* @brief: delete request in queue by src_id.
|
|
* @param src_id: id of request read meter source,
|
|
* see IOT_SG_STA_MR_SRC_ID_XXX.
|
|
*/
|
|
void iot_sg_sta_queue_app_del_by_src(uint8_t src_id);
|
|
|
|
/**
|
|
* @brief: sta add a meter reading request.
|
|
* @param id: id of request read meter source
|
|
* @param mac: meter address.
|
|
* @param seq: sequence of request.
|
|
* @param proto_type: protocol type in data,
|
|
* see IOT_SG_STA_DATA_TYPE_XXX.
|
|
* @param data: meter reading message.
|
|
* @param len: length of meter reading message.
|
|
* @param timeout: meter read time out, unit is 100ms.
|
|
* @retval: ERR_OK -- handle success.
|
|
* @retval: otherwise -- handle false, see ERR_XXX.
|
|
*/
|
|
uint32_t iot_sg_sta_add_mr_req(uint8_t id, uint8_t *mac, uint16_t seq,
|
|
uint8_t proto_type, uint8_t *data, uint16_t data_len, uint16_t timeout);
|
|
|
|
/**
|
|
* @brief: sta add a meter correct request.
|
|
* @param data: meter reading message.
|
|
* @param len: length of meter reading message.
|
|
* @retval: ERR_OK -- handle success.
|
|
* @retval: otherwise -- handle false, see ERR_XXX.
|
|
*/
|
|
uint32_t iot_sg_sta_add_corr_req(uint8_t *data, uint16_t data_len);
|
|
|
|
/**
|
|
* @brief: handle meter reading response.
|
|
* @param data_type: type of data.
|
|
* @param data: meter reading response data in it.
|
|
* @param len: length of response data.
|
|
*/
|
|
void iot_sg_sta_handle_mr_resp(uint8_t data_type, uint8_t *data, uint16_t len);
|
|
|
|
/**
|
|
* @brief: start sta tsfm feature collect timer.
|
|
* @param dur: duration of the timer. the unit is 1 ms.
|
|
*/
|
|
void iot_sg_sta_start_tsfm_feature_collect_timer(uint32_t dur);
|
|
|
|
/**
|
|
* @brief: stop sta tsfm feature collect timer.
|
|
*/
|
|
void iot_sg_sta_stop_tsfm_feature_collect_timer(void);
|
|
|
|
/**
|
|
* @brief : save time delta and addr into pib.
|
|
* @param : delta - the time delta between correct time and RTC, unit is 1s.
|
|
* @param : addr - point to the sta mac addr, big-endian.
|
|
* @retval: ERR_OK - case successfully.
|
|
* @retval: otherwise - error code. see ERR_XXX
|
|
*/
|
|
uint8_t iot_sg_sta_save_correct_tm_pib(int64_t delta, uint8_t *addr);
|
|
|
|
/**
|
|
* @brief: check sequence number of power on event report ack from cco.
|
|
* @param seq: sequence number of event report ack from cco.
|
|
* @retval: 1 -- sequence number is true.
|
|
* @retval: 0 -- sequence number is false.
|
|
*/
|
|
uint8_t iot_sg_sta_check_power_on_rpt_seq(uint16_t seq);
|
|
|
|
/**
|
|
* @brief: check sequence number of power off forward ack from cco.
|
|
* @param seq: sequence number of event forward ack from cco.
|
|
* @retval: 1 -- sequence number is true.
|
|
* @retval: 0 -- sequence number is false.
|
|
*/
|
|
uint8_t iot_sg_sta_check_power_off_fwd_seq(uint16_t seq);
|
|
|
|
/**
|
|
* @brief : handle power on event ack.
|
|
*/
|
|
void iot_sg_sta_power_on_ack_handle(void);
|
|
|
|
/**
|
|
* @brief: handle power off forward ack.
|
|
* @param seq: sequence number of event forward ack from cco.
|
|
*/
|
|
void iot_sg_sta_power_off_fwd_ack_handle(uint16_t seq);
|
|
|
|
/**
|
|
* @brief : stop sm done event report.
|
|
*/
|
|
void iot_sg_sta_sm_done_evt_stop(void);
|
|
|
|
/**
|
|
* @brief: iot_sg_sta_sm_done_evt_check_seq() - check sequence number of sm done
|
|
* event report ack from cco.
|
|
* @param seq: sequence number of event report ack from cco.
|
|
* @retval: 1 -- sequence number is true.
|
|
* @retval: 0 -- sequence number is false.
|
|
*/
|
|
uint8_t iot_sg_sta_sm_done_evt_check_seq(uint16_t seq);
|
|
|
|
/**
|
|
* @brief: re-enable meter event report to update report config.
|
|
* note: if event report is not enabled now, then calling this
|
|
* function will not enable event report.
|
|
*/
|
|
void iot_sg_sta_module_report_re_enable();
|
|
|
|
/**
|
|
* @brief: meter clock skew event report.
|
|
* @param new_evt: new event flag.
|
|
* @param interval: clock skew interval between concentrator and meter.
|
|
*/
|
|
void iot_sg_sta_clock_skew_report(uint8_t new_evt, int64_t interval);
|
|
|
|
/**
|
|
* @brief: sta net lock time save.
|
|
* @param net_lock_time: net lock time, uint is 1min. 0 means no lock.
|
|
* @param abn_lock_time: the lock time of abnormal leave net, uint is 1min.
|
|
* 0 means no lock.
|
|
*/
|
|
void iot_sg_sta_lock_time_save(uint16_t net_lock_time,
|
|
uint16_t abn_lock_time);
|
|
|
|
/**
|
|
* @brief: sta uart state get.
|
|
* @retval: uart state, see IOT_SG_STA_UART_STATE_XXX.
|
|
*/
|
|
uint8_t iot_sg_sta_uart_state_get(void);
|
|
|
|
/**
|
|
* @brief: sta node valid check.
|
|
* @param node: node checked.
|
|
* @retval: reault. 1 mean node is valid, 0 mean node is invalid;
|
|
*/
|
|
uint8_t iot_sg_sta_node_valid_check(iot_sg_sta_node_desc_t *node);
|
|
|
|
/**
|
|
* @brief: sta modify locked tsfm addr.
|
|
* @param tsfm_addr: modify locked tsfm addr, big-endian.
|
|
*/
|
|
void iot_sg_sta_modify_locked_tsfm_addr(uint8_t *tsfm_addr);
|
|
|
|
/**
|
|
* @brief: sta enable join certification.
|
|
* @param join_check: sta join certification state: 0 - disabled, 1 - enable.
|
|
* other values is invalid.
|
|
*/
|
|
void iot_sg_sta_set_join_check_state(uint8_t join_check);
|
|
|
|
/**
|
|
* @brief: sta search meter event report done.
|
|
*/
|
|
void iot_sg_sta_sm_evt_rpt_done(void);
|
|
|
|
/**
|
|
* @brief: change sta dev type to plc dev type.
|
|
* @param dev_type: dev type.
|
|
* @retval: plc dev type;
|
|
*/
|
|
uint8_t iot_sg_sta_to_plc_dev_type(uint8_t dev_type);
|
|
|
|
/**
|
|
* @brief: use current NTB correction time.
|
|
* @param: old_ntb: old ntb.
|
|
* @param: iot_ts: time.
|
|
*/
|
|
void iot_sg_sta_cur_ntb_correct_ts(uint32_t old_ntb, iot_time_tm_t *iot_ts);
|
|
|
|
/**
|
|
* @brief: iot_sg_sta_report_event_with_seq - send event message with seq.
|
|
* @param addr: mac address of the power meter of the event
|
|
* @param data_ptr: pointer to the event data.
|
|
* @param len: length size of event data.
|
|
* @param seq: message sequence.
|
|
* @retval: ERR_OK - event sent out successfully.
|
|
* @retval: otherwise - error code. see ERR_XXX
|
|
*/
|
|
uint32_t iot_sg_sta_report_event_with_seq(uint8_t *addr, uint8_t *data_ptr,
|
|
uint32_t len, uint16_t seq);
|
|
|
|
/**
|
|
* @brief: module report state reset.
|
|
* @param is_timeout: flag of timeout.
|
|
*/
|
|
void iot_sg_module_report_reset_status(uint8_t is_timeout);
|
|
|
|
/**
|
|
* @brief: report event with report type.
|
|
* @param addr: mac address of the power meter of the event
|
|
* @param data_ptr: pointer to the event data.
|
|
* @param len: length size of event data.
|
|
* @param new_evt: 0: the event isn't new, 1: the event is new.
|
|
* @param rpt_type: type of report event, see IOT_SG_STA_RPT_MODULE_XXX
|
|
* @retval: 0 - event sent out successfully.
|
|
* @retval: otherwise - error code. see ERR_XXX.
|
|
*/
|
|
uint32_t iot_sg_sta_report_event_with_type(uint8_t *addr,
|
|
uint8_t *data_ptr, uint32_t len, uint8_t new_evt, uint8_t rpt_type);
|
|
|
|
/**
|
|
* @brief iot_sg_sta_meter_read_done_framework() - function callback to allow
|
|
* device framework to notify that the meter read operation done.
|
|
* @param data_type: data type. See GW_APP_DATA_TYPE_XXX
|
|
* @param rsp_pkt: iot packet of the response.
|
|
*/
|
|
void iot_sg_sta_meter_read_done_framework(uint8_t data_type, iot_pkt_t *rsp_pkt);
|
|
|
|
/**
|
|
* @brief iot_sg_sta_correct_time_compensate() - correct time compensate.
|
|
* @param cco_ntb: ntb from cco
|
|
* @param data: pointer to the correct time message.
|
|
* @param length: length of data.
|
|
*/
|
|
void iot_sg_sta_correct_time_compensate(
|
|
uint32_t cco_ntb, uint8_t *data, uint32_t length);
|
|
|
|
/**
|
|
* @brief iot_sg_sta_minute_clct_is_enable() - get minute clct enable flag.
|
|
* @retval: 1 - enable minute clct.
|
|
* @retval: 0 - disable minute clct.
|
|
*/
|
|
uint8_t iot_sg_sta_minute_clct_is_enable();
|
|
|
|
/**
|
|
* @brief iot_sg_sta_br2_record_init() - br2 record init.
|
|
*/
|
|
void iot_sg_sta_br2_record_init(void);
|
|
|
|
/**
|
|
* @brief handle msdu msg.
|
|
* @param pkt: need to handle msdu data pointer.
|
|
* @param msdu: msdu data pointer.
|
|
*/
|
|
void iot_sg_sta_handle_msdu_msg(iot_pkt_t *pkt, iot_plc_msdu_recv_t *msdu);
|
|
|
|
/**
|
|
* @brief: sta add a meter reading request from customer app.
|
|
* @param pkt: need to send data pkt
|
|
* @param seq: sequence of request.
|
|
* @param proto_type: protocol type in data,
|
|
* see GW_APP_DATA_TYPE_XXX.
|
|
* @param timeout: meter read time out, unit is 100ms.
|
|
* @param flag_head: flag of add a new request after the req list head.
|
|
* @retval: ERR_OK -- handle success.
|
|
* @retval: otherwise -- handle false, see ERR_XXX.
|
|
*/
|
|
uint32_t iot_sg_sta_add_cus_mr_req(iot_pkt_t *pkt, uint16_t seq,
|
|
uint8_t proto_type, uint16_t timeout, uint8_t flag_head);
|
|
|
|
/**
|
|
* @brief: handle meter reading response for customer app.
|
|
* @param pkt: need to handle meter reading response data pointer.
|
|
*/
|
|
void iot_sg_sta_handle_cus_mr_resp(iot_pkt_t *pkt);
|
|
|
|
/**
|
|
* @brief: handle extend gw collection task data report message send.
|
|
* @param data: report data.
|
|
* @param len: length of report data.
|
|
* @param cnt: dl/t698.45 message cnt in report data.
|
|
* @param seq: sequence of report data.
|
|
* @param send_done_func: send done callback function.
|
|
* @retval: ERR_OK -- handle success.
|
|
* @retval: otherwise -- handle false, see ERR_XXX.
|
|
*/
|
|
uint32_t iot_sg_sta_clct_data_rpt_send(uint8_t *data,
|
|
uint16_t len, uint8_t cnt, uint16_t seq,
|
|
iot_pkt_free_func_t send_done_func);
|
|
|
|
/**
|
|
* @brief report edge computing health event to cco.
|
|
*
|
|
* @param addr power meter address.
|
|
* @param score meter score.
|
|
* @param bitmap score desc bitmap.
|
|
*/
|
|
uint32_t iot_sg_sta_report_ec_health_event(
|
|
uint8_t *addr, uint8_t score, iot_sg_sta_drv_score_bit_map_t *bitmap);
|
|
|
|
/**
|
|
* @brief report edge computing overvoltage event to cco.
|
|
*
|
|
* @param addr power meter address.
|
|
* @param is_three_phase is three phase
|
|
* @param av voltage value of phase-A, format is bin, unit is V
|
|
* @param bv voltage value of phase-B, format is bin, unit is V
|
|
* @param cv voltage value of phase-C, format is bin, unit is V
|
|
*/
|
|
uint32_t iot_sg_sta_report_ec_overvoltage_event(uint8_t *addr,
|
|
uint8_t is_three_phase, uint16_t av, uint16_t bv, uint16_t cv);
|
|
|
|
/**
|
|
* @brief report edge computing undervoltage event to cco.
|
|
*
|
|
* @param addr power meter address.
|
|
* @param is_three_phase is three phase
|
|
* @param av voltage value of phase-A, format is bin, unit is V
|
|
* @param bv voltage value of phase-B, format is bin, unit is V
|
|
* @param cv voltage value of phase-C, format is bin, unit is V
|
|
*/
|
|
uint32_t iot_sg_sta_report_ec_undervoltage_event(uint8_t *addr,
|
|
uint8_t is_three_phase, uint16_t av, uint16_t bv, uint16_t cv);
|
|
|
|
/**
|
|
* @brief report edge computing second pulse event to cco.
|
|
*
|
|
* @param addr power meter address.
|
|
* @param err_val clock error value compare for 1s,
|
|
* unit is 1us.
|
|
*/
|
|
uint32_t iot_sg_sta_report_ec_second_pulse_event(
|
|
uint8_t *addr, uint16_t err_val);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* IOT_SG_STA_H */
|