uORB: add Subscription method to change instance

This commit is contained in:
Daniel Agar
2020-09-01 13:53:15 -04:00
parent 787f9c1213
commit 94f7b50970
3 changed files with 62 additions and 0 deletions
+25
View File
@@ -88,4 +88,29 @@ void Subscription::unsubscribe()
_last_generation = 0;
}
bool Subscription::ChangeInstance(uint8_t instance)
{
if (instance != _instance) {
DeviceMaster *device_master = uORB::Manager::get_instance()->get_device_master();
if (device_master != nullptr) {
if (!device_master->deviceNodeExists(_orb_id, _instance)) {
return false;
}
// if desired new instance exists, unsubscribe from current
unsubscribe();
_instance = instance;
subscribe();
return true;
}
} else {
// already on desired index
return true;
}
return false;
}
} // namespace uORB
+6
View File
@@ -127,6 +127,12 @@ public:
*/
bool copy(void *dst) { return advertised() && _node->copy(dst, _last_generation); }
/**
* Change subscription instance
* @param instance The new multi-Subscription instance
*/
bool ChangeInstance(uint8_t instance);
uint8_t get_instance() const { return _instance; }
unsigned get_last_generation() const { return _last_generation; }
orb_id_t get_topic() const { return get_orb_meta(_orb_id); }
+31
View File
@@ -98,6 +98,37 @@ public:
_registered = false;
}
/**
* Change subscription instance
* @param instance The new multi-Subscription instance
*/
bool ChangeInstance(uint8_t instance)
{
bool ret = false;
if (instance != get_instance()) {
const bool registered = _registered;
if (registered) {
unregisterCallback();
}
if (_subscription.ChangeInstance(instance)) {
ret = true;
}
if (registered) {
registerCallback();
}
} else {
// already on desired index
return true;
}
return ret;
}
virtual void call() = 0;
protected: