mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-26 01:51:41 +00:00
[ntcore] Add sub option for local vs remote changes (#4731)
This is the subscriber readQueue version of the local value listener flag.
This commit is contained in:
@@ -492,9 +492,12 @@ bool LSImpl::SetValue(TopicData* topic, const Value& value,
|
||||
|
||||
void LSImpl::NotifyValue(TopicData* topic, unsigned int eventFlags,
|
||||
bool isDuplicate) {
|
||||
bool isNetwork = (eventFlags & NT_EVENT_VALUE_REMOTE) != 0;
|
||||
for (auto&& subscriber : topic->localSubscribers) {
|
||||
if (subscriber->active &&
|
||||
(subscriber->config.keepDuplicates || !isDuplicate)) {
|
||||
(subscriber->config.keepDuplicates || !isDuplicate) &&
|
||||
((isNetwork && subscriber->config.fromRemote) ||
|
||||
(!isNetwork && subscriber->config.fromLocal))) {
|
||||
subscriber->pollStorage.emplace_back(topic->lastValue);
|
||||
subscriber->handle.Set();
|
||||
if (!subscriber->valueListeners.empty()) {
|
||||
|
||||
@@ -29,6 +29,25 @@ nt::PubSubOptions::PubSubOptions(std::span<const PubSubOption> options) {
|
||||
case NT_PUBSUB_POLLSTORAGE:
|
||||
pollStorageSize = static_cast<size_t>(option.value);
|
||||
break;
|
||||
case NT_PUBSUB_LOCALREMOTE:
|
||||
switch (static_cast<int>(option.value)) {
|
||||
case 0:
|
||||
case 3:
|
||||
fromLocal = true;
|
||||
fromRemote = true;
|
||||
break;
|
||||
case 1:
|
||||
fromLocal = true;
|
||||
fromRemote = false;
|
||||
break;
|
||||
case 2:
|
||||
fromLocal = false;
|
||||
fromRemote = true;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -22,6 +22,8 @@ class PubSubOptions {
|
||||
bool topicsOnly = false;
|
||||
bool prefixMatch = false;
|
||||
bool keepDuplicates = false;
|
||||
bool fromRemote = true;
|
||||
bool fromLocal = true;
|
||||
};
|
||||
|
||||
} // namespace nt
|
||||
|
||||
@@ -95,6 +95,7 @@ enum NT_PubSubOptionType {
|
||||
NT_PUBSUB_TOPICSONLY, /* only send topic changes, no value changes */
|
||||
NT_PUBSUB_POLLSTORAGE, /* polling storage for subscription */
|
||||
NT_PUBSUB_KEEPDUPLICATES, /* preserve duplicate values */
|
||||
NT_PUBSUB_LOCALREMOTE, /* local, remote, or any value changes */
|
||||
};
|
||||
|
||||
/** Event notification flags. */
|
||||
@@ -287,7 +288,8 @@ struct NT_PubSubOption {
|
||||
|
||||
/**
|
||||
* Option value. 1 (true) or 0 (false) for immediate and logging options,
|
||||
* time between updates, in seconds, for periodic option.
|
||||
* time between updates, in seconds, for periodic option. For local/remote
|
||||
* option, 1=local only, 2=remote only, 0 or 3=both local and remote.
|
||||
*/
|
||||
double value;
|
||||
};
|
||||
|
||||
@@ -314,7 +314,7 @@ class PubSubOption {
|
||||
|
||||
/**
|
||||
* Polling storage for subscription. Specifies the maximum number of updates
|
||||
* NetworkTables should store between calls to the subscriber's poll()
|
||||
* NetworkTables should store between calls to the subscriber's ReadQueue()
|
||||
* function. Defaults to 1 if SendAll is false, 20 if SendAll is true.
|
||||
*
|
||||
* @param depth number of entries to save for polling.
|
||||
@@ -324,6 +324,39 @@ class PubSubOption {
|
||||
return PubSubOption{NT_PUBSUB_POLLSTORAGE, static_cast<double>(depth)};
|
||||
}
|
||||
|
||||
/**
|
||||
* If only local value updates should be queued for ReadQueue(). See also
|
||||
* RemoteOnly() and AllUpdates(). Default is AllUpdates. Only has an effect on
|
||||
* subscriptions.
|
||||
*
|
||||
* @return option
|
||||
*/
|
||||
static constexpr PubSubOption LocalOnly() {
|
||||
return PubSubOption{NT_PUBSUB_LOCALREMOTE, 1.0};
|
||||
}
|
||||
|
||||
/**
|
||||
* If only remote value updates should be queued for ReadQueue(). See also
|
||||
* LocalOnly() and AllUpdates(). Default is AllUpdates. Only has an effect on
|
||||
* subscriptions.
|
||||
*
|
||||
* @return option
|
||||
*/
|
||||
static constexpr PubSubOption RemoteOnly() {
|
||||
return PubSubOption{NT_PUBSUB_LOCALREMOTE, 2.0};
|
||||
}
|
||||
|
||||
/**
|
||||
* If both local and remote value updates should be queued for ReadQueue().
|
||||
* See also LocalOnly() and RemoteOnly(). Default is AllUpdates. Only has an
|
||||
* effect on subscriptions.
|
||||
*
|
||||
* @return option
|
||||
*/
|
||||
static constexpr PubSubOption AllUpdates() {
|
||||
return PubSubOption{NT_PUBSUB_LOCALREMOTE, 0.0};
|
||||
}
|
||||
|
||||
NT_PubSubOptionType type;
|
||||
double value;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user