RobotCore 1.0
WPILib port to raspberry Pi
Loading...
Searching...
No Matches
NetworkTableInstance.java
1// Copyright (c) FIRST and other WPILib contributors.
2// Open Source Software; you can modify and/or share it under the terms of
3// the WPILib BSD license file in the root directory of this project.
4
5// THIS FILE WAS AUTO-GENERATED BY ./ntcore/generate_topics.py. DO NOT MODIFY
6
7package org.wpilib.networktables;
8
9import java.nio.charset.StandardCharsets;
10import java.util.Arrays;
11import java.util.EnumSet;
12import java.util.HashMap;
13import java.util.HashSet;
14import java.util.Map;
15import java.util.OptionalLong;
16import java.util.Set;
17import java.util.concurrent.ConcurrentHashMap;
18import java.util.concurrent.ConcurrentMap;
19import java.util.concurrent.TimeUnit;
20import java.util.concurrent.locks.Condition;
21import java.util.concurrent.locks.ReentrantLock;
22import java.util.function.Consumer;
23import org.wpilib.datalog.DataLog;
24import org.wpilib.util.WPIUtilJNI;
25import org.wpilib.util.concurrent.Event;
26import org.wpilib.util.protobuf.Protobuf;
27import org.wpilib.util.struct.Struct;
28import us.hebi.quickbuf.ProtoMessage;
29
47public final class NetworkTableInstance implements AutoCloseable {
49 public enum NetworkMode {
51 SERVER(0x01),
52
54 CLIENT(0x04),
55
57 STARTING(0x08),
58
60 LOCAL(0x10);
61
62 private final int value;
63
64 NetworkMode(int value) {
65 this.value = value;
66 }
67
73 public int getValue() {
74 return value;
75 }
76 }
77
79 public static final int DEFAULT_PORT = 5810;
80
86 private NetworkTableInstance(int handle) {
87 m_owned = false;
88 m_handle = handle;
89 }
90
92 @Override
93 public synchronized void close() {
94 if (m_owned && m_handle != 0) {
95 m_listeners.close();
96 m_schemas.forEach((k, v) -> v.close());
97 NetworkTablesJNI.destroyInstance(m_handle);
98 m_handle = 0;
99 }
100 }
101
107 public boolean isValid() {
108 return m_handle != 0;
109 }
110
111 /* The default instance. */
112 private static NetworkTableInstance s_defaultInstance;
113
119 public static synchronized NetworkTableInstance getDefault() {
120 if (s_defaultInstance == null) {
121 s_defaultInstance = new NetworkTableInstance(NetworkTablesJNI.getDefaultInstance());
122 }
123 return s_defaultInstance;
124 }
125
132 public static NetworkTableInstance create() {
133 NetworkTableInstance inst = new NetworkTableInstance(NetworkTablesJNI.createInstance());
134 inst.m_owned = true;
135 return inst;
136 }
137
144 public static NetworkTableInstance fromNativeHandle(int handle) {
145 return new NetworkTableInstance(handle);
146 }
147
153 public int getHandle() {
154 return m_handle;
155 }
156
163 public Topic getTopic(String name) {
164 Topic topic = m_topics.get(name);
165 if (topic == null) {
166 int handle = NetworkTablesJNI.getTopic(m_handle, name);
167 topic = new Topic(this, handle);
168 Topic oldTopic = m_topics.putIfAbsent(name, topic);
169 if (oldTopic != null) {
170 topic = oldTopic;
171 }
172 // also cache by handle
173 m_topicsByHandle.putIfAbsent(handle, topic);
174 }
175 return topic;
176 }
177
184 public BooleanTopic getBooleanTopic(String name) {
185 Topic topic = m_topics.get(name);
186 if (topic instanceof BooleanTopic t) {
187 return t;
188 }
189
190 int handle;
191 if (topic == null) {
192 handle = NetworkTablesJNI.getTopic(m_handle, name);
193 } else {
194 handle = topic.getHandle();
195 }
196
197 BooleanTopic wrapTopic = new BooleanTopic(this, handle);
198 m_topics.put(name, wrapTopic);
199
200 // also cache by handle
201 m_topicsByHandle.put(handle, wrapTopic);
202
203 return wrapTopic;
204 }
205
212 public IntegerTopic getIntegerTopic(String name) {
213 Topic topic = m_topics.get(name);
214 if (topic instanceof IntegerTopic t) {
215 return t;
216 }
217
218 int handle;
219 if (topic == null) {
220 handle = NetworkTablesJNI.getTopic(m_handle, name);
221 } else {
222 handle = topic.getHandle();
223 }
224
225 IntegerTopic wrapTopic = new IntegerTopic(this, handle);
226 m_topics.put(name, wrapTopic);
227
228 // also cache by handle
229 m_topicsByHandle.put(handle, wrapTopic);
230
231 return wrapTopic;
232 }
233
240 public FloatTopic getFloatTopic(String name) {
241 Topic topic = m_topics.get(name);
242 if (topic instanceof FloatTopic t) {
243 return t;
244 }
245
246 int handle;
247 if (topic == null) {
248 handle = NetworkTablesJNI.getTopic(m_handle, name);
249 } else {
250 handle = topic.getHandle();
251 }
252
253 FloatTopic wrapTopic = new FloatTopic(this, handle);
254 m_topics.put(name, wrapTopic);
255
256 // also cache by handle
257 m_topicsByHandle.put(handle, wrapTopic);
258
259 return wrapTopic;
260 }
261
268 public DoubleTopic getDoubleTopic(String name) {
269 Topic topic = m_topics.get(name);
270 if (topic instanceof DoubleTopic t) {
271 return t;
272 }
273
274 int handle;
275 if (topic == null) {
276 handle = NetworkTablesJNI.getTopic(m_handle, name);
277 } else {
278 handle = topic.getHandle();
279 }
280
281 DoubleTopic wrapTopic = new DoubleTopic(this, handle);
282 m_topics.put(name, wrapTopic);
283
284 // also cache by handle
285 m_topicsByHandle.put(handle, wrapTopic);
286
287 return wrapTopic;
288 }
289
296 public StringTopic getStringTopic(String name) {
297 Topic topic = m_topics.get(name);
298 if (topic instanceof StringTopic t) {
299 return t;
300 }
301
302 int handle;
303 if (topic == null) {
304 handle = NetworkTablesJNI.getTopic(m_handle, name);
305 } else {
306 handle = topic.getHandle();
307 }
308
309 StringTopic wrapTopic = new StringTopic(this, handle);
310 m_topics.put(name, wrapTopic);
311
312 // also cache by handle
313 m_topicsByHandle.put(handle, wrapTopic);
314
315 return wrapTopic;
316 }
317
324 public RawTopic getRawTopic(String name) {
325 Topic topic = m_topics.get(name);
326 if (topic instanceof RawTopic t) {
327 return t;
328 }
329
330 int handle;
331 if (topic == null) {
332 handle = NetworkTablesJNI.getTopic(m_handle, name);
333 } else {
334 handle = topic.getHandle();
335 }
336
337 RawTopic wrapTopic = new RawTopic(this, handle);
338 m_topics.put(name, wrapTopic);
339
340 // also cache by handle
341 m_topicsByHandle.put(handle, wrapTopic);
342
343 return wrapTopic;
344 }
345
353 Topic topic = m_topics.get(name);
354 if (topic instanceof BooleanArrayTopic t) {
355 return t;
356 }
357
358 int handle;
359 if (topic == null) {
360 handle = NetworkTablesJNI.getTopic(m_handle, name);
361 } else {
362 handle = topic.getHandle();
363 }
364
365 BooleanArrayTopic wrapTopic = new BooleanArrayTopic(this, handle);
366 m_topics.put(name, wrapTopic);
367
368 // also cache by handle
369 m_topicsByHandle.put(handle, wrapTopic);
370
371 return wrapTopic;
372 }
373
381 Topic topic = m_topics.get(name);
382 if (topic instanceof IntegerArrayTopic t) {
383 return t;
384 }
385
386 int handle;
387 if (topic == null) {
388 handle = NetworkTablesJNI.getTopic(m_handle, name);
389 } else {
390 handle = topic.getHandle();
391 }
392
393 IntegerArrayTopic wrapTopic = new IntegerArrayTopic(this, handle);
394 m_topics.put(name, wrapTopic);
395
396 // also cache by handle
397 m_topicsByHandle.put(handle, wrapTopic);
398
399 return wrapTopic;
400 }
401
409 Topic topic = m_topics.get(name);
410 if (topic instanceof FloatArrayTopic t) {
411 return t;
412 }
413
414 int handle;
415 if (topic == null) {
416 handle = NetworkTablesJNI.getTopic(m_handle, name);
417 } else {
418 handle = topic.getHandle();
419 }
420
421 FloatArrayTopic wrapTopic = new FloatArrayTopic(this, handle);
422 m_topics.put(name, wrapTopic);
423
424 // also cache by handle
425 m_topicsByHandle.put(handle, wrapTopic);
426
427 return wrapTopic;
428 }
429
437 Topic topic = m_topics.get(name);
438 if (topic instanceof DoubleArrayTopic t) {
439 return t;
440 }
441
442 int handle;
443 if (topic == null) {
444 handle = NetworkTablesJNI.getTopic(m_handle, name);
445 } else {
446 handle = topic.getHandle();
447 }
448
449 DoubleArrayTopic wrapTopic = new DoubleArrayTopic(this, handle);
450 m_topics.put(name, wrapTopic);
451
452 // also cache by handle
453 m_topicsByHandle.put(handle, wrapTopic);
454
455 return wrapTopic;
456 }
457
465 Topic topic = m_topics.get(name);
466 if (topic instanceof StringArrayTopic t) {
467 return t;
468 }
469
470 int handle;
471 if (topic == null) {
472 handle = NetworkTablesJNI.getTopic(m_handle, name);
473 } else {
474 handle = topic.getHandle();
475 }
476
477 StringArrayTopic wrapTopic = new StringArrayTopic(this, handle);
478 m_topics.put(name, wrapTopic);
479
480 // also cache by handle
481 m_topicsByHandle.put(handle, wrapTopic);
482
483 return wrapTopic;
484 }
485
486
496 public <T, MessageType extends ProtoMessage<?>>
497 ProtobufTopic<T> getProtobufTopic(String name, Protobuf<T, MessageType> proto) {
498 Topic topic = m_topics.get(name);
499 if (topic instanceof ProtobufTopic<?> t && t.getProto().equals(proto)) {
500 @SuppressWarnings("unchecked")
501 ProtobufTopic<T> wrapTopic = (ProtobufTopic<T>) topic;
502 return wrapTopic;
503 }
504
505 int handle;
506 if (topic == null) {
507 handle = NetworkTablesJNI.getTopic(m_handle, name);
508 } else {
509 handle = topic.getHandle();
510 }
511
512 ProtobufTopic<T> wrapTopic = ProtobufTopic.wrap(this, handle, proto);
513 m_topics.put(name, wrapTopic);
514
515 // also cache by handle
516 m_topicsByHandle.put(handle, wrapTopic);
517
518 return wrapTopic;
519 }
520
529 public <T>
530 StructTopic<T> getStructTopic(String name, Struct<T> struct) {
531 Topic topic = m_topics.get(name);
532 if (topic instanceof StructTopic<?> t && t.getStruct().equals(struct)) {
533 @SuppressWarnings("unchecked")
534 StructTopic<T> wrapTopic = (StructTopic<T>) topic;
535 return wrapTopic;
536 }
537
538 int handle;
539 if (topic == null) {
540 handle = NetworkTablesJNI.getTopic(m_handle, name);
541 } else {
542 handle = topic.getHandle();
543 }
544
545 StructTopic<T> wrapTopic = StructTopic.wrap(this, handle, struct);
546 m_topics.put(name, wrapTopic);
547
548 // also cache by handle
549 m_topicsByHandle.put(handle, wrapTopic);
550
551 return wrapTopic;
552 }
553
562 public <T>
563 StructArrayTopic<T> getStructArrayTopic(String name, Struct<T> struct) {
564 Topic topic = m_topics.get(name);
565 if (topic instanceof StructArrayTopic<?> t && t.getStruct().equals(struct)) {
566 @SuppressWarnings("unchecked")
567 StructArrayTopic<T> wrapTopic = (StructArrayTopic<T>) topic;
568 return wrapTopic;
569 }
570
571 int handle;
572 if (topic == null) {
573 handle = NetworkTablesJNI.getTopic(m_handle, name);
574 } else {
575 handle = topic.getHandle();
576 }
577
578 StructArrayTopic<T> wrapTopic = StructArrayTopic.wrap(this, handle, struct);
579 m_topics.put(name, wrapTopic);
580
581 // also cache by handle
582 m_topicsByHandle.put(handle, wrapTopic);
583
584 return wrapTopic;
585 }
586
587 private Topic[] topicHandlesToTopics(int[] handles) {
588 Topic[] topics = new Topic[handles.length];
589 for (int i = 0; i < handles.length; i++) {
590 topics[i] = getCachedTopic(handles[i]);
591 }
592 return topics;
593 }
594
600 public Topic[] getTopics() {
601 return topicHandlesToTopics(NetworkTablesJNI.getTopics(m_handle, "", 0));
602 }
603
612 public Topic[] getTopics(String prefix) {
613 return topicHandlesToTopics(NetworkTablesJNI.getTopics(m_handle, prefix, 0));
614 }
615
625 public Topic[] getTopics(String prefix, int types) {
626 return topicHandlesToTopics(NetworkTablesJNI.getTopics(m_handle, prefix, types));
627 }
628
638 public Topic[] getTopics(String prefix, String[] types) {
639 return topicHandlesToTopics(NetworkTablesJNI.getTopicsStr(m_handle, prefix, types));
640 }
641
648 return NetworkTablesJNI.getTopicInfos(this, m_handle, "", 0);
649 }
650
659 public TopicInfo[] getTopicInfo(String prefix) {
660 return NetworkTablesJNI.getTopicInfos(this, m_handle, prefix, 0);
661 }
662
672 public TopicInfo[] getTopicInfo(String prefix, int types) {
673 return NetworkTablesJNI.getTopicInfos(this, m_handle, prefix, types);
674 }
675
685 public TopicInfo[] getTopicInfo(String prefix, String[] types) {
686 return NetworkTablesJNI.getTopicInfosStr(this, m_handle, prefix, types);
687 }
688
689 /* Cache of created entries. */
690 private final ConcurrentMap<String, NetworkTableEntry> m_entries = new ConcurrentHashMap<>();
691
698 public NetworkTableEntry getEntry(String name) {
699 NetworkTableEntry entry = m_entries.get(name);
700 if (entry == null) {
701 entry = new NetworkTableEntry(this, NetworkTablesJNI.getEntry(m_handle, name));
702 NetworkTableEntry oldEntry = m_entries.putIfAbsent(name, entry);
703 if (oldEntry != null) {
704 entry = oldEntry;
705 }
706 }
707 return entry;
708 }
709
710 /* Cache of created topics. */
711 private final ConcurrentMap<String, Topic> m_topics = new ConcurrentHashMap<>();
712 private final ConcurrentMap<Integer, Topic> m_topicsByHandle = new ConcurrentHashMap<>();
713
714 Topic getCachedTopic(String name) {
715 Topic topic = m_topics.get(name);
716 if (topic == null) {
717 int handle = NetworkTablesJNI.getTopic(m_handle, name);
718 topic = new Topic(this, handle);
719 Topic oldTopic = m_topics.putIfAbsent(name, topic);
720 if (oldTopic != null) {
721 topic = oldTopic;
722 }
723 // also cache by handle
724 m_topicsByHandle.putIfAbsent(handle, topic);
725 }
726 return topic;
727 }
728
729 Topic getCachedTopic(int handle) {
730 Topic topic = m_topicsByHandle.get(handle);
731 if (topic == null) {
732 topic = new Topic(this, handle);
733 Topic oldTopic = m_topicsByHandle.putIfAbsent(handle, topic);
734 if (oldTopic != null) {
735 topic = oldTopic;
736 }
737 }
738 return topic;
739 }
740
741 /* Cache of created tables. */
742 private final ConcurrentMap<String, NetworkTable> m_tables = new ConcurrentHashMap<>();
743
750 public NetworkTable getTable(String key) {
751 // prepend leading / if not present
752 String theKey;
753 if (key.isEmpty() || "/".equals(key)) {
754 theKey = "";
755 } else if (key.charAt(0) == NetworkTable.PATH_SEPARATOR) {
756 theKey = key;
757 } else {
758 theKey = NetworkTable.PATH_SEPARATOR + key;
759 }
760
761 // cache created tables
762 NetworkTable table = m_tables.get(theKey);
763 if (table == null) {
764 table = new NetworkTable(this, theKey);
765 NetworkTable oldTable = m_tables.putIfAbsent(theKey, table);
766 if (oldTable != null) {
767 table = oldTable;
768 }
769 }
770 return table;
771 }
772
773 /*
774 * Callback Creation Functions
775 */
776
777 private static class ListenerStorage implements AutoCloseable {
778 private final ReentrantLock m_lock = new ReentrantLock();
779 private final Map<Integer, Consumer<NetworkTableEvent>> m_listeners = new HashMap<>();
780
781 @SuppressWarnings("PMD.SingularField")
782 private Thread m_thread;
783
784 private int m_poller;
785 private boolean m_waitQueue;
786 private final Event m_waitQueueEvent = new Event();
787 private final Condition m_waitQueueCond = m_lock.newCondition();
788 private final NetworkTableInstance m_inst;
789
790 ListenerStorage(NetworkTableInstance inst) {
791 m_inst = inst;
792 }
793
794 int add(
795 String[] prefixes,
796 EnumSet<NetworkTableEvent.Kind> eventKinds,
797 Consumer<NetworkTableEvent> listener) {
798 m_lock.lock();
799 try {
800 if (m_poller == 0) {
801 m_poller = NetworkTablesJNI.createListenerPoller(m_inst.getHandle());
802 startThread();
803 }
804 int h = NetworkTablesJNI.addListener(m_poller, prefixes, eventKinds);
805 m_listeners.put(h, listener);
806 return h;
807 } finally {
808 m_lock.unlock();
809 }
810 }
811
812 int add(
813 int handle,
814 EnumSet<NetworkTableEvent.Kind> eventKinds,
815 Consumer<NetworkTableEvent> listener) {
816 m_lock.lock();
817 try {
818 if (m_poller == 0) {
819 m_poller = NetworkTablesJNI.createListenerPoller(m_inst.getHandle());
820 startThread();
821 }
822 int h = NetworkTablesJNI.addListener(m_poller, handle, eventKinds);
823 m_listeners.put(h, listener);
824 return h;
825 } finally {
826 m_lock.unlock();
827 }
828 }
829
830 int addLogger(int minLevel, int maxLevel, Consumer<NetworkTableEvent> listener) {
831 m_lock.lock();
832 try {
833 if (m_poller == 0) {
834 m_poller = NetworkTablesJNI.createListenerPoller(m_inst.getHandle());
835 startThread();
836 }
837 int h = NetworkTablesJNI.addLogger(m_poller, minLevel, maxLevel);
838 m_listeners.put(h, listener);
839 return h;
840 } finally {
841 m_lock.unlock();
842 }
843 }
844
845 void remove(int listener) {
846 m_lock.lock();
847 try {
848 m_listeners.remove(listener);
849 } finally {
850 m_lock.unlock();
851 }
852 NetworkTablesJNI.removeListener(listener);
853 }
854
855 @Override
856 public void close() {
857 if (m_poller != 0) {
858 NetworkTablesJNI.destroyListenerPoller(m_poller);
859 }
860 m_poller = 0;
861 }
862
863 @SuppressWarnings("PMD.AvoidCatchingGenericException")
864 private void startThread() {
865 m_thread =
866 new Thread(
867 () -> {
868 boolean wasInterrupted = false;
869 int[] handles = new int[] { m_poller, m_waitQueueEvent.getHandle() };
870 while (!Thread.interrupted()) {
871 try {
872 WPIUtilJNI.waitForObjects(handles);
873 } catch (InterruptedException ex) {
874 m_lock.lock();
875 try {
876 if (m_waitQueue) {
877 m_waitQueue = false;
878 m_waitQueueCond.signalAll();
879 }
880 } finally {
881 m_lock.unlock();
882 }
883 Thread.currentThread().interrupt();
884 // don't try to destroy poller, as its handle is likely no longer valid
885 wasInterrupted = true;
886 break;
887 }
888 for (NetworkTableEvent event :
889 NetworkTablesJNI.readListenerQueue(m_inst, m_poller)) {
890 Consumer<NetworkTableEvent> listener;
891 m_lock.lock();
892 try {
893 listener = m_listeners.get(event.listener);
894 } finally {
895 m_lock.unlock();
896 }
897 if (listener != null) {
898 try {
899 listener.accept(event);
900 } catch (Throwable throwable) {
901 System.err.println(
902 "Unhandled exception during listener callback: "
903 + throwable.toString());
904 throwable.printStackTrace();
905 }
906 }
907 }
908 m_lock.lock();
909 try {
910 if (m_waitQueue) {
911 m_waitQueue = false;
912 m_waitQueueCond.signalAll();
913 }
914 } finally {
915 m_lock.unlock();
916 }
917 }
918 m_lock.lock();
919 try {
920 if (!wasInterrupted) {
921 NetworkTablesJNI.destroyListenerPoller(m_poller);
922 }
923 m_poller = 0;
924 } finally {
925 m_lock.unlock();
926 }
927 },
928 "NTListener");
929 m_thread.setDaemon(true);
930 m_thread.start();
931 }
932
933 boolean waitForQueue(double timeout) {
934 m_lock.lock();
935 try {
936 if (m_poller != 0) {
937 m_waitQueue = true;
938 m_waitQueueEvent.set();
939 while (m_waitQueue) {
940 try {
941 if (timeout < 0) {
942 m_waitQueueCond.await();
943 } else {
944 return m_waitQueueCond.await((long) (timeout * 1e9), TimeUnit.NANOSECONDS);
945 }
946 } catch (InterruptedException ex) {
947 Thread.currentThread().interrupt();
948 return true;
949 }
950 }
951 }
952 } finally {
953 m_lock.unlock();
954 }
955 return true;
956 }
957 }
958
959 private final ListenerStorage m_listeners = new ListenerStorage(this);
960
966 public void removeListener(int listener) {
967 m_listeners.remove(listener);
968 }
969
979 public boolean waitForListenerQueue(double timeout) {
980 return m_listeners.waitForQueue(timeout);
981 }
982
993 boolean immediateNotify, Consumer<NetworkTableEvent> listener) {
994 EnumSet<NetworkTableEvent.Kind> eventKinds = EnumSet.of(NetworkTableEvent.Kind.CONNECTION);
995 if (immediateNotify) {
996 eventKinds.add(NetworkTableEvent.Kind.IMMEDIATE);
997 }
998 return m_listeners.add(m_handle, eventKinds, listener);
999 }
1000
1011 boolean immediateNotify, Consumer<NetworkTableEvent> listener) {
1012 EnumSet<NetworkTableEvent.Kind> eventKinds = EnumSet.of(NetworkTableEvent.Kind.TIME_SYNC);
1013 if (immediateNotify) {
1014 eventKinds.add(NetworkTableEvent.Kind.IMMEDIATE);
1015 }
1016 return m_listeners.add(m_handle, eventKinds, listener);
1017 }
1018
1032 public int addListener(
1033 Topic topic,
1034 EnumSet<NetworkTableEvent.Kind> eventKinds,
1035 Consumer<NetworkTableEvent> listener) {
1036 if (topic.getInstance().getHandle() != m_handle) {
1037 throw new IllegalArgumentException("topic is not from this instance");
1038 }
1039 return m_listeners.add(topic.getHandle(), eventKinds, listener);
1040 }
1041
1053 public int addListener(
1054 Subscriber subscriber,
1055 EnumSet<NetworkTableEvent.Kind> eventKinds,
1056 Consumer<NetworkTableEvent> listener) {
1057 if (subscriber.getTopic().getInstance().getHandle() != m_handle) {
1058 throw new IllegalArgumentException("subscriber is not from this instance");
1059 }
1060 return m_listeners.add(subscriber.getHandle(), eventKinds, listener);
1061 }
1062
1074 public int addListener(
1075 MultiSubscriber subscriber,
1076 EnumSet<NetworkTableEvent.Kind> eventKinds,
1077 Consumer<NetworkTableEvent> listener) {
1078 if (subscriber.getInstance().getHandle() != m_handle) {
1079 throw new IllegalArgumentException("subscriber is not from this instance");
1080 }
1081 return m_listeners.add(subscriber.getHandle(), eventKinds, listener);
1082 }
1083
1094 public int addListener(
1095 NetworkTableEntry entry,
1096 EnumSet<NetworkTableEvent.Kind> eventKinds,
1097 Consumer<NetworkTableEvent> listener) {
1098 if (entry.getTopic().getInstance().getHandle() != m_handle) {
1099 throw new IllegalArgumentException("entry is not from this instance");
1100 }
1101 return m_listeners.add(entry.getHandle(), eventKinds, listener);
1102 }
1103
1118 public int addListener(
1119 String[] prefixes,
1120 EnumSet<NetworkTableEvent.Kind> eventKinds,
1121 Consumer<NetworkTableEvent> listener) {
1122 return m_listeners.add(prefixes, eventKinds, listener);
1123 }
1124
1125 /*
1126 * Client/Server Functions
1127 */
1128
1134 public EnumSet<NetworkMode> getNetworkMode() {
1135 int flags = NetworkTablesJNI.getNetworkMode(m_handle);
1136 EnumSet<NetworkMode> rv = EnumSet.noneOf(NetworkMode.class);
1137 for (NetworkMode mode : NetworkMode.values()) {
1138 if ((flags & mode.getValue()) != 0) {
1139 rv.add(mode);
1140 }
1141 }
1142 return rv;
1143 }
1144
1149 public void startLocal() {
1150 NetworkTablesJNI.startLocal(m_handle);
1151 }
1152
1157 public void stopLocal() {
1158 NetworkTablesJNI.stopLocal(m_handle);
1159 }
1160
1165 public void startServer() {
1166 startServer("networktables.json");
1167 }
1168
1175 public void startServer(String persistFilename) {
1176 startServer(persistFilename, "", "");
1177 }
1178
1185 public void startServer(String persistFilename, String listenAddress) {
1186 startServer(persistFilename, listenAddress, "");
1187 }
1188
1197 public void startServer(String persistFilename, String listenAddress, String mdnsService) {
1198 startServer(persistFilename, listenAddress, mdnsService, DEFAULT_PORT);
1199 }
1200
1209 public void startServer(String persistFilename, String listenAddress, String mdnsService,
1210 int port) {
1211 NetworkTablesJNI.startServer(m_handle, persistFilename, listenAddress, mdnsService, port);
1212 }
1213
1215 public void stopServer() {
1216 NetworkTablesJNI.stopServer(m_handle);
1217 }
1218
1225 public void startClient(String identity) {
1226 NetworkTablesJNI.startClient(m_handle, identity);
1227 }
1228
1230 public void stopClient() {
1231 NetworkTablesJNI.stopClient(m_handle);
1232 }
1233
1240 public void setServer(String serverName) {
1241 setServer(serverName, 0);
1242 }
1243
1250 public void setServer(String serverName, int port) {
1251 NetworkTablesJNI.setServer(m_handle, serverName, port);
1252 }
1253
1260 public void setServer(String[] serverNames) {
1261 setServer(serverNames, 0);
1262 }
1263
1271 public void setServer(String[] serverNames, int port) {
1272 int[] ports = new int[serverNames.length];
1273 Arrays.fill(ports, port);
1274 setServer(serverNames, ports);
1275 }
1276
1284 public void setServer(String[] serverNames, int[] ports) {
1285 NetworkTablesJNI.setServer(m_handle, serverNames, ports);
1286 }
1287
1295 public void setServerMdns(String serviceName) {
1296 NetworkTablesJNI.setServerMdns(m_handle, serviceName);
1297 }
1298
1308 public void setServerMdns(String serviceName, String serverName) {
1309 setServerMdns(serviceName, serverName, 0);
1310 }
1311
1321 public void setServerMdns(String serviceName, String serverName, int port) {
1322 NetworkTablesJNI.setServerMdns(m_handle, serviceName, serverName, port);
1323 }
1324
1334 public void setServerMdns(String serviceName, String[] serverNames) {
1335 setServerMdns(serviceName, serverNames, 0);
1336 }
1337
1347 public void setServerMdns(String serviceName, String[] serverNames, int port) {
1348 int[] ports = new int[serverNames.length];
1349 Arrays.fill(ports, port);
1350 setServerMdns(serviceName, port, serverNames, ports);
1351 }
1352
1363 public void setServerMdns(String serviceName, String[] serverNames, int[] ports) {
1364 setServerMdns(serviceName, 0, serverNames, ports);
1365 }
1366
1377 public void setServerMdns(
1378 String serviceName, int mdnsPort, String[] serverNames, int[] ports) {
1379 NetworkTablesJNI.setServerMdns(
1380 m_handle, serviceName, mdnsPort, serverNames, ports);
1381 }
1382
1401 public void setServerTeam(String team) {
1402 setServerTeam(team, 0);
1403 }
1404
1423 public void setServerTeam(String team, int port) {
1424 NetworkTablesJNI.setServerTeam(m_handle, team, port);
1425 }
1426
1446 public void setServerFixed(String team) {
1447 setServerFixed(team, 0);
1448 }
1449
1469 public void setServerFixed(String team, int port) {
1470 NetworkTablesJNI.setServerFixed(m_handle, team, port);
1471 }
1472
1477 public void disconnect() {
1478 NetworkTablesJNI.disconnect(m_handle);
1479 }
1480
1485 public void startDSClient() {
1486 startDSClient(0);
1487 }
1488
1495 public void startDSClient(int port) {
1496 NetworkTablesJNI.startDSClient(m_handle, port);
1497 }
1498
1500 public void stopDSClient() {
1501 NetworkTablesJNI.stopDSClient(m_handle);
1502 }
1503
1508 public void flushLocal() {
1509 NetworkTablesJNI.flushLocal(m_handle);
1510 }
1511
1517 public void flush() {
1518 NetworkTablesJNI.flush(m_handle);
1519 }
1520
1528 return NetworkTablesJNI.getConnections(m_handle);
1529 }
1530
1536 public boolean isConnected() {
1537 return NetworkTablesJNI.isConnected(m_handle);
1538 }
1539
1549 public OptionalLong getServerTimeOffset() {
1550 return NetworkTablesJNI.getServerTimeOffset(m_handle);
1551 }
1552
1563 public int startEntryDataLog(DataLog log, String prefix, String logPrefix) {
1564 return NetworkTablesJNI.startEntryDataLog(m_handle, log, prefix, logPrefix);
1565 }
1566
1572 public static void stopEntryDataLog(int logger) {
1573 NetworkTablesJNI.stopEntryDataLog(logger);
1574 }
1575
1584 public int startConnectionDataLog(DataLog log, String name) {
1585 return NetworkTablesJNI.startConnectionDataLog(m_handle, log, name);
1586 }
1587
1593 public static void stopConnectionDataLog(int logger) {
1594 NetworkTablesJNI.stopConnectionDataLog(logger);
1595 }
1596
1608 public int addLogger(int minLevel, int maxLevel, Consumer<NetworkTableEvent> func) {
1609 return m_listeners.addLogger(minLevel, maxLevel, func);
1610 }
1611
1620 public boolean hasSchema(String name) {
1621 return m_schemas.containsKey("/.schema/" + name);
1622 }
1623
1635 public void addSchema(String name, String type, byte[] schema) {
1636 m_schemas.computeIfAbsent("/.schema/" + name, k -> {
1637 RawPublisher pub = getRawTopic(k).publishEx(type, "{\"retained\":true}");
1638 pub.setDefault(schema);
1639 return pub;
1640 });
1641 }
1642
1654 public void addSchema(String name, String type, String schema) {
1655 m_schemas.computeIfAbsent("/.schema/" + name, k -> {
1656 RawPublisher pub = getRawTopic(k).publishEx(type, "{\"retained\":true}");
1657 pub.setDefault(StandardCharsets.UTF_8.encode(schema));
1658 return pub;
1659 });
1660 }
1661
1668 public void addSchema(Protobuf<?, ?> proto) {
1669 proto.forEachDescriptor(
1670 this::hasSchema,
1671 (typeString, schema) -> addSchema(typeString, "proto:FileDescriptorProto", schema));
1672 }
1673
1680 public void addSchema(Struct<?> struct) {
1681 addSchemaImpl(struct, new HashSet<>());
1682 }
1683
1684 @Override
1685 public boolean equals(Object other) {
1686 return other == this || other instanceof NetworkTableInstance inst && m_handle == inst.m_handle;
1687 }
1688
1689 @Override
1690 public int hashCode() {
1691 return m_handle;
1692 }
1693
1694 private void addSchemaImpl(Struct<?> struct, Set<String> seen) {
1695 String typeString = struct.getTypeString();
1696 if (hasSchema(typeString)) {
1697 return;
1698 }
1699 if (!seen.add(typeString)) {
1700 throw new UnsupportedOperationException(typeString + ": circular reference with " + seen);
1701 }
1702 addSchema(typeString, "structschema", struct.getSchema());
1703 for (Struct<?> inner : struct.getNested()) {
1704 addSchemaImpl(inner, seen);
1705 }
1706 seen.remove(typeString);
1707 }
1708
1709 private boolean m_owned;
1710 private int m_handle;
1711 private final ConcurrentMap<String, RawPublisher> m_schemas = new ConcurrentHashMap<>();
1712}
int getHandle()
NetworkTableEntry(NetworkTableInstance inst, int handle)
Topic getTopic()
int addConnectionListener(boolean immediateNotify, Consumer< NetworkTableEvent > listener)
void setServerMdns(String serviceName, String serverName, int port)
void setServer(String[] serverNames, int[] ports)
void setServerMdns(String serviceName, String[] serverNames)
int addListener(Subscriber subscriber, EnumSet< NetworkTableEvent.Kind > eventKinds, Consumer< NetworkTableEvent > listener)
void startServer(String persistFilename, String listenAddress, String mdnsService, int port)
int addListener(String[] prefixes, EnumSet< NetworkTableEvent.Kind > eventKinds, Consumer< NetworkTableEvent > listener)
void setServerMdns(String serviceName, String[] serverNames, int port)
void addSchema(String name, String type, String schema)
int addListener(Topic topic, EnumSet< NetworkTableEvent.Kind > eventKinds, Consumer< NetworkTableEvent > listener)
int startEntryDataLog(DataLog log, String prefix, String logPrefix)
int addTimeSyncListener(boolean immediateNotify, Consumer< NetworkTableEvent > listener)
static synchronized NetworkTableInstance getDefault()
void startServer(String persistFilename, String listenAddress)
void addSchema(String name, String type, byte[] schema)
Topic[] getTopics(String prefix, String[] types)
void startServer(String persistFilename, String listenAddress, String mdnsService)
void setServerMdns(String serviceName, int mdnsPort, String[] serverNames, int[] ports)
TopicInfo[] getTopicInfo(String prefix, String[] types)
TopicInfo[] getTopicInfo(String prefix, int types)
void setServerMdns(String serviceName, String serverName)
int addListener(MultiSubscriber subscriber, EnumSet< NetworkTableEvent.Kind > eventKinds, Consumer< NetworkTableEvent > listener)
static NetworkTableInstance fromNativeHandle(int handle)
void setServer(String[] serverNames, int port)
int addLogger(int minLevel, int maxLevel, Consumer< NetworkTableEvent > func)
void setServerMdns(String serviceName, String[] serverNames, int[] ports)
int addListener(NetworkTableEntry entry, EnumSet< NetworkTableEvent.Kind > eventKinds, Consumer< NetworkTableEvent > listener)
RawPublisher publishEx(String typeString, String properties, PubSubOption... options)
NetworkTableInstance getInstance()
Definition Topic.java:43
default void setDefault(byte[] value)
default void forEachDescriptor(Predicate< String > exists, BiConsumer< String, byte[]> fn)