Adding a unit test for quad X motor mixers.

This commit is contained in:
Dominic Clifton 2015-03-21 11:30:03 +01:00
parent 730d0fe45c
commit 4154afcb63
2 changed files with 85 additions and 18 deletions

View File

@ -203,7 +203,7 @@ static const motorMixer_t mixerDualcopter[] = {
// Keep synced with mixerMode_e
const mixer_t mixers[] = {
// Mo Se Mixtable
// motors, servos, motor mixer
{ 0, 0, NULL }, // entry 0
{ 3, 1, mixerTri }, // MIXER_TRI
{ 4, 0, mixerQuadP }, // MIXER_QUADP
@ -224,7 +224,7 @@ const mixer_t mixers[] = {
{ 4, 0, mixerVtail4 }, // MIXER_VTAIL4
{ 6, 0, mixerHex6H }, // MIXER_HEX6H
{ 0, 1, NULL }, // * MIXER_PPM_TO_SERVO
{ 2, 1, mixerDualcopter }, // MIXER_DUALCOPTER
{ 2, 1, mixerDualcopter }, // MIXER_DUALCOPTER
{ 1, 1, NULL }, // MIXER_SINGLECOPTER
{ 4, 0, mixerAtail4 }, // MIXER_ATAIL4
{ 0, 0, NULL }, // MIXER_CUSTOM
@ -665,9 +665,11 @@ void mixTable(void)
}
// constrain servos
for (i = 0; i < MAX_SUPPORTED_SERVOS; i++)
servo[i] = constrain(servo[i], servoConf[i].min, servoConf[i].max); // limit the values
if (useServo) {
for (i = 0; i < MAX_SUPPORTED_SERVOS; i++) {
servo[i] = constrain(servo[i], servoConf[i].min, servoConf[i].max); // limit the values
}
}
// forward AUX1-4 to servo outputs (not constrained)
if (gimbalConfig->gimbal_flags & GIMBAL_FORWARDAUX) {
forwardAuxChannelsToServos();

View File

@ -65,6 +65,13 @@ extern "C" {
#include "unittest_macros.h"
#include "gtest/gtest.h"
// input
#define TEST_RC_MID 1500
// output
#define TEST_MIN_COMMAND 1000
#define TEST_SERVO_MID 1500
typedef struct motor_s {
uint16_t value;
} motor_t;
@ -87,17 +94,17 @@ TEST(FlightMixerTest, TestForwardAuxChannelsToServosWithNoServos)
memset(&servos, 0, sizeof(servos));
servoCount = 0;
rcData[AUX1] = 1500;
rcData[AUX2] = 1500;
rcData[AUX3] = 1500;
rcData[AUX4] = 1500;
rcData[AUX1] = TEST_RC_MID;
rcData[AUX2] = TEST_RC_MID;
rcData[AUX3] = TEST_RC_MID;
rcData[AUX4] = TEST_RC_MID;
// when
forwardAuxChannelsToServos();
// then
for (uint8_t i = 0; i < MAX_SUPPORTED_SERVOS; i++) {
EXPECT_EQ(servos[i].value, 0);
EXPECT_EQ(0, servos[i].value);
}
}
@ -122,10 +129,10 @@ TEST(FlightMixerTest, TestForwardAuxChannelsToServosWithMaxServos)
}
// -1 for zero based offset
EXPECT_EQ(servos[MAX_SUPPORTED_SERVOS - 3 - 1].value, 1000);
EXPECT_EQ(servos[MAX_SUPPORTED_SERVOS - 2 - 1].value, 1250);
EXPECT_EQ(servos[MAX_SUPPORTED_SERVOS - 1 - 1].value, 1750);
EXPECT_EQ(servos[MAX_SUPPORTED_SERVOS - 0 - 1].value, 2000);
EXPECT_EQ(1000, servos[MAX_SUPPORTED_SERVOS - 3 - 1].value);
EXPECT_EQ(1250, servos[MAX_SUPPORTED_SERVOS - 2 - 1].value);
EXPECT_EQ(1750, servos[MAX_SUPPORTED_SERVOS - 1 - 1].value);
EXPECT_EQ(2000, servos[MAX_SUPPORTED_SERVOS - 0 - 1].value);
}
TEST(FlightMixerTest, TestForwardAuxChannelsToServosWithLessServosThanAuxChannelsToForward)
@ -149,8 +156,8 @@ TEST(FlightMixerTest, TestForwardAuxChannelsToServosWithLessServosThanAuxChannel
}
// -1 for zero based offset
EXPECT_EQ(servos[0].value, 1000);
EXPECT_EQ(servos[1].value, 1250);
EXPECT_EQ(1000, servos[0].value);
EXPECT_EQ(1250, servos[1].value);
}
TEST(FlightMixerTest, TestTricopterServo)
@ -163,7 +170,7 @@ TEST(FlightMixerTest, TestTricopterServo)
escAndServoConfig_t escAndServoConfig;
memset(&escAndServoConfig, 0, sizeof(escAndServoConfig));
escAndServoConfig.mincommand = 1000;
escAndServoConfig.mincommand = TEST_MIN_COMMAND;
servoParam_t servoConf[MAX_SUPPORTED_SERVOS];
memset(&servoConf, 0, sizeof(servoConf));
@ -213,9 +220,67 @@ TEST(FlightMixerTest, TestTricopterServo)
writeServos();
// then
EXPECT_EQ(servos[0].value, 1500);
EXPECT_EQ(TEST_SERVO_MID, servos[0].value);
}
TEST(FlightMixerTest, TestQuadMotors)
{
// given
mixerConfig_t mixerConfig;
memset(&mixerConfig, 0, sizeof(mixerConfig));
//servoParam_t servoConf[MAX_SUPPORTED_SERVOS];
//memset(&servoConf, 0, sizeof(servoConf));
escAndServoConfig_t escAndServoConfig;
memset(&escAndServoConfig, 0, sizeof(escAndServoConfig));
escAndServoConfig.mincommand = TEST_MIN_COMMAND;
gimbalConfig_t gimbalConfig = {
.gimbal_flags = 0
};
mixerUseConfigs(
NULL,// servoConf,
&gimbalConfig,
NULL,
&escAndServoConfig,
&mixerConfig,
NULL,
NULL
);
motorMixer_t customMixer[MAX_SUPPORTED_MOTORS];
memset(&customMixer, 0, sizeof(customMixer));
mixerInit(MIXER_QUADX, customMixer);
// and
pwmOutputConfiguration_t pwmOutputConfiguration = {
.servoCount = 0,
.motorCount = 4
};
mixerUsePWMOutputConfiguration(&pwmOutputConfiguration);
// and
memset(rcCommand, 0, sizeof(rcCommand));
// and
memset(axisPID, 0, sizeof(axisPID));
axisPID[YAW] = 0;
// when
mixTable();
writeMotors();
// then
EXPECT_EQ(TEST_MIN_COMMAND, motors[0].value);
EXPECT_EQ(TEST_MIN_COMMAND, motors[1].value);
EXPECT_EQ(TEST_MIN_COMMAND, motors[2].value);
EXPECT_EQ(TEST_MIN_COMMAND, motors[3].value);
}
// STUBS