1
0
Fork 0
mirror of https://github.com/betaflight/betaflight.git synced 2025-07-20 23:05:19 +03:00

Merge pull request #7500 from mikeller/improve_crsf_flight_mode_reporting

Improved CRSF flight mode reporting.
This commit is contained in:
Michael Keller 2019-02-03 14:50:09 +13:00 committed by GitHub
commit 493d0d0d8f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 47 additions and 7 deletions

View file

@ -267,19 +267,39 @@ void crsfFrameFlightMode(sbuf_t *dst)
sbufWriteU8(dst, 0); sbufWriteU8(dst, 0);
sbufWriteU8(dst, CRSF_FRAMETYPE_FLIGHT_MODE); sbufWriteU8(dst, CRSF_FRAMETYPE_FLIGHT_MODE);
// use same logic as OSD, so telemetry displays same flight text as OSD // Acro is the default mode
const char *flightMode = "ACRO"; const char *flightMode = "ACRO";
if (airmodeIsEnabled()) {
flightMode = "AIR"; // Modes that are only relevant when disarmed
} if (!ARMING_FLAG(ARMED) && isArmingDisabled()) {
flightMode = "!ERR";
} else
#if defined(USE_GPS)
if (!ARMING_FLAG(ARMED) && featureIsEnabled(FEATURE_GPS) && (!STATE(GPS_FIX) || !STATE(GPS_FIX_HOME))) {
flightMode = "WAIT"; // Waiting for GPS lock
} else
#endif
// Flight modes in decreasing order of importance
if (FLIGHT_MODE(FAILSAFE_MODE)) { if (FLIGHT_MODE(FAILSAFE_MODE)) {
flightMode = "!FS"; flightMode = "!FS!";
} else if (FLIGHT_MODE(GPS_RESCUE_MODE)) {
flightMode = "RTH";
} else if (FLIGHT_MODE(PASSTHRU_MODE)) {
flightMode = "MANU";
} else if (FLIGHT_MODE(ANGLE_MODE)) { } else if (FLIGHT_MODE(ANGLE_MODE)) {
flightMode = "STAB"; flightMode = "STAB";
} else if (FLIGHT_MODE(HORIZON_MODE)) { } else if (FLIGHT_MODE(HORIZON_MODE)) {
flightMode = "HOR"; flightMode = "HOR";
} else if (airmodeIsEnabled()) {
flightMode = "AIR";
} }
sbufWriteString(dst, flightMode); sbufWriteString(dst, flightMode);
if (!ARMING_FLAG(ARMED)) {
sbufWriteU8(dst, '*');
}
sbufWriteU8(dst, '\0'); // zero-terminate string sbufWriteU8(dst, '\0'); // zero-terminate string
// write in the frame length // write in the frame length
*lengthPtr = sbufPtr(dst) - lengthPtr; *lengthPtr = sbufPtr(dst) - lengthPtr;

View file

@ -216,9 +216,30 @@ TEST(TelemetryCrsfTest, TestFlightMode)
{ {
uint8_t frame[CRSF_FRAME_SIZE_MAX]; uint8_t frame[CRSF_FRAME_SIZE_MAX];
// nothing set, so ACRO mode ENABLE_STATE(GPS_FIX);
ENABLE_STATE(GPS_FIX_HOME);
airMode = false; airMode = false;
DISABLE_ARMING_FLAG(ARMED);
// nothing set, so ACRO mode
int frameLen = getCrsfFrame(frame, CRSF_FRAMETYPE_FLIGHT_MODE); int frameLen = getCrsfFrame(frame, CRSF_FRAMETYPE_FLIGHT_MODE);
EXPECT_EQ(6 + FRAME_HEADER_FOOTER_LEN, frameLen);
EXPECT_EQ(CRSF_SYNC_BYTE, frame[0]); // address
EXPECT_EQ(8, frame[1]); // length
EXPECT_EQ(0x21, frame[2]); // type
EXPECT_EQ('A', frame[3]);
EXPECT_EQ('C', frame[4]);
EXPECT_EQ('R', frame[5]);
EXPECT_EQ('O', frame[6]);
EXPECT_EQ('*', frame[7]);
EXPECT_EQ(0, frame[8]);
EXPECT_EQ(crfsCrc(frame, frameLen), frame[9]);
ENABLE_ARMING_FLAG(ARMED);
frameLen = getCrsfFrame(frame, CRSF_FRAMETYPE_FLIGHT_MODE);
EXPECT_EQ(5 + FRAME_HEADER_FOOTER_LEN, frameLen); EXPECT_EQ(5 + FRAME_HEADER_FOOTER_LEN, frameLen);
EXPECT_EQ(CRSF_SYNC_BYTE, frame[0]); // address EXPECT_EQ(CRSF_SYNC_BYTE, frame[0]); // address
EXPECT_EQ(7, frame[1]); // length EXPECT_EQ(7, frame[1]); // length
@ -230,7 +251,6 @@ TEST(TelemetryCrsfTest, TestFlightMode)
EXPECT_EQ(0, frame[7]); EXPECT_EQ(0, frame[7]);
EXPECT_EQ(crfsCrc(frame, frameLen), frame[8]); EXPECT_EQ(crfsCrc(frame, frameLen), frame[8]);
enableFlightMode(ANGLE_MODE); enableFlightMode(ANGLE_MODE);
EXPECT_EQ(ANGLE_MODE, FLIGHT_MODE(ANGLE_MODE)); EXPECT_EQ(ANGLE_MODE, FLIGHT_MODE(ANGLE_MODE));
frameLen = getCrsfFrame(frame, CRSF_FRAMETYPE_FLIGHT_MODE); frameLen = getCrsfFrame(frame, CRSF_FRAMETYPE_FLIGHT_MODE);