• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright (c) 2022, The OpenThread Authors.
3  *  All rights reserved.
4  *
5  *  Redistribution and use in source and binary forms, with or without
6  *  modification, are permitted provided that the following conditions are met:
7  *  1. Redistributions of source code must retain the above copyright
8  *     notice, this list of conditions and the following disclaimer.
9  *  2. Redistributions in binary form must reproduce the above copyright
10  *     notice, this list of conditions and the following disclaimer in the
11  *     documentation and/or other materials provided with the distribution.
12  *  3. Neither the name of the copyright holder nor the
13  *     names of its contributors may be used to endorse or promote products
14  *     derived from this software without specific prior written permission.
15  *
16  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17  *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20  *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21  *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22  *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23  *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24  *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25  *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26  *  POSSIBILITY OF SUCH DAMAGE.
27  */
28 
29 #include <openthread/platform/radio.h>
30 
31 #include "test_platform.h"
32 #include "test_util.h"
33 
34 #if OPENTHREAD_CONFIG_POWER_CALIBRATION_ENABLE && OPENTHREAD_CONFIG_PLATFORM_POWER_CALIBRATION_ENABLE
35 
36 namespace ot {
37 
TestPowerCalibration(void)38 void TestPowerCalibration(void)
39 {
40     otInstance *instance;
41     uint8_t     rawPowerSetting[2];
42     uint16_t    rawPowerSettingLength;
43 
44     struct CalibratedPowerEntry
45     {
46         uint8_t  mChannel;
47         int16_t  mActualPower;
48         uint8_t  mRawPowerSetting[1];
49         uint16_t mRawPowerSettingLength;
50     };
51 
52     constexpr CalibratedPowerEntry kCalibratedPowerTable[] = {
53         {11, 15000, {0x02}, 1},
54         {11, 5000, {0x00}, 1},
55         {11, 10000, {0x01}, 1},
56     };
57 
58     instance = static_cast<otInstance *>(testInitInstance());
59     VerifyOrQuit(instance != nullptr, "Null OpenThread instance");
60 
61     for (const CalibratedPowerEntry &calibratedPower : kCalibratedPowerTable)
62     {
63         SuccessOrQuit(otPlatRadioAddCalibratedPower(instance, calibratedPower.mChannel, calibratedPower.mActualPower,
64                                                     calibratedPower.mRawPowerSetting,
65                                                     calibratedPower.mRawPowerSettingLength));
66     }
67 
68     SuccessOrQuit(otPlatRadioSetChannelTargetPower(instance, 11, 4999));
69     rawPowerSettingLength = sizeof(rawPowerSetting);
70     VerifyOrQuit(otPlatRadioGetRawPowerSetting(instance, 11, rawPowerSetting, &rawPowerSettingLength) ==
71                  OT_ERROR_NOT_FOUND);
72 
73     SuccessOrQuit(otPlatRadioSetChannelTargetPower(instance, 11, 5000));
74     rawPowerSettingLength = sizeof(rawPowerSetting);
75     SuccessOrQuit(otPlatRadioGetRawPowerSetting(instance, 11, rawPowerSetting, &rawPowerSettingLength));
76     VerifyOrQuit(rawPowerSettingLength == 1);
77     VerifyOrQuit(rawPowerSetting[0] == 0x00);
78 
79     SuccessOrQuit(otPlatRadioSetChannelTargetPower(instance, 11, 9999));
80     rawPowerSettingLength = sizeof(rawPowerSetting);
81     SuccessOrQuit(otPlatRadioGetRawPowerSetting(instance, 11, rawPowerSetting, &rawPowerSettingLength));
82     VerifyOrQuit(rawPowerSettingLength == 1);
83     VerifyOrQuit(rawPowerSetting[0] == 0x00);
84 
85     SuccessOrQuit(otPlatRadioSetChannelTargetPower(instance, 11, 10000));
86     rawPowerSettingLength = sizeof(rawPowerSetting);
87     SuccessOrQuit(otPlatRadioGetRawPowerSetting(instance, 11, rawPowerSetting, &rawPowerSettingLength));
88     VerifyOrQuit(rawPowerSettingLength == 1);
89     VerifyOrQuit(rawPowerSetting[0] == 0x01);
90 
91     SuccessOrQuit(otPlatRadioSetChannelTargetPower(instance, 11, 14999));
92     rawPowerSettingLength = sizeof(rawPowerSetting);
93     SuccessOrQuit(otPlatRadioGetRawPowerSetting(instance, 11, rawPowerSetting, &rawPowerSettingLength));
94     VerifyOrQuit(rawPowerSettingLength == 1);
95     VerifyOrQuit(rawPowerSetting[0] == 0x01);
96 
97     SuccessOrQuit(otPlatRadioSetChannelTargetPower(instance, 11, 15000));
98     rawPowerSettingLength = sizeof(rawPowerSetting);
99     SuccessOrQuit(otPlatRadioGetRawPowerSetting(instance, 11, rawPowerSetting, &rawPowerSettingLength));
100     VerifyOrQuit(rawPowerSettingLength == 1);
101     VerifyOrQuit(rawPowerSetting[0] == 0x02);
102 
103     SuccessOrQuit(otPlatRadioSetChannelTargetPower(instance, 11, 15001));
104     rawPowerSettingLength = sizeof(rawPowerSetting);
105     SuccessOrQuit(otPlatRadioGetRawPowerSetting(instance, 11, rawPowerSetting, &rawPowerSettingLength));
106     VerifyOrQuit(rawPowerSettingLength == 1);
107     VerifyOrQuit(rawPowerSetting[0] == 0x02);
108 
109     rawPowerSettingLength = sizeof(rawPowerSetting);
110     VerifyOrQuit(otPlatRadioGetRawPowerSetting(instance, 12, rawPowerSetting, &rawPowerSettingLength) ==
111                  OT_ERROR_NOT_FOUND);
112 
113     SuccessOrQuit(otPlatRadioClearCalibratedPowers(instance));
114     rawPowerSettingLength = sizeof(rawPowerSetting);
115     VerifyOrQuit(otPlatRadioGetRawPowerSetting(instance, 11, rawPowerSetting, &rawPowerSettingLength) ==
116                  OT_ERROR_NOT_FOUND);
117 
118     for (const CalibratedPowerEntry &calibratedPower : kCalibratedPowerTable)
119     {
120         SuccessOrQuit(otPlatRadioAddCalibratedPower(instance, calibratedPower.mChannel, calibratedPower.mActualPower,
121                                                     calibratedPower.mRawPowerSetting,
122                                                     calibratedPower.mRawPowerSettingLength));
123     }
124 
125     SuccessOrQuit(otPlatRadioSetChannelTargetPower(instance, 11, 15000));
126     rawPowerSettingLength = sizeof(rawPowerSetting);
127     SuccessOrQuit(otPlatRadioGetRawPowerSetting(instance, 11, rawPowerSetting, &rawPowerSettingLength));
128     VerifyOrQuit(rawPowerSettingLength == 1);
129     VerifyOrQuit(rawPowerSetting[0] == 0x02);
130 
131     VerifyOrQuit(
132         otPlatRadioAddCalibratedPower(instance, kCalibratedPowerTable[0].mChannel,
133                                       kCalibratedPowerTable[0].mActualPower, kCalibratedPowerTable[0].mRawPowerSetting,
134                                       kCalibratedPowerTable[0].mRawPowerSettingLength) == OT_ERROR_INVALID_ARGS);
135 
136     testFreeInstance(instance);
137 }
138 } // namespace ot
139 
140 #endif // OPENTHREAD_CONFIG_POWER_CALIBRATION_ENABLE && OPENTHREAD_CONFIG_PLATFORM_POWER_CALIBRATION_ENABLE
141 
main(void)142 int main(void)
143 {
144 #if OPENTHREAD_CONFIG_POWER_CALIBRATION_ENABLE && OPENTHREAD_CONFIG_PLATFORM_POWER_CALIBRATION_ENABLE
145     ot::TestPowerCalibration();
146     printf("All tests passed\n");
147 #else
148     printf("Power calibration is not enabled\n");
149 #endif
150     return 0;
151 }
152