2 * Copyright (c) 2020 Project CHIP Authors
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
19 #include "NetworkCommand.h"
21 using namespace ::chip;
23 constexpr uint16_t kWaitDurationInSeconds = 10;
25 // Make sure our buffer is big enough, but this will need a better setup!
26 constexpr uint16_t kMaxBufferSize = 1024;
28 CHIP_ERROR NetworkCommand::Run(PersistentStorage & storage, NodeId localId, NodeId remoteId)
30 CHIP_ERROR err = CHIP_NO_ERROR;
32 err = mCommissioner.Init(localId, &storage);
33 VerifyOrExit(err == CHIP_NO_ERROR, ChipLogError(Controller, "Init failure! Commissioner: %s", chip::ErrorStr(err)));
35 err = mCommissioner.ServiceEvents();
36 VerifyOrExit(err == CHIP_NO_ERROR, ChipLogError(Controller, "Init failure! Run Loop: %s", chip::ErrorStr(err)));
38 err = RunInternal(remoteId);
41 VerifyOrExit(GetCommandExitStatus(), err = CHIP_ERROR_INTERNAL);
44 mCommissioner.ServiceEventSignal();
45 mCommissioner.Shutdown();
49 CHIP_ERROR NetworkCommand::RunInternal(NodeId remoteId)
52 CHIP_ERROR err = mCommissioner.GetDevice(remoteId, &device);
53 VerifyOrExit(err == CHIP_NO_ERROR, ChipLogError(chipTool, "Could not find a paired device. Are you sure it has been paired ?"));
55 device->SetDelegate(this);
57 err = RunCommandInternal(device);
60 UpdateWaitForResponse(true);
61 WaitForResponse(kWaitDurationInSeconds);
67 CHIP_ERROR NetworkCommand::RunCommandInternal(ChipDevice * device)
69 CHIP_ERROR err = CHIP_NO_ERROR;
70 uint16_t payloadLen = 0;
72 PacketBufferHandle buffer = PacketBuffer::NewWithAvailableSize(kMaxBufferSize);
73 VerifyOrExit(!buffer.IsNull(), err = CHIP_ERROR_NO_MEMORY);
75 payloadLen = Encode(buffer, kMaxBufferSize);
76 VerifyOrExit(payloadLen != 0, err = CHIP_ERROR_INVALID_MESSAGE_LENGTH);
78 buffer->SetDataLength(payloadLen);
84 err = device->SendMessage(std::move(buffer));
85 VerifyOrExit(err == CHIP_NO_ERROR, ChipLogError(chipTool, "Failed to send message: %s", ErrorStr(err)));
91 void NetworkCommand::OnMessage(PacketBufferHandle buffer)
93 ChipLogDetail(chipTool, "OnMessage: Received %zu bytes", buffer->DataLength());
95 SetCommandExitStatus(Decode(buffer));
96 UpdateWaitForResponse(false);
99 void NetworkCommand::OnStatusChange(void)
101 ChipLogProgress(chipTool, "DeviceStatusDelegate::OnStatusChange");
104 void NetworkCommand::PrintBuffer(PacketBufferHandle & buffer) const
106 const size_t data_len = buffer->DataLength();
108 fprintf(stderr, "SENDING: %zu ", data_len);
109 for (size_t i = 0; i < data_len; ++i)
111 fprintf(stderr, "%d ", buffer->Start()[i]);
113 fprintf(stderr, "\n");