@@ -35,10 +35,10 @@ static void onOperationalStateTimerTick(System::Layer * systemLayer, void * data
35
35
36
36
DataModel::Nullable<uint32_t > RvcOperationalStateDelegate::GetCountdownTime ()
37
37
{
38
- if (mRunningTime > mPhaseDuration .Value ())
38
+ if (mCountdownTime . IsNull () || mRunningTime > mCountdownTime .Value ())
39
39
return DataModel::NullNullable;
40
40
41
- return DataModel::MakeNullable ((uint32_t ) (mPhaseDuration .Value () - mRunningTime ));
41
+ return DataModel::MakeNullable ((uint32_t ) (mCountdownTime .Value () - mRunningTime ));
42
42
}
43
43
44
44
CHIP_ERROR RvcOperationalStateDelegate::GetOperationalStateAtIndex (size_t index, GenericOperationalState & operationalState)
@@ -62,10 +62,27 @@ CHIP_ERROR RvcOperationalStateDelegate::GetOperationalPhaseAtIndex(size_t index,
62
62
63
63
void RvcOperationalStateDelegate::HandlePauseStateCallback (GenericOperationalError & err)
64
64
{
65
+ OperationalState::OperationalStateEnum state =
66
+ static_cast <OperationalState::OperationalStateEnum>(gRvcOperationalStateInstance ->GetCurrentOperationalState ());
67
+
68
+ if (state == OperationalState::OperationalStateEnum::kPaused )
69
+ {
70
+ err.Set (to_underlying (OperationalState::ErrorStateEnum::kNoError ));
71
+ return ;
72
+ }
73
+
74
+ if (state == OperationalState::OperationalStateEnum::kStopped || state == OperationalState::OperationalStateEnum::kError )
75
+ {
76
+ err.Set (to_underlying (OperationalState::ErrorStateEnum::kCommandInvalidInState ));
77
+ return ;
78
+ }
79
+
65
80
// placeholder implementation
66
- auto error = GetInstance () ->SetOperationalState (to_underlying (OperationalState::OperationalStateEnum::kPaused ));
81
+ auto error = gRvcOperationalStateInstance ->SetOperationalState (to_underlying (OperationalState::OperationalStateEnum::kPaused ));
67
82
if (error == CHIP_NO_ERROR)
68
83
{
84
+ (void ) DeviceLayer::SystemLayer ().StartTimer (System::Clock::Seconds16 (1 ), onOperationalStateTimerTick, GetInstance ());
85
+ GetInstance ()->UpdateCountdownTimeFromDelegate ();
69
86
err.Set (to_underlying (OperationalState::ErrorStateEnum::kNoError ));
70
87
}
71
88
else
@@ -76,10 +93,21 @@ void RvcOperationalStateDelegate::HandlePauseStateCallback(GenericOperationalErr
76
93
77
94
void RvcOperationalStateDelegate::HandleResumeStateCallback (GenericOperationalError & err)
78
95
{
96
+ OperationalState::OperationalStateEnum state =
97
+ static_cast <OperationalState::OperationalStateEnum>(gRvcOperationalStateInstance ->GetCurrentOperationalState ());
98
+
99
+ if (state == OperationalState::OperationalStateEnum::kStopped || state == OperationalState::OperationalStateEnum::kError )
100
+ {
101
+ err.Set (to_underlying (OperationalState::ErrorStateEnum::kUnableToStartOrResume ));
102
+ return ;
103
+ }
104
+
79
105
// placeholder implementation
80
- auto error = GetInstance () ->SetOperationalState (to_underlying (OperationalState::OperationalStateEnum::kRunning ));
106
+ auto error = gRvcOperationalStateInstance ->SetOperationalState (to_underlying (OperationalState::OperationalStateEnum::kRunning ));
81
107
if (error == CHIP_NO_ERROR)
82
108
{
109
+ (void ) DeviceLayer::SystemLayer ().StartTimer (System::Clock::Seconds16 (1 ), onOperationalStateTimerTick, GetInstance ());
110
+ GetInstance ()->UpdateCountdownTimeFromDelegate ();
83
111
err.Set (to_underlying (OperationalState::ErrorStateEnum::kNoError ));
84
112
}
85
113
else
@@ -103,7 +131,8 @@ void RvcOperationalStateDelegate::HandleStartStateCallback(GenericOperationalErr
103
131
auto error = GetInstance ()->SetOperationalState (to_underlying (OperationalState::OperationalStateEnum::kRunning ));
104
132
if (error == CHIP_NO_ERROR)
105
133
{
106
- (void ) DeviceLayer::SystemLayer ().StartTimer (System::Clock::Seconds16 (1 ), onOperationalStateTimerTick, this );
134
+ (void ) DeviceLayer::SystemLayer ().StartTimer (System::Clock::Seconds16 (1 ), onOperationalStateTimerTick, GetInstance ());
135
+ GetInstance ()->UpdateCountdownTimeFromDelegate ();
107
136
err.Set (to_underlying (OperationalState::ErrorStateEnum::kNoError ));
108
137
}
109
138
else
@@ -119,6 +148,7 @@ void RvcOperationalStateDelegate::HandleStopStateCallback(GenericOperationalErro
119
148
if (error == CHIP_NO_ERROR)
120
149
{
121
150
(void ) DeviceLayer::SystemLayer ().CancelTimer (onOperationalStateTimerTick, this );
151
+ GetInstance ()->UpdateCountdownTimeFromDelegate ();
122
152
123
153
OperationalState::GenericOperationalError current_err (to_underlying (OperationalState::ErrorStateEnum::kNoError ));
124
154
GetInstance ()->GetCurrentOperationalError (current_err);
@@ -130,6 +160,7 @@ void RvcOperationalStateDelegate::HandleStopStateCallback(GenericOperationalErro
130
160
131
161
mRunningTime = 0 ;
132
162
mPausedTime = 0 ;
163
+ mCountdownTime .SetNull ();
133
164
err.Set (to_underlying (OperationalState::ErrorStateEnum::kNoError ));
134
165
}
135
166
else
@@ -145,27 +176,54 @@ static void onOperationalStateTimerTick(System::Layer * systemLayer, void * data
145
176
OperationalState::OperationalStateEnum state =
146
177
static_cast <OperationalState::OperationalStateEnum>(instance->GetCurrentOperationalState ());
147
178
148
- auto countdown_time = delegate->GetCountdownTime ();
149
-
150
- if (countdown_time.ValueOr (1 ) > 0 )
179
+ if (gRvcOperationalStateDelegate ->mCountdownTime .IsNull ())
151
180
{
152
181
if (state == OperationalState::OperationalStateEnum::kRunning )
153
182
{
154
- delegate->mRunningTime ++;
155
- }
156
- else if (state == OperationalState::OperationalStateEnum::kPaused )
157
- {
158
- delegate->mPausedTime ++;
183
+ gRvcOperationalStateDelegate ->mCountdownTime .SetNonNull (
184
+ static_cast <uint32_t >(gRvcOperationalStateDelegate ->kExampleCountDown ));
185
+ gRvcOperationalStateDelegate ->mRunningTime = 0 ;
186
+ gRvcOperationalStateDelegate ->mPausedTime = 0 ;
159
187
}
160
188
}
161
189
162
- if (state == OperationalState::OperationalStateEnum::kRunning || state == OperationalState::OperationalStateEnum::kPaused )
190
+ if (state == OperationalState::OperationalStateEnum::kRunning )
191
+ {
192
+ gRvcOperationalStateDelegate ->mRunningTime ++;
193
+ }
194
+ else if (state == OperationalState::OperationalStateEnum::kPaused )
195
+ {
196
+ gRvcOperationalStateDelegate ->mPausedTime ++;
197
+ }
198
+
199
+ uint32_t mPausedTime = gRvcOperationalStateDelegate ->mPausedTime ;
200
+ uint32_t mRunningTime = gRvcOperationalStateDelegate ->mRunningTime ;
201
+
202
+ if (gRvcOperationalStateDelegate ->mCountdownTime .Value () > mRunningTime )
163
203
{
164
204
(void ) DeviceLayer::SystemLayer ().StartTimer (System::Clock::Seconds16 (1 ), onOperationalStateTimerTick, delegate);
165
205
}
166
206
else
167
207
{
168
208
(void ) DeviceLayer::SystemLayer ().CancelTimer (onOperationalStateTimerTick, delegate);
209
+
210
+ CHIP_ERROR err =
211
+ gRvcOperationalStateInstance ->SetOperationalState (to_underlying (OperationalState::OperationalStateEnum::kStopped ));
212
+ if (err == CHIP_NO_ERROR)
213
+ {
214
+ OperationalState::GenericOperationalError current_err (to_underlying (OperationalState::ErrorStateEnum::kNoError ));
215
+ gRvcOperationalStateInstance ->GetCurrentOperationalError (current_err);
216
+
217
+ Optional<DataModel::Nullable<uint32_t >> totalTime ((DataModel::Nullable<uint32_t >(mPausedTime + mRunningTime )));
218
+ Optional<DataModel::Nullable<uint32_t >> pausedTime ((DataModel::Nullable<uint32_t >(mPausedTime )));
219
+
220
+ gRvcOperationalStateInstance ->OnOperationCompletionDetected (static_cast <uint8_t >(current_err.errorStateID ), totalTime,
221
+ pausedTime);
222
+
223
+ gRvcOperationalStateDelegate ->mRunningTime = 0 ;
224
+ gRvcOperationalStateDelegate ->mPausedTime = 0 ;
225
+ gRvcOperationalStateDelegate ->mCountdownTime .SetNull ();
226
+ }
169
227
}
170
228
}
171
229
@@ -200,8 +258,17 @@ chip::Protocols::InteractionModel::Status chefRvcOperationalStateWriteCallback(c
200
258
}
201
259
break ;
202
260
case chip::app::Clusters::RvcOperationalState::Attributes::OperationalState::Id: {
203
- uint8_t m = static_cast <uint8_t >(buffer[0 ]);
204
- CHIP_ERROR err = gRvcOperationalStateInstance ->SetOperationalState (m);
261
+ uint8_t currentState = gRvcOperationalStateInstance ->GetCurrentOperationalState ();
262
+ uint8_t m = static_cast <uint8_t >(buffer[0 ]);
263
+ CHIP_ERROR err = gRvcOperationalStateInstance ->SetOperationalState (m);
264
+
265
+ if (currentState == to_underlying (OperationalState::OperationalStateEnum::kStopped ) &&
266
+ m == to_underlying (OperationalState::OperationalStateEnum::kRunning ))
267
+ {
268
+ gRvcOperationalStateDelegate ->mCountdownTime .SetNonNull (
269
+ static_cast <uint32_t >(gRvcOperationalStateDelegate ->kExampleCountDown ));
270
+ }
271
+
205
272
if (CHIP_NO_ERROR == err)
206
273
{
207
274
break ;
0 commit comments