diff --git a/.gitignore b/.gitignore
index 6d7138e6bd5..c1015dd5c68 100644
--- a/.gitignore
+++ b/.gitignore
@@ -47,6 +47,10 @@ launch.json
tokens.yaml
*.ubx
+# Build output directories (catch-all for ad-hoc build dirs)
+/build_*/
+/build_hw/
+
# Local development files
.semgrepignore
build_sitl/
diff --git a/lib/main/pico-sdk/lib/tinyusb/.idea/.gitignore b/lib/main/pico-sdk/lib/tinyusb/.idea/.gitignore
new file mode 100644
index 00000000000..b0811f16305
--- /dev/null
+++ b/lib/main/pico-sdk/lib/tinyusb/.idea/.gitignore
@@ -0,0 +1,10 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# GitHub Copilot persisted chat sessions
+/copilot/chatSessions
diff --git a/lib/main/pico-sdk/lib/tinyusb/.idea/cmake.xml b/lib/main/pico-sdk/lib/tinyusb/.idea/cmake.xml
new file mode 100644
index 00000000000..96ff19c89d4
--- /dev/null
+++ b/lib/main/pico-sdk/lib/tinyusb/.idea/cmake.xml
@@ -0,0 +1,150 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/kl25.xml b/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/kl25.xml
new file mode 100644
index 00000000000..96c208dde10
--- /dev/null
+++ b/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/kl25.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/lpc1857.xml b/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/lpc1857.xml
new file mode 100644
index 00000000000..a4764b9d62c
--- /dev/null
+++ b/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/lpc1857.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/lpc4088.xml b/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/lpc4088.xml
new file mode 100644
index 00000000000..9da975ef309
--- /dev/null
+++ b/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/lpc4088.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/lpc54628.xml b/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/lpc54628.xml
new file mode 100644
index 00000000000..0c3877e9448
--- /dev/null
+++ b/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/lpc54628.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/lpc55s69.xml b/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/lpc55s69.xml
new file mode 100644
index 00000000000..2fa127d33dc
--- /dev/null
+++ b/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/lpc55s69.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/mcx947.xml b/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/mcx947.xml
new file mode 100644
index 00000000000..12180a996c7
--- /dev/null
+++ b/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/mcx947.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/nrf52840.xml b/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/nrf52840.xml
new file mode 100644
index 00000000000..8e48a2b978a
--- /dev/null
+++ b/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/nrf52840.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/nrf5340.xml b/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/nrf5340.xml
new file mode 100644
index 00000000000..646f2d38c36
--- /dev/null
+++ b/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/nrf5340.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/ra4m1.xml b/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/ra4m1.xml
new file mode 100644
index 00000000000..72bc63d9b2f
--- /dev/null
+++ b/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/ra4m1.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/ra6m1.xml b/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/ra6m1.xml
new file mode 100644
index 00000000000..ca8c7245a5e
--- /dev/null
+++ b/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/ra6m1.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/ra6m5.xml b/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/ra6m5.xml
new file mode 100644
index 00000000000..ecbdb21b74c
--- /dev/null
+++ b/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/ra6m5.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/rp2040.xml b/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/rp2040.xml
new file mode 100644
index 00000000000..da5a8f1ee8c
--- /dev/null
+++ b/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/rp2040.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/rt1010.xml b/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/rt1010.xml
new file mode 100644
index 00000000000..f415c067661
--- /dev/null
+++ b/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/rt1010.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/rt1060.xml b/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/rt1060.xml
new file mode 100644
index 00000000000..cc75aa62cec
--- /dev/null
+++ b/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/rt1060.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/samd21g18.xml b/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/samd21g18.xml
new file mode 100644
index 00000000000..f8aa6009d07
--- /dev/null
+++ b/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/samd21g18.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/samd51j19.xml b/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/samd51j19.xml
new file mode 100644
index 00000000000..694ea7dfdcf
--- /dev/null
+++ b/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/samd51j19.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/stlink.xml b/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/stlink.xml
new file mode 100644
index 00000000000..628f7910de0
--- /dev/null
+++ b/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/stlink.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/stm32g474.xml b/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/stm32g474.xml
new file mode 100644
index 00000000000..6d65e83c78e
--- /dev/null
+++ b/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/stm32g474.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/stm32h743.xml b/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/stm32h743.xml
new file mode 100644
index 00000000000..aeaf9fb533b
--- /dev/null
+++ b/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/stm32h743.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/uno_r4.xml b/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/uno_r4.xml
new file mode 100644
index 00000000000..98bf918120a
--- /dev/null
+++ b/lib/main/pico-sdk/lib/tinyusb/.idea/runConfigurations/uno_r4.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/lib/main/pico-sdk/lib/tinyusb/.idea/vcs.xml b/lib/main/pico-sdk/lib/tinyusb/.idea/vcs.xml
new file mode 100644
index 00000000000..94a25f7f4cb
--- /dev/null
+++ b/lib/main/pico-sdk/lib/tinyusb/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/io/osd.c b/src/main/io/osd.c
index 0bdb9e3375f..9b56008cef8 100644
--- a/src/main/io/osd.c
+++ b/src/main/io/osd.c
@@ -2056,7 +2056,7 @@ static bool osdDrawSingleElement(uint8_t item)
break;
case OSD_3D_SPEED:
- osdFormatVelocityStr(buff, osdGet3DSpeed(), OSD_SPEED_TYPE_3D, false);
+ osdFormatVelocityStr(buff, posControl.actualState.vel3D, OSD_SPEED_TYPE_3D, false);
break;
case OSD_3D_MAX_SPEED:
@@ -4928,7 +4928,7 @@ static void osdUpdateStats(void)
int32_t value;
if (feature(FEATURE_GPS)) {
- value = osdGet3DSpeed();
+ value = posControl.actualState.vel3D;
const float airspeed_estimate = getAirspeedEstimate();
if (stats.max_3D_speed < value) stats.max_3D_speed = value;
diff --git a/src/main/io/osd_common.c b/src/main/io/osd_common.c
index 38563ed5d88..6b2e59706be 100644
--- a/src/main/io/osd_common.c
+++ b/src/main/io/osd_common.c
@@ -42,6 +42,8 @@
#include "io/osd_grid.h"
#include "navigation/navigation.h"
+#include "navigation/navigation_private.h"
+
#include "sensors/pitotmeter.h"
#if defined(USE_OSD) || defined(USE_DJI_HD_OSD)
@@ -59,7 +61,7 @@ int16_t osdGetSpeedFromSelectedSource(void) {
speed = gpsSol.groundSpeed;
break;
case OSD_SPEED_SOURCE_3D:
- speed = osdGet3DSpeed();
+ speed = posControl.actualState.vel3D;
break;
case OSD_SPEED_SOURCE_AIR:
#ifdef USE_PITOT
@@ -164,7 +166,7 @@ void osdDrawArtificialHorizon(displayPort_t *display, displayCanvas_t *canvas, c
{
uint8_t gx;
uint8_t gy;
-
+
#if defined(USE_CANVAS)
if (canvas) {
osdCanvasDrawArtificialHorizon(display, canvas, p, pitchAngle, rollAngle);
@@ -211,15 +213,3 @@ void osdDrawSidebars(displayPort_t *display, displayCanvas_t *canvas)
}
#endif
-
-#ifdef USE_GPS
-/*
- * 3D speed in cm/s
- */
-int16_t osdGet3DSpeed(void)
-{
- float vert_speed = getEstimatedActualVelocity(Z);
- float hor_speed = (float)gpsSol.groundSpeed;
- return (int16_t)calc_length_pythagorean_2D(hor_speed, vert_speed);
-}
-#endif
diff --git a/src/main/io/osd_common.h b/src/main/io/osd_common.h
index a032747effc..0831a36e678 100644
--- a/src/main/io/osd_common.h
+++ b/src/main/io/osd_common.h
@@ -105,7 +105,3 @@ void osdDrawArtificialHorizon(displayPort_t *display, displayCanvas_t *canvas, c
// grid slots.
void osdDrawHeadingGraph(displayPort_t *display, displayCanvas_t *canvas, const osdDrawPoint_t *p, int heading);
void osdDrawSidebars(displayPort_t *display, displayCanvas_t *canvas);
-
-#ifdef USE_GPS
-int16_t osdGet3DSpeed(void);
-#endif
diff --git a/src/main/io/osd_dji_hd.c b/src/main/io/osd_dji_hd.c
index a8adf663d57..a2a4ecbfaa5 100644
--- a/src/main/io/osd_dji_hd.c
+++ b/src/main/io/osd_dji_hd.c
@@ -681,7 +681,7 @@ void osdDJIFormatVelocityStr(char* buff)
break;
case OSD_SPEED_SOURCE_3D:
strcpy(sourceBuf, "3D");
- vel = osdGet3DSpeed();
+ vel = posControl.actualState.vel3D;
break;
case OSD_SPEED_SOURCE_AIR:
strcpy(sourceBuf, "AIR");
diff --git a/src/main/navigation/navigation.c b/src/main/navigation/navigation.c
index 03d4a3da36b..611d25864cc 100644
--- a/src/main/navigation/navigation.c
+++ b/src/main/navigation/navigation.c
@@ -2852,6 +2852,8 @@ void updateActualAltitudeAndClimbRate(bool estimateValid, float newAltitude, flo
posControl.actualState.agl.pos.z = surfaceDistance;
posControl.actualState.agl.vel.z = surfaceVelocity;
+ posControl.actualState.vel3D = calc_length_pythagorean_2D(posControl.actualState.velXY, posControl.actualState.abs.vel.z);
+
// Update altitude that would be used when executing RTH
if (estimateValid) {
updateDesiredRTHAltitude();
@@ -3874,10 +3876,10 @@ void getWaypoint(uint8_t wpNumber, navWaypoint_t * wpData)
int isGCSValid(void)
{
- return (ARMING_FLAG(ARMED) &&
- (posControl.flags.estPosStatus >= EST_TRUSTED) &&
- posControl.gpsOrigin.valid &&
- posControl.flags.isGCSAssistedNavigationEnabled &&
+ return (ARMING_FLAG(ARMED) &&
+ (posControl.flags.estPosStatus >= EST_TRUSTED) &&
+ posControl.gpsOrigin.valid &&
+ posControl.flags.isGCSAssistedNavigationEnabled &&
(posControl.navState == NAV_STATE_POSHOLD_3D_IN_PROGRESS));
}
diff --git a/src/main/navigation/navigation_private.h b/src/main/navigation/navigation_private.h
index a1f07e470c0..4ae10b0be7c 100644
--- a/src/main/navigation/navigation_private.h
+++ b/src/main/navigation/navigation_private.h
@@ -137,6 +137,7 @@ typedef struct {
float cosYaw;
float surfaceMin;
float velXY;
+ float vel3D;
} navigationEstimatedState_t;
typedef struct {
diff --git a/src/main/programming/logic_condition.c b/src/main/programming/logic_condition.c
index edba68b8e94..9fcf42495a6 100644
--- a/src/main/programming/logic_condition.c
+++ b/src/main/programming/logic_condition.c
@@ -733,9 +733,8 @@ static int logicConditionGetFlightOperandValue(int operand) {
return getMinGroundSpeed(navConfig()->general.min_ground_speed);
break;
- //FIXME align with osdGet3DSpeed
case LOGIC_CONDITION_OPERAND_FLIGHT_3D_SPEED: // cm/s
- return osdGet3DSpeed();
+ return posControl.actualState.vel3D;
break;
case LOGIC_CONDITION_OPERAND_FLIGHT_AIR_SPEED: // cm/s
@@ -767,7 +766,7 @@ static int logicConditionGetFlightOperandValue(int operand) {
uint16_t windAngle;
getEstimatedHorizontalWindSpeed(&windAngle);
int32_t windHeading = (int32_t)windAngle + 18000; // Correct heading to display correctly.
-
+
while (windHeading < 0) windHeading += 36000;
while (windHeading >= 36000) windHeading -= 36000;
@@ -787,10 +786,10 @@ static int logicConditionGetFlightOperandValue(int operand) {
uint16_t windAngle;
getEstimatedHorizontalWindSpeed(&windAngle);
int32_t relativeWindHeading = (int32_t)windAngle + 18000 - DECIDEGREES_TO_CENTIDEGREES(attitude.values.yaw);
-
+
while (relativeWindHeading < 0) relativeWindHeading += 36000;
while (relativeWindHeading >= 36000) relativeWindHeading -= 36000;
-
+
relativeWindHeading = -relativeWindHeading;
if (relativeWindHeading <= -18000)
relativeWindHeading = 18000 + (relativeWindHeading + 18000);
@@ -802,7 +801,7 @@ static int logicConditionGetFlightOperandValue(int operand) {
#else
return 0;
#endif
- break;
+ break;
case LOGIC_CONDITION_OPERAND_FLIGHT_ALTITUDE: // cm
return constrain(getEstimatedActualPosition(Z), INT32_MIN, INT32_MAX);
@@ -894,7 +893,7 @@ static int logicConditionGetFlightOperandValue(int operand) {
return rxLinkStatistics.uplinkRSSI;
#else
return 0;
-#endif
+#endif
break;
case LOGIC_CONDITION_OPERAND_FLIGHT_LQ_DOWNLINK: