@@ -37,10 +37,10 @@ using namespace chip::app::Clusters::ClosureControl;
3737using namespace chip ::app::Clusters::ClosureDimension;
3838
3939namespace {
40- constexpr uint32_t kDefaultCountdownTimeSeconds = 10 ; // 10 seconds
41- constexpr uint32_t kCalibrateTimerMs = 10000 ; // 10 seconds
42- constexpr uint32_t kMotionCountdownTimeMs = 1000 ; // 1 second for each motion.
43- constexpr chip::Percent100ths kMotionPositionStep = 1000 ; // 10 % of the total range per motion interval.
40+ constexpr uint32_t kDefaultCountdownTimeSeconds = 10 ; // 10 seconds
41+ constexpr uint32_t kCalibrateCountdownTimeMs = 3000 ; // 3 seconds
42+ constexpr uint32_t kMotionCountdownTimeMs = 1000 ; // 1 second for each motion.
43+ constexpr chip::Percent100ths kMotionPositionStep = 2000 ; // 20 % of the total range per motion interval.
4444
4545// Define the Namespace and Tag for the endpoint
4646// Derived from https://github.com/CHIP-Specifications/connectedhomeip-spec/blob/master/src/namespaces/Namespace-Closure.adoc
@@ -168,7 +168,7 @@ CHIP_ERROR ClosureManager::SetClosurePanelInitialState(ClosureDimensionEndpoint
168168 ReturnErrorOnFailure (closurePanelEndpoint.GetLogic ().SetTargetState (targetState));
169169
170170 ReturnErrorOnFailure (closurePanelEndpoint.GetLogic ().SetResolution (Percent100ths (100 )));
171- ReturnErrorOnFailure (closurePanelEndpoint.GetLogic ().SetStepValue (1000 ));
171+ ReturnErrorOnFailure (closurePanelEndpoint.GetLogic ().SetStepValue (2000 ));
172172 ReturnErrorOnFailure (closurePanelEndpoint.GetLogic ().SetUnit (ClosureUnitEnum::kMillimeter ));
173173 ReturnErrorOnFailure (closurePanelEndpoint.GetLogic ().SetUnitRange (
174174 ClosureDimension::Structs::UnitRangeStruct::Type{ .min = static_cast <int16_t >(0 ), .max = static_cast <int16_t >(10000 ) }));
@@ -227,7 +227,7 @@ void ClosureManager::InitiateAction(AppEvent * event)
227227 ChipLogDetail (AppServer, " Initiating calibration action" );
228228 // Timer used in sample application to simulate the calibration process.
229229 // In a real application, this would be replaced with actual calibration logic.
230- instance.StartTimer (kCalibrateTimerMs );
230+ instance.StartTimer (kCalibrateCountdownTimeMs );
231231 break ;
232232 case Action_t::MOVE_TO_ACTION:
233233 ChipLogDetail (AppServer, " Initiating move to action" );
@@ -535,16 +535,16 @@ chip::Protocols::InteractionModel::Status ClosureManager::OnMoveToCommand(const
535535 mClosurePanelEndpoint3Position = static_cast <Percent100ths>(0 );
536536 break ;
537537 case TargetPositionEnum::kMoveToPedestrianPosition :
538- mClosurePanelEndpoint2Position = static_cast <Percent100ths>(3000 );
539- mClosurePanelEndpoint3Position = static_cast <Percent100ths>(3000 );
538+ mClosurePanelEndpoint2Position = static_cast <Percent100ths>(6000 );
539+ mClosurePanelEndpoint3Position = static_cast <Percent100ths>(6000 );
540540 break ;
541541 case TargetPositionEnum::kMoveToSignaturePosition :
542- mClosurePanelEndpoint2Position = static_cast <Percent100ths>(2000 );
543- mClosurePanelEndpoint3Position = static_cast <Percent100ths>(2000 );
542+ mClosurePanelEndpoint2Position = static_cast <Percent100ths>(4000 );
543+ mClosurePanelEndpoint3Position = static_cast <Percent100ths>(4000 );
544544 break ;
545545 case TargetPositionEnum::kMoveToVentilationPosition :
546- mClosurePanelEndpoint2Position = static_cast <Percent100ths>(1000 );
547- mClosurePanelEndpoint3Position = static_cast <Percent100ths>(1000 );
546+ mClosurePanelEndpoint2Position = static_cast <Percent100ths>(2000 );
547+ mClosurePanelEndpoint3Position = static_cast <Percent100ths>(2000 );
548548 break ;
549549 default :
550550 ChipLogError (AppServer, " Invalid target position received in OnMoveToCommand" );
@@ -1102,7 +1102,11 @@ void ClosureManager::HandlePanelStepAction(EndpointId endpointId)
11021102 }
11031103 else
11041104 {
1105- nextCurrentPosition = std::max (static_cast <chip::Percent100ths>(currentPosition - stepValue), targetPosition);
1105+ // Underflow protection: if currentPosition <= stepValue, set to 0.
1106+ chip::Percent100ths decreasedCurrentPosition = (currentPosition > stepValue)
1107+ ? static_cast <chip::Percent100ths>(currentPosition - stepValue)
1108+ : static_cast <chip::Percent100ths>(0 );
1109+ nextCurrentPosition = std::max (decreasedCurrentPosition, targetPosition);
11061110 }
11071111
11081112 panelCurrentState.Value ().position .SetValue (DataModel::MakeNullable (nextCurrentPosition));
@@ -1157,14 +1161,18 @@ bool ClosureManager::GetPanelNextPosition(const GenericDimensionStateStruct & cu
11571161
11581162 if (currentPosition < targetPosition)
11591163 {
1160- // Increment position by 1000 units, capped at target.
1164+ // Increment position by 2000 units, capped at target.
1165+ // No overflow handling needed due to currentposition max value is 10000
11611166 nextPosition.SetNonNull (std::min (static_cast <chip::Percent100ths>(currentPosition + kMotionPositionStep ), targetPosition));
11621167 }
11631168 else if (currentPosition > targetPosition)
11641169 {
1165- // Moving down: Decreasing the current position by a step of 1000 units,
1170+ // Handling overflow for CurrentPosition
1171+ chip::Percent100ths newCurrentPosition =
1172+ (currentPosition > kMotionPositionStep ) ? currentPosition - kMotionPositionStep : 0 ;
1173+ // Moving down: Decreasing the current position by a step of 2000 units,
11661174 // ensuring it does not go below the target position.
1167- nextPosition.SetNonNull (std::max (static_cast <chip::Percent100ths>(currentPosition - kMotionPositionStep ) , targetPosition));
1175+ nextPosition.SetNonNull (std::max (newCurrentPosition , targetPosition));
11681176 }
11691177 else
11701178 {
0 commit comments