Skip to content

Commit 4589231

Browse files
Merge pull request #11168 from sensei-hacker/pr-11100-crsf-baro
CRSF Baro Altitude and Vario, AirSpeed (fixed conflicts from #11100)
2 parents 8df5ac2 + e26ea67 commit 4589231

6 files changed

Lines changed: 61 additions & 28 deletions

File tree

docs/Settings.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -644,6 +644,16 @@ Blackbox logging rate numerator. Use num/denom settings to decide if a frame sho
644644

645645
---
646646

647+
### crsf_use_legacy_baro_packet
648+
649+
CRSF telemetry: If `ON`, send altitude about start point in GPS telemetry packet. If `OFF`, GPS has ASL altitude, altitude about start point in separate packet. Default: 'OFF'
650+
651+
| Default | Min | Max |
652+
| --- | --- | --- |
653+
| OFF | OFF | ON |
654+
655+
---
656+
647657
### cruise_power
648658

649659
Power draw at cruise throttle used for remaining flight time/distance estimation in 0.01W unit

src/main/fc/settings.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3303,6 +3303,10 @@ groups:
33033303
min: 1
33043304
max: 255
33053305
default_value: 1
3306+
- name: crsf_use_legacy_baro_packet
3307+
description: "CRSF telemetry: If `ON`, send altitude about start point in GPS telemetry packet. If `OFF`, GPS has ASL altitude, altitude about start point in separate packet. Default: 'OFF'"
3308+
default_value: OFF
3309+
type: bool
33063310

33073311
- name: PG_OSD_CONFIG
33083312
type: osdConfig_t

src/main/rx/crsf.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ enum {
4545
CRSF_FRAME_GPS_PAYLOAD_SIZE = 15,
4646
CRSF_FRAME_VARIO_SENSOR_PAYLOAD_SIZE = 2,
4747
CRSF_FRAME_BATTERY_SENSOR_PAYLOAD_SIZE = 8,
48-
CRSF_FRAME_BAROMETER_ALTITUDE_PAYLOAD_SIZE = 2,
48+
CRSF_FRAME_BAROMETER_ALTITUDE_VARIO_PAYLOAD_SIZE = 3,
4949
CRSF_FRAME_AIRSPEED_PAYLOAD_SIZE = 2,
5050
CRSF_FRAME_LINK_STATISTICS_PAYLOAD_SIZE = 10,
5151
CRSF_FRAME_RC_CHANNELS_PAYLOAD_SIZE = 22, // 11 bits per channel * 16 channels = 22 bytes.
@@ -88,7 +88,7 @@ typedef enum {
8888
CRSF_FRAMETYPE_GPS = 0x02,
8989
CRSF_FRAMETYPE_VARIO_SENSOR = 0x07,
9090
CRSF_FRAMETYPE_BATTERY_SENSOR = 0x08,
91-
CRSF_FRAMETYPE_BAROMETER_ALTITUDE = 0x09,
91+
CRSF_FRAMETYPE_BAROMETER_ALTITUDE_VARIO_SENSOR = 0x09,
9292
CRSF_FRAMETYPE_AIRSPEED_SENSOR = 0x0A,
9393
CRSF_FRAMETYPE_RPM = 0x0C,
9494
CRSF_FRAMETYPE_TEMP = 0x0D,

src/main/telemetry/crsf.c

Lines changed: 42 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
#include <stdbool.h>
1919
#include <stdint.h>
2020
#include <string.h>
21-
21+
#include <limits.h>
2222
#include "platform.h"
2323

2424
#if defined(USE_TELEMETRY) && defined(USE_SERIALRX_CRSF) && defined(USE_TELEMETRY_CRSF)
@@ -241,8 +241,7 @@ static void crsfFrameGps(sbuf_t *dst)
241241
crsfSerialize32(dst, gpsSol.llh.lon);
242242
crsfSerialize16(dst, (gpsSol.groundSpeed * 36 + 50) / 100); // gpsSol.groundSpeed is in cm/s
243243
crsfSerialize16(dst, DECIDEGREES_TO_CENTIDEGREES(gpsSol.groundCourse)); // gpsSol.groundCourse is 0.1 degrees, need 0.01 deg
244-
const uint16_t altitude = (getEstimatedActualPosition(Z) / 100) + 1000;
245-
crsfSerialize16(dst, altitude);
244+
crsfSerialize16(dst, (uint16_t)( (telemetryConfig()->crsf_use_legacy_baro_packet ? getEstimatedActualPosition(Z) : gpsSol.llh.alt ) / 100 + 1000) );
246245
crsfSerialize8(dst, gpsSol.numSat);
247246
}
248247

@@ -294,16 +293,20 @@ static void crsfFrameBatterySensor(sbuf_t *dst)
294293
crsfSerialize8(dst, batteryRemainingPercentage);
295294
}
296295

297-
const int32_t ALT_MIN_DM = 10000;
298-
const int32_t ALT_THRESHOLD_DM = 0x8000 - ALT_MIN_DM;
299-
const int32_t ALT_MAX_DM = 0x7ffe * 10 - 5;
300296

301297
/*
302298
0x09 Barometer altitude and vertical speed
303299
Payload:
304300
uint16_t altitude_packed ( dm - 10000 )
305301
*/
306-
static void crsfBarometerAltitude(sbuf_t *dst)
302+
303+
const int32_t ALT_MIN_DM = 10000;
304+
const int32_t ALT_THRESHOLD_DM = 0x8000 - ALT_MIN_DM;
305+
const int32_t ALT_MAX_DM = 0x7ffe * 10 - 5;
306+
const float VARIO_KL = 100.0f; // TBS CRSF standard
307+
const float VARIO_KR = .026f; // TBS CRSF standard
308+
309+
static void crsfFrameBarometerAltitudeVarioSensor(sbuf_t *dst)
307310
{
308311
int32_t altitude_dm = lrintf(getEstimatedActualPosition(Z) / 10);
309312
uint16_t altitude_packed;
@@ -316,9 +319,28 @@ static void crsfBarometerAltitude(sbuf_t *dst)
316319
} else {
317320
altitude_packed = ((altitude_dm + 5) / 10) | 0x8000;
318321
}
319-
sbufWriteU8(dst, CRSF_FRAME_BAROMETER_ALTITUDE_PAYLOAD_SIZE + CRSF_FRAME_LENGTH_TYPE_CRC);
320-
crsfSerialize8(dst, CRSF_FRAMETYPE_BAROMETER_ALTITUDE);
322+
323+
float vario_sm = getEstimatedActualVelocity(Z);
324+
int8_t sign = vario_sm < 0 ? -1 : ( vario_sm > 0 ? 1 : 0 );
325+
int8_t vario_packed = (int8_t)constrain( lrintf(__builtin_logf(ABS(vario_sm) / VARIO_KL + 1) / VARIO_KR * sign ), SCHAR_MIN, SCHAR_MAX );
326+
327+
sbufWriteU8(dst, CRSF_FRAME_BAROMETER_ALTITUDE_VARIO_PAYLOAD_SIZE + CRSF_FRAME_LENGTH_TYPE_CRC);
328+
crsfSerialize8(dst, CRSF_FRAMETYPE_BAROMETER_ALTITUDE_VARIO_SENSOR);
321329
crsfSerialize16(dst, altitude_packed);
330+
crsfSerialize8(dst, vario_packed);
331+
}
332+
333+
/*
334+
0x0A Airspeed sensor
335+
Payload:
336+
int16 Air speed ( dm/s )
337+
*/
338+
static void crsfFrameAirSpeedSensor(sbuf_t *dst)
339+
{
340+
// use sbufWrite since CRC does not include frame length
341+
sbufWriteU8(dst, CRSF_FRAME_AIRSPEED_PAYLOAD_SIZE + CRSF_FRAME_LENGTH_TYPE_CRC);
342+
crsfSerialize8(dst, CRSF_FRAMETYPE_AIRSPEED_SENSOR);
343+
crsfSerialize16(dst, (uint16_t)(getAirspeedEstimate() * 36 / 100));
322344
}
323345

324346
#ifdef USE_PITOT
@@ -578,8 +600,7 @@ typedef enum {
578600
CRSF_FRAME_BATTERY_SENSOR_INDEX,
579601
CRSF_FRAME_FLIGHT_MODE_INDEX,
580602
CRSF_FRAME_GPS_INDEX,
581-
CRSF_FRAME_VARIO_SENSOR_INDEX,
582-
CRSF_FRAME_BAROMETER_ALTITUDE_INDEX,
603+
CRSF_FRAME_VARIO_OR_ALT_VARIO_SENSOR_INDEX,
583604
CRSF_FRAME_TEMP_INDEX,
584605
CRSF_FRAME_RPM_INDEX,
585606
CRSF_FRAME_AIRSPEED_INDEX,
@@ -668,14 +689,9 @@ static void processCrsf(void)
668689
}
669690
#endif
670691
#if defined(USE_BARO) || defined(USE_GPS)
671-
if (currentSchedule & BV(CRSF_FRAME_VARIO_SENSOR_INDEX)) {
692+
if (currentSchedule & BV(CRSF_FRAME_VARIO_OR_ALT_VARIO_SENSOR_INDEX) ) {
672693
crsfInitializeFrame(dst);
673-
crsfFrameVarioSensor(dst);
674-
crsfFinalize(dst);
675-
}
676-
if (currentSchedule & BV(CRSF_FRAME_BAROMETER_ALTITUDE_INDEX)) {
677-
crsfInitializeFrame(dst);
678-
crsfBarometerAltitude(dst);
694+
telemetryConfig()->crsf_use_legacy_baro_packet ? crsfFrameVarioSensor(dst) : crsfFrameBarometerAltitudeVarioSensor(dst);
679695
crsfFinalize(dst);
680696
}
681697
#endif
@@ -716,12 +732,7 @@ void initCrsfTelemetry(void)
716732
#endif
717733
#if defined(USE_BARO) || defined(USE_GPS)
718734
if (sensors(SENSOR_BARO) || (STATE(FIXED_WING_LEGACY) && feature(FEATURE_GPS))) {
719-
crsfSchedule[index++] = BV(CRSF_FRAME_VARIO_SENSOR_INDEX);
720-
}
721-
#endif
722-
#ifdef USE_BARO
723-
if (sensors(SENSOR_BARO)) {
724-
crsfSchedule[index++] = BV(CRSF_FRAME_BAROMETER_ALTITUDE_INDEX);
735+
crsfSchedule[index++] = BV(CRSF_FRAME_VARIO_OR_ALT_VARIO_SENSOR_INDEX);
725736
}
726737
#endif
727738
#ifdef USE_ESC_SENSOR
@@ -834,7 +845,13 @@ int getCrsfFrame(uint8_t *frame, crsfFrameType_e frameType)
834845
case CRSF_FRAMETYPE_VARIO_SENSOR:
835846
crsfFrameVarioSensor(sbuf);
836847
break;
837-
}
848+
case CRSF_FRAMETYPE_BAROMETER_ALTITUDE_VARIO_SENSOR:
849+
crsfFrameBarometerAltitudeVarioSensor(sbuf);
850+
break;
851+
case CRSF_FRAMETYPE_AIRSPEED_SENSOR:
852+
crsfFrameAirSpeedSensor(sbuf);
853+
break;
854+
}
838855
const int frameSize = crsfFinalizeBuf(sbuf, frame);
839856
return frameSize;
840857
}

src/main/telemetry/telemetry.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,8 @@ PG_RESET_TEMPLATE(telemetryConfig_t, telemetryConfig,
9898
.min_txbuff = SETTING_MAVLINK_MIN_TXBUFFER_DEFAULT,
9999
.radio_type = SETTING_MAVLINK_RADIO_TYPE_DEFAULT,
100100
.sysid = SETTING_MAVLINK_SYSID_DEFAULT
101-
}
101+
},
102+
.crsf_use_legacy_baro_packet = SETTING_CRSF_USE_LEGACY_BARO_PACKET_DEFAULT
102103
);
103104

104105
void telemetryInit(void)

src/main/telemetry/telemetry.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ typedef struct telemetryConfig_s {
8989
uint8_t radio_type;
9090
uint8_t sysid;
9191
} mavlink;
92+
bool crsf_use_legacy_baro_packet;
9293
} telemetryConfig_t;
9394

9495
PG_DECLARE(telemetryConfig_t, telemetryConfig);

0 commit comments

Comments
 (0)