xref: /aosp_15_r20/external/openthread/tools/ot-fct/cli.cpp (revision cfb92d1480a9e65faed56933e9c12405f45898b4)
1*cfb92d14SAndroid Build Coastguard Worker /*
2*cfb92d14SAndroid Build Coastguard Worker  *  Copyright (c) 2022, The OpenThread Authors.
3*cfb92d14SAndroid Build Coastguard Worker  *  All rights reserved.
4*cfb92d14SAndroid Build Coastguard Worker  *
5*cfb92d14SAndroid Build Coastguard Worker  *  Redistribution and use in source and binary forms, with or without
6*cfb92d14SAndroid Build Coastguard Worker  *  modification, are permitted provided that the following conditions are met:
7*cfb92d14SAndroid Build Coastguard Worker  *  1. Redistributions of source code must strain the above copyright
8*cfb92d14SAndroid Build Coastguard Worker  *     notice, this list of conditions and the following disclaimer.
9*cfb92d14SAndroid Build Coastguard Worker  *  2. Redistributions in binary form must reproduce the above copyright
10*cfb92d14SAndroid Build Coastguard Worker  *     notice, this list of conditions and the following disclaimer in the
11*cfb92d14SAndroid Build Coastguard Worker  *     documentation and/or other materials provided with the distribution.
12*cfb92d14SAndroid Build Coastguard Worker  *  3. Neither the name of the copyright holder nor the
13*cfb92d14SAndroid Build Coastguard Worker  *     names of its contributors may be used to endorse or promote products
14*cfb92d14SAndroid Build Coastguard Worker  *     derived from this software without specific prior written permission.
15*cfb92d14SAndroid Build Coastguard Worker  *
16*cfb92d14SAndroid Build Coastguard Worker  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17*cfb92d14SAndroid Build Coastguard Worker  *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18*cfb92d14SAndroid Build Coastguard Worker  *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19*cfb92d14SAndroid Build Coastguard Worker  *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20*cfb92d14SAndroid Build Coastguard Worker  *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21*cfb92d14SAndroid Build Coastguard Worker  *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22*cfb92d14SAndroid Build Coastguard Worker  *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23*cfb92d14SAndroid Build Coastguard Worker  *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24*cfb92d14SAndroid Build Coastguard Worker  *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25*cfb92d14SAndroid Build Coastguard Worker  *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26*cfb92d14SAndroid Build Coastguard Worker  *  POSSIBILITY OF SUCH DAMAGE.
27*cfb92d14SAndroid Build Coastguard Worker  */
28*cfb92d14SAndroid Build Coastguard Worker 
29*cfb92d14SAndroid Build Coastguard Worker #include "cli.hpp"
30*cfb92d14SAndroid Build Coastguard Worker 
31*cfb92d14SAndroid Build Coastguard Worker #include <assert.h>
32*cfb92d14SAndroid Build Coastguard Worker #include <errno.h>
33*cfb92d14SAndroid Build Coastguard Worker #include <getopt.h>
34*cfb92d14SAndroid Build Coastguard Worker #include <stdbool.h>
35*cfb92d14SAndroid Build Coastguard Worker #include <stdint.h>
36*cfb92d14SAndroid Build Coastguard Worker #include <stdio.h>
37*cfb92d14SAndroid Build Coastguard Worker #include <stdlib.h>
38*cfb92d14SAndroid Build Coastguard Worker #include <string.h>
39*cfb92d14SAndroid Build Coastguard Worker #include <unistd.h>
40*cfb92d14SAndroid Build Coastguard Worker 
41*cfb92d14SAndroid Build Coastguard Worker #include "power.hpp"
42*cfb92d14SAndroid Build Coastguard Worker #include "common/code_utils.hpp"
43*cfb92d14SAndroid Build Coastguard Worker 
44*cfb92d14SAndroid Build Coastguard Worker namespace ot {
45*cfb92d14SAndroid Build Coastguard Worker namespace Fct {
46*cfb92d14SAndroid Build Coastguard Worker 
47*cfb92d14SAndroid Build Coastguard Worker const struct Cli::Command Cli::sCommands[] = {
48*cfb92d14SAndroid Build Coastguard Worker     {"powercalibrationtable", &Cli::ProcessCalibrationTable},
49*cfb92d14SAndroid Build Coastguard Worker     {"targetpowertable", &Cli::ProcessTargetPowerTable},
50*cfb92d14SAndroid Build Coastguard Worker     {"regiondomaintable", &Cli::ProcessRegionDomainTable},
51*cfb92d14SAndroid Build Coastguard Worker };
52*cfb92d14SAndroid Build Coastguard Worker 
GetNextTargetPower(const Power::Domain & aDomain,int & aIterator,Power::TargetPower & aTargetPower)53*cfb92d14SAndroid Build Coastguard Worker otError Cli::GetNextTargetPower(const Power::Domain &aDomain, int &aIterator, Power::TargetPower &aTargetPower)
54*cfb92d14SAndroid Build Coastguard Worker {
55*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NOT_FOUND;
56*cfb92d14SAndroid Build Coastguard Worker     char    value[kMaxValueSize];
57*cfb92d14SAndroid Build Coastguard Worker     char   *domain;
58*cfb92d14SAndroid Build Coastguard Worker     char   *psave;
59*cfb92d14SAndroid Build Coastguard Worker 
60*cfb92d14SAndroid Build Coastguard Worker     while (mProductConfigFile.Get(kKeyTargetPower, aIterator, value, sizeof(value)) == OT_ERROR_NONE)
61*cfb92d14SAndroid Build Coastguard Worker     {
62*cfb92d14SAndroid Build Coastguard Worker         if (((domain = strtok_r(value, kCommaDelimiter, &psave)) == nullptr) || (aDomain != domain))
63*cfb92d14SAndroid Build Coastguard Worker         {
64*cfb92d14SAndroid Build Coastguard Worker             continue;
65*cfb92d14SAndroid Build Coastguard Worker         }
66*cfb92d14SAndroid Build Coastguard Worker 
67*cfb92d14SAndroid Build Coastguard Worker         error = aTargetPower.FromString(psave);
68*cfb92d14SAndroid Build Coastguard Worker         break;
69*cfb92d14SAndroid Build Coastguard Worker     }
70*cfb92d14SAndroid Build Coastguard Worker 
71*cfb92d14SAndroid Build Coastguard Worker     return error;
72*cfb92d14SAndroid Build Coastguard Worker }
73*cfb92d14SAndroid Build Coastguard Worker 
GetNextDomain(int & aIterator,Power::Domain & aDomain)74*cfb92d14SAndroid Build Coastguard Worker otError Cli::GetNextDomain(int &aIterator, Power::Domain &aDomain)
75*cfb92d14SAndroid Build Coastguard Worker {
76*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NOT_FOUND;
77*cfb92d14SAndroid Build Coastguard Worker     char    value[kMaxValueSize];
78*cfb92d14SAndroid Build Coastguard Worker     char   *str;
79*cfb92d14SAndroid Build Coastguard Worker 
80*cfb92d14SAndroid Build Coastguard Worker     while (mProductConfigFile.Get(kKeyRegionDomainMapping, aIterator, value, sizeof(value)) == OT_ERROR_NONE)
81*cfb92d14SAndroid Build Coastguard Worker     {
82*cfb92d14SAndroid Build Coastguard Worker         if ((str = strtok(value, kCommaDelimiter)) == nullptr)
83*cfb92d14SAndroid Build Coastguard Worker         {
84*cfb92d14SAndroid Build Coastguard Worker             continue;
85*cfb92d14SAndroid Build Coastguard Worker         }
86*cfb92d14SAndroid Build Coastguard Worker 
87*cfb92d14SAndroid Build Coastguard Worker         error = aDomain.Set(str);
88*cfb92d14SAndroid Build Coastguard Worker         break;
89*cfb92d14SAndroid Build Coastguard Worker     }
90*cfb92d14SAndroid Build Coastguard Worker 
91*cfb92d14SAndroid Build Coastguard Worker exit:
92*cfb92d14SAndroid Build Coastguard Worker     return error;
93*cfb92d14SAndroid Build Coastguard Worker }
94*cfb92d14SAndroid Build Coastguard Worker 
ProcessTargetPowerTable(Utils::CmdLineParser::Arg aArgs[])95*cfb92d14SAndroid Build Coastguard Worker otError Cli::ProcessTargetPowerTable(Utils::CmdLineParser::Arg aArgs[])
96*cfb92d14SAndroid Build Coastguard Worker {
97*cfb92d14SAndroid Build Coastguard Worker     otError       error    = OT_ERROR_NONE;
98*cfb92d14SAndroid Build Coastguard Worker     int           iterator = 0;
99*cfb92d14SAndroid Build Coastguard Worker     Power::Domain domain;
100*cfb92d14SAndroid Build Coastguard Worker 
101*cfb92d14SAndroid Build Coastguard Worker     VerifyOrExit(aArgs[0].IsEmpty(), error = OT_ERROR_INVALID_ARGS);
102*cfb92d14SAndroid Build Coastguard Worker 
103*cfb92d14SAndroid Build Coastguard Worker     printf("|  Domain  | ChStart |  ChEnd  | TargetPower(0.01dBm) |\r\n");
104*cfb92d14SAndroid Build Coastguard Worker     printf("+----------+---------+---------+----------------------+\r\n");
105*cfb92d14SAndroid Build Coastguard Worker     while (GetNextDomain(iterator, domain) == OT_ERROR_NONE)
106*cfb92d14SAndroid Build Coastguard Worker     {
107*cfb92d14SAndroid Build Coastguard Worker         int                iter = 0;
108*cfb92d14SAndroid Build Coastguard Worker         Power::TargetPower targetPower;
109*cfb92d14SAndroid Build Coastguard Worker 
110*cfb92d14SAndroid Build Coastguard Worker         while (GetNextTargetPower(domain, iter, targetPower) == OT_ERROR_NONE)
111*cfb92d14SAndroid Build Coastguard Worker         {
112*cfb92d14SAndroid Build Coastguard Worker             printf("| %-8s | %-7d | %-7d | %-20d |\r\n", domain.AsCString(), targetPower.GetChannelStart(),
113*cfb92d14SAndroid Build Coastguard Worker                    targetPower.GetChannelEnd(), targetPower.GetTargetPower());
114*cfb92d14SAndroid Build Coastguard Worker         }
115*cfb92d14SAndroid Build Coastguard Worker     }
116*cfb92d14SAndroid Build Coastguard Worker 
117*cfb92d14SAndroid Build Coastguard Worker exit:
118*cfb92d14SAndroid Build Coastguard Worker     return error;
119*cfb92d14SAndroid Build Coastguard Worker }
120*cfb92d14SAndroid Build Coastguard Worker 
ProcessRegionDomainTable(Utils::CmdLineParser::Arg aArgs[])121*cfb92d14SAndroid Build Coastguard Worker otError Cli::ProcessRegionDomainTable(Utils::CmdLineParser::Arg aArgs[])
122*cfb92d14SAndroid Build Coastguard Worker {
123*cfb92d14SAndroid Build Coastguard Worker     otError error    = OT_ERROR_NONE;
124*cfb92d14SAndroid Build Coastguard Worker     int     iterator = 0;
125*cfb92d14SAndroid Build Coastguard Worker     char    value[kMaxValueSize];
126*cfb92d14SAndroid Build Coastguard Worker     char   *domain;
127*cfb92d14SAndroid Build Coastguard Worker     char   *psave;
128*cfb92d14SAndroid Build Coastguard Worker 
129*cfb92d14SAndroid Build Coastguard Worker     VerifyOrExit(aArgs[0].IsEmpty(), error = OT_ERROR_INVALID_ARGS);
130*cfb92d14SAndroid Build Coastguard Worker 
131*cfb92d14SAndroid Build Coastguard Worker     while (mProductConfigFile.Get(kKeyRegionDomainMapping, iterator, value, sizeof(value)) == OT_ERROR_NONE)
132*cfb92d14SAndroid Build Coastguard Worker     {
133*cfb92d14SAndroid Build Coastguard Worker         printf("%s\r\n", value);
134*cfb92d14SAndroid Build Coastguard Worker     }
135*cfb92d14SAndroid Build Coastguard Worker 
136*cfb92d14SAndroid Build Coastguard Worker exit:
137*cfb92d14SAndroid Build Coastguard Worker     return error;
138*cfb92d14SAndroid Build Coastguard Worker }
139*cfb92d14SAndroid Build Coastguard Worker 
ParseNextCalibratedPower(char * aCalibratedPowerString,uint16_t aLength,uint16_t & aIterator,Power::CalibratedPower & aCalibratedPower)140*cfb92d14SAndroid Build Coastguard Worker otError Cli::ParseNextCalibratedPower(char                   *aCalibratedPowerString,
141*cfb92d14SAndroid Build Coastguard Worker                                       uint16_t                aLength,
142*cfb92d14SAndroid Build Coastguard Worker                                       uint16_t               &aIterator,
143*cfb92d14SAndroid Build Coastguard Worker                                       Power::CalibratedPower &aCalibratedPower)
144*cfb92d14SAndroid Build Coastguard Worker {
145*cfb92d14SAndroid Build Coastguard Worker     otError                    error = OT_ERROR_NONE;
146*cfb92d14SAndroid Build Coastguard Worker     char                      *start = aCalibratedPowerString + aIterator;
147*cfb92d14SAndroid Build Coastguard Worker     char                      *end;
148*cfb92d14SAndroid Build Coastguard Worker     char                      *subString;
149*cfb92d14SAndroid Build Coastguard Worker     int16_t                    actualPower;
150*cfb92d14SAndroid Build Coastguard Worker     ot::Power::RawPowerSetting rawPowerSetting;
151*cfb92d14SAndroid Build Coastguard Worker 
152*cfb92d14SAndroid Build Coastguard Worker     VerifyOrExit(aIterator < aLength, error = OT_ERROR_PARSE);
153*cfb92d14SAndroid Build Coastguard Worker 
154*cfb92d14SAndroid Build Coastguard Worker     end = strstr(start, "/");
155*cfb92d14SAndroid Build Coastguard Worker     if (end != nullptr)
156*cfb92d14SAndroid Build Coastguard Worker     {
157*cfb92d14SAndroid Build Coastguard Worker         aIterator = end - aCalibratedPowerString + 1; // +1 to skip '/'
158*cfb92d14SAndroid Build Coastguard Worker         *end      = '\0';
159*cfb92d14SAndroid Build Coastguard Worker     }
160*cfb92d14SAndroid Build Coastguard Worker     else
161*cfb92d14SAndroid Build Coastguard Worker     {
162*cfb92d14SAndroid Build Coastguard Worker         aIterator = aLength;
163*cfb92d14SAndroid Build Coastguard Worker         end       = aCalibratedPowerString + aLength;
164*cfb92d14SAndroid Build Coastguard Worker     }
165*cfb92d14SAndroid Build Coastguard Worker 
166*cfb92d14SAndroid Build Coastguard Worker     subString = strstr(start, kCommaDelimiter);
167*cfb92d14SAndroid Build Coastguard Worker     VerifyOrExit(subString != nullptr, error = OT_ERROR_PARSE);
168*cfb92d14SAndroid Build Coastguard Worker     *subString = '\0';
169*cfb92d14SAndroid Build Coastguard Worker     subString++;
170*cfb92d14SAndroid Build Coastguard Worker 
171*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = Utils::CmdLineParser::ParseAsInt16(start, actualPower));
172*cfb92d14SAndroid Build Coastguard Worker     aCalibratedPower.SetActualPower(actualPower);
173*cfb92d14SAndroid Build Coastguard Worker 
174*cfb92d14SAndroid Build Coastguard Worker     VerifyOrExit(subString < end, error = OT_ERROR_PARSE);
175*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(error = rawPowerSetting.Set(subString));
176*cfb92d14SAndroid Build Coastguard Worker     aCalibratedPower.SetRawPowerSetting(rawPowerSetting);
177*cfb92d14SAndroid Build Coastguard Worker 
178*cfb92d14SAndroid Build Coastguard Worker exit:
179*cfb92d14SAndroid Build Coastguard Worker     return error;
180*cfb92d14SAndroid Build Coastguard Worker }
181*cfb92d14SAndroid Build Coastguard Worker 
ProcessCalibrationTable(Utils::CmdLineParser::Arg aArgs[])182*cfb92d14SAndroid Build Coastguard Worker otError Cli::ProcessCalibrationTable(Utils::CmdLineParser::Arg aArgs[])
183*cfb92d14SAndroid Build Coastguard Worker {
184*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
185*cfb92d14SAndroid Build Coastguard Worker 
186*cfb92d14SAndroid Build Coastguard Worker     if (aArgs[0].IsEmpty())
187*cfb92d14SAndroid Build Coastguard Worker     {
188*cfb92d14SAndroid Build Coastguard Worker         int  iterator = 0;
189*cfb92d14SAndroid Build Coastguard Worker         char value[kMaxValueSize];
190*cfb92d14SAndroid Build Coastguard Worker 
191*cfb92d14SAndroid Build Coastguard Worker         ot::Power::CalibratedPower calibratedPower;
192*cfb92d14SAndroid Build Coastguard Worker 
193*cfb92d14SAndroid Build Coastguard Worker         printf("| ChStart |  ChEnd  | ActualPower(0.01dBm) | RawPowerSetting |\r\n");
194*cfb92d14SAndroid Build Coastguard Worker         printf("+---------+---------+----------------------+-----------------+\r\n");
195*cfb92d14SAndroid Build Coastguard Worker 
196*cfb92d14SAndroid Build Coastguard Worker         while (mFactoryConfigFile.Get(kKeyCalibratedPower, iterator, value, sizeof(value)) == OT_ERROR_NONE)
197*cfb92d14SAndroid Build Coastguard Worker         {
198*cfb92d14SAndroid Build Coastguard Worker             SuccessOrExit(error = calibratedPower.FromString(value));
199*cfb92d14SAndroid Build Coastguard Worker             printf("| %-7d | %-7d | %-20d | %-15s |\r\n", calibratedPower.GetChannelStart(),
200*cfb92d14SAndroid Build Coastguard Worker                    calibratedPower.GetChannelEnd(), calibratedPower.GetActualPower(),
201*cfb92d14SAndroid Build Coastguard Worker                    calibratedPower.GetRawPowerSetting().ToString().AsCString());
202*cfb92d14SAndroid Build Coastguard Worker         }
203*cfb92d14SAndroid Build Coastguard Worker     }
204*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "add")
205*cfb92d14SAndroid Build Coastguard Worker     {
206*cfb92d14SAndroid Build Coastguard Worker         constexpr uint16_t kStateSearchDomain = 0;
207*cfb92d14SAndroid Build Coastguard Worker         constexpr uint16_t kStateSearchPower  = 1;
208*cfb92d14SAndroid Build Coastguard Worker 
209*cfb92d14SAndroid Build Coastguard Worker         uint8_t                state = kStateSearchDomain;
210*cfb92d14SAndroid Build Coastguard Worker         char                  *subString;
211*cfb92d14SAndroid Build Coastguard Worker         uint8_t                channel;
212*cfb92d14SAndroid Build Coastguard Worker         Power::CalibratedPower calibratedPower;
213*cfb92d14SAndroid Build Coastguard Worker 
214*cfb92d14SAndroid Build Coastguard Worker         for (Utils::CmdLineParser::Arg *arg = &aArgs[1]; !arg->IsEmpty(); arg++)
215*cfb92d14SAndroid Build Coastguard Worker         {
216*cfb92d14SAndroid Build Coastguard Worker             if ((state == kStateSearchDomain) && (*arg == "-b"))
217*cfb92d14SAndroid Build Coastguard Worker             {
218*cfb92d14SAndroid Build Coastguard Worker                 arg++;
219*cfb92d14SAndroid Build Coastguard Worker                 VerifyOrExit(!arg->IsEmpty(), error = OT_ERROR_INVALID_ARGS);
220*cfb92d14SAndroid Build Coastguard Worker 
221*cfb92d14SAndroid Build Coastguard Worker                 subString = strtok(arg->GetCString(), kCommaDelimiter);
222*cfb92d14SAndroid Build Coastguard Worker                 VerifyOrExit(subString != nullptr, error = OT_ERROR_PARSE);
223*cfb92d14SAndroid Build Coastguard Worker                 SuccessOrExit(error = Utils::CmdLineParser::ParseAsUint8(subString, channel));
224*cfb92d14SAndroid Build Coastguard Worker                 calibratedPower.SetChannelStart(channel);
225*cfb92d14SAndroid Build Coastguard Worker 
226*cfb92d14SAndroid Build Coastguard Worker                 subString = strtok(NULL, kCommaDelimiter);
227*cfb92d14SAndroid Build Coastguard Worker                 VerifyOrExit(subString != nullptr, error = OT_ERROR_PARSE);
228*cfb92d14SAndroid Build Coastguard Worker                 SuccessOrExit(error = Utils::CmdLineParser::ParseAsUint8(subString, channel));
229*cfb92d14SAndroid Build Coastguard Worker                 calibratedPower.SetChannelEnd(channel);
230*cfb92d14SAndroid Build Coastguard Worker                 VerifyOrExit(calibratedPower.GetChannelStart() <= calibratedPower.GetChannelEnd(),
231*cfb92d14SAndroid Build Coastguard Worker                              error = OT_ERROR_INVALID_ARGS);
232*cfb92d14SAndroid Build Coastguard Worker 
233*cfb92d14SAndroid Build Coastguard Worker                 state = kStateSearchPower;
234*cfb92d14SAndroid Build Coastguard Worker             }
235*cfb92d14SAndroid Build Coastguard Worker             else if ((state == kStateSearchPower) && (*arg == "-c"))
236*cfb92d14SAndroid Build Coastguard Worker             {
237*cfb92d14SAndroid Build Coastguard Worker                 uint16_t length;
238*cfb92d14SAndroid Build Coastguard Worker                 uint16_t iterator = 0;
239*cfb92d14SAndroid Build Coastguard Worker 
240*cfb92d14SAndroid Build Coastguard Worker                 arg++;
241*cfb92d14SAndroid Build Coastguard Worker                 VerifyOrExit(!arg->IsEmpty(), error = OT_ERROR_INVALID_ARGS);
242*cfb92d14SAndroid Build Coastguard Worker 
243*cfb92d14SAndroid Build Coastguard Worker                 length = strlen(arg->GetCString());
244*cfb92d14SAndroid Build Coastguard Worker                 while (ParseNextCalibratedPower(arg->GetCString(), length, iterator, calibratedPower) == OT_ERROR_NONE)
245*cfb92d14SAndroid Build Coastguard Worker                 {
246*cfb92d14SAndroid Build Coastguard Worker                     SuccessOrExit(
247*cfb92d14SAndroid Build Coastguard Worker                         error = mFactoryConfigFile.Add(kKeyCalibratedPower, calibratedPower.ToString().AsCString()));
248*cfb92d14SAndroid Build Coastguard Worker                 }
249*cfb92d14SAndroid Build Coastguard Worker 
250*cfb92d14SAndroid Build Coastguard Worker                 state = kStateSearchDomain;
251*cfb92d14SAndroid Build Coastguard Worker             }
252*cfb92d14SAndroid Build Coastguard Worker             else
253*cfb92d14SAndroid Build Coastguard Worker             {
254*cfb92d14SAndroid Build Coastguard Worker                 error = OT_ERROR_INVALID_ARGS;
255*cfb92d14SAndroid Build Coastguard Worker                 break;
256*cfb92d14SAndroid Build Coastguard Worker             }
257*cfb92d14SAndroid Build Coastguard Worker         }
258*cfb92d14SAndroid Build Coastguard Worker 
259*cfb92d14SAndroid Build Coastguard Worker         if (state == kStateSearchPower)
260*cfb92d14SAndroid Build Coastguard Worker         {
261*cfb92d14SAndroid Build Coastguard Worker             error = OT_ERROR_INVALID_ARGS;
262*cfb92d14SAndroid Build Coastguard Worker         }
263*cfb92d14SAndroid Build Coastguard Worker     }
264*cfb92d14SAndroid Build Coastguard Worker     else if (aArgs[0] == "clear")
265*cfb92d14SAndroid Build Coastguard Worker     {
266*cfb92d14SAndroid Build Coastguard Worker         error = mFactoryConfigFile.Clear(kKeyCalibratedPower);
267*cfb92d14SAndroid Build Coastguard Worker     }
268*cfb92d14SAndroid Build Coastguard Worker     else
269*cfb92d14SAndroid Build Coastguard Worker     {
270*cfb92d14SAndroid Build Coastguard Worker         error = OT_ERROR_INVALID_ARGS;
271*cfb92d14SAndroid Build Coastguard Worker     }
272*cfb92d14SAndroid Build Coastguard Worker 
273*cfb92d14SAndroid Build Coastguard Worker exit:
274*cfb92d14SAndroid Build Coastguard Worker     return error;
275*cfb92d14SAndroid Build Coastguard Worker }
276*cfb92d14SAndroid Build Coastguard Worker 
ProcessCommand(Utils::CmdLineParser::Arg aArgs[])277*cfb92d14SAndroid Build Coastguard Worker void Cli::ProcessCommand(Utils::CmdLineParser::Arg aArgs[])
278*cfb92d14SAndroid Build Coastguard Worker {
279*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NOT_FOUND;
280*cfb92d14SAndroid Build Coastguard Worker     int     i;
281*cfb92d14SAndroid Build Coastguard Worker 
282*cfb92d14SAndroid Build Coastguard Worker     for (i = 0; i < (sizeof(sCommands) / sizeof(sCommands[0])); i++)
283*cfb92d14SAndroid Build Coastguard Worker     {
284*cfb92d14SAndroid Build Coastguard Worker         if (strcmp(aArgs[0].GetCString(), sCommands[i].mName) == 0)
285*cfb92d14SAndroid Build Coastguard Worker         {
286*cfb92d14SAndroid Build Coastguard Worker             error = (this->*sCommands[i].mCommand)(aArgs + 1);
287*cfb92d14SAndroid Build Coastguard Worker             break;
288*cfb92d14SAndroid Build Coastguard Worker         }
289*cfb92d14SAndroid Build Coastguard Worker     }
290*cfb92d14SAndroid Build Coastguard Worker 
291*cfb92d14SAndroid Build Coastguard Worker exit:
292*cfb92d14SAndroid Build Coastguard Worker     AppendErrorResult(error);
293*cfb92d14SAndroid Build Coastguard Worker }
294*cfb92d14SAndroid Build Coastguard Worker 
ProcessLine(char * aLine)295*cfb92d14SAndroid Build Coastguard Worker void Cli::ProcessLine(char *aLine)
296*cfb92d14SAndroid Build Coastguard Worker {
297*cfb92d14SAndroid Build Coastguard Worker     const int                 kMaxArgs = 20;
298*cfb92d14SAndroid Build Coastguard Worker     Utils::CmdLineParser::Arg args[kMaxArgs + 1];
299*cfb92d14SAndroid Build Coastguard Worker 
300*cfb92d14SAndroid Build Coastguard Worker     SuccessOrExit(ot::Utils::CmdLineParser::ParseCmd(aLine, args, kMaxArgs));
301*cfb92d14SAndroid Build Coastguard Worker     VerifyOrExit(!args[0].IsEmpty());
302*cfb92d14SAndroid Build Coastguard Worker 
303*cfb92d14SAndroid Build Coastguard Worker     ProcessCommand(args);
304*cfb92d14SAndroid Build Coastguard Worker 
305*cfb92d14SAndroid Build Coastguard Worker exit:
306*cfb92d14SAndroid Build Coastguard Worker     OutputPrompt();
307*cfb92d14SAndroid Build Coastguard Worker }
308*cfb92d14SAndroid Build Coastguard Worker 
OutputPrompt(void)309*cfb92d14SAndroid Build Coastguard Worker void Cli::OutputPrompt(void)
310*cfb92d14SAndroid Build Coastguard Worker {
311*cfb92d14SAndroid Build Coastguard Worker     printf("> ");
312*cfb92d14SAndroid Build Coastguard Worker     fflush(stdout);
313*cfb92d14SAndroid Build Coastguard Worker }
314*cfb92d14SAndroid Build Coastguard Worker 
AppendErrorResult(otError aError)315*cfb92d14SAndroid Build Coastguard Worker void Cli::AppendErrorResult(otError aError)
316*cfb92d14SAndroid Build Coastguard Worker {
317*cfb92d14SAndroid Build Coastguard Worker     if (aError != OT_ERROR_NONE)
318*cfb92d14SAndroid Build Coastguard Worker     {
319*cfb92d14SAndroid Build Coastguard Worker         printf("failed\r\nstatus %#x\r\n", aError);
320*cfb92d14SAndroid Build Coastguard Worker     }
321*cfb92d14SAndroid Build Coastguard Worker     else
322*cfb92d14SAndroid Build Coastguard Worker     {
323*cfb92d14SAndroid Build Coastguard Worker         printf("Done\r\n");
324*cfb92d14SAndroid Build Coastguard Worker     }
325*cfb92d14SAndroid Build Coastguard Worker 
326*cfb92d14SAndroid Build Coastguard Worker     fflush(stdout);
327*cfb92d14SAndroid Build Coastguard Worker }
328*cfb92d14SAndroid Build Coastguard Worker } // namespace Fct
329*cfb92d14SAndroid Build Coastguard Worker } // namespace ot
330