mirror of
https://github.com/PX4/PX4-Autopilot.git
synced 2026-05-31 02:16:53 +08:00
uavcannode: publisher: MovingBaseLine enhancements (#26092)
* uavcannode: publishers: MovingBaselineData: publish all GpsInjectData updates during BroadcastAnyUpdates. Check and report data loss via uorb generationcounter. Only registerCallback outside of the loop. * remove unnecessary include
This commit is contained in:
@@ -70,44 +70,57 @@ public:
|
|||||||
|
|
||||||
void BroadcastAnyUpdates() override
|
void BroadcastAnyUpdates() override
|
||||||
{
|
{
|
||||||
using ardupilot::gnss::MovingBaselineData;
|
|
||||||
|
|
||||||
// gps_inject_data -> ardupilot::gnss::MovingBaselineData
|
// gps_inject_data -> ardupilot::gnss::MovingBaselineData
|
||||||
gps_inject_data_s inject_data;
|
gps_inject_data_s gps_inject_data = {};
|
||||||
|
|
||||||
|
unsigned last_generation = uORB::SubscriptionCallbackWorkItem::get_last_generation();
|
||||||
|
bool updated = false;
|
||||||
|
|
||||||
|
// Drain all available messages from the queue and publish to CAN.
|
||||||
|
while ((updated = uORB::SubscriptionCallbackWorkItem::update(&gps_inject_data))) {
|
||||||
|
|
||||||
|
unsigned current_generation = uORB::SubscriptionCallbackWorkItem::get_last_generation();
|
||||||
|
|
||||||
|
if (current_generation != last_generation + 1) {
|
||||||
|
PX4_WARN("gps_inject_data lost, generation %u -> %u", last_generation, current_generation);
|
||||||
|
}
|
||||||
|
|
||||||
|
last_generation = current_generation;
|
||||||
|
|
||||||
if (uORB::SubscriptionCallbackWorkItem::update(&inject_data)) {
|
|
||||||
// Prevent republishing rtcm data we received from uavcan
|
// Prevent republishing rtcm data we received from uavcan
|
||||||
union device::Device::DeviceId device_id;
|
union device::Device::DeviceId device_id;
|
||||||
device_id.devid = inject_data.device_id;
|
device_id.devid = gps_inject_data.device_id;
|
||||||
|
|
||||||
if (device_id.devid_s.bus_type != device::Device::DeviceBusType::DeviceBusType_UAVCAN) {
|
if (device_id.devid_s.bus_type == device::Device::DeviceBusType::DeviceBusType_UAVCAN) {
|
||||||
ardupilot::gnss::MovingBaselineData movingbaselinedata{};
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
const size_t capacity = movingbaselinedata.data.capacity();
|
ardupilot::gnss::MovingBaselineData mbd = {};
|
||||||
size_t written = 0;
|
|
||||||
int result = 0;
|
|
||||||
|
|
||||||
while ((result >= 0) && written < inject_data.len) {
|
const size_t capacity = mbd.data.capacity();
|
||||||
size_t chunk_size = inject_data.len - written;
|
size_t written = 0;
|
||||||
|
int result = 0;
|
||||||
|
|
||||||
if (chunk_size > capacity) {
|
while ((result >= 0) && written < gps_inject_data.len) {
|
||||||
chunk_size = capacity;
|
size_t chunk_size = gps_inject_data.len - written;
|
||||||
}
|
|
||||||
|
|
||||||
for (size_t i = 0; i < chunk_size; ++i) {
|
if (chunk_size > capacity) {
|
||||||
movingbaselinedata.data.push_back(inject_data.data[written]);
|
chunk_size = capacity;
|
||||||
written += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
result = uavcan::Publisher<ardupilot::gnss::MovingBaselineData>::broadcast(movingbaselinedata);
|
|
||||||
|
|
||||||
// ensure callback is registered
|
|
||||||
uORB::SubscriptionCallbackWorkItem::registerCallback();
|
|
||||||
|
|
||||||
movingbaselinedata.data.clear();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (size_t i = 0; i < chunk_size; i++) {
|
||||||
|
mbd.data.push_back(gps_inject_data.data[written]);
|
||||||
|
written += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = uavcan::Publisher<ardupilot::gnss::MovingBaselineData>::broadcast(mbd);
|
||||||
|
|
||||||
|
mbd.data.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ensure callback is registered
|
||||||
|
uORB::SubscriptionCallbackWorkItem::registerCallback();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
} // namespace uavcannode
|
} // namespace uavcannode
|
||||||
|
|||||||
Reference in New Issue
Block a user