1
0
Fork 0
mirror of https://github.com/betaflight/betaflight.git synced 2025-07-20 14:55:21 +03:00

Calculate blackbox rate_num and rate_denom for MSP

This commit is contained in:
Martin Budden 2017-05-04 11:01:38 +01:00
parent c1f8e56b7f
commit f6097cba18
4 changed files with 131 additions and 7 deletions

View file

@ -1669,6 +1669,21 @@ void blackboxUpdate(timeUs_t currentTimeUs)
} }
} }
int blackboxCalculatePDenom(int rateNum, int rateDenom)
{
return blackboxIInterval * rateNum / rateDenom;
}
uint8_t blackboxGetRateNum(void)
{
return blackboxGetRateDenom() * blackboxConfig()->p_denom / blackboxIInterval;
}
uint8_t blackboxGetRateDenom(void)
{
return gcd(blackboxIInterval, blackboxPInterval);
}
/** /**
* Call during system startup to initialize the blackbox. * Call during system startup to initialize the blackbox.
*/ */

View file

@ -47,6 +47,9 @@ void blackboxLogEvent(FlightLogEvent event, flightLogEventData_t *data);
void blackboxInit(void); void blackboxInit(void);
void blackboxUpdate(timeUs_t currentTimeUs); void blackboxUpdate(timeUs_t currentTimeUs);
int blackboxCalculatePDenom(int rateNum, int rateDenom);
uint8_t blackboxGetRateNum(void);
uint8_t blackboxGetRateDenom(void);
void blackboxValidateConfig(void); void blackboxValidateConfig(void);
void blackboxFinish(void); void blackboxFinish(void);
bool blackboxMayEditConfig(void); bool blackboxMayEditConfig(void);

View file

@ -1263,8 +1263,8 @@ static bool mspFcProcessOutCommand(uint8_t cmdMSP, sbuf_t *dst, mspPostProcessFn
#ifdef BLACKBOX #ifdef BLACKBOX
sbufWriteU8(dst, 1); //Blackbox supported sbufWriteU8(dst, 1); //Blackbox supported
sbufWriteU8(dst, blackboxConfig()->device); sbufWriteU8(dst, blackboxConfig()->device);
sbufWriteU8(dst, 0); // was rate_num sbufWriteU8(dst, blackboxGetRateNum());
sbufWriteU8(dst, 0); // was rate_denom sbufWriteU8(dst, blackboxGetRateDenom());
sbufWriteU8(dst, blackboxConfig()->p_denom); sbufWriteU8(dst, blackboxConfig()->p_denom);
#else #else
sbufWriteU8(dst, 0); // Blackbox not supported sbufWriteU8(dst, 0); // Blackbox not supported
@ -1789,9 +1789,15 @@ static mspResult_e mspFcProcessInCommand(uint8_t cmdMSP, sbuf_t *src)
// Don't allow config to be updated while Blackbox is logging // Don't allow config to be updated while Blackbox is logging
if (blackboxMayEditConfig()) { if (blackboxMayEditConfig()) {
blackboxConfigMutable()->device = sbufReadU8(src); blackboxConfigMutable()->device = sbufReadU8(src);
sbufReadU8(src); // was rate_nuk const int rateNum = sbufReadU8(src); // was rate_num
sbufReadU8(src); // was rate_denom const int rateDenom = sbufReadU8(src); // was rate_denom
if (sbufBytesRemaining(src) >= 1) {
// p_denom specified, so use it directly
blackboxConfigMutable()->p_denom = sbufReadU8(src); blackboxConfigMutable()->p_denom = sbufReadU8(src);
} else {
// p_denom not specified in MSP, so calculate it from old rateNum and rateDenom
blackboxConfigMutable()->p_denom = blackboxCalculatePDenom(rateNum, rateDenom);
}
} }
break; break;
#endif #endif

View file

@ -199,7 +199,7 @@ TEST(BlackboxTest, Test_2kHz)
TEST(BlackboxTest, Test_8kHz) TEST(BlackboxTest, Test_8kHz)
{ {
blackboxConfigMutable()->p_denom = 32; blackboxConfigMutable()->p_denom = 32;
// 1kHz PIDloop // 8kHz PIDloop
gyro.targetLooptime = 125; gyro.targetLooptime = 125;
blackboxInit(); blackboxInit();
EXPECT_EQ(true, blackboxShouldLogIFrame()); EXPECT_EQ(true, blackboxShouldLogIFrame());
@ -224,7 +224,7 @@ TEST(BlackboxTest, Test_8kHz)
TEST(BlackboxTest, Test_zero_p_denom) TEST(BlackboxTest, Test_zero_p_denom)
{ {
blackboxConfigMutable()->p_denom = 0; blackboxConfigMutable()->p_denom = 0;
// 2kHz PIDloop // 1kHz PIDloop
gyro.targetLooptime = 1000; gyro.targetLooptime = 1000;
blackboxInit(); blackboxInit();
EXPECT_EQ(32, blackboxIInterval); EXPECT_EQ(32, blackboxIInterval);
@ -242,6 +242,106 @@ TEST(BlackboxTest, Test_zero_p_denom)
EXPECT_EQ(false, blackboxShouldLogPFrame()); EXPECT_EQ(false, blackboxShouldLogPFrame());
} }
TEST(BlackboxTest, Test_CalculatePDenom)
{
blackboxConfigMutable()->p_denom = 0;
// note I-frame is logged every 32ms regardless of PIDloop rate
// so p_denom is 32 when blackbox logging rate is 1kHz
// 1kHz PIDloop
gyro.targetLooptime = 1000;
blackboxInit();
EXPECT_EQ(32, blackboxIInterval);
EXPECT_EQ(32, blackboxCalculatePDenom(1, 1)); // 1kHz logging
EXPECT_EQ(16, blackboxCalculatePDenom(1, 2));
EXPECT_EQ(8, blackboxCalculatePDenom(1, 4));
// 2kHz PIDloop
gyro.targetLooptime = 500;
blackboxInit();
EXPECT_EQ(64, blackboxIInterval);
EXPECT_EQ(64, blackboxCalculatePDenom(1, 1));
EXPECT_EQ(32, blackboxCalculatePDenom(1, 2)); // 1kHz logging
EXPECT_EQ(16, blackboxCalculatePDenom(1, 4));
// 4kHz PIDloop
gyro.targetLooptime = 250;
blackboxInit();
EXPECT_EQ(128, blackboxIInterval);
EXPECT_EQ(128, blackboxCalculatePDenom(1, 1));
EXPECT_EQ(64, blackboxCalculatePDenom(1, 2));
EXPECT_EQ(32, blackboxCalculatePDenom(1, 4)); // 1kHz logging
EXPECT_EQ(16, blackboxCalculatePDenom(1, 8));
// 8kHz PIDloop
gyro.targetLooptime = 125;
blackboxInit();
EXPECT_EQ(256, blackboxIInterval);
EXPECT_EQ(256, blackboxCalculatePDenom(1, 1));
EXPECT_EQ(128, blackboxCalculatePDenom(1, 2));
EXPECT_EQ(64, blackboxCalculatePDenom(1, 4));
EXPECT_EQ(32, blackboxCalculatePDenom(1, 8)); // 1kHz logging
EXPECT_EQ(16, blackboxCalculatePDenom(1, 16));
}
TEST(BlackboxTest, Test_CalculateRates)
{
// 1kHz PIDloop
gyro.targetLooptime = 1000;
blackboxConfigMutable()->p_denom = 32;
blackboxInit();
EXPECT_EQ(32, blackboxIInterval);
EXPECT_EQ(1, blackboxPInterval);
EXPECT_EQ(1, blackboxGetRateNum());
EXPECT_EQ(1, blackboxGetRateDenom());
blackboxConfigMutable()->p_denom = 16;
blackboxInit();
EXPECT_EQ(32, blackboxIInterval);
EXPECT_EQ(2, blackboxPInterval);
EXPECT_EQ(1, blackboxGetRateNum());
EXPECT_EQ(2, blackboxGetRateDenom());
blackboxConfigMutable()->p_denom = 8;
blackboxInit();
EXPECT_EQ(32, blackboxIInterval);
EXPECT_EQ(4, blackboxPInterval);
EXPECT_EQ(1, blackboxGetRateNum());
EXPECT_EQ(4, blackboxGetRateDenom());
// 8kHz PIDloop
gyro.targetLooptime = 125;
blackboxConfigMutable()->p_denom = 32; // 1kHz logging
blackboxInit();
EXPECT_EQ(256, blackboxIInterval);
EXPECT_EQ(8, blackboxPInterval);
EXPECT_EQ(1, blackboxGetRateNum());
EXPECT_EQ(8, blackboxGetRateDenom());
blackboxConfigMutable()->p_denom = 64; // 2kHz logging
blackboxInit();
EXPECT_EQ(256, blackboxIInterval);
EXPECT_EQ(4, blackboxPInterval);
EXPECT_EQ(1, blackboxGetRateNum());
EXPECT_EQ(4, blackboxGetRateDenom());
blackboxConfigMutable()->p_denom = 128; // 4kHz logging
blackboxInit();
EXPECT_EQ(256, blackboxIInterval);
EXPECT_EQ(2, blackboxPInterval);
EXPECT_EQ(1, blackboxGetRateNum());
EXPECT_EQ(2, blackboxGetRateDenom());
blackboxConfigMutable()->p_denom = 256; // 8kHz logging
blackboxInit();
EXPECT_EQ(256, blackboxIInterval);
EXPECT_EQ(1, blackboxPInterval);
EXPECT_EQ(1, blackboxGetRateNum());
EXPECT_EQ(1, blackboxGetRateDenom());
}
// STUBS // STUBS
extern "C" { extern "C" {