Create set-home.md
[u360gts.git] / src / test / unit / rx_rx_unittest.cc
blob6b1d263ef70731df08b2add268a227933e653c72
1 /*
2 * This file is part of Cleanflight.
4 * Cleanflight is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
9 * Cleanflight is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with Cleanflight. If not, see <http://www.gnu.org/licenses/>.
18 #include <stdint.h>
19 #include <stdbool.h>
21 #include <limits.h>
23 extern "C" {
24 #include "platform.h"
26 #include "rx/rx.h"
27 #include "io/rc_controls.h"
28 #include "common/maths.h"
30 uint32_t rcModeActivationMask;
32 void rxInit(rxConfig_t *rxConfig, modeActivationCondition_t *modeActivationConditions);
33 void rxResetFlightChannelStatus(void);
34 bool rxHaveValidFlightChannels(void);
35 bool isPulseValid(uint16_t pulseDuration);
36 void rxUpdateFlightChannelStatus(uint8_t channel, uint16_t pulseDuration);
39 #include "unittest_macros.h"
40 #include "gtest/gtest.h"
42 #define DE_ACTIVATE_ALL_BOXES 0
44 typedef struct testData_s {
45 bool isPPMDataBeingReceived;
46 bool isPWMDataBeingReceived;
47 } testData_t;
49 static testData_t testData;
51 TEST(RxTest, TestValidFlightChannels)
53 // given
54 memset(&testData, 0, sizeof(testData));
55 rcModeActivationMask = DE_ACTIVATE_ALL_BOXES; // BOXFAILSAFE must be OFF
57 // and
58 rxConfig_t rxConfig;
59 modeActivationCondition_t modeActivationConditions[MAX_MODE_ACTIVATION_CONDITION_COUNT];
61 memset(&rxConfig, 0, sizeof(rxConfig));
62 rxConfig.rx_min_usec = 1000;
63 rxConfig.rx_max_usec = 2000;
65 memset(&modeActivationConditions, 0, sizeof(modeActivationConditions));
66 modeActivationConditions[0].auxChannelIndex = 0;
67 modeActivationConditions[0].modeId = BOXARM;
68 modeActivationConditions[0].range.startStep = CHANNEL_VALUE_TO_STEP(CHANNEL_RANGE_MIN);
69 modeActivationConditions[0].range.endStep = CHANNEL_VALUE_TO_STEP(1600);
71 // when
72 rxInit(&rxConfig, modeActivationConditions);
74 // then (ARM channel should be positioned just 1 step above active range to init to OFF)
75 EXPECT_EQ(1625, rcData[modeActivationConditions[0].auxChannelIndex + NON_AUX_CHANNEL_COUNT]);
77 // given
78 rxResetFlightChannelStatus();
80 // and
81 for (uint8_t channelIndex = 0; channelIndex < MAX_SUPPORTED_RC_CHANNEL_COUNT; channelIndex++) {
82 bool validPulse = isPulseValid(1500);
83 rxUpdateFlightChannelStatus(channelIndex, validPulse);
86 // then
87 EXPECT_TRUE(rxHaveValidFlightChannels());
90 TEST(RxTest, TestInvalidFlightChannels)
92 // given
93 memset(&testData, 0, sizeof(testData));
95 // and
96 rxConfig_t rxConfig;
97 modeActivationCondition_t modeActivationConditions[MAX_MODE_ACTIVATION_CONDITION_COUNT];
99 memset(&rxConfig, 0, sizeof(rxConfig));
100 rxConfig.rx_min_usec = 1000;
101 rxConfig.rx_max_usec = 2000;
103 memset(&modeActivationConditions, 0, sizeof(modeActivationConditions));
104 modeActivationConditions[0].auxChannelIndex = 0;
105 modeActivationConditions[0].modeId = BOXARM;
106 modeActivationConditions[0].range.startStep = CHANNEL_VALUE_TO_STEP(1400);
107 modeActivationConditions[0].range.endStep = CHANNEL_VALUE_TO_STEP(CHANNEL_RANGE_MAX);
109 // and
110 uint16_t channelPulses[MAX_SUPPORTED_RC_CHANNEL_COUNT];
111 memset(&channelPulses, 1500, sizeof(channelPulses));
113 // and
114 rxInit(&rxConfig, modeActivationConditions);
116 // then (ARM channel should be positioned just 1 step below active range to init to OFF)
117 EXPECT_EQ(1375, rcData[modeActivationConditions[0].auxChannelIndex + NON_AUX_CHANNEL_COUNT]);
119 // and
120 for (uint8_t stickChannelIndex = 0; stickChannelIndex < STICK_CHANNEL_COUNT; stickChannelIndex++) {
122 // given
123 rxResetFlightChannelStatus();
125 for (uint8_t otherStickChannelIndex = 0; otherStickChannelIndex < STICK_CHANNEL_COUNT; otherStickChannelIndex++) {
126 channelPulses[otherStickChannelIndex] = rxConfig.rx_min_usec;
128 channelPulses[stickChannelIndex] = rxConfig.rx_min_usec - 1;
130 // when
131 for (uint8_t channelIndex = 0; channelIndex < MAX_SUPPORTED_RC_CHANNEL_COUNT; channelIndex++) {
132 bool validPulse = isPulseValid(channelPulses[channelIndex]);
133 rxUpdateFlightChannelStatus(channelIndex, validPulse);
136 // then
137 EXPECT_FALSE(rxHaveValidFlightChannels());
139 // given
140 rxResetFlightChannelStatus();
142 for (uint8_t otherStickChannelIndex = 0; otherStickChannelIndex < STICK_CHANNEL_COUNT; otherStickChannelIndex++) {
143 channelPulses[otherStickChannelIndex] = rxConfig.rx_max_usec;
145 channelPulses[stickChannelIndex] = rxConfig.rx_max_usec + 1;
147 // when
148 for (uint8_t channelIndex = 0; channelIndex < MAX_SUPPORTED_RC_CHANNEL_COUNT; channelIndex++) {
149 bool validPulse = isPulseValid(channelPulses[channelIndex]);
150 rxUpdateFlightChannelStatus(channelIndex, validPulse);
153 // then
154 EXPECT_FALSE(rxHaveValidFlightChannels());
159 // STUBS
161 extern "C" {
162 void failsafeOnValidDataFailed() {}
163 void failsafeOnValidDataReceived() {}
165 void failsafeOnRxSuspend(uint32_t ) {}
166 void failsafeOnRxResume(void) {}
168 uint32_t micros(void) { return 0; }
169 uint32_t millis(void) { return 0; }
171 bool feature(uint32_t mask) {
172 UNUSED(mask);
173 return false;
176 bool isPPMDataBeingReceived(void) {
177 return testData.isPPMDataBeingReceived;
180 bool isPWMDataBeingReceived(void) {
181 return testData.isPWMDataBeingReceived;
184 void resetPPMDataReceivedState(void) {}
186 bool rxMspFrameComplete(void) { return false; }
188 void rxMspInit(rxConfig_t *, rxRuntimeConfig_t *, rcReadRawDataPtr *) {}
190 void rxPwmInit(rxRuntimeConfig_t *, rcReadRawDataPtr *) {}