1 /*
2  * Copyright (c) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef LNN_HEARTBEAT_FSM_H
17 #define LNN_HEARTBEAT_FSM_H
18 
19 #include "common_list.h"
20 #include "lnn_heartbeat_medium_mgr.h"
21 #include "lnn_state_machine.h"
22 
23 #ifdef __cplusplus
24 extern "C" {
25 #endif
26 
27 #define PKG_NAME_SIZE_MAX 65
28 
29 typedef enum {
30     STATE_HB_INDEX_MIN = 0,
31     STATE_HB_NONE_INDEX = STATE_HB_INDEX_MIN,
32     STATE_HB_NORMAL_NODE_INDEX,
33     STATE_HB_MASTER_NODE_INDEX,
34     STATE_HB_INDEX_MAX,
35 } LnnHeartbeatState;
36 
37 typedef enum {
38     EVENT_HB_MIN = 0,
39     EVENT_HB_AS_MASTER_NODE,
40     EVENT_HB_AS_NORMAL_NODE,
41     EVENT_HB_IN_NONE_STATE,
42     EVENT_HB_PROCESS_SEND_ONCE,
43     EVENT_HB_SEND_ONE_BEGIN = 5,
44     EVENT_HB_SEND_ONE_END,
45     EVENT_HB_CHECK_DEV_STATUS,
46     EVENT_HB_START_PROCESS,
47     EVENT_HB_STOP_SPECIFIC,
48     EVENT_HB_SET_MEDIUM_PARAM = 10,
49     EVENT_HB_UPDATE_SEND_INFO,
50     EVENT_HB_SCREEN_OFF_CHECK_STATUS,
51     EVENT_HB_MAX,
52 } LnnHeartbeatEventType;
53 
54 typedef struct {
55     ListNode node;
56     uint16_t id;
57     LnnHeartbeatType hbType;
58 
59     char fsmName[HB_FSM_NAME_LEN];
60     FsmStateMachine fsm;
61     LnnHeartbeatState state;
62     LnnHeartbeatStrategyType strategyType;
63 } LnnHeartbeatFsm;
64 
65 typedef struct {
66     LnnHeartbeatType hbType;
67     bool wakeupFlag;
68     bool isRelay;
69     bool *isRemoved;
70 } LnnRemoveSendEndMsgPara;
71 
72 typedef struct {
73     LnnHeartbeatType hbType;
74     ConnectionAddrType addrType;
75     bool hasNetworkId;
76     bool isWakeUp;
77     const char networkId[NETWORK_ID_BUF_LEN];
78 } LnnCheckDevStatusMsgPara;
79 
80 typedef struct {
81     LnnHeartbeatType hbType;
82     LnnHeartbeatStrategyType strategyType;
83     bool isRelay;
84     bool isSyncData;
85     bool isNeedRestart;
86     bool hasScanRsp;
87     bool isFirstBegin;
88     bool isFast;
89     char callerId[PKG_NAME_SIZE_MAX];
90 } LnnProcessSendOnceMsgPara;
91 
92 int32_t LnnStartHeartbeatFsm(LnnHeartbeatFsm *hbFsm);
93 int32_t LnnStopHeartbeatFsm(LnnHeartbeatFsm *hbFsm);
94 
95 int32_t LnnPostNextSendOnceMsgToHbFsm(
96     LnnHeartbeatFsm *hbFsm, const LnnProcessSendOnceMsgPara *para, uint64_t delayMillis);
97 int32_t LnnPostSendBeginMsgToHbFsm(LnnHeartbeatFsm *hbFsm, LnnHeartbeatType type, bool wakeupFlag,
98     LnnProcessSendOnceMsgPara *msgPara, uint64_t delayMillis);
99 int32_t LnnPostSendEndMsgToHbFsm(LnnHeartbeatFsm *hbFsm, LnnHeartbeatSendEndData *custData, uint64_t delayMillis);
100 int32_t LnnPostStartMsgToHbFsm(LnnHeartbeatFsm *hbFsm, uint64_t delayMillis);
101 int32_t LnnPostStopMsgToHbFsm(LnnHeartbeatFsm *hbFsm, LnnHeartbeatType type);
102 int32_t LnnPostTransStateMsgToHbFsm(LnnHeartbeatFsm *hbFsm, LnnHeartbeatEventType evtType);
103 int32_t LnnPostSetMediumParamMsgToHbFsm(LnnHeartbeatFsm *hbFsm, const LnnHeartbeatMediumParam *para);
104 int32_t LnnPostCheckDevStatusMsgToHbFsm(
105     LnnHeartbeatFsm *hbFsm, const LnnCheckDevStatusMsgPara *para, uint64_t delayMillis);
106 int32_t LnnPostUpdateSendInfoMsgToHbFsm(LnnHeartbeatFsm *hbFsm, LnnHeartbeatUpdateInfoType type);
107 int32_t LnnPostScreenOffCheckDevMsgToHbFsm(
108     LnnHeartbeatFsm *hbFsm, const LnnCheckDevStatusMsgPara *para, uint64_t delayMillis);
109 
110 void LnnRemoveSendEndMsg(LnnHeartbeatFsm *hbFsm, LnnHeartbeatType type, bool wakeupFlag, bool isRelay, bool *isRemoved);
111 void LnnRemoveCheckDevStatusMsg(LnnHeartbeatFsm *hbFsm, LnnCheckDevStatusMsgPara *msgPara);
112 void LnnRemoveScreenOffCheckStatusMsg(LnnHeartbeatFsm *hbFsm, LnnCheckDevStatusMsgPara *msgPara);
113 void LnnRemoveProcessSendOnceMsg(
114     LnnHeartbeatFsm *hbFsm, LnnHeartbeatType hbType, LnnHeartbeatStrategyType strategyType);
115 
116 LnnHeartbeatFsm *LnnCreateHeartbeatFsm(void);
117 void LnnDestroyHeartbeatFsm(LnnHeartbeatFsm *hbFsm);
118 
119 #ifdef __cplusplus
120 }
121 #endif
122 #endif /* LNN_HEARTBEAT_FSM_H */
123