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