• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021-2022 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 #include <inttypes.h>
17 #include "state_machine.h"
18 #include "wifi_log.h"
19 
20 #undef LOG_TAG
21 #define LOG_TAG "OHWIFI_STATE_MACHINE"
22 
23 namespace OHOS {
24 namespace Wifi {
25 static const int SM_INIT_CMD = -2;
StateMachine(const std::string & name)26 StateMachine::StateMachine(const std::string &name) : pStateMachineHandler(nullptr), mStateName(name)
27 {}
28 
~StateMachine()29 StateMachine::~StateMachine()
30 {
31     LOGD("StateMachine::~StateMachine");
32     if (pStateMachineHandler != nullptr) {
33         delete pStateMachineHandler;
34     }
35 }
36 
InitialStateMachine()37 bool StateMachine::InitialStateMachine()
38 {
39     pStateMachineHandler = new (std::nothrow) StateMachineHandler(this);
40     if (pStateMachineHandler == nullptr) {
41         LOGE("pStateMachineHandler alloc failed.\n");
42         return false;
43     }
44 
45     if (!pStateMachineHandler->InitialSmHandler()) {
46         LOGE("InitialStateMachineHandler failed.\n");
47         return false;
48     }
49 
50     return true;
51 }
52 
StartStateMachine()53 void StateMachine::StartStateMachine()
54 {
55     if (pStateMachineHandler == nullptr) {
56         LOGE("Start StateMachine failed, pStateMachineHandler is nullptr!");
57         return;
58     }
59 
60     pStateMachineHandler->BuildTreeComplete();
61     return;
62 }
63 
SetHandler(StateMachineHandler * handler)64 void StateMachine::SetHandler(StateMachineHandler *handler)
65 {
66     pStateMachineHandler = handler;
67 }
68 
NotExecutedMessage(const InternalMessage * msg)69 void StateMachine::NotExecutedMessage(const InternalMessage *msg)
70 {
71     if (msg == nullptr) {
72         return;
73     }
74     LOGD("msg not handled  msg:%{public}d", msg->GetMessageName());
75 }
76 
StatePlus(State * state,State * upper)77 void StateMachine::StatePlus(State *state, State *upper)
78 {
79     if (pStateMachineHandler == nullptr) {
80         LOGE("Start StateMachine failed, pStateMachineHandler is nullptr!");
81         return;
82     }
83 
84     pStateMachineHandler->StatePlus(state, upper);
85 }
86 
StateDelete(State * state)87 void StateMachine::StateDelete(State *state)
88 {
89     if (pStateMachineHandler == nullptr) {
90         LOGE("Start StateMachine failed, pStateMachineHandler is nullptr!");
91         return;
92     }
93 
94     pStateMachineHandler->StateDelete(state);
95 }
96 
SetFirstState(State * firstState)97 void StateMachine::SetFirstState(State *firstState)
98 {
99     if (pStateMachineHandler == nullptr) {
100         LOGE("Start StateMachine failed, pStateMachineHandler is nullptr!");
101         return;
102     }
103 
104     pStateMachineHandler->SetFirstState(firstState);
105 }
106 
SwitchState(State * targetState)107 void StateMachine::SwitchState(State *targetState)
108 {
109     if (pStateMachineHandler == nullptr) {
110         LOGE("Start StateMachine failed, pStateMachineHandler is nullptr!");
111         return;
112     }
113 
114     pStateMachineHandler->SwitchState(targetState);
115 }
116 
DelayMessage(const InternalMessage * msg)117 void StateMachine::DelayMessage(const InternalMessage *msg)
118 {
119     if (pStateMachineHandler == nullptr) {
120         LOGE("Start StateMachine failed, pStateMachineHandler is nullptr!");
121         return;
122     }
123 
124     pStateMachineHandler->DelayMessage(msg);
125 }
126 
StopHandlerThread()127 void StateMachine::StopHandlerThread()
128 {
129     if (pStateMachineHandler == nullptr) {
130         LOGE("Start StateMachine failed, pStateMachineHandler is nullptr!");
131         return;
132     }
133 
134     pStateMachineHandler->StopHandlerThread();
135 }
136 
CreateMessage()137 InternalMessage *StateMachine::CreateMessage()
138 {
139     return MessageManage::GetInstance().CreateMessage();
140 }
141 
CreateMessage(const InternalMessage * orig)142 InternalMessage *StateMachine::CreateMessage(const InternalMessage *orig)
143 {
144     if (orig == nullptr) {
145         return nullptr;
146     }
147     return MessageManage::GetInstance().CreateMessage(orig);
148 }
149 
CreateMessage(int msgName)150 InternalMessage *StateMachine::CreateMessage(int msgName)
151 {
152     return MessageManage::GetInstance().CreateMessage(msgName);
153 }
154 
CreateMessage(int msgName,int param1)155 InternalMessage *StateMachine::CreateMessage(int msgName, int param1)
156 {
157     return MessageManage::GetInstance().CreateMessage(msgName, param1, 0);
158 }
159 
CreateMessage(int msgName,int param1,int param2)160 InternalMessage *StateMachine::CreateMessage(int msgName, int param1, int param2)
161 {
162     return MessageManage::GetInstance().CreateMessage(msgName, param1, param2);
163 }
164 
CreateMessage(int msgName,const std::any & messageObj)165 InternalMessage *StateMachine::CreateMessage(int msgName, const std::any &messageObj)
166 {
167     return MessageManage::GetInstance().CreateMessage(msgName, messageObj);
168 }
169 
CreateMessage(int msgName,int param1,int param2,const std::any & messageObj)170 InternalMessage *StateMachine::CreateMessage(int msgName, int param1, int param2, const std::any &messageObj)
171 {
172     return MessageManage::GetInstance().CreateMessage(msgName, param1, param2, messageObj);
173 }
174 
SendMessage(int msgName)175 void StateMachine::SendMessage(int msgName)
176 {
177     pStateMachineHandler->SendMessage(CreateMessage(msgName));
178     return;
179 }
180 
SendMessage(int msgName,int param1)181 void StateMachine::SendMessage(int msgName, int param1)
182 {
183     pStateMachineHandler->SendMessage(CreateMessage(msgName, param1));
184     return;
185 }
186 
SendMessage(int msgName,int param1,int param2)187 void StateMachine::SendMessage(int msgName, int param1, int param2)
188 {
189     pStateMachineHandler->SendMessage(CreateMessage(msgName, param1, param2));
190     return;
191 }
192 
SendMessage(InternalMessage * msg)193 void StateMachine::SendMessage(InternalMessage *msg)
194 {
195     if (msg == nullptr) {
196         return;
197     }
198     pStateMachineHandler->SendMessage(msg);
199     return;
200 }
201 
SendMessage(int msgName,const std::any & messageObj)202 void StateMachine::SendMessage(int msgName, const std::any &messageObj)
203 {
204     pStateMachineHandler->SendMessage(CreateMessage(msgName, messageObj));
205     return;
206 }
207 
SendMessage(int msgName,int param1,int param2,const std::any & messageObj)208 void StateMachine::SendMessage(int msgName, int param1, int param2, const std::any &messageObj)
209 {
210     pStateMachineHandler->SendMessage(CreateMessage(msgName, param1, param2, messageObj));
211     return;
212 }
213 
MessageExecutedLater(int msgName,int64_t delayTimeMs)214 void StateMachine::MessageExecutedLater(int msgName, int64_t delayTimeMs)
215 {
216     pStateMachineHandler->MessageExecutedLater(CreateMessage(msgName), delayTimeMs);
217     return;
218 }
219 
MessageExecutedLater(int msgName,int param1,int64_t delayTimeMs)220 void StateMachine::MessageExecutedLater(int msgName, int param1, int64_t delayTimeMs)
221 {
222     pStateMachineHandler->MessageExecutedLater(CreateMessage(msgName, param1), delayTimeMs);
223     return;
224 }
225 
MessageExecutedLater(int msgName,int param1,int param2,int64_t delayTimeMs)226 void StateMachine::MessageExecutedLater(int msgName, int param1, int param2, int64_t delayTimeMs)
227 {
228     pStateMachineHandler->MessageExecutedLater(CreateMessage(msgName, param1, param2), delayTimeMs);
229     return;
230 }
231 
MessageExecutedLater(InternalMessage * msg,int64_t delayTimeMs)232 void StateMachine::MessageExecutedLater(InternalMessage *msg, int64_t delayTimeMs)
233 {
234     pStateMachineHandler->MessageExecutedLater(msg, delayTimeMs);
235     return;
236 }
237 
MessageExecutedLater(int msgName,const std::any & messageObj,int64_t delayTimeMs)238 void StateMachine::MessageExecutedLater(int msgName, const std::any &messageObj, int64_t delayTimeMs)
239 {
240     pStateMachineHandler->MessageExecutedLater(CreateMessage(msgName, messageObj), delayTimeMs);
241     return;
242 }
243 
MessageExecutedLater(int msgName,int param1,int param2,const std::any & messageObj,int64_t delayTimeMs)244 void StateMachine::MessageExecutedLater(
245     int msgName, int param1, int param2, const std::any &messageObj, int64_t delayTimeMs)
246 {
247     pStateMachineHandler->MessageExecutedLater(CreateMessage(msgName, param1, param2, messageObj), delayTimeMs);
248     return;
249 }
250 
StartTimer(int timerName,int64_t interval)251 void StateMachine::StartTimer(int timerName, int64_t interval)
252 {
253     LOGD("Enter StateMachine::StartTimer, timerName is %{public}d, interval is %" PRIu64 ".", timerName, interval);
254     MessageExecutedLater(timerName, interval);
255     return;
256 }
257 
StopTimer(int timerName)258 void StateMachine::StopTimer(int timerName)
259 {
260     LOGD("Enter StateMachine::StopTimer, timerName is %{public}d.", timerName);
261     pStateMachineHandler->DeleteMessageFromQueue(timerName);
262     return;
263 }
264 
StateMachineHandler(StateMachine * pStateMgr)265 StateMachineHandler::StateMachineHandler(StateMachine *pStateMgr)
266 {
267     mStateInfoMap.clear();
268     mStateVector.clear();
269     mStateVectorTopIndex = -1;
270     mSequenceStateVector.clear();
271     mSequenceStateVectorCount = 0;
272     mDelayedMessages.clear();
273     pStateMachine = pStateMgr;
274     pFirstState = nullptr;
275     pTargetState = nullptr;
276     mQuitFlag = false;
277     mBuildCompleteFlag = false;
278     mSwitchingStateFlag = false;
279     pCurrentMsg = nullptr;
280 }
281 
~StateMachineHandler()282 StateMachineHandler::~StateMachineHandler()
283 {
284     LOGD("StateMachineHandler::~StateMachineHandler");
285     StopHandlerThread();
286     ReleaseDelayedMessages();
287     ClearWhenQuit();
288     return;
289 }
290 
InitialSmHandler()291 bool StateMachineHandler::InitialSmHandler()
292 {
293     if (!InitialHandler()) {
294         return false;
295     }
296     return true;
297 }
298 
StatePlus(State * state,State * upper)299 StateInfo *StateMachineHandler::StatePlus(State *state, State *upper)
300 {
301     LOGD("Enter StateMachineHandler::StatePlus function.");
302 
303     StateInfo *upperStateInfo = nullptr;
304     StateInfoMap::iterator it = mStateInfoMap.begin();
305     if (upper != nullptr) {
306         it = mStateInfoMap.find(upper->GetStateName());
307         if (it != mStateInfoMap.end()) {
308             upperStateInfo = it->second;
309         }
310         if (upperStateInfo == nullptr) {
311             LOGD("upperStateInfo is null, add upper first. upper->GetStateName():%{public}s",
312                 upper->GetStateName().c_str());
313             /* Recursively add our upper as it's not been added yet. */
314             StatePlus(upper, nullptr);
315         } else {
316             LOGD("upperStateInfo is not null, go on.");
317         }
318     }
319 
320     StateInfo *stateInfo = nullptr;
321     it = mStateInfoMap.find(state->GetStateName());
322     if (it != mStateInfoMap.end()) {
323         stateInfo = it->second;
324     }
325     if (stateInfo == nullptr) {
326         stateInfo = new (std::nothrow) StateInfo();
327         if (stateInfo == nullptr) {
328             LOGE("failed to new StateInfo!");
329             return nullptr;
330         }
331         mStateInfoMap.insert(StateInfoMap::value_type(state->GetStateName(), stateInfo));
332     }
333 
334     /* Validate that we aren't adding the same state in two different hierarchies. */
335     if (stateInfo->upperStateInfo != nullptr && stateInfo->upperStateInfo != upperStateInfo) {
336         LOGE("The same state cannot be added to two different hierarchies!");
337     }
338 
339     stateInfo->state = state;
340     stateInfo->upperStateInfo = upperStateInfo;
341     stateInfo->active = false;
342 
343     LOGD("successfully added a new state!");
344 
345     return stateInfo;
346 }
347 
StateDelete(State * state)348 void StateMachineHandler::StateDelete(State *state)
349 {
350     StateInfoMap::iterator it = mStateInfoMap.find(state->GetStateName());
351     StateInfo *stateInfo = nullptr;
352     if (it != mStateInfoMap.end()) {
353         stateInfo = it->second;
354     }
355     if (stateInfo == nullptr || stateInfo->active) {
356         return;
357     }
358 
359     it = mStateInfoMap.begin();
360     while (it != mStateInfoMap.end()) {
361         if (it->second->upperStateInfo == stateInfo) {
362             return;
363         }
364         ++it;
365     }
366 
367     it = mStateInfoMap.find(state->GetStateName());
368     if (it != mStateInfoMap.end()) {
369         delete it->second;
370         it->second = nullptr;
371         mStateInfoMap.erase(it);
372     }
373 }
374 
SetFirstState(State * firstState)375 void StateMachineHandler::SetFirstState(State *firstState)
376 {
377     pFirstState = firstState;
378 }
379 
BuildTreeComplete()380 void StateMachineHandler::BuildTreeComplete()
381 {
382     /* Determines the maximum depth of the state hierarchy. */
383     int maxDepth = 0;
384     StateInfoMap::iterator it = mStateInfoMap.begin();
385     while (it != mStateInfoMap.end()) {
386         int depth = 0;
387         StateInfo *tempStateInfo = it->second;
388         while (tempStateInfo != nullptr) {
389             depth++;
390             tempStateInfo = tempStateInfo->upperStateInfo;
391         }
392 
393         if (maxDepth < depth) {
394             maxDepth = depth;
395         }
396 
397         ++it;
398     }
399 
400     LOGD("StateMachineHandler::BuildTreeComplete, maxDepth:%{public}d", maxDepth);
401     mStateVector.resize(maxDepth);
402     mSequenceStateVector.resize(maxDepth);
403     BuildStateInitVector();
404     MessageExecutedAtTime(pStateMachine->CreateMessage(SM_INIT_CMD), 0);
405     return;
406 }
407 
BuildStateInitVector()408 void StateMachineHandler::BuildStateInitVector()
409 {
410     LOGD("StateMachineHandler::BuildStateInitVector");
411 
412     if (pFirstState == nullptr) {
413         LOGE("StateMachineHandler::BuildStateInitVector  please set initial state first!");
414         return;
415     }
416 
417     StateInfoMap::iterator it = mStateInfoMap.find(pFirstState->GetStateName());
418     StateInfo *startStateInfo = nullptr;
419     if (it != mStateInfoMap.end()) {
420         startStateInfo = it->second;
421     }
422 
423     for (mSequenceStateVectorCount = 0; startStateInfo != nullptr; mSequenceStateVectorCount++) {
424         mSequenceStateVector[mSequenceStateVectorCount] = startStateInfo;
425         startStateInfo = startStateInfo->upperStateInfo;
426     }
427 
428     /* Clearing the StateVector. */
429     mStateVectorTopIndex = -1;
430     MoveSequenceToStateVector();
431 }
432 
BuildSequenceStateVector(State * targetState)433 StateInfo *StateMachineHandler::BuildSequenceStateVector(State *targetState)
434 {
435     mSequenceStateVectorCount = 0;
436     StateInfoMap::iterator it = mStateInfoMap.find(targetState->GetStateName());
437     StateInfo *curStateInfo = nullptr;
438     if (it != mStateInfoMap.end()) {
439         curStateInfo = it->second;
440     }
441 
442     if (curStateInfo == nullptr) {
443         return nullptr;
444     }
445 
446     do {
447         mSequenceStateVector[mSequenceStateVectorCount++] = curStateInfo;
448         curStateInfo = curStateInfo->upperStateInfo;
449     } while ((curStateInfo != nullptr) && (!curStateInfo->active));
450 
451     return curStateInfo;
452 }
453 
PlaceDelayedMsgQueueTop()454 void StateMachineHandler::PlaceDelayedMsgQueueTop()
455 {
456     LOGD("Enter StateMachineHandler::PlaceDelayedMsgQueueTop.");
457 
458     for (int i = mDelayedMessages.size() - 1; i >= 0; i--) {
459         InternalMessage *curMsg = mDelayedMessages[i];
460         if (curMsg == nullptr) {
461             LOGE("StateMachineHandler::PlaceDelayedMsgQueueTop: curMsg is null.");
462             continue;
463         }
464         PlaceMessageTopOfQueue(curMsg);
465     }
466     mDelayedMessages.clear();
467 
468     return;
469 }
470 
ReleaseDelayedMessages()471 void StateMachineHandler::ReleaseDelayedMessages()
472 {
473     for (int i = mDelayedMessages.size() - 1; i >= 0; i--) {
474         InternalMessage *curMsg = mDelayedMessages[i];
475         if (curMsg != nullptr) {
476             delete curMsg;
477         }
478     }
479     mDelayedMessages.clear();
480 
481     return;
482 }
483 
MoveSequenceToStateVector()484 int StateMachineHandler::MoveSequenceToStateVector()
485 {
486     LOGD("StateMachineHandler::MoveSequenceToStateVector mSequenceStateVectorCount:%{public}d",
487         mSequenceStateVectorCount);
488 
489     int newIndex = mStateVectorTopIndex + 1;
490     int i = mSequenceStateVectorCount - 1;
491     int j = newIndex;
492     while (i >= 0) {
493         mStateVector[j] = mSequenceStateVector[i];
494         j += 1;
495         i -= 1;
496     }
497 
498     mStateVectorTopIndex = j - 1;
499     return newIndex;
500 }
501 
SwitchState(State * targetState)502 void StateMachineHandler::SwitchState(State *targetState)
503 {
504     pTargetState = static_cast<State *>(targetState);
505 }
506 
ClearWhenQuit()507 void StateMachineHandler::ClearWhenQuit()
508 {
509     pStateMachine->SetHandler(nullptr);
510     pStateMachine = nullptr;
511     pCurrentMsg = nullptr;
512     mStateVector.clear();
513     mSequenceStateVector.clear();
514     mDelayedMessages.clear();
515     pFirstState = nullptr;
516     pTargetState = nullptr;
517     mQuitFlag = true;
518 
519     StateInfoMap::iterator it = mStateInfoMap.begin();
520     while (it != mStateInfoMap.end()) {
521         delete it->second;
522         it->second = nullptr;
523         it = mStateInfoMap.erase(it);
524     }
525     mStateInfoMap.clear();
526 }
527 
PerformSwitchState(State * msgProcessedState,InternalMessage * msg)528 void StateMachineHandler::PerformSwitchState(State *msgProcessedState, InternalMessage *msg)
529 {
530     if (msgProcessedState == nullptr || msg == nullptr) {
531         LOGE("poniter is null.");
532     }
533 
534     State *targetState = pTargetState;
535     if (targetState != nullptr) {
536         LOGD("StateMachineHandler::PerformSwitchState targetState name is: %{public}s",
537             targetState->GetStateName().c_str());
538         while (true) {
539             StateInfo *commonStateInfo = BuildSequenceStateVector(targetState);
540             mSwitchingStateFlag = true;
541             CallTreeStateExits(commonStateInfo);
542 
543             int stateListEnteringIndex = MoveSequenceToStateVector();
544             CallTreeStateEnters(stateListEnteringIndex);
545 
546             PlaceDelayedMsgQueueTop();
547 
548             if (targetState != pTargetState) {
549                 targetState = pTargetState;
550             } else {
551                 break;
552             }
553         }
554         pTargetState = nullptr;
555     }
556 
557     return;
558 }
559 
ExecuteMessage(InternalMessage * msg)560 void StateMachineHandler::ExecuteMessage(InternalMessage *msg)
561 {
562     if (msg == nullptr) {
563         return;
564     }
565     if (!mQuitFlag) {
566         if (pStateMachine != nullptr && msg->GetMessageName() != SM_INIT_CMD) {
567         }
568 
569         pCurrentMsg = msg;
570 
571         State *msgProcessedState = nullptr;
572         if (mBuildCompleteFlag) {
573             LOGD("StateMachineHandler::ExecuteMessage  ExecuteTreeStateMsg!");
574             msgProcessedState = ExecuteTreeStateMsg(msg);
575         } else if (!mBuildCompleteFlag && msg->GetMessageName() == SM_INIT_CMD) {
576             LOGD("StateMachineHandler::ExecuteMessage  msg: SM_INIT_CMD");
577             mBuildCompleteFlag = true;
578             CallTreeStateEnters(0);
579         } else {
580             LOGE("The start method not called!");
581         }
582 
583         if (pStateMachine != nullptr) {
584             PerformSwitchState(msgProcessedState, msg);
585         } else {
586             LOGE("poniter is null.");
587         }
588 
589         if (pStateMachine != nullptr && msg->GetMessageName() != SM_INIT_CMD) {
590         }
591     }
592 
593     return;
594 }
595 
DelayMessage(const InternalMessage * msg)596 void StateMachineHandler::DelayMessage(const InternalMessage *msg)
597 {
598     LOGD("Enter StateMachineHandler::DelayMessage.");
599     if (msg == nullptr) {
600         return;
601     }
602 
603     InternalMessage *newMsg = pStateMachine->CreateMessage(msg);
604     if (newMsg == nullptr) {
605         LOGE("StateMachineHandler::DelayMessage: newMsg is null.");
606         return;
607     }
608     mDelayedMessages.push_back(newMsg);
609     return;
610 }
611 
ExecuteTreeStateMsg(InternalMessage * msg)612 State *StateMachineHandler::ExecuteTreeStateMsg(InternalMessage *msg)
613 {
614     LOGD("StateMachineHandler::ExecuteTreeStateMsg mStateVectorTopIndex:%{public}d", mStateVectorTopIndex);
615     if (msg == nullptr) {
616         return nullptr;
617     }
618 
619     StateInfo *curStateInfo = mStateVector[mStateVectorTopIndex];
620     if (curStateInfo == nullptr) {
621         LOGE("StateInfo is null.");
622         return nullptr;
623     }
624 
625     if (curStateInfo->state) {
626         LOGI("State machine: %{public}s execute Cmd:%{public}d",
627             curStateInfo->state->GetStateName().c_str(), msg->GetMessageName());
628     }
629 
630     while (curStateInfo->state && (!curStateInfo->state->ExecuteStateMsg(msg))) {
631         curStateInfo = curStateInfo->upperStateInfo;
632 
633         if (curStateInfo == nullptr) {
634             pStateMachine->NotExecutedMessage(msg);
635             break;
636         }
637     }
638 
639     return (curStateInfo != nullptr) ? curStateInfo->state : nullptr;
640 }
641 
CallTreeStateExits(StateInfo * commonStateInfo)642 void StateMachineHandler::CallTreeStateExits(StateInfo *commonStateInfo)
643 {
644     while ((mStateVectorTopIndex >= 0) && (mStateVector[mStateVectorTopIndex] != commonStateInfo)) {
645         if (mStateVector[mStateVectorTopIndex] != nullptr) {
646             State *curState = mStateVector[mStateVectorTopIndex]->state;
647             if (curState != nullptr) {
648                 curState->GoOutState();
649             }
650             mStateVector[mStateVectorTopIndex]->active = false;
651         }
652         mStateVectorTopIndex -= 1;
653     }
654 }
655 
CallTreeStateEnters(int index)656 void StateMachineHandler::CallTreeStateEnters(int index)
657 {
658     for (int i = index; i <= mStateVectorTopIndex; i++) {
659         if (index == mStateVectorTopIndex) {
660             /* Last enter state for transition. */
661             mSwitchingStateFlag = false;
662         }
663         LOGD("StateMachineHandler::CallTreeStateEnters  mStateVectorTopIndex:%{public}d, i: %{public}d",
664             mStateVectorTopIndex,
665             i);
666         if (mStateVector[i] != nullptr && mStateVector[i]->state != nullptr) {
667             mStateVector[i]->state->GoInState();
668             mStateVector[i]->active = true;
669         }
670     }
671     /* ensure flag set to false if no methods called. */
672     mSwitchingStateFlag = false;
673 }
674 }  // namespace Wifi
675 }  // namespace OHOS