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