From c756251439ab3eb13ac87cdbb8e9d50496d2fd69 Mon Sep 17 00:00:00 2001 From: breadoven <56191411+breadoven@users.noreply.github.com> Date: Wed, 18 Mar 2026 23:57:20 +0000 Subject: [PATCH 1/3] virtual pitot fixes --- src/main/fc/cli.c | 3 ++- src/main/sensors/pitotmeter.c | 48 ++++++++++++++++++----------------- 2 files changed, 27 insertions(+), 24 deletions(-) diff --git a/src/main/fc/cli.c b/src/main/fc/cli.c index 3e8165dcf32..e356e29fe20 100644 --- a/src/main/fc/cli.c +++ b/src/main/fc/cli.c @@ -4142,13 +4142,14 @@ static void cliStatus(char *cmdline) #endif // for if at32 #endif // for SITL - cliPrintLinef("Sensor status: GYRO=%s, ACC=%s, MAG=%s, BARO=%s, RANGEFINDER=%s, OPFLOW=%s, GPS=%s", + cliPrintLinef("Sensor status: GYRO=%s, ACC=%s, MAG=%s, BARO=%s, RANGEFINDER=%s, OPFLOW=%s, PITOT=%s, GPS=%s", hardwareSensorStatusNames[getHwGyroStatus()], hardwareSensorStatusNames[getHwAccelerometerStatus()], hardwareSensorStatusNames[getHwCompassStatus()], hardwareSensorStatusNames[getHwBarometerStatus()], hardwareSensorStatusNames[getHwRangefinderStatus()], hardwareSensorStatusNames[getHwOpticalFlowStatus()], + hardwareSensorStatusNames[getHwPitotmeterStatus()], hardwareSensorStatusNames[getHwGPSStatus()] ); diff --git a/src/main/sensors/pitotmeter.c b/src/main/sensors/pitotmeter.c index b4b61f57669..2b8a3873e6a 100755 --- a/src/main/sensors/pitotmeter.c +++ b/src/main/sensors/pitotmeter.c @@ -134,14 +134,15 @@ bool pitotDetect(pitotDev_t *dev, uint8_t pitotHardwareToUse) FALLTHROUGH; case PITOT_VIRTUAL: -#if defined(USE_WIND_ESTIMATOR) && defined(USE_PITOT_VIRTUAL) - if ((pitotHardwareToUse != PITOT_AUTODETECT) && virtualPitotDetect(dev)) { - pitotHardware = PITOT_VIRTUAL; - break; - } -#endif - /* If we are asked for a specific sensor - break out, otherwise - fall through and continue */ if (pitotHardwareToUse != PITOT_AUTODETECT) { +#if defined(USE_WIND_ESTIMATOR) && defined(USE_PITOT_VIRTUAL) + if (virtualPitotDetect(dev)) { + pitotHardware = PITOT_VIRTUAL; + break; + } +#endif + // set requested to None to prevent hardware failure if GPS not enabled + requestedSensors[SENSOR_INDEX_PITOT] = PITOT_NONE; break; } FALLTHROUGH; @@ -226,9 +227,10 @@ STATIC_PROTOTHREAD(pitotThread) // Init filter pitot.lastMeasurementUs = micros(); - if(pitotmeterConfig()->pitot_lpf_milli_hz >0){ + if (pitotmeterConfig()->pitot_lpf_milli_hz > 0) { pt1FilterInit(&pitot.lpfState, pitotmeterConfig()->pitot_lpf_milli_hz / 1000.0f, 0.0f); } + while(1) { #ifdef USE_SIMULATOR while (SIMULATOR_HAS_OPTION(HITL_AIRSPEED) && SIMULATOR_HAS_OPTION(HITL_PITOT_FAILURE)) @@ -236,33 +238,33 @@ STATIC_PROTOTHREAD(pitotThread) ptDelayUs(10000); } #endif - - if ( pitot.lastSeenHealthyMs == 0 ) { + if (pitot.lastSeenHealthyMs == 0) { if (pitot.dev.start(&pitot.dev)) { pitot.lastSeenHealthyMs = millis(); - } + } } - if ( (millis() - pitot.lastSeenHealthyMs) >= US2MS(pitot.dev.delay)) { - if (pitot.dev.get(&pitot.dev)) // read current data + if ((millis() - pitot.lastSeenHealthyMs) >= US2MS(pitot.dev.delay)) { + if (pitot.dev.get(&pitot.dev)) { // read current data pitot.lastSeenHealthyMs = millis(); + } - if (pitot.dev.start(&pitot.dev)) // init for next read - pitot.lastSeenHealthyMs = millis(); + if (pitot.dev.start(&pitot.dev)) { // init for next read + pitot.lastSeenHealthyMs = millis(); + } } - pitot.dev.calculate(&pitot.dev, &pitotPressureTmp, &pitotTemperatureTmp); #ifdef USE_SIMULATOR if (SIMULATOR_HAS_OPTION(HITL_AIRSPEED)) { - pitotPressureTmp = sq(simulatorData.airSpeed) * SSL_AIR_DENSITY / 20000.0f + SSL_AIR_PRESSURE; + pitotPressureTmp = sq(simulatorData.airSpeed) * SSL_AIR_DENSITY / 20000.0f + SSL_AIR_PRESSURE; } #endif #if defined(USE_PITOT_FAKE) - if (pitotmeterConfig()->pitot_hardware == PITOT_FAKE) { - pitotPressureTmp = sq(fakePitotGetAirspeed()) * SSL_AIR_DENSITY / 20000.0f + SSL_AIR_PRESSURE; - } + if (pitotmeterConfig()->pitot_hardware == PITOT_FAKE) { + pitotPressureTmp = sq(fakePitotGetAirspeed()) * SSL_AIR_DENSITY / 20000.0f + SSL_AIR_PRESSURE; + } #endif ptYield(); @@ -280,9 +282,9 @@ STATIC_PROTOTHREAD(pitotThread) // NOTE ::filter pressure - apply filter when NOT calibrating for zero !!! currentTimeUs = micros(); - if(pitotmeterConfig()->pitot_lpf_milli_hz >0){ + if (pitotmeterConfig()->pitot_lpf_milli_hz > 0) { pitot.pressure = pt1FilterApply3(&pitot.lpfState, pitotPressureTmp, US2S(currentTimeUs - pitot.lastMeasurementUs)); - }else{ + } else { pitot.pressure = pitotPressureTmp; } pitot.lastMeasurementUs = currentTimeUs; @@ -297,7 +299,7 @@ STATIC_PROTOTHREAD(pitotThread) } #if defined(USE_PITOT_FAKE) - if (pitotmeterConfig()->pitot_hardware == PITOT_FAKE) { + if (pitotmeterConfig()->pitot_hardware == PITOT_FAKE) { pitot.airSpeed = fakePitotGetAirspeed(); } #endif From ac8522629e15683ff96e480d7b0c9f05de0dc435 Mon Sep 17 00:00:00 2001 From: breadoven <56191411+breadoven@users.noreply.github.com> Date: Thu, 19 Mar 2026 00:03:50 +0000 Subject: [PATCH 2/3] Update pitotmeter.c --- src/main/sensors/pitotmeter.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/sensors/pitotmeter.c b/src/main/sensors/pitotmeter.c index 2b8a3873e6a..8183e2f4811 100755 --- a/src/main/sensors/pitotmeter.c +++ b/src/main/sensors/pitotmeter.c @@ -136,7 +136,7 @@ bool pitotDetect(pitotDev_t *dev, uint8_t pitotHardwareToUse) case PITOT_VIRTUAL: if (pitotHardwareToUse != PITOT_AUTODETECT) { #if defined(USE_WIND_ESTIMATOR) && defined(USE_PITOT_VIRTUAL) - if (virtualPitotDetect(dev)) { + if (virtualPitotDetect(dev)) { pitotHardware = PITOT_VIRTUAL; break; } From 7cdd387fb7eeec9e2d9a54fbde824572e7b43510 Mon Sep 17 00:00:00 2001 From: breadoven <56191411+breadoven@users.noreply.github.com> Date: Thu, 19 Mar 2026 11:26:52 +0000 Subject: [PATCH 3/3] Add settings description --- docs/Settings.md | 2 +- src/main/fc/settings.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/Settings.md b/docs/Settings.md index 4e577bbedd5..561802c817d 100644 --- a/docs/Settings.md +++ b/docs/Settings.md @@ -5624,7 +5624,7 @@ Defines rotation rate on PITCH axis that UAV will try to archive on max. stick d ### pitot_hardware -Selection of pitot hardware. +Selection of pitot hardware. VIRTUAL only works if a GPS is enabled. | Default | Min | Max | | --- | --- | --- | diff --git a/src/main/fc/settings.yaml b/src/main/fc/settings.yaml index 476dfe09ff7..1c57f8363b2 100644 --- a/src/main/fc/settings.yaml +++ b/src/main/fc/settings.yaml @@ -667,7 +667,7 @@ groups: condition: USE_PITOT members: - name: pitot_hardware - description: "Selection of pitot hardware." + description: "Selection of pitot hardware. VIRTUAL only works if a GPS is enabled." default_value: "NONE" table: pitot_hardware - name: pitot_lpf_milli_hz