The previous framing leaned on "MSVC is what CI exercises" as the
reason MSVC is the default, which is circular — CI uses MSVC
because it's the default, not the other way around.
Restate the rationale as what it actually is: MSVC is Microsoft's
native Windows toolchain, ships with the Windows SDK, produces
binaries against the canonical Windows ABI, and is the toolchain
the broader Windows C++ ecosystem (debugger, profilers, libraries)
is built and tested against — so it gives the cleanest native
Windows experience. Demote the CI mention to a single sentence
noting that both MSVC and MinGW are exercised on every PR (so the
CI green covers the alternative too).
Signed-off-by: Nuno Marques <n.marques21@hotmail.com>
dev_env_windows_native.md
- Add a "Choosing the C++ Toolchain" subsection up front naming
MSVC as the default and MinGW-w64 as the alternative for GCC
workflows, so the rationale is stated once instead of scattered
across the build / agent sections.
- Trim the Gazebo / jMAVSim "not supported" admonition to a short
warning linking down to a new "Running Non-SIH Simulators from
WSL or a Remote Linux Host" section near the end where the
longer explanation now lives.
- Drop the obsolete "px4-* client wrappers are not reliably
functional" caveat and matching Known Limitations bullet —
every wrapper now works fine from a separate PowerShell window.
- Drop the assumed $env:USERPROFILE\Documents clone path here and
in the agent section; tell readers to use a directory they have
rights over (e.g. C:\PX4, C:\opt\Micro-XRCE-DDS-Agent) and
demote the OneDrive / spaces / MAX_PATH caveats from a warning
to an info box.
- Flip the "Visual Studio 2022 Build Tools installer runs silently
for 10-15 min" admonition from warning to info — it's a heads-up,
not a danger.
- Drop "Git for Windows" from the list of things the setup script
installs (it has to exist before the script can run); add a
sentence noting the script leaves any existing Git install alone.
- Remove the inline SIH-airframes table and link to the canonical
table at sim_sih/index.md#supported-vehicle-types instead, so
we don't keep two lists in sync when new airframes land.
- Note that the agent build is MSVC-only on Windows; PX4 SITL
itself still builds fine with MinGW.
- Replace the "do not use pip's ninja" warning with a where.exe-
based diagnostic plus the actual remediation (uninstall the pip
ninja, or reorder PATH so the winget install wins).
- Add an info admonition above the ROS 2 section clarifying that
ROS 2 on Windows is OSRF-community-supported, not a first-class
PX4 platform, and pointing users who would rather run ROS 2
under WSL2 at that option.
ros2/multi_vehicle.md, ros2/user_guide.md, sim_jmavsim/multi_vehicle.md
- Reword the Windows-native info boxes ("When using the Windows
Native Development Environment...") so they don't implicitly
claim to apply to every Windows setup.
Signed-off-by: Nuno Marques <n.marques21@hotmail.com>
Match the v6xrt ITCM include list to the current LED::ioctl signature after ioctl arguments were widened to uintptr_t on this branch.
This lets the ITCM checker account for the emitted ARM symbol instead of looking for the stale unsigned-long mangling.
Run PX4 integration tests from an isolated rootfs, wait for the ROS 2 vehicle_status publisher before launching ROS tests, and keep param set from consuming the startup env loop stdin.
This preserves multi-parameter test overrides used by EKF and attitude-controller cases while turning early PX4 exits into clear runner failures.
Add focused tests for Windows shim headers, file and poll behavior, runtime helpers, and main-output silence so native Windows unit jobs exercise the compatibility layer directly.
Document the native Windows development environment, setup scripts, SITL usage, and related ROS 2 / simulation notes while keeping the existing WSL and Cygwin pages linked clearly.
Add the Windows SITL workflow for MinGW and MSVC builds, extend unit-test coverage to Windows runners, and make the macOS build use the configured Python environment consistently.
Make MAVLink, uXRCE-DDS, and simulator_mavlink tolerate Windows socket and daemon semantics while preserving the existing POSIX transport behavior.
Update Gazebo Classic integration, SIH defaults, and multi-instance simulation scripts needed by the native Windows SITL workflow.
Replace GNU-only cases and POSIX assumptions with portable PX4 helpers across drivers, examples, logger, dataman, version reporting, system commands, and tests.
Keep ioctl argument types consistent and make startup/runtime diagnostics less noisy on SITL-only platforms where optional devices are absent.
Introduce grouped parameter macros and generator metadata so modules can describe optional parameter groups without expanding every disabled parameter at compile time.
Convert EKF2, logger, and sensor parameter holders to the grouped form and keep the ROS2 platform headers in sync for generated parameter consumers.
Wake scheduler waits through Windows-safe primitives, gate lockstep work-queue progress to Windows, and avoid startup stalls before simulator time is available.
Keep SIH and commander shell commands responsive at higher speed factors, including Wine-specific sleep behavior that avoids clock-poll spin overhead without changing native Windows paths.
Make PX4 startup, daemon command handling, shell I/O, shutdown, logging, getopt, and instance state work across POSIX and native Windows runtime boundaries.
Keep command-client behavior explicit by routing shell output through shared logger paths and preserving socket protocol return markers during shutdown.
Add the MinGW toolchain and Windows platform CMake module, then teach shared build helpers how to handle MSVC, clang-cl, and MinGW warning/link semantics.
Adjust affected module and test targets so the existing PX4 source tree can be configured for native Windows SITL without changing non-Windows build intent.
Introduce the Windows POSIX shim headers and implementations used by native Windows SITL builds, including filesystem, networking, process, timing, terminal, and dynamic-loading adapters.
Add the Windows runtime initialization and embedded shell backend while keeping the shared platform headers explicit about Windows support and symbol visibility.
* mavlink: reassemble GPS_RTCM_DATA before GPS injection
* Apply minor comment requested changes
* Simplification: remove _completed_sequence asymetric protection
* Handle RTCM payload length which is an exact multiple of 180
* update docs
* lib gnss: new GpsRtcmMessageFragmenter to send RTCM via GPS_RTCM_DATA.hpp
* fix clang
* Remove RTCM fragmenter
* update docs
* Compatibility fallback for older QGroundControl builds that omit the final zero-length fragment
* mavlink receiver, remove while loop to avoid dead lock
* docs(update): Subedit
Co-authored-by: Hamish Willee <hamishwillee@gmail.com>
* docs(docs): format
---------
Co-authored-by: jonas <jonas.perolini@rigi.tech>
Co-authored-by: Hamish Willee <hamishwillee@gmail.com>
ModeManagement caches the most recent config_control_setpoints entry per
source_id (one per external mode) and reads it on every nav_state change
to decide which flight controllers to enable. The cache was read verbatim
regardless of when the entry was written, so a contract authored during
an earlier activation of the same mode -- e.g. a ground configuration that
disables all controllers, followed by re-entering the same mode in the
air -- briefly forced the new activation onto a controller configuration
intended for the previous one.
Stamp every cache write with the PX4-local receive time. On the first
updateControlMode() call for a new nav_state, refuse any cached entry
whose receive time predates the activation and publish the safe default
contract (every control loop enabled) instead, until a fresh entry arrives.
A single warning is emitted per activation when the fallback engages.
After sending reboot-to-bootloader, the PX4 USB CDC node briefly
disappears while the bootloader re-enumerates. Reopening the serial
port can land on a half-broken descriptor and the next tcdrain()
raises termios.error (5, 'Input/output error'). That bare OSError
escaped every retry layer and crashed the uploader, even though a
manual re-run would succeed once enumeration settled.
Convert OSError/SerialException from flush() and reset_buffers() into
the module's ConnectionError, matching how send()/recv() already
behave, and let the identify retry loops in _try_identify also catch
ConnectionError so a single transient I/O hiccup doesn't abort the
upload.
Signed-off-by: Jacob Dahl <dahl.jakejacob@gmail.com>
The line "Priority is assigned automatically during calibration..."
added in #27393 duplicates information already conveyed by the
surrounding paragraph. Hamish flagged the redundancy in code review.
This PR was AI-assisted (Claude Code) and reviewed by a human
before submission.
Co-authored-by: _pmjn_ <pcminh170701@gmail.com>
* fix(drivers/ak09940a): fix probe retry, devtype collision, and register naming
* fix(drivers/neopixel): check init return value and fix module name typo
* fix(boards/3dr/ctrl-n1): correct magnetometer i2c bus, LED indexing, chip variant for bootloader, and TIM3 conflict with srgbled_dma
* fix(boards/3dr/ctrl-n1): update bootloader for STM32H743VI