/* * Copyright (c) 2024 Project CHIP Authors * All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #include "ModelCommand.h" #include #include #include using namespace ::chip; CHIP_ERROR ModelCommand::RunCommand() { if (IsGroupId(mDestinationId)) { FabricIndex fabricIndex = CurrentCommissioner().GetFabricIndex(); ChipLogProgress(chipTool, "Sending command to group 0x%x", GroupIdFromNodeId(mDestinationId)); return SendGroupCommand(GroupIdFromNodeId(mDestinationId), fabricIndex); } ChipLogProgress(NotSpecified, "Sending command to node " ChipLogFormatX64, ChipLogValueX64(mDestinationId)); CheckPeerICDType(); CommissioneeDeviceProxy * commissioneeDeviceProxy = nullptr; if (CHIP_NO_ERROR == CurrentCommissioner().GetDeviceBeingCommissioned(mDestinationId, &commissioneeDeviceProxy)) { return SendCommand(commissioneeDeviceProxy, mEndPointId); } return CurrentCommissioner().GetConnectedDevice(mDestinationId, &mOnDeviceConnectedCallback, &mOnDeviceConnectionFailureCallback); } void ModelCommand::OnDeviceConnectedFn(void * context, chip::Messaging::ExchangeManager & exchangeMgr, const chip::SessionHandle & sessionHandle) { ModelCommand * command = reinterpret_cast(context); VerifyOrReturn(command != nullptr, ChipLogError(NotSpecified, "OnDeviceConnectedFn: context is null")); chip::OperationalDeviceProxy device(&exchangeMgr, sessionHandle); CHIP_ERROR err = command->SendCommand(&device, command->mEndPointId); VerifyOrReturn(CHIP_NO_ERROR == err, command->SetCommandExitStatus(err)); } void ModelCommand::OnDeviceConnectionFailureFn(void * context, const chip::ScopedNodeId & peerId, CHIP_ERROR err) { LogErrorOnFailure(err); ModelCommand * command = reinterpret_cast(context); VerifyOrReturn(command != nullptr, ChipLogError(NotSpecified, "OnDeviceConnectionFailureFn: context is null")); command->SetCommandExitStatus(err); } void ModelCommand::Shutdown() { mOnDeviceConnectedCallback.Cancel(); mOnDeviceConnectionFailureCallback.Cancel(); CHIPCommand::Shutdown(); } void ModelCommand::CheckPeerICDType() { if (mIsPeerLIT.HasValue()) { ChipLogProgress(NotSpecified, "Peer ICD type is set to %s", mIsPeerLIT.Value() == 1 ? "LIT-ICD" : "non LIT-ICD"); return; } app::ICDClientInfo info; auto destinationPeerId = chip::ScopedNodeId(mDestinationId, CurrentCommissioner().GetFabricIndex()); auto iter = CHIPCommand::sICDClientStorage.IterateICDClientInfo(); if (iter == nullptr) { return; } app::DefaultICDClientStorage::ICDClientInfoIteratorWrapper clientInfoIteratorWrapper(iter); while (iter->Next(info)) { if (ScopedNodeId(info.peer_node.GetNodeId(), info.peer_node.GetFabricIndex()) == destinationPeerId) { ChipLogProgress(NotSpecified, "Peer is a registered LIT ICD."); mIsPeerLIT.SetValue(true); return; } } }