Skip to content

Commit daa5110

Browse files
committed
Add Tests
1 parent 640cf32 commit daa5110

File tree

8 files changed

+218
-56
lines changed

8 files changed

+218
-56
lines changed

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,3 +88,7 @@ bower_components
8888
**/generated
8989
*/generated_tests
9090
/bin/
91+
92+
### NetworkTables
93+
networktables.ini
94+
networktables.ini.bak

core/src/main/java/edu/wpi/grip/core/operations/network/NetworkReceiver.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package edu.wpi.grip.core.operations.network;
22

3+
import java.util.function.Consumer;
4+
35
import static com.google.common.base.Preconditions.checkArgument;
46

57
/**
@@ -27,6 +29,13 @@ public NetworkReceiver(String path) {
2729
*/
2830
public abstract Object getValue();
2931

32+
/**
33+
* Add a listener to the NetworkReceiver item.
34+
*
35+
* @param consumer The consumer to call when this item has a update
36+
*/
37+
public abstract void addListener(Consumer<Object> consumer);
38+
3039
/**
3140
* Close the network reciever. This should not throw an exception.
3241
*/

core/src/main/java/edu/wpi/grip/core/operations/network/networktables/NTManager.java

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,15 @@
2121
import edu.wpi.first.wpilibj.tables.ITable;
2222

2323
import java.io.File;
24+
import java.util.LinkedList;
25+
import java.util.List;
2426
import java.util.Map;
2527
import java.util.Optional;
2628
import java.util.Set;
2729
import java.util.concurrent.atomic.AtomicInteger;
30+
import java.util.function.Consumer;
2831
import java.util.logging.Level;
2932
import java.util.logging.Logger;
30-
import javafx.beans.property.SimpleObjectProperty;
3133
import javax.inject.Inject;
3234

3335
import static com.google.common.base.Preconditions.checkNotNull;
@@ -47,7 +49,7 @@ public class NTManager implements Manager, MapNetworkPublisherFactory, MapNetwor
4749
* https://github.com/PeterJohnson/ntcore/blob/e6054f543a6ab10aa27af6cace855da66d67ee44
4850
* /include/ntcore_c.h#L39
4951
*/
50-
private static final Map<Integer, Level> ntLogLevels = ImmutableMap.<Integer, Level>builder()
52+
protected static final Map<Integer, Level> ntLogLevels = ImmutableMap.<Integer, Level>builder()
5153
.put(40, Level.SEVERE)
5254
.put(30, Level.WARNING)
5355
.put(20, Level.INFO)
@@ -136,34 +138,39 @@ public NetworkReceiver create(String path) {
136138
private static final class NTReceiver extends NetworkReceiver {
137139

138140
private int entryListenerFunctionUid;
139-
private final SimpleObjectProperty objectProperty = new SimpleObjectProperty();
141+
private Object object = false;
142+
private final List<Consumer<Object>> listeners = new LinkedList<>();
140143

141144
protected NTReceiver(String path) {
142145
super(path);
143-
NetworkTablesJNI.addConnectionListener((uid, connected, conn) -> {
144-
if (connected) {
145-
addListener();
146-
NetworkTablesJNI.removeConnectionListener(uid);
147-
}
148-
}, true);
146+
addListener();
147+
149148
synchronized (NetworkTable.class) {
150149
NetworkTable.initialize();
151150
}
152151
}
153152

154153
private void addListener() {
155154
entryListenerFunctionUid = NetworkTablesJNI.addEntryListener(path,
156-
(uid, key, value, flags) -> objectProperty.set(value),
155+
(uid, key, value, flags) -> {
156+
object = value;
157+
listeners.forEach(c -> c.accept(object));
158+
},
157159
ITable.NOTIFY_IMMEDIATE
158160
| ITable.NOTIFY_NEW
159161
| ITable.NOTIFY_UPDATE
160162
| ITable.NOTIFY_DELETE
161163
| ITable.NOTIFY_LOCAL);
162164
}
163165

166+
@Override
167+
public void addListener(Consumer<Object> consumer) {
168+
listeners.add(consumer);
169+
}
170+
164171
@Override
165172
public Object getValue() {
166-
return objectProperty.getValue();
173+
return object;
167174
}
168175

169176
@Override

core/src/main/java/edu/wpi/grip/core/sources/NetworkTableEntrySource.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package edu.wpi.grip.core.sources;
22

33
import edu.wpi.grip.core.Source;
4+
import edu.wpi.grip.core.events.SourceHasPendingUpdateEvent;
45
import edu.wpi.grip.core.events.SourceRemovedEvent;
56
import edu.wpi.grip.core.operations.network.MapNetworkReceiverFactory;
67
import edu.wpi.grip.core.operations.network.NetworkReceiver;
@@ -10,6 +11,7 @@
1011
import edu.wpi.grip.core.util.ExceptionWitness;
1112

1213
import com.google.common.collect.ImmutableList;
14+
import com.google.common.eventbus.EventBus;
1315
import com.google.common.eventbus.Subscribe;
1416
import com.google.inject.assistedinject.Assisted;
1517
import com.google.inject.assistedinject.AssistedInject;
@@ -51,11 +53,13 @@ public String toString() {
5153

5254
@AssistedInject
5355
NetworkTableEntrySource(
56+
EventBus eventBus,
5457
ExceptionWitness.Factory exceptionWitnessFactory,
5558
OutputSocket.Factory osf,
5659
@Named("ntManager") MapNetworkReceiverFactory networkReceiverFactory,
5760
@Assisted Properties properties) {
58-
this(exceptionWitnessFactory,
61+
this(eventBus,
62+
exceptionWitnessFactory,
5963
osf,
6064
networkReceiverFactory,
6165
properties.getProperty(PATH_PROPERTY),
@@ -64,6 +68,7 @@ public String toString() {
6468

6569
@AssistedInject
6670
NetworkTableEntrySource(
71+
EventBus eventBus,
6772
ExceptionWitness.Factory exceptionWitnessFactory,
6873
OutputSocket.Factory osf,
6974
@Named("ntManager") MapNetworkReceiverFactory networkReceiverFactory,
@@ -74,6 +79,8 @@ public String toString() {
7479
this.type = type;
7580
networkReceiver = networkReceiverFactory.create(path);
7681
output = osf.create(createOutputSocket(type));
82+
83+
networkReceiver.addListener(o -> eventBus.post(new SourceHasPendingUpdateEvent(this)));
7784
}
7885

7986
@Override

core/src/test/java/edu/wpi/grip/core/operations/network/MockGripNetworkModule.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package edu.wpi.grip.core.operations.network;
22

3+
import edu.wpi.grip.core.operations.network.networktables.TestingNTManager;
34
import edu.wpi.grip.core.operations.network.ros.MockROSManager;
45
import edu.wpi.grip.core.operations.network.ros.ROSNetworkPublisherFactory;
56

@@ -24,6 +25,6 @@ protected void configure() {
2425

2526
bind(MapNetworkReceiverFactory.class)
2627
.annotatedWith(Names.named("ntManager"))
27-
.to(MockNetworkReceiver.class);
28+
.to(TestingNTManager.class);
2829
}
2930
}

core/src/test/java/edu/wpi/grip/core/operations/network/MockNetworkReceiver.java

Lines changed: 0 additions & 28 deletions
This file was deleted.
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package edu.wpi.grip.core.operations.network.networktables;
2+
3+
import com.google.inject.Singleton;
4+
5+
import edu.wpi.first.wpilibj.networktables.NetworkTable;
6+
import edu.wpi.first.wpilibj.networktables.NetworkTablesJNI;
7+
8+
import java.io.File;
9+
import java.util.logging.Logger;
10+
11+
/**
12+
* This class encapsulates the way we map various settings to the global NetworkTables state.
13+
*/
14+
@Singleton
15+
public class TestingNTManager extends NTManager {
16+
17+
private static final Logger logger = Logger.getLogger(TestingNTManager.class.getName());
18+
19+
public TestingNTManager() {
20+
// We may have another instance of this method lying around
21+
NetworkTable.shutdown();
22+
23+
// Redirect NetworkTables log messages to our own log files. This gets rid of console spam,
24+
// and it also lets
25+
// us grep through NetworkTables messages just like any other messages.
26+
NetworkTablesJNI.setLogger((level, file, line, msg) -> {
27+
String filename = new File(file).getName();
28+
logger.log(ntLogLevels.get(level), String.format("NetworkTables: %s:%d %s", filename, line,
29+
msg));
30+
}, 0);
31+
32+
NetworkTable.setServerMode();
33+
NetworkTable.initialize();
34+
}
35+
36+
}

0 commit comments

Comments
 (0)