Skip to content

Commit 848f98c

Browse files
committed
Address review comments
1 parent 0b8df82 commit 848f98c

File tree

4 files changed

+113
-12
lines changed

4 files changed

+113
-12
lines changed

examples/fabric-admin/commands/fabric-sync/FabricSyncCommand.cpp

+50-6
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,11 @@ using namespace ::chip;
3131

3232
namespace {
3333

34-
constexpr uint16_t kRetryIntervalS = 3;
35-
constexpr uint16_t kMaxManaulCodeLength = 11;
34+
// Constants
35+
constexpr uint32_t kCommissionPrepareTimeMs = 500;
36+
constexpr uint16_t kMaxManaulCodeLength = 11;
37+
constexpr uint16_t kSubscribeMinInterval = 0;
38+
constexpr uint16_t kSubscribeMaxInterval = 60;
3639

3740
} // namespace
3841

@@ -55,21 +58,62 @@ void FabricSyncDeviceCommand::OnCommissioningWindowOpened(NodeId deviceId, CHIP_
5558
CHIP_ERROR error = ManualSetupPayloadGenerator(payload).payloadDecimalStringRepresentation(manualCode);
5659
if (error == CHIP_NO_ERROR)
5760
{
58-
char command[64];
59-
snprintf(command, sizeof(command), "pairing code 3 %s", payloadBuffer);
61+
char command[kMaxCommandSize];
62+
NodeId nodeId = 2; // TODO: need to switch to dynamically assigned ID
63+
snprintf(command, sizeof(command), "pairing code %ld %s", nodeId, payloadBuffer);
64+
65+
PairingCommand * pairingCommand = static_cast<PairingCommand *>(CommandMgr().GetCommandByName("pairing", "code"));
66+
67+
if (pairingCommand == nullptr)
68+
{
69+
ChipLogError(NotSpecified, "Pairing code command is not available");
70+
return;
71+
}
72+
73+
pairingCommand->RegisterCommissioningDelegate(this);
74+
mAssignedNodeId = nodeId;
75+
76+
usleep(kCommissionPrepareTimeMs * 1000);
77+
6078
PushCommand(command);
6179
}
6280
else
6381
{
6482
ChipLogError(NotSpecified, "Unable to generate manual code for setup payload: %" CHIP_ERROR_FORMAT, error.Format());
6583
}
6684
}
85+
else
86+
{
87+
ChipLogError(NotSpecified,
88+
"Failed to open synced device (0x:" ChipLogFormatX64 ") commissioning window: %" CHIP_ERROR_FORMAT,
89+
ChipLogValueX64(deviceId), err.Format());
90+
}
91+
}
92+
93+
void FabricSyncDeviceCommand::OnCommissioningComplete(chip::NodeId deviceId, CHIP_ERROR err)
94+
{
95+
if (mAssignedNodeId != deviceId)
96+
{
97+
return;
98+
}
99+
100+
if (err == CHIP_NO_ERROR)
101+
{
102+
// TODO: AddSyncedDevice
103+
}
104+
else
105+
{
106+
ChipLogError(NotSpecified, "Failed to pair synced device (0x:" ChipLogFormatX64 ") with error: %" CHIP_ERROR_FORMAT,
107+
ChipLogValueX64(deviceId), err.Format());
108+
}
67109
}
68110

69111
CHIP_ERROR FabricSyncDeviceCommand::RunCommand(EndpointId remoteId)
70112
{
71-
char command[64];
72-
snprintf(command, sizeof(command), "pairing open-commissioning-window 1 %d 1 300 1000 3840", remoteId);
113+
char command[kMaxCommandSize];
114+
NodeId bridgeNodeId = 1; // TODO: need to switch to configured ID
115+
snprintf(command, sizeof(command), "pairing open-commissioning-window %ld %d %d %d %d %d", bridgeNodeId, remoteId,
116+
kEnhancedCommissioningMethod, kWindowTimeout, kIteration, kDiscriminator);
73117

74118
OpenCommissioningWindowCommand * openCommand =
75119
static_cast<OpenCommissioningWindowCommand *>(CommandMgr().GetCommandByName("pairing", "open-commissioning-window"));

examples/fabric-admin/commands/fabric-sync/FabricSyncCommand.h

+15-4
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,15 @@
2020

2121
#include <commands/common/CHIPCommand.h>
2222
#include <commands/pairing/OpenCommissioningWindowCommand.h>
23+
#include <commands/pairing/PairingCommand.h>
24+
25+
constexpr uint32_t kSetupPinCode = 20202021;
26+
constexpr uint16_t kMaxCommandSize = 64;
27+
constexpr uint16_t kDiscriminator = 3840;
28+
constexpr uint16_t kWindowTimeout = 300;
29+
constexpr uint16_t kIteration = 1000;
30+
constexpr uint16_t kAggragatorEndpointId = 1;
31+
constexpr uint8_t kEnhancedCommissioningMethod = 1;
2332

2433
class FabricSyncAddDeviceCommand : public CHIPCommand
2534
{
@@ -40,23 +49,25 @@ class FabricSyncAddDeviceCommand : public CHIPCommand
4049
CHIP_ERROR RunCommand(NodeId remoteId);
4150
};
4251

43-
class FabricSyncDeviceCommand : public CHIPCommand, CommissioningWindowDelegate
52+
class FabricSyncDeviceCommand : public CHIPCommand, public CommissioningWindowDelegate, public CommissioningDelegate
4453
{
4554
public:
4655
FabricSyncDeviceCommand(CredentialIssuerCommands * credIssuerCommands) : CHIPCommand("sync-device", credIssuerCommands)
4756
{
48-
AddArgument("endpointid", 0, UINT16_MAX, &mEndpointId);
57+
AddArgument("endpointid", 0, UINT16_MAX, &mRemoteEndpointId);
4958
}
5059

5160
void OnCommissioningWindowOpened(NodeId deviceId, CHIP_ERROR status, chip::SetupPayload payload) override;
61+
void OnCommissioningComplete(NodeId deviceId, CHIP_ERROR err) override;
5262

5363
/////////// CHIPCommand Interface /////////
54-
CHIP_ERROR RunCommand() override { return RunCommand(mEndpointId); }
64+
CHIP_ERROR RunCommand() override { return RunCommand(mRemoteEndpointId); }
5565

5666
chip::System::Clock::Timeout GetWaitDuration() const override { return chip::System::Clock::Seconds16(1); }
5767

5868
private:
59-
chip::EndpointId mEndpointId;
69+
chip::EndpointId mRemoteEndpointId = chip::kInvalidEndpointId;
70+
chip::NodeId mAssignedNodeId = chip::kUndefinedNodeId;
6071

6172
CHIP_ERROR RunCommand(chip::EndpointId remoteId);
6273
};

examples/fabric-admin/commands/pairing/PairingCommand.cpp

+20-1
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,7 @@ void PairingCommand::OnCommissioningComplete(NodeId nodeId, CHIP_ERROR err)
393393
{
394394
if (err == CHIP_NO_ERROR)
395395
{
396+
// print to console
396397
fprintf(stderr, "New device with Node ID: 0x%lx has been successfully added.\n", nodeId);
397398

398399
#if defined(PW_RPC_ENABLED)
@@ -414,6 +415,12 @@ void PairingCommand::OnCommissioningComplete(NodeId nodeId, CHIP_ERROR err)
414415
ChipLogProgress(NotSpecified, "Device commissioning Failure: %s", ErrorStr(err));
415416
}
416417

418+
if (mCommissioningDelegate)
419+
{
420+
mCommissioningDelegate->OnCommissioningComplete(nodeId, err);
421+
this->UnregisterCommissioningDelegate();
422+
}
423+
417424
SetCommandExitStatus(err);
418425
}
419426

@@ -528,13 +535,25 @@ void PairingCommand::OnCurrentFabricRemove(void * context, NodeId nodeId, CHIP_E
528535

529536
if (err == CHIP_NO_ERROR)
530537
{
531-
ChipLogProgress(NotSpecified, "Device unpair completed with success: " ChipLogFormatX64, ChipLogValueX64(nodeId));
538+
// print to console
539+
fprintf(stderr, "Device with Node ID: 0x%lx has been successfully removed.\n", nodeId);
540+
541+
#if defined(PW_RPC_ENABLED)
542+
RemoveSynchronizedDevice(nodeId);
543+
#endif
532544
}
533545
else
534546
{
535547
ChipLogProgress(NotSpecified, "Device unpair Failure: " ChipLogFormatX64 " %s", ChipLogValueX64(nodeId), ErrorStr(err));
536548
}
537549

550+
PairingDelegate * pairingDelegate = command->GetPairingDelegate();
551+
if (pairingDelegate)
552+
{
553+
pairingDelegate->OnDeviceRemoved(nodeId, err);
554+
command->UnregisterPairingDelegate();
555+
}
556+
538557
command->SetCommandExitStatus(err);
539558
}
540559

examples/fabric-admin/commands/pairing/PairingCommand.h

+28-1
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,20 @@ enum class PairingNetworkType
4545
Thread,
4646
};
4747

48+
class CommissioningDelegate
49+
{
50+
public:
51+
virtual void OnCommissioningComplete(chip::NodeId deviceId, CHIP_ERROR err) = 0;
52+
virtual ~CommissioningDelegate() = default;
53+
};
54+
55+
class PairingDelegate
56+
{
57+
public:
58+
virtual void OnDeviceRemoved(chip::NodeId deviceId, CHIP_ERROR err) = 0;
59+
virtual ~PairingDelegate() = default;
60+
};
61+
4862
class PairingCommand : public CHIPCommand,
4963
public chip::Controller::DevicePairingDelegate,
5064
public chip::Controller::DeviceDiscoveryDelegate,
@@ -73,6 +87,7 @@ class PairingCommand : public CHIPCommand,
7387
AddArgument("icd-symmetric-key", &mICDSymmetricKey, "The 16 bytes ICD symmetric key, default: randomly generated.");
7488
AddArgument("icd-stay-active-duration", 0, UINT32_MAX, &mICDStayActiveDurationMsec,
7589
"If set, a LIT ICD that is commissioned will be requested to stay active for this many milliseconds");
90+
7691
switch (networkType)
7792
{
7893
case PairingNetworkType::None:
@@ -202,12 +217,21 @@ class PairingCommand : public CHIPCommand,
202217
/////////// DeviceDiscoveryDelegate Interface /////////
203218
void OnDiscoveredDevice(const chip::Dnssd::CommissionNodeData & nodeData) override;
204219

205-
/////////// DeviceAttestationDelegate /////////
220+
/////////// DeviceAttestationDelegate Interface /////////
206221
chip::Optional<uint16_t> FailSafeExpiryTimeoutSecs() const override;
207222
void OnDeviceAttestationCompleted(chip::Controller::DeviceCommissioner * deviceCommissioner, chip::DeviceProxy * device,
208223
const chip::Credentials::DeviceAttestationVerifier::AttestationDeviceInfo & info,
209224
chip::Credentials::AttestationVerificationResult attestationResult) override;
210225

226+
/////////// CommissioningDelegate /////////
227+
void RegisterCommissioningDelegate(CommissioningDelegate * delegate) { mCommissioningDelegate = delegate; }
228+
void UnregisterCommissioningDelegate() { mCommissioningDelegate = nullptr; }
229+
230+
/////////// PairingDelegate /////////
231+
void RegisterPairingDelegate(PairingDelegate * delegate) { mPairingDelegate = delegate; }
232+
void UnregisterPairingDelegate() { mPairingDelegate = nullptr; }
233+
PairingDelegate * GetPairingDelegate() { return mPairingDelegate; }
234+
211235
private:
212236
CHIP_ERROR RunInternal(NodeId remoteId);
213237
CHIP_ERROR Pair(NodeId remoteId, PeerAddress address);
@@ -262,6 +286,9 @@ class PairingCommand : public CHIPCommand,
262286
chip::Platform::UniquePtr<chip::Controller::CurrentFabricRemover> mCurrentFabricRemover;
263287
chip::Callback::Callback<chip::Controller::OnCurrentFabricRemove> mCurrentFabricRemoveCallback;
264288

289+
CommissioningDelegate * mCommissioningDelegate = nullptr;
290+
PairingDelegate * mPairingDelegate = nullptr;
291+
265292
static void OnCurrentFabricRemove(void * context, NodeId remoteNodeId, CHIP_ERROR status);
266293
void PersistIcdInfo();
267294
};

0 commit comments

Comments
 (0)