From 1733599f590291d2d9ec1fe4ada3bf18a0d812ca Mon Sep 17 00:00:00 2001 From: Matt Date: Fri, 1 Nov 2024 22:19:35 -0700 Subject: [PATCH] Start tsp server in C++ photonlib --- .../main/native/cpp/photon/PhotonCamera.cpp | 14 +++++ .../src/test/native/cpp/PhotonCameraTest.cpp | 54 +++++++++++++++++++ photon-lib/src/test/native/cpp/main.cpp | 4 ++ photon-targeting/src/test/native/cpp/main.cpp | 7 ++- .../src/test/native/cpp/net/TimeSyncTest.cpp | 2 - .../poseest/src/test/cpp/main.cpp | 1 + 6 files changed, 79 insertions(+), 3 deletions(-) create mode 100644 photon-lib/src/test/native/cpp/PhotonCameraTest.cpp diff --git a/photon-lib/src/main/native/cpp/photon/PhotonCamera.cpp b/photon-lib/src/main/native/cpp/photon/PhotonCamera.cpp index 91a1d95149..e4c7916647 100644 --- a/photon-lib/src/main/native/cpp/photon/PhotonCamera.cpp +++ b/photon-lib/src/main/native/cpp/photon/PhotonCamera.cpp @@ -25,6 +25,7 @@ #include "photon/PhotonCamera.h" #include +#include #include #include @@ -59,6 +60,11 @@ inline constexpr std::string_view bfw = ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n" "\n\n"; +// bit of a hack -- start a TimeSync server on port 5810 (hard-coded) +static std::mutex g_timeSyncServerMutex; +static bool g_timeSyncServerStarted; +static wpi::tsp::TimeSyncServer timesyncServer{5810}; + namespace photon { constexpr const units::second_t VERSION_CHECK_INTERVAL = 5_s; @@ -110,6 +116,14 @@ PhotonCamera::PhotonCamera(nt::NetworkTableInstance instance, cameraName(cameraName) { HAL_Report(HALUsageReporting::kResourceType_PhotonCamera, InstanceCount); InstanceCount++; + + { + std::lock_guard lock{g_timeSyncServerMutex}; + if (!g_timeSyncServerStarted) { + timesyncServer.Start(); + g_timeSyncServerStarted = true; + } + } } PhotonCamera::PhotonCamera(const std::string_view cameraName) diff --git a/photon-lib/src/test/native/cpp/PhotonCameraTest.cpp b/photon-lib/src/test/native/cpp/PhotonCameraTest.cpp new file mode 100644 index 0000000000..d795b653d0 --- /dev/null +++ b/photon-lib/src/test/native/cpp/PhotonCameraTest.cpp @@ -0,0 +1,54 @@ +/* + * MIT License + * + * Copyright (c) PhotonVision + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include +#include +#include +#include + +#include "photon/PhotonCamera.h" + +TEST(TimeSyncProtocolTest, Smoketest) { + using namespace wpi::tsp; + using namespace std::chrono_literals; + + // start a server implicitly + photon::PhotonCamera camera{"camera"}; + + TimeSyncClient client{"127.0.0.1", 5810, 100ms}; + client.Start(); + + for (int i = 0; i < 10; i++) { + std::this_thread::sleep_for(100ms); + TimeSyncClient::Metadata m = client.GetMetadata(); + + // give us time to warm up + if (i > 5) { + EXPECT_TRUE(m.rtt2 > 0); + EXPECT_TRUE(m.pongsReceived > 0); + } + } + + client.Stop(); +} diff --git a/photon-lib/src/test/native/cpp/main.cpp b/photon-lib/src/test/native/cpp/main.cpp index 5236c0d36b..351c8d3378 100644 --- a/photon-lib/src/test/native/cpp/main.cpp +++ b/photon-lib/src/test/native/cpp/main.cpp @@ -22,10 +22,14 @@ * SOFTWARE. */ +#include + #include "gtest/gtest.h" int main(int argc, char** argv) { + HAL_Initialize(500, 0); ::testing::InitGoogleTest(&argc, argv); int ret = RUN_ALL_TESTS(); + HAL_Shutdown(); return ret; } diff --git a/photon-targeting/src/test/native/cpp/main.cpp b/photon-targeting/src/test/native/cpp/main.cpp index 7aab1315f7..47adcce931 100644 --- a/photon-targeting/src/test/native/cpp/main.cpp +++ b/photon-targeting/src/test/native/cpp/main.cpp @@ -15,9 +15,14 @@ * along with this program. If not, see . */ +#include + #include "gtest/gtest.h" int main(int argc, char** argv) { + HAL_Initialize(500, 0); ::testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); + int ret = RUN_ALL_TESTS(); + HAL_Shutdown(); + return ret; } diff --git a/photon-targeting/src/test/native/cpp/net/TimeSyncTest.cpp b/photon-targeting/src/test/native/cpp/net/TimeSyncTest.cpp index eeec41ee3e..9e23fd6004 100644 --- a/photon-targeting/src/test/native/cpp/net/TimeSyncTest.cpp +++ b/photon-targeting/src/test/native/cpp/net/TimeSyncTest.cpp @@ -24,8 +24,6 @@ TEST(TimeSyncProtocolTest, Smoketest) { using namespace wpi::tsp; using namespace std::chrono_literals; - HAL_Initialize(500, 0); - TimeSyncServer server{5812}; TimeSyncClient client{"127.0.0.1", 5812, 100ms}; diff --git a/photonlib-cpp-examples/poseest/src/test/cpp/main.cpp b/photonlib-cpp-examples/poseest/src/test/cpp/main.cpp index 031d1ce96b..351c8d3378 100644 --- a/photonlib-cpp-examples/poseest/src/test/cpp/main.cpp +++ b/photonlib-cpp-examples/poseest/src/test/cpp/main.cpp @@ -30,5 +30,6 @@ int main(int argc, char** argv) { HAL_Initialize(500, 0); ::testing::InitGoogleTest(&argc, argv); int ret = RUN_ALL_TESTS(); + HAL_Shutdown(); return ret; }