mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-03 14:58:53 +08:00
fix uxrce_dds_client: apparently we cannot use the upper 4 bits for ID's
This commit is contained in:
@@ -105,7 +105,7 @@ static void on_topic_update(uxrSession *session, uxrObjectId object_id, uint16_t
|
|||||||
|
|
||||||
switch (object_id.id) {
|
switch (object_id.id) {
|
||||||
@[ for idx, sub in enumerate(subscriptions)]@
|
@[ for idx, sub in enumerate(subscriptions)]@
|
||||||
case @(idx)+1000: {
|
case @(idx)+ (65535U / 32U) + 1: {
|
||||||
@(sub['simple_base_type'])_s data;
|
@(sub['simple_base_type'])_s data;
|
||||||
|
|
||||||
if (ucdr_deserialize_@(sub['simple_base_type'])(*ub, data, time_offset_us)) {
|
if (ucdr_deserialize_@(sub['simple_base_type'])(*ub, data, time_offset_us)) {
|
||||||
|
|||||||
@@ -10,17 +10,13 @@
|
|||||||
|
|
||||||
uxrObjectId topic_id_from_orb(ORB_ID orb_id, uint8_t instance = 0)
|
uxrObjectId topic_id_from_orb(ORB_ID orb_id, uint8_t instance = 0)
|
||||||
{
|
{
|
||||||
// Note that the uxrObjectId.id is a uint16_t so we need to cap the ID.
|
// Note that the uxrObjectId.id is a uint16_t so we need to cap the ID,
|
||||||
// orb_id_size_t is currently uint16_t (MAX = 65535) and a max # of instances as either 4 or 10.
|
// and urx does not allow us to use the upper 4 bits.
|
||||||
// We want to use half of the available id's for writers and half for readers,
|
const unsigned max_id = 65535U / 32U;
|
||||||
// so this works as long as orb_id < 3276.
|
const unsigned id = static_cast<unsigned>(orb_id) + (instance * ORB_TOPICS_COUNT);
|
||||||
// Unfortunately, limits does not appear to be available. So hard-coding for uint16_t.
|
|
||||||
if (orb_id != ORB_ID::INVALID &&
|
if (orb_id != ORB_ID::INVALID && id < max_id) {
|
||||||
//(orb_id_size_t) orb_id < (std::numeric_limits<orb_id_size_t> / (2*ORB_MULTI_MAX_INSTANCES) )
|
uxrObjectId topic_id = uxr_object_id(static_cast<uint16_t>(id), UXR_TOPIC_ID);
|
||||||
(orb_id_size_t) orb_id < (65535U / (2U * (uint16_t)ORB_MULTI_MAX_INSTANCES))
|
|
||||||
) {
|
|
||||||
uint16_t id = static_cast<orb_id_size_t>(orb_id) + (instance * ORB_TOPICS_COUNT);
|
|
||||||
uxrObjectId topic_id = uxr_object_id(id, UXR_TOPIC_ID);
|
|
||||||
return topic_id;
|
return topic_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -103,8 +99,8 @@ static bool create_data_reader(uxrSession *session, uxrStreamId reliable_out_str
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Use the second half of the available ID space.
|
// Use the second half of the available ID space.
|
||||||
// Add 1 so that we get a nice hex starting number: 0x8000 instead of 0x7fff.
|
// Add 1 so that we get a nice hex starting number: 0x800 instead of 0x7ff.
|
||||||
uint16_t id = index + (65535U / 2U) + 1;
|
uint16_t id = index + (65535U / 32U) + 1;
|
||||||
|
|
||||||
uxrObjectId topic_id = uxr_object_id(id, UXR_TOPIC_ID);
|
uxrObjectId topic_id = uxr_object_id(id, UXR_TOPIC_ID);
|
||||||
uint16_t topic_req = uxr_buffer_create_topic_bin(session, reliable_out_stream_id, topic_id, participant_id, topic_name,
|
uint16_t topic_req = uxr_buffer_create_topic_bin(session, reliable_out_stream_id, topic_id, participant_id, topic_name,
|
||||||
|
|||||||
Reference in New Issue
Block a user