@@ -54,6 +54,139 @@ enum class ClosureControlTestEventTrigger : uint64_t
5454
5555} // namespace
5656
57+ namespace {
58+
59+ /* *
60+ * @brief Logs state transition information for debugging purposes
61+ * @param fromState The previous state
62+ * @param toState The new state
63+ * @param reason Optional reason for the state change
64+ */
65+ void LogStateTransition (MainStateEnum fromState, MainStateEnum toState, const char * reason = nullptr )
66+ {
67+ const char * fromStateStr = " Unknown" ;
68+ const char * toStateStr = " Unknown" ;
69+
70+ // Convert from state enum to string
71+ switch (fromState)
72+ {
73+ case MainStateEnum::kStopped :
74+ fromStateStr = " Stopped" ;
75+ break ;
76+ case MainStateEnum::kCalibrating :
77+ fromStateStr = " Calibrating" ;
78+ break ;
79+ case MainStateEnum::kMoving :
80+ fromStateStr = " Moving" ;
81+ break ;
82+ case MainStateEnum::kWaitingForMotion :
83+ fromStateStr = " WaitingForMotion" ;
84+ break ;
85+ case MainStateEnum::kError :
86+ fromStateStr = " Error" ;
87+ break ;
88+ case MainStateEnum::kProtected :
89+ fromStateStr = " Protected" ;
90+ break ;
91+ case MainStateEnum::kDisengaged :
92+ fromStateStr = " Disengaged" ;
93+ break ;
94+ case MainStateEnum::kSetupRequired :
95+ fromStateStr = " SetupRequired" ;
96+ break ;
97+ default :
98+ fromStateStr = " UnknownState" ;
99+ break ;
100+ }
101+
102+ // Convert to state enum to string
103+ switch (toState)
104+ {
105+ case MainStateEnum::kStopped :
106+ toStateStr = " Stopped" ;
107+ break ;
108+ case MainStateEnum::kCalibrating :
109+ toStateStr = " Calibrating" ;
110+ break ;
111+ case MainStateEnum::kMoving :
112+ toStateStr = " Moving" ;
113+ break ;
114+ case MainStateEnum::kWaitingForMotion :
115+ toStateStr = " WaitingForMotion" ;
116+ break ;
117+ case MainStateEnum::kError :
118+ toStateStr = " Error" ;
119+ break ;
120+ case MainStateEnum::kProtected :
121+ toStateStr = " Protected" ;
122+ break ;
123+ case MainStateEnum::kDisengaged :
124+ toStateStr = " Disengaged" ;
125+ break ;
126+ case MainStateEnum::kSetupRequired :
127+ toStateStr = " SetupRequired" ;
128+ break ;
129+ default :
130+ toStateStr = " UnknownState" ;
131+ break ;
132+ }
133+
134+ if (reason != nullptr )
135+ {
136+ ChipLogProgress (AppServer, " Closure state transition: %s -> %s (Reason: %s)" , fromStateStr, toStateStr, reason);
137+ }
138+ else
139+ {
140+ ChipLogProgress (AppServer, " Closure state transition: %s -> %s" , fromStateStr, toStateStr);
141+ }
142+ }
143+
144+ /* *
145+ * @brief Validates if a state transition is allowed
146+ * @param fromState The current state
147+ * @param toState The desired new state
148+ * @return true if transition is valid, false otherwise
149+ */
150+ bool IsValidStateTransition (MainStateEnum fromState, MainStateEnum toState)
151+ {
152+ // Allow transitions to Error state from any state
153+ if (toState == MainStateEnum::kError )
154+ {
155+ return true ;
156+ }
157+
158+ // Allow transitions from Error state to Stopped state
159+ if (fromState == MainStateEnum::kError && toState == MainStateEnum::kStopped )
160+ {
161+ return true ;
162+ }
163+
164+ // Allow transitions from Protected/Disengaged/SetupRequired to Stopped
165+ if ((fromState == MainStateEnum::kProtected || fromState == MainStateEnum::kDisengaged ||
166+ fromState == MainStateEnum::kSetupRequired ) && toState == MainStateEnum::kStopped )
167+ {
168+ return true ;
169+ }
170+
171+ // Normal operational transitions
172+ switch (fromState)
173+ {
174+ case MainStateEnum::kStopped :
175+ return (toState == MainStateEnum::kCalibrating || toState == MainStateEnum::kMoving ||
176+ toState == MainStateEnum::kWaitingForMotion );
177+ case MainStateEnum::kCalibrating :
178+ return (toState == MainStateEnum::kStopped );
179+ case MainStateEnum::kMoving :
180+ return (toState == MainStateEnum::kStopped );
181+ case MainStateEnum::kWaitingForMotion :
182+ return (toState == MainStateEnum::kStopped || toState == MainStateEnum::kMoving );
183+ default :
184+ return false ;
185+ }
186+ }
187+
188+ } // anonymous namespace
189+
57190Status ClosureControlDelegate::HandleCalibrateCommand ()
58191{
59192 return ClosureManager::GetInstance ().OnCalibrateCommand ();
0 commit comments