Skip to content

Commit 2dfceb7

Browse files
authored
Merge pull request #9868 from iNavFlight/MrD_Change-sensor-IDs-for-GPS-and-Modes-on-SmartPort
Change SmartPort sensor IDs for GPS and Modes
2 parents f3da487 + 6f58bdb commit 2dfceb7

File tree

6 files changed

+117
-87
lines changed

6 files changed

+117
-87
lines changed

docs/Settings.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1162,6 +1162,16 @@ S.Port telemetry: Send pitch and roll degrees*10 instead of raw accelerometer da
11621162

11631163
---
11641164

1165+
### frsky_use_legacy_gps_mode_sensor_ids
1166+
1167+
S.Port telemetry: If `ON`, send the legacy telemetry IDs for modes (Tmp1) and GNSS (Tmp2). These are old IDs, deprecated, and will be removed in INAV 10.0. Tools and scripts using these IDs should be updated to use the new IDs of **470** for Modes and **480** for GNSS. Default: 'OFF'
1168+
1169+
| Default | Min | Max |
1170+
| --- | --- | --- |
1171+
| OFF | OFF | ON |
1172+
1173+
---
1174+
11651175
### fw_autotune_max_rate_deflection
11661176

11671177
The target percentage of maximum mixer output used for determining the rates in `AUTO` and `LIMIT`.

docs/Telemetry.md

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,17 +102,21 @@ The following sensors are transmitted
102102
* **VSpd** : vertical speed, unit is cm/s.
103103
* **Hdg** : heading, North is 0°, South is 180°.
104104
* **AccX,Y,Z** : accelerometer values (not sent if `frsky_pitch_roll = ON`).
105-
* **Tmp1** : flight mode, sent as 5 digits. Number is sent as **ABCDE** detailed below. The numbers are additives (for example: if digit C is 6, it means both position hold and altitude hold are active) :
105+
* **470** : flight mode, sent as 5 digits. Number is sent as **ABCDE** detailed below. The numbers are additives (for example: if digit C is 6, it means both position hold and altitude hold are active) :
106106
* **A** : 1 = flaperon mode, 2 = auto tune mode, 4 = failsafe mode
107107
* **B** : 1 = return to home, 2 = waypoint mode, 4 = headfree mode
108108
* **C** : 1 = heading hold, 2 = altitude hold, 4 = position hold
109109
* **D** : 1 = angle mode, 2 = horizon mode, 4 = passthru mode
110110
* **E** : 1 = ok to arm, 2 = arming is prevented, 4 = armed
111-
* **Tmp2** : GPS lock status, accuracy, home reset trigger, and number of satellites. Number is sent as **ABCD** detailed below. Typical minimum GPS 3D lock value is 3906 (GPS locked and home fixed, HDOP highest accuracy, 6 satellites).
111+
112+
_NOTE_ This sensor used to be **Tmp1**. The ID has been reassigned in INAV 8.0. The old ID of **Tmp1** can still be used, by using `set frsky_use_legacy_gps_mode_sensor_ids = ON`. This is deprecated and will be removed in INAV 10.0. All tools and scripts using the old IDs should be updated to use the new ID.
113+
* **480** : GPS lock status, accuracy, home reset trigger, and number of satellites. Number is sent as **ABCD** detailed below. Typical minimum GPS 3D lock value is 3906 (GPS locked and home fixed, HDOP highest accuracy, 6 satellites).
112114
* **A** : 1 = GPS fix, 2 = GPS home fix, 4 = home reset (numbers are additive)
113115
* **B** : GPS accuracy based on HDOP (0 = lowest to 9 = highest accuracy)
114116
* **C** : number of satellites locked (digit C & D are the number of locked satellites)
115117
* **D** : number of satellites locked (if 14 satellites are locked, C = 1 & D = 4)
118+
119+
_NOTE_ This sensor used to be **Tmp2**. The ID has been reassigned in INAV 8.0. The old ID of **Tmp2** can still be used, by using `set frsky_use_legacy_gps_mode_sensor_ids = ON`. This is deprecated and will be removed in INAV 10.0. All tools and scripts using the old IDs should be updated to use the new ID.
116120
* **GAlt** : GPS altitude, sea level is zero.
117121
* **ASpd** : true air speed, from pitot sensor. This is _Knots * 10_
118122
* **A4** : average cell value. Warning : unlike FLVSS and MLVSS sensors, you do not get actual lowest value of a cell, but an average : (total lipo voltage) / (number of cells)

src/main/fc/settings.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3052,6 +3052,10 @@ groups:
30523052
description: "S.Port telemetry: Send pitch and roll degrees*10 instead of raw accelerometer data"
30533053
default_value: OFF
30543054
type: bool
3055+
- name: frsky_use_legacy_gps_mode_sensor_ids
3056+
description: "S.Port telemetry: If `ON`, send the legacy telemetry IDs for modes (Tmp1) and GNSS (Tmp2). These are old IDs, deprecated, and will be removed in INAV 10.0. Tools and scripts using these IDs should be updated to use the new IDs of **470** for Modes and **480** for GNSS. Default: 'OFF'"
3057+
default_value: OFF
3058+
type: bool
30553059
- name: report_cell_voltage
30563060
description: "S.Port and IBUS telemetry: Send the average cell voltage if set to ON"
30573061
default_value: OFF

src/main/telemetry/smartport.c

Lines changed: 95 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -63,66 +63,68 @@
6363
// these data identifiers are obtained from https://github.com/opentx/opentx/blob/2.3/radio/src/telemetry/frsky.h
6464
enum
6565
{
66-
FSSP_DATAID_SPEED = 0x0830 ,
67-
FSSP_DATAID_VFAS = 0x0210 ,
68-
FSSP_DATAID_CURRENT = 0x0200 ,
69-
FSSP_DATAID_RPM = 0x050F ,
70-
FSSP_DATAID_ALTITUDE = 0x0100 ,
71-
FSSP_DATAID_FUEL = 0x0600 ,
72-
FSSP_DATAID_ADC1 = 0xF102 ,
73-
FSSP_DATAID_ADC2 = 0xF103 ,
74-
FSSP_DATAID_LATLONG = 0x0800 ,
75-
FSSP_DATAID_CAP_USED = 0x0600 ,
76-
FSSP_DATAID_VARIO = 0x0110 ,
77-
FSSP_DATAID_CELLS = 0x0300 ,
78-
FSSP_DATAID_CELLS_LAST = 0x030F ,
79-
FSSP_DATAID_HEADING = 0x0840 ,
80-
FSSP_DATAID_FPV = 0x0450 ,
81-
FSSP_DATAID_PITCH = 0x0430 ,
82-
FSSP_DATAID_ROLL = 0x0440 ,
83-
FSSP_DATAID_ACCX = 0x0700 ,
84-
FSSP_DATAID_ACCY = 0x0710 ,
85-
FSSP_DATAID_ACCZ = 0x0720 ,
86-
FSSP_DATAID_T1 = 0x0400 ,
87-
FSSP_DATAID_T2 = 0x0410 ,
88-
FSSP_DATAID_HOME_DIST = 0x0420 ,
89-
FSSP_DATAID_GPS_ALT = 0x0820 ,
90-
FSSP_DATAID_ASPD = 0x0A00 ,
91-
FSSP_DATAID_A3 = 0x0900 ,
92-
FSSP_DATAID_A4 = 0x0910 ,
93-
FSSP_DATAID_AZIMUTH = 0x0460
66+
FSSP_DATAID_SPEED = 0x0830,
67+
FSSP_DATAID_VFAS = 0x0210,
68+
FSSP_DATAID_CURRENT = 0x0200,
69+
FSSP_DATAID_RPM = 0x050F,
70+
FSSP_DATAID_ALTITUDE = 0x0100,
71+
FSSP_DATAID_FUEL = 0x0600,
72+
FSSP_DATAID_ADC1 = 0xF102,
73+
FSSP_DATAID_ADC2 = 0xF103,
74+
FSSP_DATAID_LATLONG = 0x0800,
75+
FSSP_DATAID_CAP_USED = 0x0600,
76+
FSSP_DATAID_VARIO = 0x0110,
77+
FSSP_DATAID_CELLS = 0x0300,
78+
FSSP_DATAID_CELLS_LAST = 0x030F,
79+
FSSP_DATAID_HEADING = 0x0840,
80+
FSSP_DATAID_FPV = 0x0450,
81+
FSSP_DATAID_PITCH = 0x0430,
82+
FSSP_DATAID_ROLL = 0x0440,
83+
FSSP_DATAID_ACCX = 0x0700,
84+
FSSP_DATAID_ACCY = 0x0710,
85+
FSSP_DATAID_ACCZ = 0x0720,
86+
FSSP_DATAID_LEGACY_MODES = 0x0400, // Deprecated. Should be removed in INAV 10.0
87+
FSSP_DATAID_LEGACY_GNSS = 0x0410, // Deprecated. Should be removed in INAV 10.0
88+
FSSP_DATAID_HOME_DIST = 0x0420,
89+
FSSP_DATAID_GPS_ALT = 0x0820,
90+
FSSP_DATAID_ASPD = 0x0A00,
91+
FSSP_DATAID_A3 = 0x0900,
92+
FSSP_DATAID_A4 = 0x0910,
93+
FSSP_DATAID_AZIMUTH = 0x0460,
94+
FSSP_DATAID_MODES = 0x0470,
95+
FSSP_DATAID_GNSS = 0x0480,
9496
};
9597

9698
const uint16_t frSkyDataIdTable[] = {
97-
FSSP_DATAID_SPEED ,
98-
FSSP_DATAID_VFAS ,
99-
FSSP_DATAID_CURRENT ,
100-
//FSSP_DATAID_RPM ,
101-
FSSP_DATAID_ALTITUDE ,
102-
FSSP_DATAID_FUEL ,
103-
//FSSP_DATAID_ADC1 ,
104-
//FSSP_DATAID_ADC2 ,
105-
FSSP_DATAID_LATLONG ,
106-
FSSP_DATAID_LATLONG , // twice
107-
//FSSP_DATAID_CAP_USED ,
108-
FSSP_DATAID_VARIO ,
109-
//FSSP_DATAID_CELLS ,
99+
FSSP_DATAID_SPEED,
100+
FSSP_DATAID_VFAS,
101+
FSSP_DATAID_CURRENT,
102+
//FSSP_DATAID_RPM,
103+
FSSP_DATAID_ALTITUDE,
104+
FSSP_DATAID_FUEL,
105+
//FSSP_DATAID_ADC1,
106+
//FSSP_DATAID_ADC2,
107+
FSSP_DATAID_LATLONG,
108+
FSSP_DATAID_LATLONG, // twice
109+
//FSSP_DATAID_CAP_USED,
110+
FSSP_DATAID_VARIO,
111+
//FSSP_DATAID_CELLS,
110112
//FSSP_DATAID_CELLS_LAST,
111-
FSSP_DATAID_HEADING ,
112-
FSSP_DATAID_FPV ,
113-
FSSP_DATAID_PITCH ,
114-
FSSP_DATAID_ROLL ,
115-
FSSP_DATAID_ACCX ,
116-
FSSP_DATAID_ACCY ,
117-
FSSP_DATAID_ACCZ ,
118-
FSSP_DATAID_T1 ,
119-
FSSP_DATAID_T2 ,
120-
FSSP_DATAID_HOME_DIST ,
121-
FSSP_DATAID_GPS_ALT ,
122-
FSSP_DATAID_ASPD ,
123-
// FSSP_DATAID_A3 ,
124-
FSSP_DATAID_A4 ,
125-
FSSP_DATAID_AZIMUTH ,
113+
FSSP_DATAID_HEADING,
114+
FSSP_DATAID_FPV,
115+
FSSP_DATAID_PITCH,
116+
FSSP_DATAID_ROLL,
117+
FSSP_DATAID_ACCX,
118+
FSSP_DATAID_ACCY,
119+
FSSP_DATAID_ACCZ,
120+
FSSP_DATAID_MODES,
121+
FSSP_DATAID_GNSS,
122+
FSSP_DATAID_HOME_DIST,
123+
FSSP_DATAID_GPS_ALT,
124+
FSSP_DATAID_ASPD,
125+
// FSSP_DATAID_A3,
126+
FSSP_DATAID_A4,
127+
FSSP_DATAID_AZIMUTH,
126128
0
127129
};
128130

@@ -467,27 +469,27 @@ void processSmartPortTelemetry(smartPortPayload_t *payload, volatile bool *clear
467469
smartPortIdCnt++;
468470

469471
switch (id) {
470-
case FSSP_DATAID_VFAS :
472+
case FSSP_DATAID_VFAS:
471473
if (isBatteryVoltageConfigured()) {
472474
uint16_t vfasVoltage = telemetryConfig()->report_cell_voltage ? getBatteryAverageCellVoltage() : getBatteryVoltage();
473475
smartPortSendPackage(id, vfasVoltage);
474476
*clearToSend = false;
475477
}
476478
break;
477-
case FSSP_DATAID_CURRENT :
479+
case FSSP_DATAID_CURRENT:
478480
if (isAmperageConfigured()) {
479481
smartPortSendPackage(id, getAmperage() / 10); // given in 10mA steps, unknown requested unit
480482
*clearToSend = false;
481483
}
482484
break;
483-
//case FSSP_DATAID_RPM :
484-
case FSSP_DATAID_ALTITUDE :
485+
//case FSSP_DATAID_RPM:
486+
case FSSP_DATAID_ALTITUDE:
485487
if (sensors(SENSOR_BARO)) {
486488
smartPortSendPackage(id, getEstimatedActualPosition(Z)); // unknown given unit, requested 100 = 1 meter
487489
*clearToSend = false;
488490
}
489491
break;
490-
case FSSP_DATAID_FUEL :
492+
case FSSP_DATAID_FUEL:
491493
if (telemetryConfig()->smartportFuelUnit == SMARTPORT_FUEL_UNIT_PERCENT) {
492494
smartPortSendPackage(id, calculateBatteryPercentage()); // Show remaining battery % if smartport_fuel_percent=ON
493495
*clearToSend = false;
@@ -496,63 +498,71 @@ void processSmartPortTelemetry(smartPortPayload_t *payload, volatile bool *clear
496498
*clearToSend = false;
497499
}
498500
break;
499-
//case FSSP_DATAID_ADC1 :
500-
//case FSSP_DATAID_ADC2 :
501-
//case FSSP_DATAID_CAP_USED :
502-
case FSSP_DATAID_VARIO :
501+
//case FSSP_DATAID_ADC1:
502+
//case FSSP_DATAID_ADC2:
503+
//case FSSP_DATAID_CAP_USED:
504+
case FSSP_DATAID_VARIO:
503505
if (sensors(SENSOR_BARO)) {
504506
smartPortSendPackage(id, lrintf(getEstimatedActualVelocity(Z))); // unknown given unit but requested in 100 = 1m/s
505507
*clearToSend = false;
506508
}
507509
break;
508-
case FSSP_DATAID_HEADING :
510+
case FSSP_DATAID_HEADING:
509511
smartPortSendPackage(id, attitude.values.yaw * 10); // given in 10*deg, requested in 10000 = 100 deg
510512
*clearToSend = false;
511513
break;
512-
case FSSP_DATAID_PITCH :
514+
case FSSP_DATAID_PITCH:
513515
if (telemetryConfig()->frsky_pitch_roll) {
514516
smartPortSendPackage(id, attitude.values.pitch); // given in 10*deg
515517
*clearToSend = false;
516518
}
517519
break;
518-
case FSSP_DATAID_ROLL :
520+
case FSSP_DATAID_ROLL:
519521
if (telemetryConfig()->frsky_pitch_roll) {
520522
smartPortSendPackage(id, attitude.values.roll); // given in 10*deg
521523
*clearToSend = false;
522524
}
523525
break;
524-
case FSSP_DATAID_ACCX :
526+
case FSSP_DATAID_ACCX:
525527
if (!telemetryConfig()->frsky_pitch_roll) {
526528
smartPortSendPackage(id, lrintf(100 * acc.accADCf[X]));
527529
*clearToSend = false;
528530
}
529531
break;
530-
case FSSP_DATAID_ACCY :
532+
case FSSP_DATAID_ACCY:
531533
if (!telemetryConfig()->frsky_pitch_roll) {
532534
smartPortSendPackage(id, lrintf(100 * acc.accADCf[Y]));
533535
*clearToSend = false;
534536
}
535537
break;
536-
case FSSP_DATAID_ACCZ :
538+
case FSSP_DATAID_ACCZ:
537539
if (!telemetryConfig()->frsky_pitch_roll) {
538540
smartPortSendPackage(id, lrintf(100 * acc.accADCf[Z]));
539541
*clearToSend = false;
540542
}
541543
break;
542-
case FSSP_DATAID_T1 :
544+
case FSSP_DATAID_MODES:
543545
{
546+
if (telemetryConfig()->frsky_use_legacy_gps_mode_sensor_ids)
547+
id = FSSP_DATAID_LEGACY_MODES;
548+
544549
smartPortSendPackage(id, frskyGetFlightMode());
545550
*clearToSend = false;
546551
break;
547552
}
548553
#ifdef USE_GPS
549-
case FSSP_DATAID_T2 :
550-
if (smartPortShouldSendGPSData()) {
551-
smartPortSendPackage(id, frskyGetGPSState());
552-
*clearToSend = false;
554+
case FSSP_DATAID_GNSS:
555+
{
556+
if (telemetryConfig()->frsky_use_legacy_gps_mode_sensor_ids)
557+
id = FSSP_DATAID_LEGACY_GNSS;
558+
559+
if (smartPortShouldSendGPSData()) {
560+
smartPortSendPackage(id, frskyGetGPSState());
561+
*clearToSend = false;
562+
}
563+
break;
553564
}
554-
break;
555-
case FSSP_DATAID_SPEED :
565+
case FSSP_DATAID_SPEED:
556566
if (smartPortShouldSendGPSData()) {
557567
//convert to knots: 1cm/s = 0.0194384449 knots
558568
//Speed should be sent in knots/1000 (GPS speed is in cm/s)
@@ -561,7 +571,7 @@ void processSmartPortTelemetry(smartPortPayload_t *payload, volatile bool *clear
561571
*clearToSend = false;
562572
}
563573
break;
564-
case FSSP_DATAID_LATLONG :
574+
case FSSP_DATAID_LATLONG:
565575
if (smartPortShouldSendGPSData()) {
566576
uint32_t tmpui = 0;
567577
// the same ID is sent twice, one for longitude, one for latitude
@@ -581,25 +591,25 @@ void processSmartPortTelemetry(smartPortPayload_t *payload, volatile bool *clear
581591
*clearToSend = false;
582592
}
583593
break;
584-
case FSSP_DATAID_HOME_DIST :
594+
case FSSP_DATAID_HOME_DIST:
585595
if (smartPortShouldSendGPSData()) {
586596
smartPortSendPackage(id, GPS_distanceToHome);
587597
*clearToSend = false;
588598
}
589599
break;
590-
case FSSP_DATAID_GPS_ALT :
600+
case FSSP_DATAID_GPS_ALT:
591601
if (smartPortShouldSendGPSData()) {
592602
smartPortSendPackage(id, gpsSol.llh.alt); // cm
593603
*clearToSend = false;
594604
}
595605
break;
596-
case FSSP_DATAID_FPV :
606+
case FSSP_DATAID_FPV:
597607
if (smartPortShouldSendGPSData()) {
598608
smartPortSendPackage(id, gpsSol.groundCourse); // given in 10*deg
599609
*clearToSend = false;
600610
}
601611
break;
602-
case FSSP_DATAID_AZIMUTH :
612+
case FSSP_DATAID_AZIMUTH:
603613
if (smartPortShouldSendGPSData()) {
604614
int16_t h = GPS_directionToHome;
605615
if (h < 0) {
@@ -614,13 +624,13 @@ void processSmartPortTelemetry(smartPortPayload_t *payload, volatile bool *clear
614624
}
615625
break;
616626
#endif
617-
case FSSP_DATAID_A4 :
627+
case FSSP_DATAID_A4:
618628
if (isBatteryVoltageConfigured()) {
619629
smartPortSendPackage(id, getBatteryAverageCellVoltage());
620630
*clearToSend = false;
621631
}
622632
break;
623-
case FSSP_DATAID_ASPD :
633+
case FSSP_DATAID_ASPD:
624634
#ifdef USE_PITOT
625635
if (sensors(SENSOR_PITOT) && pitotIsHealthy()) {
626636
smartPortSendPackage(id, getAirspeedEstimate() * 0.194384449f); // cm/s to knots*1

src/main/telemetry/telemetry.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ PG_RESET_TEMPLATE(telemetryConfig_t, telemetryConfig,
6262
.telemetry_switch = SETTING_TELEMETRY_SWITCH_DEFAULT,
6363
.telemetry_inverted = SETTING_TELEMETRY_INVERTED_DEFAULT,
6464
.frsky_pitch_roll = SETTING_FRSKY_PITCH_ROLL_DEFAULT,
65+
.frsky_use_legacy_gps_mode_sensor_ids = SETTING_FRSKY_USE_LEGACY_GPS_MODE_SENSOR_IDS_DEFAULT,
6566
.report_cell_voltage = SETTING_REPORT_CELL_VOLTAGE_DEFAULT,
6667
.hottAlarmSoundInterval = SETTING_HOTT_ALARM_SOUND_INTERVAL_DEFAULT,
6768
.halfDuplex = SETTING_TELEMETRY_HALFDUPLEX_DEFAULT,

src/main/telemetry/telemetry.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ typedef struct telemetryConfig_s {
4646
uint8_t telemetry_switch; // Use aux channel to change serial output & baudrate( MSP / Telemetry ). It disables automatic switching to Telemetry when armed.
4747
uint8_t telemetry_inverted; // Flip the default inversion of the protocol - Same as serialrx_inverted in rx.c, but for telemetry.
4848
uint8_t frsky_pitch_roll;
49+
bool frsky_use_legacy_gps_mode_sensor_ids;
4950
uint8_t report_cell_voltage;
5051
uint8_t hottAlarmSoundInterval;
5152
uint8_t halfDuplex;

0 commit comments

Comments
 (0)