diff --git a/simulation/halsim_ds_socket/src/main/native/cpp/main.cpp b/simulation/halsim_ds_socket/src/main/native/cpp/main.cpp index 56c784b9d4..bafe8b38d2 100644 --- a/simulation/halsim_ds_socket/src/main/native/cpp/main.cpp +++ b/simulation/halsim_ds_socket/src/main/native/cpp/main.cpp @@ -16,9 +16,11 @@ #include +#include #include #include +#include #include #include #include @@ -35,6 +37,7 @@ using namespace wpi::uv; static std::unique_ptr singleByte; +static std::atomic gDSConnected = false; namespace { struct DataStore { @@ -91,12 +94,16 @@ static void SetupTcp(wpi::uv::Loop& loop) { tcp->Listen([t = tcp.get()] { auto client = t->Accept(); + gDSConnected = true; client->data.connect([t](Buffer& buf, size_t len) { HandleTcpDataStream(buf, len, *t->GetData()); }); client->StartRead(); - client->end.connect([c = client.get()] { c->Close(); }); + client->end.connect([c = client.get()] { + c->Close(); + gDSConnected = false; + }); }); } @@ -178,6 +185,8 @@ __declspec(dllexport) wpi::outs() << "DriverStationSocket Initializing.\n"; + HAL_RegisterExtension("ds_socket", &gDSConnected); + singleByte = std::make_unique("0"); eventLoopRunner = std::make_unique(); diff --git a/simulation/halsim_gui/src/main/native/cpp/DriverStationGui.cpp b/simulation/halsim_gui/src/main/native/cpp/DriverStationGui.cpp index 89050279b5..96b53cba6f 100644 --- a/simulation/halsim_gui/src/main/native/cpp/DriverStationGui.cpp +++ b/simulation/halsim_gui/src/main/native/cpp/DriverStationGui.cpp @@ -7,6 +7,7 @@ #include "DriverStationGui.h" +#include #include #include #include @@ -102,6 +103,11 @@ static RobotJoystick gRobotJoysticks[HAL_kMaxJoysticks]; static std::unique_ptr gJoystickSources[HAL_kMaxJoysticks]; static bool gDisableDS = false; +static std::atomic* gDSSocketConnected = nullptr; + +static inline bool IsDSDisabled() { + return gDisableDS || (gDSSocketConnected && *gDSSocketConnected); +} JoystickSource::JoystickSource(int index) : m_index{index} { HAL_JoystickAxes halAxes; @@ -396,13 +402,15 @@ static void DriverStationExecute() { } static bool prevDisableDS = false; - if (gDisableDS && !prevDisableDS) { + + bool disableDS = IsDSDisabled(); + if (disableDS && !prevDisableDS) { HALSimGui::SetWindowVisibility("System Joysticks", HALSimGui::kDisabled); - } else if (!gDisableDS && prevDisableDS) { + } else if (!disableDS && prevDisableDS) { HALSimGui::SetWindowVisibility("System Joysticks", HALSimGui::kShow); } - prevDisableDS = gDisableDS; - if (gDisableDS) return; + prevDisableDS = disableDS; + if (disableDS) return; double curTime = glfwGetTime(); @@ -464,7 +472,7 @@ static void DisplayFMS() { HAL_MatchInfo matchInfo; HALSIM_GetMatchInfo(&matchInfo); - if (gDisableDS) { + if (IsDSDisabled()) { if (!HALSIM_GetDriverStationEnabled()) ImGui::Text("Robot State: Disabled"); else if (HALSIM_GetDriverStationTest()) @@ -559,6 +567,7 @@ static void DisplaySystemJoysticks() { } static void DisplayJoysticks() { + bool disableDS = IsDSDisabled(); // imgui doesn't size columns properly with autoresize, so force it ImGui::Dummy(ImVec2(ImGui::GetFontSize() * 10 * HAL_kMaxJoysticks, 0)); @@ -567,7 +576,7 @@ static void DisplayJoysticks() { auto& joy = gRobotJoysticks[i]; char label[128]; joy.name.GetLabel(label, sizeof(label), "Joystick", i); - if (!gDisableDS && joy.sys) { + if (!disableDS && joy.sys) { ImGui::Selectable(label, false); if (ImGui::BeginDragDropSource()) { ImGui::SetDragDropPayload("Joystick", &joy.sys, sizeof(joy.sys)); @@ -578,7 +587,7 @@ static void DisplayJoysticks() { } else { ImGui::Selectable(label, false, ImGuiSelectableFlags_Disabled); } - if (!gDisableDS && ImGui::BeginDragDropTarget()) { + if (!disableDS && ImGui::BeginDragDropTarget()) { if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload("Joystick")) { IM_ASSERT(payload->DataSize == sizeof(SystemJoystick*)); @@ -603,12 +612,12 @@ static void DisplayJoysticks() { auto& joy = gRobotJoysticks[i]; auto source = gJoystickSources[i].get(); - if (gDisableDS) joy.GetHAL(i); + if (disableDS) joy.GetHAL(i); - if ((gDisableDS && joy.desc.type != 0) || (joy.sys && joy.sys->present)) { + if ((disableDS && joy.desc.type != 0) || (joy.sys && joy.sys->present)) { // update GUI display ImGui::PushID(i); - if (gDisableDS) { + if (disableDS) { ImGui::Text("%s", joy.desc.name); ImGui::Text("Gamepad: %s", joy.desc.isXbox ? "Yes" : "No"); } else { @@ -662,7 +671,11 @@ static void DisplayJoysticks() { } static void DriverStationOptionMenu() { - ImGui::MenuItem("Turn off DS", nullptr, &gDisableDS); + if (gDSSocketConnected && *gDSSocketConnected) { + ImGui::MenuItem("Turn off DS (real DS connected)", nullptr, true, false); + } else { + ImGui::MenuItem("Turn off DS", nullptr, &gDisableDS); + } } void DriverStationGui::Initialize() { @@ -695,3 +708,7 @@ void DriverStationGui::Initialize() { HALSimGui::SetDefaultWindowPos("System Joysticks", 5, 385); HALSimGui::SetDefaultWindowPos("Joysticks", 250, 465); } + +void DriverStationGui::SetDSSocketExtension(void* data) { + gDSSocketConnected = static_cast*>(data); +} diff --git a/simulation/halsim_gui/src/main/native/cpp/DriverStationGui.h b/simulation/halsim_gui/src/main/native/cpp/DriverStationGui.h index 571c2653b2..5bf25b5375 100644 --- a/simulation/halsim_gui/src/main/native/cpp/DriverStationGui.h +++ b/simulation/halsim_gui/src/main/native/cpp/DriverStationGui.h @@ -1,5 +1,5 @@ /*----------------------------------------------------------------------------*/ -/* Copyright (c) 2019 FIRST. All Rights Reserved. */ +/* Copyright (c) 2019-2020 FIRST. All Rights Reserved. */ /* Open Source Software - may be modified and shared by FRC teams. The code */ /* must be accompanied by the FIRST BSD license file in the root directory of */ /* the project. */ @@ -12,6 +12,7 @@ namespace halsimgui { class DriverStationGui { public: static void Initialize(); + static void SetDSSocketExtension(void* data); }; } // namespace halsimgui diff --git a/simulation/halsim_gui/src/main/native/cpp/main.cpp b/simulation/halsim_gui/src/main/native/cpp/main.cpp index 7900ace51a..a904580c5f 100644 --- a/simulation/halsim_gui/src/main/native/cpp/main.cpp +++ b/simulation/halsim_gui/src/main/native/cpp/main.cpp @@ -5,7 +5,9 @@ /* the project. */ /*----------------------------------------------------------------------------*/ +#include #include +#include #include #include "AccelerometerGui.h" @@ -61,6 +63,12 @@ __declspec(dllexport) wpi::outs() << "Simulator GUI Initializing.\n"; if (!HALSimGui::Initialize()) return 0; + HAL_RegisterExtensionListener( + nullptr, [](void*, const char* name, void* data) { + if (wpi::StringRef{name} == "ds_socket") { + DriverStationGui::SetDSSocketExtension(data); + } + }); HAL_SetMain(nullptr, HALSimGui::Main, HALSimGui::Exit); wpi::outs() << "Simulator GUI Initialized!\n";