mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-07-06 03:40:35 +08:00
uORB: introduce SubscriptionMultiArray for working with multi-instances
This commit is contained in:
@@ -3755,7 +3755,7 @@ void Commander::mission_init()
|
||||
|
||||
void Commander::data_link_check()
|
||||
{
|
||||
for (auto &telemetry_status : _telemetry_status_sub) {
|
||||
for (auto &telemetry_status : _telemetry_status_subs) {
|
||||
telemetry_status_s telemetry;
|
||||
|
||||
if (telemetry_status.update(&telemetry)) {
|
||||
@@ -3924,14 +3924,13 @@ void Commander::data_link_check()
|
||||
|
||||
void Commander::avoidance_check()
|
||||
{
|
||||
for (auto &dist_sens_sub : _distance_sensor_subs) {
|
||||
distance_sensor_s distance_sensor;
|
||||
|
||||
for (unsigned i = 0; i < ORB_MULTI_MAX_INSTANCES; i++) {
|
||||
if (_sub_distance_sensor[i].updated()) {
|
||||
distance_sensor_s distance_sensor {};
|
||||
_sub_distance_sensor[i].copy(&distance_sensor);
|
||||
|
||||
if (dist_sens_sub.update(&distance_sensor)) {
|
||||
if ((distance_sensor.orientation != distance_sensor_s::ROTATION_DOWNWARD_FACING) &&
|
||||
(distance_sensor.orientation != distance_sensor_s::ROTATION_UPWARD_FACING)) {
|
||||
|
||||
_valid_distance_sensor_time_us = distance_sensor.timestamp;
|
||||
}
|
||||
}
|
||||
@@ -3961,28 +3960,24 @@ void Commander::avoidance_check()
|
||||
|
||||
void Commander::battery_status_check()
|
||||
{
|
||||
bool battery_sub_updated = false;
|
||||
// We need to update the status flag if ANY battery is updated, because the system source might have
|
||||
// changed, or might be nothing (if there is no battery connected)
|
||||
if (!_battery_status_subs.updated()) {
|
||||
// Nothing has changed since the last time this function was called, so nothing needs to be done now.
|
||||
return;
|
||||
}
|
||||
|
||||
battery_status_s batteries[ORB_MULTI_MAX_INSTANCES];
|
||||
battery_status_s batteries[_battery_status_subs.size()];
|
||||
size_t num_connected_batteries = 0;
|
||||
|
||||
for (size_t i = 0; i < sizeof(_battery_subs) / sizeof(_battery_subs[0]); i++) {
|
||||
// We need to update the status flag if ANY battery is updated, because the system source might have
|
||||
// changed, or might be nothing (if there is no battery connected)
|
||||
battery_sub_updated |= _battery_subs[i].updated();
|
||||
|
||||
if (_battery_subs[i].copy(&batteries[num_connected_batteries])) {
|
||||
for (auto &battery_sub : _battery_status_subs) {
|
||||
if (battery_sub.copy(&batteries[num_connected_batteries])) {
|
||||
if (batteries[num_connected_batteries].connected) {
|
||||
num_connected_batteries++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!battery_sub_updated) {
|
||||
// Nothing has changed since the last time this function was called, so nothing needs to be done now.
|
||||
return;
|
||||
}
|
||||
|
||||
// There are possibly multiple batteries, and we can't know which ones serve which purpose. So the safest
|
||||
// option is to check if ANY of them have a warning, and specifically find which one has the most
|
||||
// urgent warning.
|
||||
|
||||
@@ -56,6 +56,7 @@
|
||||
|
||||
// subscriptions
|
||||
#include <uORB/Subscription.hpp>
|
||||
#include <uORB/SubscriptionMultiArray.hpp>
|
||||
#include <uORB/topics/actuator_controls.h>
|
||||
#include <uORB/topics/airspeed.h>
|
||||
#include <uORB/topics/battery_status.h>
|
||||
@@ -384,21 +385,8 @@ private:
|
||||
|
||||
// Subscriptions
|
||||
uORB::Subscription _actuator_controls_sub{ORB_ID_VEHICLE_ATTITUDE_CONTROLS};
|
||||
#if BOARD_NUMBER_BRICKS > 1
|
||||
uORB::Subscription _battery_subs[ORB_MULTI_MAX_INSTANCES] {
|
||||
uORB::Subscription(ORB_ID(battery_status), 0),
|
||||
uORB::Subscription(ORB_ID(battery_status), 1),
|
||||
uORB::Subscription(ORB_ID(battery_status), 2),
|
||||
uORB::Subscription(ORB_ID(battery_status), 3),
|
||||
};
|
||||
#else
|
||||
uORB::Subscription _battery_subs[1] {
|
||||
uORB::Subscription(ORB_ID(battery_status), 0)
|
||||
};
|
||||
#endif
|
||||
uORB::Subscription _cmd_sub {ORB_ID(vehicle_command)};
|
||||
uORB::Subscription _cpuload_sub{ORB_ID(cpuload)};
|
||||
uORB::Subscription _sub_distance_sensor[ORB_MULTI_MAX_INSTANCES] {{ORB_ID(distance_sensor), 0}, {ORB_ID(distance_sensor), 1}, {ORB_ID(distance_sensor), 2}, {ORB_ID(distance_sensor), 3}}; /**< distance data received from onboard rangefinders */
|
||||
uORB::Subscription _esc_status_sub{ORB_ID(esc_status)};
|
||||
uORB::Subscription _geofence_result_sub{ORB_ID(geofence_result)};
|
||||
uORB::Subscription _iridiumsbd_status_sub{ORB_ID(iridiumsbd_status)};
|
||||
@@ -408,9 +396,11 @@ private:
|
||||
uORB::Subscription _manual_control_setpoint_sub{ORB_ID(manual_control_setpoint)};
|
||||
uORB::Subscription _subsys_sub{ORB_ID(subsystem_info)};
|
||||
uORB::Subscription _system_power_sub{ORB_ID(system_power)};
|
||||
uORB::Subscription _telemetry_status_sub[ORB_MULTI_MAX_INSTANCES] {{ORB_ID(telemetry_status), 0}, {ORB_ID(telemetry_status), 1}, {ORB_ID(telemetry_status), 2}, {ORB_ID(telemetry_status), 3}};
|
||||
uORB::Subscription _vehicle_acceleration_sub{ORB_ID(vehicle_acceleration)};
|
||||
uORB::Subscription _vtol_vehicle_status_sub{ORB_ID(vtol_vehicle_status)};
|
||||
uORB::SubscriptionMultiArray<battery_status_s> _battery_status_subs{ORB_ID::battery_status};
|
||||
uORB::SubscriptionMultiArray<distance_sensor_s> _distance_sensor_subs{ORB_ID::distance_sensor};
|
||||
uORB::SubscriptionMultiArray<telemetry_status_s> _telemetry_status_subs{ORB_ID::telemetry_status};
|
||||
|
||||
#if defined(BOARD_HAS_POWER_CONTROL)
|
||||
uORB::Subscription _power_button_state_sub {ORB_ID(power_button_state)};
|
||||
|
||||
@@ -141,6 +141,7 @@
|
||||
#include <lib/systemlib/mavlink_log.h>
|
||||
#include <uORB/Subscription.hpp>
|
||||
#include <uORB/SubscriptionBlocking.hpp>
|
||||
#include <uORB/SubscriptionMultiArray.hpp>
|
||||
#include <uORB/topics/sensor_accel.h>
|
||||
#include <uORB/topics/vehicle_attitude.h>
|
||||
|
||||
@@ -437,11 +438,7 @@ int do_accel_calibration_quick(orb_advert_t *mavlink_log_pub)
|
||||
sensor_correction_s sensor_correction{};
|
||||
sensor_correction_sub.copy(&sensor_correction);
|
||||
|
||||
uORB::Subscription accel_sub[MAX_ACCEL_SENS] {
|
||||
{ORB_ID(sensor_accel), 0},
|
||||
{ORB_ID(sensor_accel), 1},
|
||||
{ORB_ID(sensor_accel), 2},
|
||||
};
|
||||
uORB::SubscriptionMultiArray<sensor_accel_s, MAX_ACCEL_SENS> accel_subs{ORB_ID::sensor_accel};
|
||||
|
||||
/* use the first sensor to pace the readout, but do per-sensor counts */
|
||||
for (unsigned accel_index = 0; accel_index < MAX_ACCEL_SENS; accel_index++) {
|
||||
@@ -449,7 +446,7 @@ int do_accel_calibration_quick(orb_advert_t *mavlink_log_pub)
|
||||
Vector3f accel_sum{};
|
||||
unsigned count = 0;
|
||||
|
||||
while (accel_sub[accel_index].update(&arp)) {
|
||||
while (accel_subs[accel_index].update(&arp)) {
|
||||
// fetch optional thermal offset corrections in sensor/board frame
|
||||
if ((arp.timestamp > 0) && (arp.device_id != 0)) {
|
||||
Vector3f offset{0, 0, 0};
|
||||
|
||||
Reference in New Issue
Block a user