By reading sizeof(packet), it could have happened that 2 packets at once
were read, and the second one was then ignored.
This makes sure that only one packet at a time is read.
The other 2 changes are for efficiency.
It was not enough to lock individual accesses to the maps.
For example it could happen that a thread was started and exited very
quickly, before the pthread_t item was inserted into the map, such
that when the cleanup method was called, the thread and pipe fd were not
found (and fd=0=stdin was closed).
The buffer length given to snprintf() is unsigned, so we must check for
an overflow after each call.
This happend for very long printf's (module documentation)
- move posix-configs/SITL/init/{rcS,10016_iris,6011_typhoon_h480} to ROMFS/px4fmu_common/init.d-posix
allows for easier unification, only one symlink is required.
- rcS: add AUTOCNF support. Update scripts to match with behavior of PX4
master (parameter values, some sitl driver got removed)
- add alias to allow 'set variable value' syntax in scripts to px4-alias.sh
- use px4_getopt
- use separate argument for the test_data directory
- append PATH from within the px4 binary: this simplifies the usage
w/o the sitl_run.sh script.
- add 'source px4-alias.sh' to all existing sitl startup scripts
- move sitl mixers to ROMFS/px4fmu_common/mixers-sitl
makes it easier to use existing mixers and sitl-specific ones.
- remove unused rcS_gazebo_delta_wing
_subscriptions is a vector that is resized when needed. However there could
still be references to elements in the vector when the resize happens.
These references then become invalid.
Using a vector of pointers fixes that.
- use the orb topic safety to check the safety state, because the actual
safety state can come from the IO
- fix initialization if circuit breaker is set
The check is unnecessary. In the worst case the semaphore gets unlocked
twice, but it's not an issue because the waiter is only interested in the
first sem_post(), and the semaphore is then not used anymore.
poll() is one of the heavily used methods and thus needs to be optimized
as much as possible.
Test on Pixracer: uorb_tests latency_test
Before:
uORB note: ---------------- LATENCY TEST ------------------
INFO [uorb_tests] mean: 40.4320 us
INFO [uorb_tests] std dev: 1.3466 us
INFO [uorb_tests] min: 39 us
INFO [uorb_tests] max: 57 us
INFO [uorb_tests] missed topic updates: 0
This Patch:
uORB note: ---------------- LATENCY TEST ------------------
INFO [uorb_tests] mean: 31.3480 us
INFO [uorb_tests] std dev: 1.4584 us
INFO [uorb_tests] min: 30 us
INFO [uorb_tests] max: 45 us
INFO [uorb_tests] missed topic updates: 0
- running at max priority significantly decreases jitter for the latency
test, providing more consistent results
- stack size increase is required for the latency test
- Telemetry is only enabled on omnibus, since on Pixhawk it seems we cannot
write to the RC UART due to how the board is wired
- For the Telemetry the UART needs to be opened RW
Modules generally do not check for a valid timestamp, thus we need to avoid
publishing invalid data.
This is for example problematic in the attitude_estimator_q, if the
system has no mag: it will copy the (invalid) data and then fails to
initialize, as there is no more mag data coming in.
- every incremental rebuild extended ${config_romfs_files_list}, the
chached variable was never reset
- cmake -E copy_directory did not remove deleted files
remaining issue: removing a file from the ROMFS & px4_add_romfs_files()
does not trigger the px_romfs_pruner.py COMMANDs to be re-executed.
This fixes automatic upload. Since ed95dced0f the NuttX string
is used for device detection, but Linux uses the bootloader's USB vendor
and product strings.
So the NuttX strings must match with the ones from the bootloader.
When a gyro driver is stopped, the topic is unadvertised and
orb_group_count() returns a smaller count. This can have the effect, that
we poll on a certain gyro fd, but since _gyro.subscription_count is reduced
we never do the orb_copy for that fd.
This cannot happen when armed. And only someone playing with the shell
can trigger it (sensor failures do not have that effect).
- There is an assumption un uORB that PX4_F_RDONLY is not 0.
- But O_RDONLY is 0 on Linux. orb_exists passes 0 to px4_open, which in
uORB::DeviceNode::open leads to an unnecessary allocation of
SubscriberData()
- PX4_F_RDONLY is only used in combination with px4_open, never with open()
However even if it was wrong/unexpected, it did not cause any problems,
just the unnecessary allocation.
- reorders operations, such that the most expensive one (orb_copy) is done
only when really needed.
- corner case: when the topic was not advertised yet, orb_stat() would fail
and then update() was called, which succeeds for the first advertisement.
In that case the timestamp was incorrectly set to 0 and true was
returned.
The next call would again return true, because the timestamp was updated,
but the topic data was still the same.
Reduces CPU load by ~2% on a Pixracer.
This is a more generic solution for 532a97041, and also enables it for
vehicle_command_ack's.
In addition it avoids using a timestamp for subscription update checking,
because it does not work well together with orb queuing.
Can be used to avoid auto-detection.
Strangely on the Omnibus via UART4, the auto-detection for single-wire
S.Port did not work when connecting via battery (it works via USB) -
S.Port got detected instead.
Might be a board-specific issue.
If S.Port is connected via external inverter or an uninverted signal is
used, the UART needs to be put into half-duplex mode.
This can be used to get uninverted S.Port:
https://oscarliang.com/uninverted-sbus-smart-port-frsky-receivers/
It is not needed for the Pixracer FrSky port.
Previously the rate controller disabled updating the integral below 20%
throttle. This is not ideal for several reasons:
- some racers already hover with 20% throttle.
- for acro it is important to always keep the integral enabled, it has a
noticeable effect on flight performance.
A reason for using switch arming in the first place is that you cannot
accidentally disarm in-air with the sticks during acrobatic flights.
It also adds a low-throttle arming requirement for switch arming.
This changes the arming logic such that the preflight checks don't need
to be satisfied if arming happens < 5 seconds after the last disarming.
This allows to recover from accidental in-air disarming.
if fRunPreArmChecks was set to false, there were still cases where the
preflight checks could be called. This fixes that.
arming_state_transition() with fRunPreArmChecks=false is only called
when entering & leaving preflight calibration mode.
All other places use fRunPreArmChecks=true, which means there is no change
for these.
- this matches the logic in arming_state_transition()
- if Commander::preflight_check was run in armed state and the checks
failed, disarming was not possible anymore
(because disarming checks for condition_system_sensors_initialized).
That is currently not the case, but the existing logic is way too fragile.
Alternative solution: check if armed in Preflight::preflightCheck, and
only transition to false if disarmed (but also respect the re-arming
grace period).
The uorb subscribe logic got changed for queued topics with
https://github.com/PX4/Firmware/pull/9436, meaning an orb_subscribe will
return past messages as well now.
This lead to an error 'Command denied during calibration' for the previously
received calibration start command.