@@ -242,10 +242,53 @@ CommissioningStage AutoCommissioner::GetNextCommissioningStageInternal(Commissio
242
242
// Per the spec, we restart from after adding the NOC.
243
243
return GetNextCommissioningStage (CommissioningStage::kSendNOC , lastErr);
244
244
}
245
+ if (mParams .GetCheckForMatchingFabric ())
246
+ {
247
+ return CommissioningStage::kCheckForMatchingFabric ;
248
+ }
249
+ return CommissioningStage::kArmFailsafe ;
250
+ case CommissioningStage::kCheckForMatchingFabric :
245
251
return CommissioningStage::kArmFailsafe ;
246
252
case CommissioningStage::kArmFailsafe :
247
253
return CommissioningStage::kConfigRegulatory ;
248
254
case CommissioningStage::kConfigRegulatory :
255
+ if (mDeviceCommissioningInfo .requiresUTC )
256
+ {
257
+ return CommissioningStage::kConfigureUTCTime ;
258
+ }
259
+ else
260
+ {
261
+ // Time cluster is not supported, move right to DA
262
+ return CommissioningStage::kSendPAICertificateRequest ;
263
+ }
264
+ case CommissioningStage::kConfigureUTCTime :
265
+ if (mDeviceCommissioningInfo .requiresTimeZone && mParams .GetTimeZone ().HasValue ())
266
+ {
267
+ return kConfigureTimeZone ;
268
+ }
269
+ else
270
+ {
271
+ return GetNextCommissioningStageInternal (CommissioningStage::kConfigureTimeZone , lastErr);
272
+ }
273
+ case CommissioningStage::kConfigureTimeZone :
274
+ if (mNeedsDST && mParams .GetDSTOffsets ().HasValue ())
275
+ {
276
+ return CommissioningStage::kConfigureDSTOffset ;
277
+ }
278
+ else
279
+ {
280
+ return GetNextCommissioningStageInternal (CommissioningStage::kConfigureDSTOffset , lastErr);
281
+ }
282
+ case CommissioningStage::kConfigureDSTOffset :
283
+ if (mDeviceCommissioningInfo .requiresDefaultNTP && mParams .GetDefaultNTP ().HasValue ())
284
+ {
285
+ return CommissioningStage::kConfigureDefaultNTP ;
286
+ }
287
+ else
288
+ {
289
+ return GetNextCommissioningStageInternal (CommissioningStage::kConfigureDefaultNTP , lastErr);
290
+ }
291
+ case CommissioningStage::kConfigureDefaultNTP :
249
292
return CommissioningStage::kSendPAICertificateRequest ;
250
293
case CommissioningStage::kSendPAICertificateRequest :
251
294
return CommissioningStage::kSendDACCertificateRequest ;
@@ -264,6 +307,15 @@ CommissioningStage AutoCommissioner::GetNextCommissioningStageInternal(Commissio
264
307
case CommissioningStage::kSendTrustedRootCert :
265
308
return CommissioningStage::kSendNOC ;
266
309
case CommissioningStage::kSendNOC :
310
+ if (mDeviceCommissioningInfo .requiresTrustedTimeSource && mParams .GetTrustedTimeSource ().HasValue ())
311
+ {
312
+ return CommissioningStage::kConfigureTrustedTimeSource ;
313
+ }
314
+ else
315
+ {
316
+ return GetNextCommissioningStageInternal (CommissioningStage::kConfigureTrustedTimeSource , lastErr);
317
+ }
318
+ case CommissioningStage::kConfigureTrustedTimeSource :
267
319
// TODO(cecille): device attestation casues operational cert provisioning to happen, This should be a separate stage.
268
320
// For thread and wifi, this should go to network setup then enable. For on-network we can skip right to finding the
269
321
// operational network because the provisioning of certificates will trigger the device to start operational advertising.
@@ -580,11 +632,20 @@ CHIP_ERROR AutoCommissioner::CommissioningStepFinished(CHIP_ERROR err, Commissio
580
632
.SetRemoteProductId (mDeviceCommissioningInfo .basic .productId )
581
633
.SetDefaultRegulatoryLocation (mDeviceCommissioningInfo .general .currentRegulatoryLocation )
582
634
.SetLocationCapability (mDeviceCommissioningInfo .general .locationCapability );
583
- if (mDeviceCommissioningInfo .nodeId != kUndefinedNodeId )
635
+ // Don't send DST unless the device says it needs it
636
+ mNeedsDST = false ;
637
+ break ;
638
+ case CommissioningStage::kCheckForMatchingFabric : {
639
+ chip::NodeId nodeId = report.Get <MatchingFabricInfo>().nodeId ;
640
+ if (nodeId != kUndefinedNodeId )
584
641
{
585
- mParams .SetRemoteNodeId (mDeviceCommissioningInfo . nodeId );
642
+ mParams .SetRemoteNodeId (nodeId);
586
643
}
587
644
break ;
645
+ }
646
+ case CommissioningStage::kConfigureTimeZone :
647
+ mNeedsDST = report.Get <TimeZoneResponseInfo>().requiresDSTOffsets ;
648
+ break ;
588
649
case CommissioningStage::kSendPAICertificateRequest :
589
650
SetPAI (report.Get <RequestedCertificate>().certificate );
590
651
break ;
@@ -650,6 +711,7 @@ CHIP_ERROR AutoCommissioner::CommissioningStepFinished(CHIP_ERROR err, Commissio
650
711
mCommissioneeDeviceProxy = nullptr ;
651
712
mOperationalDeviceProxy = OperationalDeviceProxy ();
652
713
mDeviceCommissioningInfo = ReadCommissioningInfo ();
714
+ mNeedsDST = false ;
653
715
return CHIP_NO_ERROR;
654
716
default :
655
717
break ;
@@ -692,6 +754,26 @@ CHIP_ERROR AutoCommissioner::PerformStep(CommissioningStage nextStage)
692
754
ChipLogError (Controller, " Invalid device for commissioning" );
693
755
return CHIP_ERROR_INCORRECT_STATE;
694
756
}
757
+ // Perform any last minute parameter adjustments before calling the commissioner object
758
+ switch (nextStage)
759
+ {
760
+ case CommissioningStage::kConfigureTimeZone :
761
+ if (mParams .GetTimeZone ().Value ().size () > mDeviceCommissioningInfo .maxTimeZoneSize )
762
+ {
763
+ mParams .SetTimeZone (app::DataModel::List<app::Clusters::TimeSynchronization::Structs::TimeZoneStruct::Type>(
764
+ mParams .GetTimeZone ().Value ().SubSpan (0 , mDeviceCommissioningInfo .maxTimeZoneSize )));
765
+ }
766
+ break ;
767
+ case CommissioningStage::kConfigureDSTOffset :
768
+ if (mParams .GetDSTOffsets ().Value ().size () > mDeviceCommissioningInfo .maxDSTSize )
769
+ {
770
+ mParams .SetDSTOffsets (app::DataModel::List<app::Clusters::TimeSynchronization::Structs::DSTOffsetStruct::Type>(
771
+ mParams .GetDSTOffsets ().Value ().SubSpan (0 , mDeviceCommissioningInfo .maxDSTSize )));
772
+ }
773
+ break ;
774
+ default :
775
+ break ;
776
+ }
695
777
696
778
mCommissioner ->PerformCommissioningStep (proxy, nextStage, mParams , this , GetEndpoint (nextStage),
697
779
GetCommandTimeout (proxy, nextStage));
0 commit comments