diff --git a/examples/fabric-admin/device_manager/DeviceSubscription.cpp b/examples/fabric-admin/device_manager/DeviceSubscription.cpp index dddb4f9f758291..e83eda282c476b 100644 --- a/examples/fabric-admin/device_manager/DeviceSubscription.cpp +++ b/examples/fabric-admin/device_manager/DeviceSubscription.cpp @@ -17,7 +17,10 @@ */ #include "DeviceSubscription.h" + +#if defined(PW_RPC_ENABLED) #include "rpc/RpcClient.h" +#endif #include #include @@ -61,11 +64,14 @@ void DeviceSubscription::OnAttributeData(const ConcreteDataAttributePath & path, CHIP_ERROR err = data->Get(windowStatus); VerifyOrReturn(err == CHIP_NO_ERROR, ChipLogError(NotSpecified, "Failed to read WindowStatus")); VerifyOrReturn(windowStatus != Clusters::AdministratorCommissioning::CommissioningWindowStatusEnum::kUnknownEnumValue); +#if defined(PW_RPC_ENABLED) mCurrentAdministratorCommissioningAttributes.window_status = static_cast(windowStatus); - mChangeDetected = true; +#endif + mChangeDetected = true; break; } case Clusters::AdministratorCommissioning::Attributes::AdminFabricIndex::Id: { +#if defined(PW_RPC_ENABLED) FabricIndex fabricIndex; CHIP_ERROR err = data->Get(fabricIndex); mCurrentAdministratorCommissioningAttributes.has_opener_fabric_index = err == CHIP_NO_ERROR; @@ -73,10 +79,12 @@ void DeviceSubscription::OnAttributeData(const ConcreteDataAttributePath & path, { mCurrentAdministratorCommissioningAttributes.opener_fabric_index = static_cast(fabricIndex); } +#endif mChangeDetected = true; break; } case Clusters::AdministratorCommissioning::Attributes::AdminVendorId::Id: { +#if defined(PW_RPC_ENABLED) chip::VendorId vendorId; CHIP_ERROR err = data->Get(vendorId); mCurrentAdministratorCommissioningAttributes.has_opener_vendor_id = err == CHIP_NO_ERROR; @@ -84,6 +92,7 @@ void DeviceSubscription::OnAttributeData(const ConcreteDataAttributePath & path, { mCurrentAdministratorCommissioningAttributes.opener_vendor_id = static_cast(vendorId); } +#endif mChangeDetected = true; break; } @@ -111,7 +120,7 @@ void DeviceSubscription::OnDone(ReadClient * apReadClient) // After calling mOnDoneCallback we are indicating that `this` is deleted and we shouldn't do anything else with // DeviceSubscription. MoveToState(State::AwaitingDestruction); - mOnDoneCallback(mCurrentAdministratorCommissioningAttributes.node_id); + mOnDoneCallback(mNodeId); } void DeviceSubscription::OnError(CHIP_ERROR error) @@ -126,7 +135,7 @@ void DeviceSubscription::OnDeviceConnected(Messaging::ExchangeManager & exchange // After calling mOnDoneCallback we are indicating that `this` is deleted and we shouldn't do anything else with // DeviceSubscription. MoveToState(State::AwaitingDestruction); - mOnDoneCallback(mCurrentAdministratorCommissioningAttributes.node_id); + mOnDoneCallback(mNodeId); return; } VerifyOrDie(mState == State::Connecting); @@ -151,7 +160,7 @@ void DeviceSubscription::OnDeviceConnected(Messaging::ExchangeManager & exchange // After calling mOnDoneCallback we are indicating that `this` is deleted and we shouldn't do anything else with // DeviceSubscription. MoveToState(State::AwaitingDestruction); - mOnDoneCallback(mCurrentAdministratorCommissioningAttributes.node_id); + mOnDoneCallback(mNodeId); return; } MoveToState(State::SubscriptionStarted); @@ -194,7 +203,7 @@ void DeviceSubscription::OnDeviceConnectionFailure(const ScopedNodeId & peerId, // After calling mOnDoneCallback we are indicating that `this` is deleted and we shouldn't do anything else with // DeviceSubscription. MoveToState(State::AwaitingDestruction); - mOnDoneCallback(mCurrentAdministratorCommissioningAttributes.node_id); + mOnDoneCallback(mNodeId); } CHIP_ERROR DeviceSubscription::StartSubscription(OnDoneCallback onDoneCallback, Controller::DeviceController & controller, @@ -203,10 +212,14 @@ CHIP_ERROR DeviceSubscription::StartSubscription(OnDoneCallback onDoneCallback, assertChipStackLockedByCurrentThread(); VerifyOrDie(mState == State::Idle); + mNodeId = nodeId; + +#if defined(PW_RPC_ENABLED) mCurrentAdministratorCommissioningAttributes = chip_rpc_AdministratorCommissioningChanged_init_default; mCurrentAdministratorCommissioningAttributes.node_id = nodeId; mCurrentAdministratorCommissioningAttributes.window_status = static_cast(Clusters::AdministratorCommissioning::CommissioningWindowStatusEnum::kWindowNotOpen); +#endif mOnDoneCallback = onDoneCallback; MoveToState(State::Connecting); @@ -243,5 +256,5 @@ void DeviceSubscription::StopSubscription() // After calling mOnDoneCallback we are indicating that `this` is deleted and we shouldn't do anything else with // DeviceSubscription. MoveToState(State::AwaitingDestruction); - mOnDoneCallback(mCurrentAdministratorCommissioningAttributes.node_id); + mOnDoneCallback(mNodeId); } diff --git a/examples/fabric-admin/device_manager/DeviceSubscription.h b/examples/fabric-admin/device_manager/DeviceSubscription.h index 353eb30c1c7158..5d8403777364b7 100644 --- a/examples/fabric-admin/device_manager/DeviceSubscription.h +++ b/examples/fabric-admin/device_manager/DeviceSubscription.h @@ -23,8 +23,10 @@ #include +#if defined(PW_RPC_ENABLED) #include "fabric_bridge_service/fabric_bridge_service.pb.h" #include "fabric_bridge_service/fabric_bridge_service.rpc.pb.h" +#endif class DeviceSubscriptionManager; @@ -32,7 +34,7 @@ class DeviceSubscriptionManager; /// via RPC when change has been identified. /// /// An instance of DeviceSubscription is intended to be used only once. Once a DeviceSubscription is -/// terminal, either from an error or from subscriptions getting shut down, we expect the instance +/// terminated, either from an error or from subscriptions getting shut down, we expect the instance /// to be deleted. Any new subscription should instantiate another instance of DeviceSubscription. class DeviceSubscription : public chip::app::ReadClient::Callback { @@ -78,13 +80,18 @@ class DeviceSubscription : public chip::app::ReadClient::Callback void MoveToState(const State aTargetState); const char * GetStateStr() const; + chip::NodeId mNodeId = chip::kUndefinedNodeId; + OnDoneCallback mOnDoneCallback; std::unique_ptr mClient; chip::Callback::Callback mOnDeviceConnectedCallback; chip::Callback::Callback mOnDeviceConnectionFailureCallback; +#if defined(PW_RPC_ENABLED) chip_rpc_AdministratorCommissioningChanged mCurrentAdministratorCommissioningAttributes; +#endif + bool mChangeDetected = false; State mState = State::Idle; }; diff --git a/examples/fabric-admin/device_manager/DeviceSubscriptionManager.cpp b/examples/fabric-admin/device_manager/DeviceSubscriptionManager.cpp index c59fd98192cd47..b485806bef6292 100644 --- a/examples/fabric-admin/device_manager/DeviceSubscriptionManager.cpp +++ b/examples/fabric-admin/device_manager/DeviceSubscriptionManager.cpp @@ -17,7 +17,10 @@ */ #include "DeviceSubscriptionManager.h" + +#if defined(PW_RPC_ENABLED) #include "rpc/RpcClient.h" +#endif #include #include diff --git a/examples/fabric-admin/device_manager/DeviceSynchronization.cpp b/examples/fabric-admin/device_manager/DeviceSynchronization.cpp index 6cc1cea690df2f..cbf84e23d0b2ed 100644 --- a/examples/fabric-admin/device_manager/DeviceSynchronization.cpp +++ b/examples/fabric-admin/device_manager/DeviceSynchronization.cpp @@ -19,7 +19,10 @@ #include "DeviceSynchronization.h" #include "DeviceSubscriptionManager.h" + +#if defined(PW_RPC_ENABLED) #include "rpc/RpcClient.h" +#endif #include #include @@ -44,6 +47,7 @@ void OnDeviceConnectionFailureWrapper(void * context, const ScopedNodeId & peerI reinterpret_cast(context)->OnDeviceConnectionFailure(peerId, error); } +#if defined(PW_RPC_ENABLED) bool SuccessOrLog(CHIP_ERROR err, const char * name) { if (err == CHIP_NO_ERROR) @@ -55,6 +59,7 @@ bool SuccessOrLog(CHIP_ERROR err, const char * name) return false; } +#endif } // namespace @@ -82,6 +87,7 @@ void DeviceSynchronizer::OnAttributeData(const ConcreteDataAttributePath & path, switch (path.mAttributeId) { +#if defined(PW_RPC_ENABLED) case Clusters::BasicInformation::Attributes::UniqueID::Id: mCurrentDeviceData.has_unique_id = SuccessOrLog(data->GetString(mCurrentDeviceData.unique_id, sizeof(mCurrentDeviceData.unique_id)), "UniqueId"); @@ -120,6 +126,7 @@ void DeviceSynchronizer::OnAttributeData(const ConcreteDataAttributePath & path, data->GetString(mCurrentDeviceData.software_version_string, sizeof(mCurrentDeviceData.software_version_string)), "SoftwareVersionString"); break; +#endif // #if defined(PW_RPC_ENABLED) default: break; } @@ -134,7 +141,7 @@ void DeviceSynchronizer::OnReportEnd() void DeviceSynchronizer::OnDone(chip::app::ReadClient * apReadClient) { #if defined(PW_RPC_ENABLED) - if (mState == State::ReceivedResponse && !DeviceMgr().IsCurrentBridgeDevice(mCurrentDeviceData.node_id)) + if (mState == State::ReceivedResponse && !DeviceMgr().IsCurrentBridgeDevice(mNodeId)) { GetUniqueId(); if (mState == State::GettingUid) @@ -197,10 +204,14 @@ void DeviceSynchronizer::StartDeviceSynchronization(chip::Controller::DeviceCont return; } + mNodeId = nodeId; + +#if defined(PW_RPC_ENABLED) mCurrentDeviceData = chip_rpc_SynchronizedDevice_init_default; mCurrentDeviceData.node_id = nodeId; mCurrentDeviceData.has_is_icd = true; mCurrentDeviceData.is_icd = deviceIsIcd; +#endif ReturnOnFailure(controller->GetConnectedDevice(nodeId, &mOnDeviceConnectedCallback, &mOnDeviceConnectionFailureCallback)); mController = controller; @@ -212,10 +223,12 @@ void DeviceSynchronizer::GetUniqueId() VerifyOrDie(mState == State::ReceivedResponse); VerifyOrDie(mController); +#if defined(PW_RPC_ENABLED) // If we have a UniqueId we can return leaving state in ReceivedResponse. VerifyOrReturn(!mCurrentDeviceData.has_unique_id, ChipLogDetail(NotSpecified, "We already have UniqueId")); +#endif - auto * device = DeviceMgr().FindDeviceByNode(mCurrentDeviceData.node_id); + auto * device = DeviceMgr().FindDeviceByNode(mNodeId); // If there is no associated remote Fabric Sync Aggregator there is no other place for us to try // getting the UniqueId from and can return leaving the state in ReceivedResponse. VerifyOrReturn(device, ChipLogDetail(NotSpecified, "No remote Fabric Sync Aggregator to get UniqueId from")); @@ -231,8 +244,10 @@ void DeviceSynchronizer::GetUniqueId() [this](std::optional aUniqueId) { if (aUniqueId.has_value()) { +#if defined(PW_RPC_ENABLED) this->mCurrentDeviceData.has_unique_id = true; memcpy(this->mCurrentDeviceData.unique_id, aUniqueId.value().data(), aUniqueId.value().size()); +#endif } else { @@ -255,19 +270,22 @@ void DeviceSynchronizer::GetUniqueId() void DeviceSynchronizer::SynchronizationCompleteAddDevice() { VerifyOrDie(mState == State::ReceivedResponse || mState == State::GettingUid); + +#if defined(PW_RPC_ENABLED) AddSynchronizedDevice(mCurrentDeviceData); // TODO(#35077) Figure out how we should reflect CADMIN values of ICD. if (!mCurrentDeviceData.is_icd) { VerifyOrDie(mController); // TODO(#35333) Figure out how we should recover in this circumstance. - CHIP_ERROR err = DeviceSubscriptionManager::Instance().StartSubscription(*mController, mCurrentDeviceData.node_id); + CHIP_ERROR err = DeviceSubscriptionManager::Instance().StartSubscription(*mController, mNodeId); if (err != CHIP_NO_ERROR) { - ChipLogError(NotSpecified, "Failed start subscription to NodeId:" ChipLogFormatX64, - ChipLogValueX64(mCurrentDeviceData.node_id)); + ChipLogError(NotSpecified, "Failed start subscription to NodeId:" ChipLogFormatX64, ChipLogValueX64(mNodeId)); } } +#endif + MoveToState(State::Idle); } diff --git a/examples/fabric-admin/device_manager/DeviceSynchronization.h b/examples/fabric-admin/device_manager/DeviceSynchronization.h index 11b640236268dd..28880c6faec7a1 100644 --- a/examples/fabric-admin/device_manager/DeviceSynchronization.h +++ b/examples/fabric-admin/device_manager/DeviceSynchronization.h @@ -25,8 +25,10 @@ #include +#if defined(PW_RPC_ENABLED) #include "fabric_bridge_service/fabric_bridge_service.pb.h" #include "fabric_bridge_service/fabric_bridge_service.rpc.pb.h" +#endif /// Ensures that device data is synchronized to the remote fabric bridge. /// @@ -92,6 +94,9 @@ class DeviceSynchronizer : public chip::app::ReadClient::Callback // mController is expected to remain valid throughout the entire device synchronization process (i.e. when // mState != Idle). chip::Controller::DeviceController * mController = nullptr; - chip_rpc_SynchronizedDevice mCurrentDeviceData = chip_rpc_SynchronizedDevice_init_default; + chip::NodeId mNodeId = chip::kUndefinedNodeId; +#if defined(PW_RPC_ENABLED) + chip_rpc_SynchronizedDevice mCurrentDeviceData = chip_rpc_SynchronizedDevice_init_default; +#endif UniqueIdGetter mUniqueIdGetter; };