e79cc7f11c8bfb2fcaa21a58bd57910dd69f41cf
[platform/upstream/connectedhomeip.git] / examples / chip-tool / commands / common / NetworkCommand.cpp
1 /*
2  *   Copyright (c) 2020 Project CHIP Authors
3  *   All rights reserved.
4  *
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
8  *
9  *       http://www.apache.org/licenses/LICENSE-2.0
10  *
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.
16  *
17  */
18
19 #include "NetworkCommand.h"
20
21 using namespace ::chip;
22
23 constexpr uint16_t kWaitDurationInSeconds = 10;
24
25 // Make sure our buffer is big enough, but this will need a better setup!
26 constexpr uint16_t kMaxBufferSize = 1024;
27
28 CHIP_ERROR NetworkCommand::Run(PersistentStorage & storage, NodeId localId, NodeId remoteId)
29 {
30     CHIP_ERROR err = CHIP_NO_ERROR;
31
32     err = mCommissioner.Init(localId, &storage);
33     VerifyOrExit(err == CHIP_NO_ERROR, ChipLogError(Controller, "Init failure! Commissioner: %s", chip::ErrorStr(err)));
34
35     err = mCommissioner.ServiceEvents();
36     VerifyOrExit(err == CHIP_NO_ERROR, ChipLogError(Controller, "Init failure! Run Loop: %s", chip::ErrorStr(err)));
37
38     err = RunInternal(remoteId);
39     SuccessOrExit(err);
40
41     VerifyOrExit(GetCommandExitStatus(), err = CHIP_ERROR_INTERNAL);
42
43 exit:
44     mCommissioner.ServiceEventSignal();
45     mCommissioner.Shutdown();
46     return err;
47 }
48
49 CHIP_ERROR NetworkCommand::RunInternal(NodeId remoteId)
50 {
51     ChipDevice * device;
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 ?"));
54
55     device->SetDelegate(this);
56
57     err = RunCommandInternal(device);
58     SuccessOrExit(err);
59
60     UpdateWaitForResponse(true);
61     WaitForResponse(kWaitDurationInSeconds);
62
63 exit:
64     return err;
65 }
66
67 CHIP_ERROR NetworkCommand::RunCommandInternal(ChipDevice * device)
68 {
69     CHIP_ERROR err      = CHIP_NO_ERROR;
70     uint16_t payloadLen = 0;
71
72     PacketBufferHandle buffer = PacketBuffer::NewWithAvailableSize(kMaxBufferSize);
73     VerifyOrExit(!buffer.IsNull(), err = CHIP_ERROR_NO_MEMORY);
74
75     payloadLen = Encode(buffer, kMaxBufferSize);
76     VerifyOrExit(payloadLen != 0, err = CHIP_ERROR_INVALID_MESSAGE_LENGTH);
77
78     buffer->SetDataLength(payloadLen);
79
80 #ifdef DEBUG
81     PrintBuffer(buffer);
82 #endif
83
84     err = device->SendMessage(std::move(buffer));
85     VerifyOrExit(err == CHIP_NO_ERROR, ChipLogError(chipTool, "Failed to send message: %s", ErrorStr(err)));
86
87 exit:
88     return err;
89 }
90
91 void NetworkCommand::OnMessage(PacketBufferHandle buffer)
92 {
93     ChipLogDetail(chipTool, "OnMessage: Received %zu bytes", buffer->DataLength());
94
95     SetCommandExitStatus(Decode(buffer));
96     UpdateWaitForResponse(false);
97 }
98
99 void NetworkCommand::OnStatusChange(void)
100 {
101     ChipLogProgress(chipTool, "DeviceStatusDelegate::OnStatusChange");
102 }
103
104 void NetworkCommand::PrintBuffer(PacketBufferHandle & buffer) const
105 {
106     const size_t data_len = buffer->DataLength();
107
108     fprintf(stderr, "SENDING: %zu ", data_len);
109     for (size_t i = 0; i < data_len; ++i)
110     {
111         fprintf(stderr, "%d ", buffer->Start()[i]);
112     }
113     fprintf(stderr, "\n");
114 }