bool uORB::DeviceNode::appears_updated(SubscriberData *sd) { /* block if in simulation mode */ while (px4_sim_delay_enabled()) { usleep(100); } //warnx("uORB::DeviceNode::appears_updated sd = %p", sd); /* assume it doesn't look updated */ bool ret = false; /* check if this topic has been published yet, if not bail out */ if (_data == nullptr) { return false; } /* * If the subscriber's generation count matches the update generation * count, there has been no update from their perspective; if they * don't match then we might have a visible update. */ while (sd->generation != _generation) { /* * Handle non-rate-limited subscribers. */ if (sd->update_interval == 0) { ret = true; break; } /* * If we have previously told the subscriber that there is data, * and they have not yet collected it, continue to tell them * that there has been an update. This mimics the non-rate-limited * behaviour where checking / polling continues to report an update * until the topic is read. */ if (sd->update_reported) { ret = true; break; } // If we have not yet reached the deadline, then assume that we can ignore any // newly received data. if (sd->last_update + sd->update_interval > hrt_absolute_time()) { break; } /* * Remember that we have told the subscriber that there is data. */ sd->update_reported = true; sd->last_update = hrt_absolute_time(); ret = true; break; } return ret; }
bool uORB::DeviceNode::appears_updated(SubscriberData *sd) { /* block if in simulation mode */ while (px4_sim_delay_enabled()) { usleep(100); } //warnx("uORB::DeviceNode::appears_updated sd = %p", sd); /* assume it doesn't look updated */ bool ret = false; /* check if this topic has been published yet, if not bail out */ if (_data == nullptr) { ret = false; goto out; } /* * If the subscriber's generation count matches the update generation * count, there has been no update from their perspective; if they * don't match then we might have a visible update. */ while (sd->generation != _generation) { /* * Handle non-rate-limited subscribers. */ if (sd->update_interval == 0) { ret = true; break; } /* * If we have previously told the subscriber that there is data, * and they have not yet collected it, continue to tell them * that there has been an update. This mimics the non-rate-limited * behaviour where checking / polling continues to report an update * until the topic is read. */ if (sd->update_reported) { ret = true; break; } /* * If the interval timer is still running, the topic should not * appear updated, even though at this point we know that it has. * We have previously been through here, so the subscriber * must have collected the update we reported, otherwise * update_reported would still be true. */ if (!hrt_called(&sd->update_call)) { break; } /* * Make sure that we don't consider the topic to be updated again * until the interval has passed once more by restarting the interval * timer and thereby re-scheduling a poll notification at that time. */ hrt_call_after(&sd->update_call, sd->update_interval, &uORB::DeviceNode::update_deferred_trampoline, (void *)this); /* * Remember that we have told the subscriber that there is data. */ sd->update_reported = true; ret = true; break; } out: /* consider it updated */ return ret; }