From bdc822fad8ee73260cff8fc1fa8b8c84c20625b8 Mon Sep 17 00:00:00 2001 From: Thad House Date: Sat, 27 Apr 2019 20:35:23 -0700 Subject: [PATCH] Only generate passthrough URLs for RoboRIO (#1624) Otherwise accidentally, a race could occur between coprocessors and rio. Java was done in both old and new locations as it's a race. --- .../wpi/first/cameraserver/CameraServer.java | 26 +++++++++++-------- .../cameraserver/CameraServerShared.java | 9 +++++++ .../native/cpp/cameraserver/CameraServer.cpp | 3 +++ .../edu/wpi/first/wpilibj/CameraServer.java | 26 +++++++++++-------- .../java/edu/wpi/first/wpilibj/RobotBase.java | 5 ++++ 5 files changed, 47 insertions(+), 22 deletions(-) diff --git a/cameraserver/src/main/java/edu/wpi/first/cameraserver/CameraServer.java b/cameraserver/src/main/java/edu/wpi/first/cameraserver/CameraServer.java index fe54225b1c..705a51c801 100644 --- a/cameraserver/src/main/java/edu/wpi/first/cameraserver/CameraServer.java +++ b/cameraserver/src/main/java/edu/wpi/first/cameraserver/CameraServer.java @@ -142,17 +142,21 @@ public final class CameraServer { values[j] = "mjpg:" + values[j]; } - // Look to see if we have a passthrough server for this source - for (VideoSink i : m_sinks.values()) { - int sink = i.getHandle(); - int sinkSource = CameraServerJNI.getSinkSource(sink); - if (source == sinkSource - && VideoSink.getKindFromInt(CameraServerJNI.getSinkKind(sink)) == VideoSink.Kind.kMjpeg) { - // Add USB-only passthrough - String[] finalValues = Arrays.copyOf(values, values.length + 1); - int port = CameraServerJNI.getMjpegServerPort(sink); - finalValues[values.length] = makeStreamValue("172.22.11.2", port); - return finalValues; + if (CameraServerSharedStore.getCameraServerShared().isRoboRIO()) { + // Look to see if we have a passthrough server for this source + // Only do this on the roboRIO + for (VideoSink i : m_sinks.values()) { + int sink = i.getHandle(); + int sinkSource = CameraServerJNI.getSinkSource(sink); + if (source == sinkSource + && VideoSink.getKindFromInt(CameraServerJNI.getSinkKind(sink)) + == VideoSink.Kind.kMjpeg) { + // Add USB-only passthrough + String[] finalValues = Arrays.copyOf(values, values.length + 1); + int port = CameraServerJNI.getMjpegServerPort(sink); + finalValues[values.length] = makeStreamValue("172.22.11.2", port); + return finalValues; + } } } diff --git a/cameraserver/src/main/java/edu/wpi/first/cameraserver/CameraServerShared.java b/cameraserver/src/main/java/edu/wpi/first/cameraserver/CameraServerShared.java index 32a4d01ff2..db030a0dd0 100644 --- a/cameraserver/src/main/java/edu/wpi/first/cameraserver/CameraServerShared.java +++ b/cameraserver/src/main/java/edu/wpi/first/cameraserver/CameraServerShared.java @@ -43,4 +43,13 @@ public interface CameraServerShared { * @param id the usage id */ void reportAxisCamera(int id); + + /** + * Get if running on a roboRIO. + * + * @return true if on roboRIO + */ + default boolean isRoboRIO() { + return false; + } } diff --git a/cameraserver/src/main/native/cpp/cameraserver/CameraServer.cpp b/cameraserver/src/main/native/cpp/cameraserver/CameraServer.cpp index 8db4db36b3..00fa3530ae 100644 --- a/cameraserver/src/main/native/cpp/cameraserver/CameraServer.cpp +++ b/cameraserver/src/main/native/cpp/cameraserver/CameraServer.cpp @@ -132,7 +132,9 @@ std::vector CameraServer::Impl::GetSourceStreamValues( auto values = cs::GetHttpCameraUrls(source, &status); for (auto& value : values) value = "mjpg:" + value; +#ifdef __FRC_ROBORIO__ // Look to see if we have a passthrough server for this source + // Only do this on the roboRIO for (const auto& i : m_sinks) { CS_Sink sink = i.second.GetHandle(); CS_Source sinkSource = cs::GetSinkSource(sink, &status); @@ -144,6 +146,7 @@ std::vector CameraServer::Impl::GetSourceStreamValues( break; } } +#endif // Set table value return values; diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/CameraServer.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/CameraServer.java index a25ab2ee8a..405bf5050d 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/CameraServer.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/CameraServer.java @@ -146,17 +146,21 @@ public final class CameraServer { values[j] = "mjpg:" + values[j]; } - // Look to see if we have a passthrough server for this source - for (VideoSink i : m_sinks.values()) { - int sink = i.getHandle(); - int sinkSource = CameraServerJNI.getSinkSource(sink); - if (source == sinkSource - && VideoSink.getKindFromInt(CameraServerJNI.getSinkKind(sink)) == VideoSink.Kind.kMjpeg) { - // Add USB-only passthrough - String[] finalValues = Arrays.copyOf(values, values.length + 1); - int port = CameraServerJNI.getMjpegServerPort(sink); - finalValues[values.length] = makeStreamValue("172.22.11.2", port); - return finalValues; + if (CameraServerSharedStore.getCameraServerShared().isRoboRIO()) { + // Look to see if we have a passthrough server for this source + // Only do this on the roboRIO + for (VideoSink i : m_sinks.values()) { + int sink = i.getHandle(); + int sinkSource = CameraServerJNI.getSinkSource(sink); + if (source == sinkSource + && VideoSink.getKindFromInt(CameraServerJNI.getSinkKind(sink)) + == VideoSink.Kind.kMjpeg) { + // Add USB-only passthrough + String[] finalValues = Arrays.copyOf(values, values.length + 1); + int port = CameraServerJNI.getMjpegServerPort(sink); + finalValues[values.length] = makeStreamValue("172.22.11.2", port); + return finalValues; + } } } diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/RobotBase.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/RobotBase.java index 44c03a375b..e4a1f46158 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/RobotBase.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/RobotBase.java @@ -67,6 +67,11 @@ public abstract class RobotBase implements AutoCloseable { public Long getRobotMainThreadId() { return MAIN_THREAD_ID; } + + @Override + public boolean isRoboRIO() { + return RobotBase.isReal(); + } }; CameraServerSharedStore.setCameraServerShared(shared);