WPILibC++  unspecified
EntryNotifier.h
1 /*----------------------------------------------------------------------------*/
2 /* Copyright (c) FIRST 2015. All Rights Reserved. */
3 /* Open Source Software - may be modified and shared by FRC teams. The code */
4 /* must be accompanied by the FIRST BSD license file in the root directory of */
5 /* the project. */
6 /*----------------------------------------------------------------------------*/
7 
8 #ifndef NT_ENTRYNOTIFIER_H_
9 #define NT_ENTRYNOTIFIER_H_
10 
11 #include "ntcore_cpp.h"
12 
13 #include <atomic>
14 
15 #include "CallbackManager.h"
16 #include "Handle.h"
17 #include "IEntryNotifier.h"
18 
19 namespace wpi {
20 class Logger;
21 }
22 
23 namespace nt {
24 
25 namespace impl {
26 
28  : public ListenerData<std::function<void(const EntryNotification& event)>> {
29  EntryListenerData() = default;
31  std::function<void(const EntryNotification& event)> callback_,
32  StringRef prefix_, unsigned int flags_)
33  : ListenerData(callback_), prefix(prefix_), flags(flags_) {}
35  std::function<void(const EntryNotification& event)> callback_,
36  NT_Entry entry_, unsigned int flags_)
37  : ListenerData(callback_), entry(entry_), flags(flags_) {}
38  EntryListenerData(unsigned int poller_uid_, StringRef prefix_,
39  unsigned int flags_)
40  : ListenerData(poller_uid_), prefix(prefix_), flags(flags_) {}
41  EntryListenerData(unsigned int poller_uid_, NT_Entry entry_,
42  unsigned int flags_)
43  : ListenerData(poller_uid_), entry(entry_), flags(flags_) {}
44 
45  std::string prefix;
46  NT_Entry entry = 0;
47  unsigned int flags;
48 };
49 
51  : public CallbackThread<EntryNotifierThread, EntryNotification,
52  EntryListenerData> {
53  public:
54  EntryNotifierThread(int inst) : m_inst(inst) {}
55 
56  bool Matches(const EntryListenerData& listener,
57  const EntryNotification& data);
58 
59  void SetListener(EntryNotification* data, unsigned int listener_uid) {
60  data->listener =
61  Handle(m_inst, listener_uid, Handle::kEntryListener).handle();
62  }
63 
64  void DoCallback(std::function<void(const EntryNotification& event)> callback,
65  const EntryNotification& data) {
66  callback(data);
67  }
68 
69  int m_inst;
70 };
71 
72 } // namespace impl
73 
75  : public IEntryNotifier,
76  public CallbackManager<EntryNotifier, impl::EntryNotifierThread> {
77  friend class EntryNotifierTest;
78  friend class CallbackManager<EntryNotifier, impl::EntryNotifierThread>;
79 
80  public:
81  explicit EntryNotifier(int inst, wpi::Logger& logger);
82 
83  void Start();
84 
85  bool local_notifiers() const override;
86 
87  unsigned int Add(std::function<void(const EntryNotification& event)> callback,
88  llvm::StringRef prefix, unsigned int flags) override;
89  unsigned int Add(std::function<void(const EntryNotification& event)> callback,
90  unsigned int local_id, unsigned int flags) override;
91  unsigned int AddPolled(unsigned int poller_uid, llvm::StringRef prefix,
92  unsigned int flags) override;
93  unsigned int AddPolled(unsigned int poller_uid, unsigned int local_id,
94  unsigned int flags) override;
95 
96  void NotifyEntry(unsigned int local_id, StringRef name,
97  std::shared_ptr<Value> value, unsigned int flags,
98  unsigned int only_listener = UINT_MAX) override;
99 
100  private:
101  int m_inst;
102  wpi::Logger& m_logger;
103  std::atomic_bool m_local_notifiers;
104 };
105 
106 } // namespace nt
107 
108 #endif // NT_ENTRYNOTIFIER_H_
Definition: CallbackManager.h:52
NetworkTables Entry Notification.
Definition: ntcore_cpp.h:165
Definition: EntryNotifier.h:74
Definition: SocketError.cpp:18
Definition: Handle.h:20
Definition: IEntryNotifier.h:15
Definition: EntryNotifier.h:27
Definition: CallbackManager.h:166
Definition: Logger.h:30
NT_EntryListener listener
Listener that was triggered.
Definition: ntcore_cpp.h:178
Definition: CallbackManager.h:28
Definition: EntryNotifier.h:50
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:42
Definition: IEntryNotifier.h:17