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

Rationalised CRSF constants

This commit is contained in:
Martin Budden 2017-08-31 17:02:49 +01:00
parent 3c2f62a6a9
commit 604b661a62
4 changed files with 33 additions and 32 deletions

View file

@ -30,7 +30,7 @@ typedef enum {
CRSF_FRAMETYPE_RC_CHANNELS_PACKED = 0x16, CRSF_FRAMETYPE_RC_CHANNELS_PACKED = 0x16,
CRSF_FRAMETYPE_ATTITUDE = 0x1E, CRSF_FRAMETYPE_ATTITUDE = 0x1E,
CRSF_FRAMETYPE_FLIGHT_MODE = 0x21 CRSF_FRAMETYPE_FLIGHT_MODE = 0x21
} crsfFrameTypes_e; } crsfFrameType_e;
enum { enum {
CRSF_FRAME_GPS_PAYLOAD_SIZE = 15, CRSF_FRAME_GPS_PAYLOAD_SIZE = 15,

View file

@ -226,7 +226,15 @@ void crsfFrameFlightMode(sbuf_t *dst)
#define BV(x) (1 << (x)) // bit value #define BV(x) (1 << (x)) // bit value
// schedule array to decide how often each type of frame is sent // schedule array to decide how often each type of frame is sent
#define CRSF_SCHEDULE_COUNT_MAX 5 typedef enum {
CRSF_FRAME_START_INDEX = 0,
CRSF_FRAME_ATTITUDE_INDEX = CRSF_FRAME_START_INDEX,
CRSF_FRAME_BATTERY_SENSOR_INDEX,
CRSF_FRAME_FLIGHT_MODE_INDEX,
CRSF_FRAME_GPS_INDEX,
CRSF_SCHEDULE_COUNT_MAX
} crsfFrameTypeIndex_e;
static uint8_t crsfScheduleCount; static uint8_t crsfScheduleCount;
static uint8_t crsfSchedule[CRSF_SCHEDULE_COUNT_MAX]; static uint8_t crsfSchedule[CRSF_SCHEDULE_COUNT_MAX];
@ -239,23 +247,23 @@ static void processCrsf(void)
sbuf_t crsfPayloadBuf; sbuf_t crsfPayloadBuf;
sbuf_t *dst = &crsfPayloadBuf; sbuf_t *dst = &crsfPayloadBuf;
if (currentSchedule & BV(CRSF_FRAME_ATTITUDE)) { if (currentSchedule & BV(CRSF_FRAME_ATTITUDE_INDEX)) {
crsfInitializeFrame(dst); crsfInitializeFrame(dst);
crsfFrameAttitude(dst); crsfFrameAttitude(dst);
crsfFinalize(dst); crsfFinalize(dst);
} }
if (currentSchedule & BV(CRSF_FRAME_BATTERY_SENSOR)) { if (currentSchedule & BV(CRSF_FRAME_BATTERY_SENSOR_INDEX)) {
crsfInitializeFrame(dst); crsfInitializeFrame(dst);
crsfFrameBatterySensor(dst); crsfFrameBatterySensor(dst);
crsfFinalize(dst); crsfFinalize(dst);
} }
if (currentSchedule & BV(CRSF_FRAME_FLIGHT_MODE)) { if (currentSchedule & BV(CRSF_FRAME_FLIGHT_MODE_INDEX)) {
crsfInitializeFrame(dst); crsfInitializeFrame(dst);
crsfFrameFlightMode(dst); crsfFrameFlightMode(dst);
crsfFinalize(dst); crsfFinalize(dst);
} }
#ifdef GPS #ifdef GPS
if (currentSchedule & BV(CRSF_FRAME_GPS)) { if (currentSchedule & BV(CRSF_FRAME_GPS_INDEX)) {
crsfInitializeFrame(dst); crsfInitializeFrame(dst);
crsfFrameGps(dst); crsfFrameGps(dst);
crsfFinalize(dst); crsfFinalize(dst);
@ -270,11 +278,11 @@ void initCrsfTelemetry(void)
// and feature is enabled, if so, set CRSF telemetry enabled // and feature is enabled, if so, set CRSF telemetry enabled
crsfTelemetryEnabled = crsfRxIsActive(); crsfTelemetryEnabled = crsfRxIsActive();
int index = 0; int index = 0;
crsfSchedule[index++] = BV(CRSF_FRAME_ATTITUDE); crsfSchedule[index++] = BV(CRSF_FRAME_ATTITUDE_INDEX);
crsfSchedule[index++] = BV(CRSF_FRAME_BATTERY_SENSOR); crsfSchedule[index++] = BV(CRSF_FRAME_BATTERY_SENSOR_INDEX);
crsfSchedule[index++] = BV(CRSF_FRAME_FLIGHT_MODE); crsfSchedule[index++] = BV(CRSF_FRAME_FLIGHT_MODE_INDEX);
if (feature(FEATURE_GPS)) { if (feature(FEATURE_GPS)) {
crsfSchedule[index++] = BV(CRSF_FRAME_GPS); crsfSchedule[index++] = BV(CRSF_FRAME_GPS_INDEX);
} }
crsfScheduleCount = (uint8_t)index; crsfScheduleCount = (uint8_t)index;
@ -315,17 +323,17 @@ int getCrsfFrame(uint8_t *frame, crsfFrameType_e frameType)
crsfInitializeFrame(sbuf); crsfInitializeFrame(sbuf);
switch (frameType) { switch (frameType) {
default: default:
case CRSF_FRAME_ATTITUDE: case CRSF_FRAMETYPE_ATTITUDE:
crsfFrameAttitude(sbuf); crsfFrameAttitude(sbuf);
break; break;
case CRSF_FRAME_BATTERY_SENSOR: case CRSF_FRAMETYPE_BATTERY_SENSOR:
crsfFrameBatterySensor(sbuf); crsfFrameBatterySensor(sbuf);
break; break;
case CRSF_FRAME_FLIGHT_MODE: case CRSF_FRAMETYPE_FLIGHT_MODE:
crsfFrameFlightMode(sbuf); crsfFrameFlightMode(sbuf);
break; break;
#if defined(GPS) #if defined(GPS)
case CRSF_FRAME_GPS: case CRSF_FRAMETYPE_GPS:
crsfFrameGps(sbuf); crsfFrameGps(sbuf);
break; break;
#endif #endif

View file

@ -18,14 +18,7 @@
#pragma once #pragma once
#include "common/time.h" #include "common/time.h"
#include "rx/crsf.h"
typedef enum {
CRSF_FRAME_START = 0,
CRSF_FRAME_ATTITUDE = CRSF_FRAME_START,
CRSF_FRAME_BATTERY_SENSOR,
CRSF_FRAME_FLIGHT_MODE,
CRSF_FRAME_GPS
} crsfFrameType_e;
void initCrsfTelemetry(void); void initCrsfTelemetry(void);
bool checkCrsfTelemetryState(void); bool checkCrsfTelemetryState(void);

View file

@ -91,7 +91,7 @@ TEST(TelemetryCrsfTest, TestGPS)
{ {
uint8_t frame[CRSF_FRAME_SIZE_MAX]; uint8_t frame[CRSF_FRAME_SIZE_MAX];
int frameLen = getCrsfFrame(frame, CRSF_FRAME_GPS); int frameLen = getCrsfFrame(frame, CRSF_FRAMETYPE_GPS);
EXPECT_EQ(CRSF_FRAME_GPS_PAYLOAD_SIZE + FRAME_HEADER_FOOTER_LEN, frameLen); EXPECT_EQ(CRSF_FRAME_GPS_PAYLOAD_SIZE + FRAME_HEADER_FOOTER_LEN, frameLen);
EXPECT_EQ(CRSF_ADDRESS_BROADCAST, frame[0]); // address EXPECT_EQ(CRSF_ADDRESS_BROADCAST, frame[0]); // address
EXPECT_EQ(17, frame[1]); // length EXPECT_EQ(17, frame[1]); // length
@ -117,7 +117,7 @@ TEST(TelemetryCrsfTest, TestGPS)
gpsSol.groundSpeed = 163; // speed in 0.1m/s, 16.3 m/s = 58.68 km/h, so CRSF (km/h *10) value is 587 gpsSol.groundSpeed = 163; // speed in 0.1m/s, 16.3 m/s = 58.68 km/h, so CRSF (km/h *10) value is 587
gpsSol.numSat = 9; gpsSol.numSat = 9;
gpsSol.groundCourse = 1479; // degrees * 10 gpsSol.groundCourse = 1479; // degrees * 10
frameLen = getCrsfFrame(frame, CRSF_FRAME_GPS); frameLen = getCrsfFrame(frame, CRSF_FRAMETYPE_GPS);
lattitude = frame[3] << 24 | frame[4] << 16 | frame[5] << 8 | frame[6]; lattitude = frame[3] << 24 | frame[4] << 16 | frame[5] << 8 | frame[6];
EXPECT_EQ(560000000, lattitude); EXPECT_EQ(560000000, lattitude);
longitude = frame[7] << 24 | frame[8] << 16 | frame[9] << 8 | frame[10]; longitude = frame[7] << 24 | frame[8] << 16 | frame[9] << 8 | frame[10];
@ -138,7 +138,7 @@ TEST(TelemetryCrsfTest, TestBattery)
uint8_t frame[CRSF_FRAME_SIZE_MAX]; uint8_t frame[CRSF_FRAME_SIZE_MAX];
testBatteryVoltage = 0; // 0.1V units testBatteryVoltage = 0; // 0.1V units
int frameLen = getCrsfFrame(frame, CRSF_FRAME_BATTERY_SENSOR); int frameLen = getCrsfFrame(frame, CRSF_FRAMETYPE_BATTERY_SENSOR);
EXPECT_EQ(CRSF_FRAME_BATTERY_SENSOR_PAYLOAD_SIZE + FRAME_HEADER_FOOTER_LEN, frameLen); EXPECT_EQ(CRSF_FRAME_BATTERY_SENSOR_PAYLOAD_SIZE + FRAME_HEADER_FOOTER_LEN, frameLen);
EXPECT_EQ(CRSF_ADDRESS_BROADCAST, frame[0]); // address EXPECT_EQ(CRSF_ADDRESS_BROADCAST, frame[0]); // address
EXPECT_EQ(10, frame[1]); // length EXPECT_EQ(10, frame[1]); // length
@ -156,7 +156,7 @@ TEST(TelemetryCrsfTest, TestBattery)
testBatteryVoltage = 33; // 3.3V = 3300 mv testBatteryVoltage = 33; // 3.3V = 3300 mv
testAmperage = 2960; // = 29.60A = 29600mA - amperage is in 0.01A steps testAmperage = 2960; // = 29.60A = 29600mA - amperage is in 0.01A steps
batteryConfigMutable()->batteryCapacity = 1234; batteryConfigMutable()->batteryCapacity = 1234;
frameLen = getCrsfFrame(frame, CRSF_FRAME_BATTERY_SENSOR); frameLen = getCrsfFrame(frame, CRSF_FRAMETYPE_BATTERY_SENSOR);
voltage = frame[3] << 8 | frame[4]; // mV * 100 voltage = frame[3] << 8 | frame[4]; // mV * 100
EXPECT_EQ(33, voltage); EXPECT_EQ(33, voltage);
current = frame[5] << 8 | frame[6]; // mA * 100 current = frame[5] << 8 | frame[6]; // mA * 100
@ -175,7 +175,7 @@ TEST(TelemetryCrsfTest, TestAttitude)
attitude.values.pitch = 0; attitude.values.pitch = 0;
attitude.values.roll = 0; attitude.values.roll = 0;
attitude.values.yaw = 0; attitude.values.yaw = 0;
int frameLen = getCrsfFrame(frame, CRSF_FRAME_ATTITUDE); int frameLen = getCrsfFrame(frame, CRSF_FRAMETYPE_ATTITUDE);
EXPECT_EQ(CRSF_FRAME_ATTITUDE_PAYLOAD_SIZE + FRAME_HEADER_FOOTER_LEN, frameLen); EXPECT_EQ(CRSF_FRAME_ATTITUDE_PAYLOAD_SIZE + FRAME_HEADER_FOOTER_LEN, frameLen);
EXPECT_EQ(CRSF_ADDRESS_BROADCAST, frame[0]); // address EXPECT_EQ(CRSF_ADDRESS_BROADCAST, frame[0]); // address
EXPECT_EQ(8, frame[1]); // length EXPECT_EQ(8, frame[1]); // length
@ -191,7 +191,7 @@ TEST(TelemetryCrsfTest, TestAttitude)
attitude.values.pitch = 678; // decidegrees == 1.183333232852155 rad attitude.values.pitch = 678; // decidegrees == 1.183333232852155 rad
attitude.values.roll = 1495; // 2.609267231731523 rad attitude.values.roll = 1495; // 2.609267231731523 rad
attitude.values.yaw = -1799; //3.139847324337799 rad attitude.values.yaw = -1799; //3.139847324337799 rad
frameLen = getCrsfFrame(frame, CRSF_FRAME_ATTITUDE); frameLen = getCrsfFrame(frame, CRSF_FRAMETYPE_ATTITUDE);
pitch = frame[3] << 8 | frame[4]; // rad / 10000 pitch = frame[3] << 8 | frame[4]; // rad / 10000
EXPECT_EQ(11833, pitch); EXPECT_EQ(11833, pitch);
roll = frame[5] << 8 | frame[6]; roll = frame[5] << 8 | frame[6];
@ -207,7 +207,7 @@ TEST(TelemetryCrsfTest, TestFlightMode)
// nothing set, so ACRO mode // nothing set, so ACRO mode
airMode = false; airMode = false;
int frameLen = getCrsfFrame(frame, CRSF_FRAME_FLIGHT_MODE); int 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_ADDRESS_BROADCAST, frame[0]); // address EXPECT_EQ(CRSF_ADDRESS_BROADCAST, frame[0]); // address
EXPECT_EQ(7, frame[1]); // length EXPECT_EQ(7, frame[1]); // length
@ -222,7 +222,7 @@ TEST(TelemetryCrsfTest, TestFlightMode)
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_FRAME_FLIGHT_MODE); 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_ADDRESS_BROADCAST, frame[0]); // address EXPECT_EQ(CRSF_ADDRESS_BROADCAST, frame[0]); // address
EXPECT_EQ(7, frame[1]); // length EXPECT_EQ(7, frame[1]); // length
@ -237,7 +237,7 @@ TEST(TelemetryCrsfTest, TestFlightMode)
disableFlightMode(ANGLE_MODE); disableFlightMode(ANGLE_MODE);
enableFlightMode(HORIZON_MODE); enableFlightMode(HORIZON_MODE);
EXPECT_EQ(HORIZON_MODE, FLIGHT_MODE(HORIZON_MODE)); EXPECT_EQ(HORIZON_MODE, FLIGHT_MODE(HORIZON_MODE));
frameLen = getCrsfFrame(frame, CRSF_FRAME_FLIGHT_MODE); frameLen = getCrsfFrame(frame, CRSF_FRAMETYPE_FLIGHT_MODE);
EXPECT_EQ(4 + FRAME_HEADER_FOOTER_LEN, frameLen); EXPECT_EQ(4 + FRAME_HEADER_FOOTER_LEN, frameLen);
EXPECT_EQ(CRSF_ADDRESS_BROADCAST, frame[0]); // address EXPECT_EQ(CRSF_ADDRESS_BROADCAST, frame[0]); // address
EXPECT_EQ(6, frame[1]); // length EXPECT_EQ(6, frame[1]); // length
@ -250,7 +250,7 @@ TEST(TelemetryCrsfTest, TestFlightMode)
disableFlightMode(HORIZON_MODE); disableFlightMode(HORIZON_MODE);
airMode = true; airMode = true;
frameLen = getCrsfFrame(frame, CRSF_FRAME_FLIGHT_MODE); frameLen = getCrsfFrame(frame, CRSF_FRAMETYPE_FLIGHT_MODE);
EXPECT_EQ(4 + FRAME_HEADER_FOOTER_LEN, frameLen); EXPECT_EQ(4 + FRAME_HEADER_FOOTER_LEN, frameLen);
EXPECT_EQ(CRSF_ADDRESS_BROADCAST, frame[0]); // address EXPECT_EQ(CRSF_ADDRESS_BROADCAST, frame[0]); // address
EXPECT_EQ(6, frame[1]); // length EXPECT_EQ(6, frame[1]); // length