diff --git a/.github/labeler.yml b/.github/labeler.yml
index f9ae9fa6dd..642615aa62 100644
--- a/.github/labeler.yml
+++ b/.github/labeler.yml
@@ -33,9 +33,6 @@
'component: sysid':
- changed-files:
- any-glob-to-any-file: sysid/**
-'component: teamnumbersetter':
-- changed-files:
- - any-glob-to-any-file: roborioteamnumbersetter/**
'component: wpilibc':
- changed-files:
- any-glob-to-any-file: wpilibc/**
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 9448fc87bf..df1e06e890 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -324,7 +324,6 @@ if(WITH_GUI)
add_subdirectory(wpical)
endif()
if(LIBSSH_FOUND)
- add_subdirectory(roborioteamnumbersetter)
add_subdirectory(datalogtool)
endif()
endif()
diff --git a/README-CMake.md b/README-CMake.md
index 09b776ebe7..7f42ad75c2 100644
--- a/README-CMake.md
+++ b/README-CMake.md
@@ -24,7 +24,6 @@ WPILib is normally built with Gradle, however for some systems, such as Linux ba
* datalogtool
* glass
* outlineviewer
-* roborioteamnumbersetter
* sysid
* halsim_gui (if simulation extensions are enabled)
diff --git a/roborioteamnumbersetter/.styleguide b/roborioteamnumbersetter/.styleguide
deleted file mode 100644
index 6e411bc832..0000000000
--- a/roborioteamnumbersetter/.styleguide
+++ /dev/null
@@ -1,30 +0,0 @@
-cppHeaderFileInclude {
- \.h$
- \.inc$
- \.inl$
-}
-
-cppSrcFileInclude {
- \.cpp$
-}
-
-generatedFileExclude {
- src/main/native/resources/
- src/main/native/win/roborioteamnumbersetter.ico
- src/main/native/mac/rtns.icns
-}
-
-repoRootNameOverride {
- roborioteamnumbersetter
-}
-
-includeOtherLibs {
- ^GLFW
- ^fmt/
- ^imgui
- ^libssh/
- ^ntcore
- ^wpi/
- ^wpigui
- ^wpinet/
-}
diff --git a/roborioteamnumbersetter/CMakeLists.txt b/roborioteamnumbersetter/CMakeLists.txt
deleted file mode 100644
index c249c7c8c2..0000000000
--- a/roborioteamnumbersetter/CMakeLists.txt
+++ /dev/null
@@ -1,37 +0,0 @@
-project(roborioteamnumbersetter)
-
-include(CompileWarnings)
-include(GenResources)
-include(LinkMacOSGUI)
-
-configure_file(src/main/generate/WPILibVersion.cpp.in WPILibVersion.cpp)
-generate_resources(src/main/native/resources generated/main/cpp RTNS rtns rtns_resources_src)
-
-file(GLOB rtns_src src/main/native/cpp/*.cpp ${CMAKE_CURRENT_BINARY_DIR}/WPILibVersion.cpp)
-
-if(WIN32)
- set(rtns_rc src/main/native/win/roborioteamnumbersetter.rc)
-elseif(APPLE)
- set(MACOSX_BUNDLE_ICON_FILE rtns.icns)
- set(APP_ICON_MACOSX src/main/native/mac/rtns.icns)
- set_source_files_properties(${APP_ICON_MACOSX} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")
-endif()
-
-add_executable(
- roborioteamnumbersetter
- ${rtns_src}
- ${rtns_resources_src}
- ${rtns_rc}
- ${APP_ICON_MACOSX}
-)
-wpilib_link_macos_gui(roborioteamnumbersetter)
-target_link_libraries(roborioteamnumbersetter libglass wpinet ssh)
-
-if(WIN32)
- set_target_properties(roborioteamnumbersetter PROPERTIES WIN32_EXECUTABLE YES)
-elseif(APPLE)
- set_target_properties(
- roborioteamnumbersetter
- PROPERTIES MACOSX_BUNDLE YES OUTPUT_NAME "roborioTeamNumberSetter"
- )
-endif()
diff --git a/roborioteamnumbersetter/Info.plist b/roborioteamnumbersetter/Info.plist
deleted file mode 100644
index 9c617003a1..0000000000
--- a/roborioteamnumbersetter/Info.plist
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
-
- CFBundleName
- roboRIOTeamNumberSetter
- CFBundleExecutable
- roborioteamnumbersetter
- CFBundleDisplayName
- roboRIOTeamNumberSetter
- CFBundleIdentifier
- edu.wpi.first.tools.roboRIOTeamNumberSetter
- CFBundleIconFile
- rtns.icns
- CFBundlePackageType
- APPL
- CFBundleSupportedPlatforms
-
- MacOSX
-
- CFBundleInfoDictionaryVersion
- 6.0
- CFBundleShortVersionString
- 2021
- CFBundleVersion
- 2021
- LSMinimumSystemVersion
- 10.11
- NSHighResolutionCapable
-
-
-
diff --git a/roborioteamnumbersetter/build.gradle b/roborioteamnumbersetter/build.gradle
deleted file mode 100644
index 434f381dea..0000000000
--- a/roborioteamnumbersetter/build.gradle
+++ /dev/null
@@ -1,124 +0,0 @@
-import org.gradle.internal.os.OperatingSystem
-
-if (project.hasProperty('onlylinuxathena') || project.hasProperty('onlylinuxsystemcore')) {
- return;
-}
-
-description = "roboRIO Team Number Setter"
-
-apply plugin: 'cpp'
-apply plugin: 'visual-studio'
-apply plugin: 'edu.wpi.first.NativeUtils'
-
-if (OperatingSystem.current().isWindows()) {
- apply plugin: 'windows-resources'
-}
-
-ext {
- nativeName = 'roborioteamnumbersetter'
-}
-
-apply from: "${rootDir}/shared/resources.gradle"
-apply from: "${rootDir}/shared/config.gradle"
-
-def wpilibVersionFileInput = file("src/main/generate/WPILibVersion.cpp.in")
-def wpilibVersionFileOutput = file("$buildDir/generated/main/cpp/WPILibVersion.cpp")
-
-apply from: "${rootDir}/shared/libssh.gradle"
-
-task generateCppVersion() {
- description = 'Generates the wpilib version class'
- group = 'WPILib'
-
- outputs.file wpilibVersionFileOutput
- inputs.file wpilibVersionFileInput
-
- if (wpilibVersioning.releaseMode) {
- outputs.upToDateWhen { false }
- }
-
- // We follow a simple set of checks to determine whether we should generate a new version file:
- // 1. If the release type is not development, we generate a new version file
- // 2. If there is no generated version number, we generate a new version file
- // 3. If there is a generated build number, and the release type is development, then we will
- // only generate if the publish task is run.
- doLast {
- def version = wpilibVersioning.version.get()
- println "Writing version ${version} to $wpilibVersionFileOutput"
-
- if (wpilibVersionFileOutput.exists()) {
- wpilibVersionFileOutput.delete()
- }
- def read = wpilibVersionFileInput.text.replace('${wpilib_version}', version)
- wpilibVersionFileOutput.write(read)
- }
-}
-
-gradle.taskGraph.addTaskExecutionGraphListener { graph ->
- def willPublish = graph.hasTask(publish)
- if (willPublish) {
- generateCppVersion.outputs.upToDateWhen { false }
- }
-}
-
-def generateTask = createGenerateResourcesTask('main', 'RTNS', 'rtns', project)
-
-project(':').libraryBuild.dependsOn build
-tasks.withType(CppCompile) {
- dependsOn generateTask
- dependsOn generateCppVersion
-}
-
-model {
- components {
- // By default, a development executable will be generated. This is to help the case of
- // testing specific functionality of the library.
- "${nativeName}"(NativeExecutableSpec) {
- baseName = 'roborioteamnumbersetter'
- sources {
- cpp {
- source {
- srcDirs 'src/main/native/cpp', "$buildDir/generated/main/cpp"
- include '**/*.cpp'
- }
- exportedHeaders {
- srcDirs 'src/main/native/include'
- }
- }
- if (OperatingSystem.current().isWindows()) {
- rc.source {
- srcDirs 'src/main/native/win'
- include '*.rc'
- }
- }
- }
- binaries.all {
- if (it.targetPlatform.name == nativeUtils.wpi.platforms.roborio || it.targetPlatform.name == nativeUtils.wpi.platforms.systemcore) {
- it.buildable = false
- return
- }
- it.cppCompiler.define("LIBSSH_STATIC")
- lib project: ':glass', library: 'glass', linkage: 'static'
- lib project: ':wpinet', library: 'wpinet', linkage: 'static'
- lib project: ':wpiutil', library: 'wpiutil', linkage: 'static'
- lib project: ':wpigui', library: 'wpigui', linkage: 'static'
- nativeUtils.useRequiredLibrary(it, 'libssh')
- lib project: ':thirdparty:imgui_suite', library: 'imguiSuite', linkage: 'static'
- if (it.targetPlatform.operatingSystem.isWindows()) {
- it.linker.args << 'Gdi32.lib' << 'Shell32.lib' << 'd3d11.lib' << 'd3dcompiler.lib'
- it.linker.args << 'ws2_32.lib' << 'advapi32.lib' << 'crypt32.lib' << 'user32.lib'
- } else if (it.targetPlatform.operatingSystem.isMacOsX()) {
- it.linker.args << '-framework' << 'Metal' << '-framework' << 'MetalKit' << '-framework' << 'Cocoa' << '-framework' << 'IOKit' << '-framework' << 'CoreFoundation' << '-framework' << 'CoreVideo' << '-framework' << 'QuartzCore'
- it.linker.args << '-framework' << 'Kerberos'
- } else {
- it.linker.args << '-lX11'
- if (it.targetPlatform.name.startsWith('linuxarm')) {
- it.linker.args << '-lGL'
- }
- }
- }
- }
- }
-}
-
-apply from: 'publish.gradle'
diff --git a/roborioteamnumbersetter/publish.gradle b/roborioteamnumbersetter/publish.gradle
deleted file mode 100644
index 7b147195ae..0000000000
--- a/roborioteamnumbersetter/publish.gradle
+++ /dev/null
@@ -1,124 +0,0 @@
-apply plugin: 'maven-publish'
-
-def baseArtifactId = 'roboRIOTeamNumberSetter'
-def artifactGroupId = 'edu.wpi.first.tools'
-def zipBaseName = '_GROUP_edu_wpi_first_tools_ID_roboRIOTeamNumberSetter_CLS'
-
-def outputsFolder = file("$project.buildDir/outputs")
-
-model {
- tasks {
- // Create the run task.
- $.components.roborioteamnumbersetter.binaries.each { bin ->
- if (bin.buildable && bin.name.toLowerCase().contains("debug") && nativeUtils.isNativeDesktopPlatform(bin.targetPlatform)) {
- Task run = project.tasks.create("run", Exec) {
- commandLine bin.tasks.install.runScriptFile.get().asFile.toString()
- }
- run.dependsOn bin.tasks.install
- }
- }
- }
- publishing {
- def roboRIOTeamNumberSetterTaskList = []
- $.components.each { component ->
- component.binaries.each { binary ->
- if (binary in NativeExecutableBinarySpec && binary.component.name.contains("roborioteamnumbersetter")) {
- if (binary.buildable && (binary.name.contains('Release') || binary.name.contains('release'))) {
- // We are now in the binary that we want.
- // This is the default application path for the ZIP task.
- def applicationPath = binary.executable.file
- def icon = file("$project.projectDir/src/main/native/mac/rtns.icns")
-
- // Create the ZIP.
- def task = project.tasks.create("copyroboRIOTeamNumberSetterExecutable" + binary.targetPlatform.operatingSystem.name + binary.targetPlatform.architecture.name, Zip) {
- description("Copies the roboRIOTeamNumberSetter executable to the outputs directory.")
- destinationDirectory = outputsFolder
-
- archiveBaseName = zipBaseName
- duplicatesStrategy = 'exclude'
- archiveClassifier = nativeUtils.getPublishClassifier(binary)
-
- from(licenseFile) {
- into '/'
- }
-
- if (binary.targetPlatform.operatingSystem.isWindows()) {
- def exePath = binary.executable.file.absolutePath
- exePath = exePath.substring(0, exePath.length() - 4)
- def pdbPath = new File(exePath + '.pdb')
- from(pdbPath)
- }
-
- into(nativeUtils.getPlatformPath(binary))
- }
-
- if (binary.targetPlatform.operatingSystem.isMacOsX()) {
- // Create the macOS bundle.
- def bundleTask = project.tasks.create("bundleroboRIOTeamNumberSetterOsxApp" + binary.targetPlatform.architecture.name, Copy) {
- description("Creates a macOS application bundle for roboRIO Team Number Setter")
- from(file("$project.projectDir/Info.plist"))
- into(file("$project.buildDir/outputs/bundles/$binary.targetPlatform.architecture.name/roboRIOTeamNumberSetter.app/Contents"))
- into("MacOS") {
- with copySpec {
- from binary.executable.file
- }
- }
- into("Resources") {
- with copySpec {
- from icon
- }
- }
-
- inputs.property "HasDeveloperId", project.hasProperty("developerID")
-
- doLast {
- if (project.hasProperty("developerID")) {
- // Get path to binary.
- exec {
- workingDir rootDir
- def args = [
- "sh",
- "-c",
- "codesign --force --strict --deep " +
- "--timestamp --options=runtime " +
- "--verbose -s ${project.findProperty("developerID")} " +
- "$project.buildDir/outputs/bundles/$binary.targetPlatform.architecture.name/roboRIOTeamNumberSetter.app/"
- ]
- commandLine args
- }
- }
- }
- }
-
- // Reset the application path if we are creating a bundle.
- applicationPath = file("$project.buildDir/outputs/bundles/$binary.targetPlatform.architecture.name")
- task.from(applicationPath)
- project.build.dependsOn bundleTask
-
- bundleTask.dependsOn binary.tasks.link
- task.dependsOn(bundleTask)
- } else {
- task.from(applicationPath)
- }
-
- task.dependsOn binary.tasks.link
- roboRIOTeamNumberSetterTaskList.add(task)
- project.build.dependsOn task
- project.artifacts { task }
- addTaskToCopyAllOutputs(task)
- }
- }
- }
- }
-
- publications {
- roborioteamnumbersetter(MavenPublication) {
- roboRIOTeamNumberSetterTaskList.each { artifact it }
-
- artifactId = baseArtifactId
- groupId = artifactGroupId
- version wpilibVersioning.version.get()
- }
- }
- }
-}
diff --git a/roborioteamnumbersetter/src/main/generate/WPILibVersion.cpp.in b/roborioteamnumbersetter/src/main/generate/WPILibVersion.cpp.in
deleted file mode 100644
index cfe2441158..0000000000
--- a/roborioteamnumbersetter/src/main/generate/WPILibVersion.cpp.in
+++ /dev/null
@@ -1,7 +0,0 @@
-/**
- * Autogenerated file! Do not manually edit this file. This version is regenerated
- * any time the publish task is run, or when this file is deleted.
- */
-const char* GetWPILibVersion() {
- return "${wpilib_version}";
-}
diff --git a/roborioteamnumbersetter/src/main/native/cpp/App.cpp b/roborioteamnumbersetter/src/main/native/cpp/App.cpp
deleted file mode 100644
index 7e66467620..0000000000
--- a/roborioteamnumbersetter/src/main/native/cpp/App.cpp
+++ /dev/null
@@ -1,355 +0,0 @@
-// Copyright (c) FIRST and other WPILib contributors.
-// Open Source Software; you can modify and/or share it under the terms of
-// the WPILib BSD license file in the root directory of this project.
-
-#include
-#include
-#include
-#include
-#include
-
-#ifndef _WIN32
-#include
-#endif
-
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include "DeploySession.h"
-
-namespace gui = wpi::gui;
-
-const char* GetWPILibVersion();
-
-namespace rtns {
-std::string_view GetResource_rtns_16_png();
-std::string_view GetResource_rtns_32_png();
-std::string_view GetResource_rtns_48_png();
-std::string_view GetResource_rtns_64_png();
-std::string_view GetResource_rtns_128_png();
-std::string_view GetResource_rtns_256_png();
-std::string_view GetResource_rtns_512_png();
-} // namespace rtns
-
-#define GLFWAPI extern "C"
-GLFWAPI void glfwGetWindowSize(GLFWwindow* window, int* width, int* height);
-#define GLFW_DONT_CARE -1
-GLFWAPI void glfwSetWindowSizeLimits(GLFWwindow* window, int minwidth,
- int minheight, int maxwidth,
- int maxheight);
-GLFWAPI void glfwSetWindowSize(GLFWwindow* window, int width, int height);
-
-struct TeamNumberRefHolder {
- explicit TeamNumberRefHolder(glass::Storage& storage)
- : teamNumber{storage.GetInt("TeamNumber", 0)} {}
- int& teamNumber;
-};
-
-static std::unique_ptr teamNumberRef;
-static std::unordered_map>
- foundDevices;
-static std::unordered_map>
- deviceStatuses;
-static wpi::Logger logger;
-static rtns::DeploySession deploySession{logger};
-static std::unique_ptr multicastResolver;
-static glass::MainMenuBar gMainMenu;
-
-static void FindDevices() {
- WPI_EventHandle resolveEvent = multicastResolver->GetEventHandle();
-
- bool timedOut = 0;
- if (wpi::WaitForObject(resolveEvent, 0, &timedOut)) {
- auto allData = multicastResolver->GetData();
-
- for (auto&& data : allData) {
- // search for MAC
- auto macKey =
- std::find_if(data.txt.begin(), data.txt.end(),
- [](const auto& a) { return a.first == "MAC"; });
- if (macKey != data.txt.end()) {
- auto& mac = macKey->second;
- auto& foundDevice = foundDevices[mac];
- foundDevice = std::pair{data.ipv4Address, data.hostName};
- auto& deviceStatus = deviceStatuses[mac];
- if (!deviceStatus) {
- deploySession.GetStatus(mac, foundDevice.first);
- }
- }
- }
- }
-}
-
-static int minWidth = 400;
-
-static void DisplayGui() {
- int& teamNumber = teamNumberRef->teamNumber;
- FindDevices();
-
- ImGui::GetStyle().WindowRounding = 0;
-
- // fill entire OS window with this window
- ImGui::SetNextWindowPos(ImVec2(0, 0));
- int width, height;
- glfwGetWindowSize(gui::GetSystemWindow(), &width, &height);
-
- ImGui::SetNextWindowSize(ImVec2(width, height));
-
- ImGui::Begin("Entries", nullptr,
- ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_MenuBar |
- ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove |
- ImGuiWindowFlags_NoCollapse);
-
- ImGui::BeginMenuBar();
- gMainMenu.WorkspaceMenu();
- gui::EmitViewMenu();
-
- bool about = false;
- if (ImGui::BeginMenu("Info")) {
- if (ImGui::MenuItem("About")) {
- about = true;
- }
- ImGui::EndMenu();
- }
- ImGui::EndMenuBar();
-
- if (about) {
- ImGui::OpenPopup("About");
- }
- if (ImGui::BeginPopupModal("About")) {
- ImGui::Text("roboRIO Team Number Setter");
- ImGui::Separator();
- ImGui::Text("v%s", GetWPILibVersion());
- ImGui::Separator();
- ImGui::Text("Has mDNS Implementation: %d",
- static_cast(multicastResolver->HasImplementation()));
- ImGui::Separator();
- ImGui::Text("Save location: %s", glass::GetStorageDir().c_str());
- ImGui::Text("%.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate,
- ImGui::GetIO().Framerate);
- if (ImGui::Button("Close")) {
- ImGui::CloseCurrentPopup();
- }
- ImGui::EndPopup();
- }
-
- if (multicastResolver->HasImplementation()) {
- ImGui::InputInt("Team Number", &teamNumber);
-
- if (teamNumber < 0) {
- teamNumber = 0;
- }
-
- int nameWidth = ImGui::CalcTextSize("roboRIO2-0000-FRC.local. ").x;
- int macWidth = ImGui::CalcTextSize("88:88:88:88:88:88").x;
- int ipAddressWidth = ImGui::CalcTextSize("255.255.255.255").x;
- int setWidth = ImGui::CalcTextSize(" Set Team To 99999 ").x;
-
- minWidth = nameWidth + macWidth + ipAddressWidth + setWidth + 100;
-
- std::string setString = fmt::format("Set team to {}", teamNumber);
-
- if (ImGui::BeginTable("Table", 4)) {
- ImGui::TableSetupColumn(
- "Name",
- ImGuiTableColumnFlags_NoResize | ImGuiTableColumnFlags_WidthFixed,
- nameWidth);
- ImGui::TableSetupColumn(
- "MAC Address",
- ImGuiTableColumnFlags_NoResize | ImGuiTableColumnFlags_WidthFixed,
- macWidth);
- ImGui::TableSetupColumn(
- "IP Address",
- ImGuiTableColumnFlags_NoResize | ImGuiTableColumnFlags_WidthFixed,
- ipAddressWidth);
- ImGui::TableSetupColumn(
- "Set",
- ImGuiTableColumnFlags_NoResize | ImGuiTableColumnFlags_WidthFixed,
- setWidth);
- ImGui::TableHeadersRow();
-
- ImGui::EndTable();
- }
-
- for (auto&& i : foundDevices) {
- std::future* future = deploySession.GetFuture(i.first);
- std::future* futureStatus =
- deploySession.GetStatusFuture(i.first);
- if (ImGui::BeginTable("Table", 4)) {
- ImGui::TableSetupColumn(
- "Name",
- ImGuiTableColumnFlags_NoResize | ImGuiTableColumnFlags_WidthFixed,
- nameWidth);
- ImGui::TableSetupColumn(
- "MAC Address",
- ImGuiTableColumnFlags_NoResize | ImGuiTableColumnFlags_WidthFixed,
- macWidth);
- ImGui::TableSetupColumn(
- "IP Address",
- ImGuiTableColumnFlags_NoResize | ImGuiTableColumnFlags_WidthFixed,
- ipAddressWidth);
- ImGui::TableSetupColumn(
- "Set",
- ImGuiTableColumnFlags_NoResize | ImGuiTableColumnFlags_WidthFixed,
- setWidth);
-
- ImGui::TableNextRow();
- ImGui::TableNextColumn();
- ImGui::Text("%s", i.second.second.c_str());
- ImGui::TableNextColumn();
- ImGui::Text("%s", i.first.c_str());
- ImGui::TableNextColumn();
- struct in_addr in;
- in.s_addr = i.second.first;
- ImGui::Text("%s", inet_ntoa(in));
- ImGui::TableNextColumn();
- ImGui::PushID(i.first.c_str());
- if (future) {
- ImGui::TableNextColumn();
- const auto fs = future->wait_for(std::chrono::seconds(0));
- if (fs == std::future_status::ready) {
- deploySession.DestroyFuture(i.first);
- }
- } else {
- if (ImGui::Button(setString.c_str())) {
- deploySession.ChangeTeamNumber(i.first, teamNumber, i.second.first);
- }
- ImGui::TableNextColumn();
- }
-
- ImGui::PopID();
- ImGui::EndTable();
- }
-
- ImGui::PushID(i.first.c_str());
- if (futureStatus) {
- ImGui::Text("Refreshing Status");
- const auto fs = futureStatus->wait_for(std::chrono::seconds(0));
- if (fs == std::future_status::ready) {
- // DeploySession may throw exceptions. They've already been logged, so
- // we can ignore them.
- try {
- deviceStatuses[i.first] = futureStatus->get();
- } catch (const std::exception&) {
- // pass, already been logged
- }
- // Always destroy the future so the UI updates
- deploySession.DestroyStatusFuture(i.first);
- }
- } else {
- auto& deviceStatus = deviceStatuses[i.first];
- if (deviceStatus) {
- if (ImGui::Button("Refresh Status")) {
- deploySession.GetStatus(i.first, i.second.first);
- }
- std::string formatted =
- fmt::format("Image: {}", deviceStatus.value().image);
- ImGui::Text("%s", formatted.c_str());
- formatted = fmt::format("Serial Number: {}",
- deviceStatus.value().serialNumber);
- ImGui::Text("%s", formatted.c_str());
- formatted = fmt::format(
- "Web Server Status: {}",
- deviceStatus.value().webServerEnabled ? "Enabled" : "Disabled");
- ImGui::Text("%s", formatted.c_str());
- } else {
- ImGui::Text("Waiting for refresh");
- }
- }
-
- if (future) {
- ImGui::Text("Deploying");
- } else {
- if (ImGui::Button("Blink")) {
- deploySession.Blink(i.first, i.second.first);
- }
- ImGui::SameLine();
- if (ImGui::Button("Reboot")) {
- deploySession.Reboot(i.first, i.second.first);
- }
- ImGui::SameLine();
- if (ImGui::Button("Disable Web Server")) {
- deploySession.DisableWebServer(i.first, i.second.first);
- }
- ImGui::SameLine();
- if (ImGui::Button("Enable Web Server")) {
- deploySession.EnableWebServer(i.first, i.second.first);
- }
- }
- ImGui::Separator();
- ImGui::PopID();
- }
-
- ImGui::Columns(6, "Devices");
-
- // TODO make columns better
- } else {
- // Missing MDNS Implementation
- ImGui::Text("mDNS Implementation is missing.");
-#ifdef _WIN32
- ImGui::Text("Windows 10 1809 or newer is required for this tool");
-#else
- ImGui::Text("avahi-client 3 and avahi-core 3 are required for this tool");
- ImGui::Text(
- "Install libavahi-client3 and libavahi-core3 from your package "
- "manager");
-#endif
- }
- ImGui::Columns();
- ImGui::End();
-
- glfwSetWindowSizeLimits(gui::GetSystemWindow(), minWidth, 200, GLFW_DONT_CARE,
- GLFW_DONT_CARE);
- if (width < minWidth) {
- width = minWidth;
- glfwSetWindowSize(gui::GetSystemWindow(), width, height);
- }
-}
-
-void Application(std::string_view saveDir) {
- gui::CreateContext();
- glass::CreateContext();
-
- // Add icons
- gui::AddIcon(rtns::GetResource_rtns_16_png());
- gui::AddIcon(rtns::GetResource_rtns_32_png());
- gui::AddIcon(rtns::GetResource_rtns_48_png());
- gui::AddIcon(rtns::GetResource_rtns_64_png());
- gui::AddIcon(rtns::GetResource_rtns_128_png());
- gui::AddIcon(rtns::GetResource_rtns_256_png());
- gui::AddIcon(rtns::GetResource_rtns_512_png());
-
- glass::SetStorageName("roborioteamnumbersetter");
- glass::SetStorageDir(saveDir.empty() ? gui::GetPlatformSaveFileDir()
- : saveDir);
-
- ssh_init();
-
- teamNumberRef =
- std::make_unique(glass::GetStorageRoot());
-
- multicastResolver =
- std::make_unique("_ni._tcp");
- multicastResolver->Start();
-
- gui::AddLateExecute(DisplayGui);
- gui::Initialize("roboRIO Team Number Setter", 600, 400);
-
- gui::Main();
- multicastResolver->Stop();
- multicastResolver = nullptr;
-
- glass::DestroyContext();
- gui::DestroyContext();
-}
diff --git a/roborioteamnumbersetter/src/main/native/cpp/DeploySession.cpp b/roborioteamnumbersetter/src/main/native/cpp/DeploySession.cpp
deleted file mode 100644
index 84a950b483..0000000000
--- a/roborioteamnumbersetter/src/main/native/cpp/DeploySession.cpp
+++ /dev/null
@@ -1,344 +0,0 @@
-// Copyright (c) FIRST and other WPILib contributors.
-// Open Source Software; you can modify and/or share it under the terms of
-// the WPILib BSD license file in the root directory of this project.
-
-#include "DeploySession.h"
-
-#include
-#include
-#include
-#include
-
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-#include "SshSession.h"
-
-using namespace rtns;
-
-#ifdef ERROR
-#undef ERROR
-#endif
-
-// Macros to make logging easier.
-#define INFO(fmt, ...) WPI_INFO(m_logger, fmt, __VA_ARGS__)
-#define DEBUG(fmt, ...) WPI_DEBUG(m_logger, fmt, __VA_ARGS__)
-#define ERROR(fmt, ...) WPI_DEBUG(m_logger, fmt, __VA_ARGS__)
-#define SUCCESS(fmt, ...) WPI_LOG(m_logger, kLogSuccess, fmt, __VA_ARGS__)
-
-// roboRIO SSH constants.
-static constexpr int kPort = 22;
-static constexpr std::string_view kUsername = "admin";
-static constexpr std::string_view kPassword = "";
-
-std::unordered_map> s_outstanding;
-std::unordered_map> s_outstandingStatus;
-
-DeploySession::DeploySession(wpi::Logger& logger) : m_logger{logger} {}
-
-template
-struct SafeDeleter {
- explicit SafeDeleter(T d) : deleter(d) {}
- ~SafeDeleter() noexcept { deleter(); }
- T deleter;
-};
-
-std::future* DeploySession::GetFuture(const std::string& macAddress) {
- auto itr = s_outstanding.find(macAddress);
- if (itr == s_outstanding.end()) {
- return nullptr;
- }
- return &itr->second;
-}
-
-void DeploySession::DestroyFuture(const std::string& macAddress) {
- s_outstanding.erase(macAddress);
-}
-
-std::future* DeploySession::GetStatusFuture(
- const std::string& macAddress) {
- auto itr = s_outstandingStatus.find(macAddress);
- if (itr == s_outstandingStatus.end()) {
- return nullptr;
- }
- return &itr->second;
-}
-
-void DeploySession::DestroyStatusFuture(const std::string& macAddress) {
- s_outstandingStatus.erase(macAddress);
-}
-
-bool DeploySession::ChangeTeamNumber(const std::string& macAddress,
- int teamNumber, unsigned int ipAddress) {
- auto itr = s_outstanding.find(macAddress);
- if (itr != s_outstanding.end()) {
- return false;
- }
-
- std::future future = std::async(
- std::launch::async, [this, ipAddress, teamNumber, mac = macAddress]() {
- // Convert to IP address.
- wpi::SmallString<16> ip;
- in_addr addr;
- addr.s_addr = ipAddress;
- wpi::uv::AddrToName(addr, &ip);
- DEBUG("Trying to establish SSH connection to {}.", ip.str());
- try {
- SshSession session{ip.str(), kPort, kUsername, kPassword, m_logger};
- session.Open();
- DEBUG("SSH connection to {} was successful.", ip.str());
-
- SUCCESS("roboRIO Connected!");
-
- try {
- session.Execute(fmt::format(
- "/usr/local/natinst/bin/nirtcfg "
- "--file=/etc/natinst/share/ni-rt.ini --set "
- "section=systemsettings,token=host_name,value=roboRIO-{"
- "}-FRC ; sync",
- teamNumber));
- } catch (const SshSession::SshException& e) {
- ERROR("An exception occurred: {}", e.what());
- throw e;
- }
- } catch (const SshSession::SshException& e) {
- DEBUG("SSH connection to {} failed with {}.", ip.str(), e.what());
- throw e;
- }
- return 0;
- });
-
- s_outstanding[macAddress] = std::move(future);
- return true;
-}
-
-bool DeploySession::Reboot(const std::string& macAddress,
- unsigned int ipAddress) {
- auto itr = s_outstanding.find(macAddress);
- if (itr != s_outstanding.end()) {
- return false;
- }
-
- std::future future =
- std::async(std::launch::async, [this, ipAddress, mac = macAddress]() {
- // Convert to IP address.
- wpi::SmallString<16> ip;
- in_addr addr;
- addr.s_addr = ipAddress;
- wpi::uv::AddrToName(addr, &ip);
- DEBUG("Trying to establish SSH connection to {}.", ip.str());
- try {
- SshSession session{ip.str(), kPort, kUsername, kPassword, m_logger};
- session.Open();
- DEBUG("SSH connection to {} was successful.", ip.str());
-
- SUCCESS("roboRIO Connected!");
-
- try {
- session.Execute(fmt::format("sync ; shutdown -r now"));
- } catch (const SshSession::SshException& e) {
- ERROR("An exception occurred: {}", e.what());
- throw e;
- }
- } catch (const SshSession::SshException& e) {
- DEBUG("SSH connection to {} failed with {}.", ip.str(), e.what());
- throw e;
- }
- return 0;
- });
-
- s_outstanding[macAddress] = std::move(future);
- return true;
-}
-
-bool DeploySession::Blink(const std::string& macAddress,
- unsigned int ipAddress) {
- auto itr = s_outstanding.find(macAddress);
- if (itr != s_outstanding.end()) {
- return false;
- }
-
- std::future future =
- std::async(std::launch::async, [this, ipAddress, mac = macAddress]() {
- // Convert to IP address.
- wpi::SmallString<16> ip;
- in_addr addr;
- addr.s_addr = ipAddress;
- wpi::uv::AddrToName(addr, &ip);
- DEBUG("Trying to establish SSH connection to {}.", ip.str());
- try {
- SshSession session{ip.str(), kPort, kUsername, kPassword, m_logger};
- session.Open();
- DEBUG("SSH connection to {} was successful.", ip.str());
-
- SUCCESS("roboRIO Connected!");
-
- try {
- session.Execute(fmt::format(
- "for i in 1 2 3 4 5 ; do ` echo 255 > "
- "/sys/class/leds/nilrt:wifi:primary/brightness; sleep 0.5; "
- "echo 0 > /sys/class/leds/nilrt:wifi:primary/brightness; sleep "
- "0.5 ` ; done"));
- } catch (const SshSession::SshException& e) {
- ERROR("An exception occurred: {}", e.what());
- throw e;
- }
- } catch (const SshSession::SshException& e) {
- DEBUG("SSH connection to {} failed with {}.", ip.str(), e.what());
- throw e;
- }
- return 0;
- });
-
- s_outstanding[macAddress] = std::move(future);
- return true;
-}
-
-bool DeploySession::DisableWebServer(const std::string& macAddress,
- unsigned int ipAddress) {
- auto itr = s_outstanding.find(macAddress);
- if (itr != s_outstanding.end()) {
- return false;
- }
-
- std::future future =
- std::async(std::launch::async, [this, ipAddress, mac = macAddress]() {
- // Convert to IP address.
- wpi::SmallString<16> ip;
- in_addr addr;
- addr.s_addr = ipAddress;
- wpi::uv::AddrToName(addr, &ip);
- DEBUG("Trying to establish SSH connection to {}.", ip.str());
- try {
- SshSession session{ip.str(), kPort, kUsername, kPassword, m_logger};
- session.Open();
- DEBUG("SSH connection to {} was successful.", ip.str());
-
- SUCCESS("roboRIO Connected!");
-
- try {
- session.Execute(
- "/bin/bash -c \"/etc/init.d/systemWebServer stop\"");
- session.Execute(
- "/bin/bash -c \"update-rc.d -f systemWebServer remove\"");
- session.Execute("/bin/bash -c \"sync\"");
- } catch (const SshSession::SshException& e) {
- ERROR("An exception occurred: {}", e.what());
- throw e;
- }
- } catch (const SshSession::SshException& e) {
- DEBUG("SSH connection to {} failed with {}.", ip.str(), e.what());
- throw e;
- }
- return 0;
- });
-
- s_outstanding[macAddress] = std::move(future);
- return true;
-}
-
-bool DeploySession::EnableWebServer(const std::string& macAddress,
- unsigned int ipAddress) {
- auto itr = s_outstanding.find(macAddress);
- if (itr != s_outstanding.end()) {
- return false;
- }
-
- std::future future =
- std::async(std::launch::async, [this, ipAddress, mac = macAddress]() {
- // Convert to IP address.
- wpi::SmallString<16> ip;
- in_addr addr;
- addr.s_addr = ipAddress;
- wpi::uv::AddrToName(addr, &ip);
- DEBUG("Trying to establish SSH connection to {}.", ip.str());
- try {
- SshSession session{ip.str(), kPort, kUsername, kPassword, m_logger};
- session.Open();
- DEBUG("SSH connection to {} was successful.", ip.str());
-
- SUCCESS("roboRIO Connected!");
-
- try {
- session.Execute(
- "/bin/bash -c \"update-rc.d -f systemWebServer defaults\"");
- session.Execute(
- "/bin/bash -c \"/etc/init.d/systemWebServer start\"");
- session.Execute("/bin/bash -c \"sync\"");
- } catch (const SshSession::SshException& e) {
- ERROR("An exception occurred: {}", e.what());
- throw e;
- }
- } catch (const SshSession::SshException& e) {
- DEBUG("SSH connection to {} failed with {}.", ip.str(), e.what());
- throw e;
- }
- return 0;
- });
-
- s_outstanding[macAddress] = std::move(future);
- return true;
-}
-
-bool DeploySession::GetStatus(const std::string& macAddress,
- unsigned int ipAddress) {
- auto itr = s_outstandingStatus.find(macAddress);
- if (itr != s_outstandingStatus.end()) {
- return false;
- }
-
- std::future future =
- std::async(std::launch::async, [this, ipAddress, mac = macAddress]() {
- // Convert to IP address.
- wpi::SmallString<16> ip;
- in_addr addr;
- addr.s_addr = ipAddress;
- wpi::uv::AddrToName(addr, &ip);
- DEBUG("Trying to establish SSH connection to {}.", ip.str());
- DeviceStatus status;
- try {
- SshSession session{ip.str(), kPort, kUsername, kPassword, m_logger};
- session.Open();
- DEBUG("SSH connection to {} was successful.", ip.str());
-
- SUCCESS("roboRIO Connected!");
-
- try {
- int exitStatus = 0;
- session.ExecuteResult(
- "start-stop-daemon --status -x "
- "/usr/local/natinst/share/NIWebServer/SystemWebServer",
- &exitStatus);
- status.webServerEnabled = exitStatus == 0;
- auto serialNumber = session.ExecuteResult(
- "/sbin/fw_printenv -n serial#", &exitStatus);
- if (exitStatus == 0) {
- status.serialNumber = wpi::trim(serialNumber);
- }
- auto image = session.ExecuteResult(
- "/usr/local/natinst/bin/nirtcfg --file "
- "/etc/natinst/share/scs_imagemetadata.ini --get "
- "section=ImageMetadata,token=IMAGEVERSION,value=UNKNOWN",
- &exitStatus);
- if (exitStatus == 0) {
- status.image = wpi::trim(image);
- }
- } catch (const SshSession::SshException& e) {
- ERROR("An exception occurred: {}", e.what());
- throw e;
- }
- } catch (const SshSession::SshException& e) {
- DEBUG("SSH connection to {} failed with {}.", ip.str(), e.what());
- throw e;
- }
- return status;
- });
-
- s_outstandingStatus[macAddress] = std::move(future);
- return true;
-}
diff --git a/roborioteamnumbersetter/src/main/native/cpp/DeploySession.h b/roborioteamnumbersetter/src/main/native/cpp/DeploySession.h
deleted file mode 100644
index b5cafa93ec..0000000000
--- a/roborioteamnumbersetter/src/main/native/cpp/DeploySession.h
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright (c) FIRST and other WPILib contributors.
-// Open Source Software; you can modify and/or share it under the terms of
-// the WPILib BSD license file in the root directory of this project.
-
-#pragma once
-
-#include
-#include
-#include
-#include
-#include
-#include
-
-#include
-
-namespace rtns {
-// Define an integer for a successful message in the log (shown in green on the
-// GUI).
-static constexpr unsigned int kLogSuccess = 31;
-
-struct DeviceStatus {
- bool webServerEnabled = false;
- std::string serialNumber;
- std::string image;
-};
-
-/**
- * Represents a single deploy session.
- *
- * An instance of this class must be kept alive in memory until GetStatus()
- * returns kDiscoveryFailure or kDone. Otherwise, the deploy will fail!
- */
-class DeploySession {
- public:
- /** Represents the status of the deploy session. */
- enum class Status { kInProgress, kDiscoveryFailure, kDone };
-
- /**
- * Constructs an instance of the deploy session.
- *
- * @param team The team number (or an IP address/hostname).
- * @param drive Whether the drive program should be deployed to the roboRIO.
- * If this is set to false, the mechanism project will be
- * deployed.
- * @param config The generation configuration file to be sent to the roboRIO.
- * @param logger A reference to a logger where log messages should be sent.
- */
- explicit DeploySession(wpi::Logger& logger);
-
- /**
- * Executes the deploy. This can be called from any thread.
- */
- bool ChangeTeamNumber(const std::string& macAddress, int team,
- unsigned int ipAddress);
-
- bool Blink(const std::string& macAddress, unsigned int ipAddress);
-
- bool DisableWebServer(const std::string& macAddress, unsigned int ipAddress);
-
- bool EnableWebServer(const std::string& macAddress, unsigned int ipAddress);
-
- bool Reboot(const std::string& macAddress, unsigned int ipAddress);
-
- bool GetStatus(const std::string& macAddress, unsigned int ipAddress);
-
- std::future* GetFuture(const std::string& macAddress);
- void DestroyFuture(const std::string& macAddress);
-
- std::future* GetStatusFuture(const std::string& macAddress);
- void DestroyStatusFuture(const std::string& macAddress);
-
- private:
- // Logger reference where log messages will be sent.
- wpi::Logger& m_logger;
-
- // The number of hostnames that have completed their resolution/connection
- // attempts.
- std::atomic_int m_visited = 0;
-};
-} // namespace rtns
diff --git a/roborioteamnumbersetter/src/main/native/cpp/SshSession.cpp b/roborioteamnumbersetter/src/main/native/cpp/SshSession.cpp
deleted file mode 100644
index 187ad784b7..0000000000
--- a/roborioteamnumbersetter/src/main/native/cpp/SshSession.cpp
+++ /dev/null
@@ -1,227 +0,0 @@
-// Copyright (c) FIRST and other WPILib contributors.
-// Open Source Software; you can modify and/or share it under the terms of
-// the WPILib BSD license file in the root directory of this project.
-
-#include "SshSession.h"
-
-#include
-#include
-#include
-
-#include
-#include
-
-#include
-#include
-#include
-#include
-
-using namespace rtns;
-
-#define INFO(fmt, ...) WPI_INFO(m_logger, fmt __VA_OPT__(, ) __VA_ARGS__)
-
-SshSession::SshSession(std::string_view host, int port, std::string_view user,
- std::string_view pass, wpi::Logger& logger)
- : m_host{host},
- m_port{port},
- m_username{user},
- m_password{pass},
- m_logger{logger} {
- // Create a new SSH session.
- m_session = ssh_new();
- if (!m_session) {
- throw SshException("The SSH session could not be allocated.");
- }
-
- // Set the host, user, and port.
- ssh_options_set(m_session, SSH_OPTIONS_HOST, m_host.c_str());
- ssh_options_set(m_session, SSH_OPTIONS_USER, m_username.c_str());
- ssh_options_set(m_session, SSH_OPTIONS_PORT, &m_port);
-
- // Set timeout to 3 seconds.
- int64_t timeout = 3L;
- ssh_options_set(m_session, SSH_OPTIONS_TIMEOUT, &timeout);
-
- // Set other miscellaneous options.
- ssh_options_set(m_session, SSH_OPTIONS_STRICTHOSTKEYCHECK, "no");
-}
-
-SshSession::~SshSession() {
- ssh_disconnect(m_session);
- ssh_free(m_session);
-}
-
-void SshSession::Open() {
- // Connect to the server.
- int rc = ssh_connect(m_session);
- if (rc != SSH_OK) {
- throw SshException(ssh_get_error(m_session));
- }
-
- // Authenticate with password.
- rc = ssh_userauth_password(m_session, nullptr, m_password.c_str());
- if (rc != SSH_AUTH_SUCCESS) {
- throw SshException(ssh_get_error(m_session));
- }
-}
-
-void SshSession::Execute(std::string_view cmd) {
- // Allocate a new channel.
- ssh_channel channel = ssh_channel_new(m_session);
- if (!channel) {
- throw SshException(ssh_get_error(m_session));
- }
-
- // Open the channel.
- int rc = ssh_channel_open_session(channel);
- if (rc != SSH_OK) {
- throw SshException(ssh_get_error(m_session));
- }
-
- // Execute the command.
- std::string command{cmd};
- rc = ssh_channel_request_exec(channel, command.c_str());
- if (rc != SSH_OK) {
- ssh_channel_close(channel);
- ssh_channel_free(channel);
- throw SshException(ssh_get_error(m_session));
- }
- uint32_t exitCode = 0;
-#if LIBSSH_VERSION_MAJOR == 0 && LIBSSH_VERSION_MINOR >= 11
- ssh_channel_get_exit_state(channel, &exitCode, nullptr, nullptr);
-#else
- exitCode = ssh_channel_get_exit_status(channel);
-#endif
- INFO("{} {}", exitCode, cmd);
-
- // Log output.
- char buf[512];
- int read = ssh_channel_read(channel, buf, sizeof(buf), 0);
- if (read != 0) {
- if (read < static_cast(sizeof(buf) / sizeof(buf[0]))) {
- buf[read] = 0;
- } else {
- buf[(sizeof(buf) / sizeof(buf[0])) - 1] = 0;
- }
- INFO("stdout: {} {}", read, buf);
- }
-
- read = ssh_channel_read(channel, buf, sizeof(buf), 1);
- if (read != 0) {
- if (read < static_cast(sizeof(buf) / sizeof(buf[0]))) {
- buf[read] = 0;
- } else {
- buf[(sizeof(buf) / sizeof(buf[0])) - 1] = 0;
- }
- INFO("stderr: {} {}", read, buf);
- }
-
- // Close and free channel.
- ssh_channel_close(channel);
- ssh_channel_free(channel);
-}
-
-std::string SshSession::ExecuteResult(std::string_view cmd, int* exitStatus) {
- // Allocate a new channel.
- ssh_channel channel = ssh_channel_new(m_session);
- if (!channel) {
- throw SshException(ssh_get_error(m_session));
- }
-
- // Open the channel.
- int rc = ssh_channel_open_session(channel);
- if (rc != SSH_OK) {
- throw SshException(ssh_get_error(m_session));
- }
-
- // Execute the command.
- std::string command{cmd};
- rc = ssh_channel_request_exec(channel, command.c_str());
- if (rc != SSH_OK) {
- ssh_channel_close(channel);
- ssh_channel_free(channel);
- throw SshException(ssh_get_error(m_session));
- }
- uint32_t exitCode = 0;
-#if LIBSSH_VERSION_MAJOR == 0 && LIBSSH_VERSION_MINOR >= 11
- ssh_channel_get_exit_state(channel, &exitCode, nullptr, nullptr);
-#else
- exitCode = ssh_channel_get_exit_status(channel);
-#endif
- INFO("{} {}", exitCode, cmd);
-
- std::string result;
- if (exitStatus) {
- *exitStatus = exitCode;
- }
-
- // Log output.
- char buf[512];
- int read = ssh_channel_read(channel, buf, sizeof(buf), 0);
- if (read != 0) {
- if (read < static_cast(sizeof(buf) / sizeof(buf[0]))) {
- buf[read] = 0;
- } else {
- buf[(sizeof(buf) / sizeof(buf[0])) - 1] = 0;
- }
- result = buf;
- INFO("stdout: {} {}", read, buf);
- }
-
- read = ssh_channel_read(channel, buf, sizeof(buf), 1);
- if (read != 0) {
- if (read < static_cast(sizeof(buf) / sizeof(buf[0]))) {
- buf[read] = 0;
- } else {
- buf[(sizeof(buf) / sizeof(buf[0])) - 1] = 0;
- }
- INFO("stderr: {} {}", read, buf);
- }
-
- // Close and free channel.
- ssh_channel_close(channel);
- ssh_channel_free(channel);
-
- return result;
-}
-
-void SshSession::Put(std::string_view path, std::string_view contents) {
- // Allocate the SFTP session.
- sftp_session sftp = sftp_new(m_session);
- if (!sftp) {
- throw SshException(ssh_get_error(m_session));
- }
-
- // Initialize.
- int rc = sftp_init(sftp);
- if (rc != SSH_OK) {
- sftp_free(sftp);
- throw SshException(ssh_get_error(m_session));
- }
-
- // Copy.
- sftp_file file =
- sftp_open(sftp, path.data(), O_WRONLY | O_CREAT | O_TRUNC, S_IFMT);
- if (!file) {
- sftp_free(sftp);
- throw SshException(ssh_get_error(m_session));
- }
-
- // Send 150K at a time.
- static constexpr size_t kChunkSize = 150000;
- for (size_t i = 0; i < contents.size(); i += kChunkSize) {
- size_t len = (std::min)(kChunkSize, contents.size() - i);
- size_t written = sftp_write(file, contents.data() + i, len);
- if (written != len) {
- sftp_close(file);
- sftp_free(sftp);
- throw SshException(ssh_get_error(m_session));
- }
- }
-
- INFO("[SFTP] Deployed {}!", path);
-
- // Close file, free memory.
- sftp_close(file);
- sftp_free(sftp);
-}
diff --git a/roborioteamnumbersetter/src/main/native/cpp/SshSession.h b/roborioteamnumbersetter/src/main/native/cpp/SshSession.h
deleted file mode 100644
index 423c16c109..0000000000
--- a/roborioteamnumbersetter/src/main/native/cpp/SshSession.h
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright (c) FIRST and other WPILib contributors.
-// Open Source Software; you can modify and/or share it under the terms of
-// the WPILib BSD license file in the root directory of this project.
-
-#pragma once
-
-#include
-#include
-#include
-
-#include
-#include
-
-namespace rtns {
-/**
- * This class is a C++ implementation of the SshSessionController in
- * wpilibsuite/deploy-utils. It handles connecting to an SSH server, running
- * commands, and transferring files.
- */
-class SshSession {
- public:
- /**
- * This is the exception that will be thrown by any of the methods in this
- * class if something goes wrong.
- */
- class SshException : public std::runtime_error {
- public:
- explicit SshException(const char* msg) : runtime_error(msg) {}
- };
-
- /**
- * Constructs a new session controller.
- *
- * @param host The hostname of the server to connect to.
- * @param port The port that the sshd server is operating on.
- * @param user The username to login as.
- * @param pass The password for the given username.
- * @param logger A reference to a logger to log messages to.
- */
- SshSession(std::string_view host, int port, std::string_view user,
- std::string_view pass, wpi::Logger& logger);
-
- /**
- * Destroys the controller object. This also disconnects the session from the
- * server.
- */
- ~SshSession();
-
- /**
- * Opens the SSH connection to the given host.
- */
- void Open();
-
- /**
- * Executes a command and logs the output (if there is any).
- *
- * @param cmd The command to execute on the server.
- */
- void Execute(std::string_view cmd);
-
- std::string ExecuteResult(std::string_view cmd, int* exitStatus);
-
- /**
- * Puts a file on the server using SFTP.
- *
- * @param path The path to the file to put (on the server).
- * @param contents The contents of the file.
- */
- void Put(std::string_view path, std::string_view contents);
-
- private:
- ssh_session m_session;
- std::string m_host;
-
- int m_port;
-
- std::string m_username;
- std::string m_password;
-
- wpi::Logger& m_logger;
-};
-} // namespace rtns
diff --git a/roborioteamnumbersetter/src/main/native/cpp/main.cpp b/roborioteamnumbersetter/src/main/native/cpp/main.cpp
deleted file mode 100644
index 3d1a1965f2..0000000000
--- a/roborioteamnumbersetter/src/main/native/cpp/main.cpp
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright (c) FIRST and other WPILib contributors.
-// Open Source Software; you can modify and/or share it under the terms of
-// the WPILib BSD license file in the root directory of this project.
-
-#include
-
-void Application(std::string_view saveDir);
-
-#ifdef _WIN32
-int __stdcall WinMain(void* hInstance, void* hPrevInstance, char* pCmdLine,
- int nCmdShow) {
- int argc = __argc;
- char** argv = __argv;
-#else
-int main(int argc, char** argv) {
-#endif
- std::string_view saveDir;
- if (argc == 2) {
- saveDir = argv[1];
- }
-
- Application(saveDir);
-
- return 0;
-}
diff --git a/roborioteamnumbersetter/src/main/native/mac/rtns.icns b/roborioteamnumbersetter/src/main/native/mac/rtns.icns
deleted file mode 100644
index 4a1d0131b3..0000000000
Binary files a/roborioteamnumbersetter/src/main/native/mac/rtns.icns and /dev/null differ
diff --git a/roborioteamnumbersetter/src/main/native/resources/rtns-128.png b/roborioteamnumbersetter/src/main/native/resources/rtns-128.png
deleted file mode 100644
index 5c6ebdd61d..0000000000
Binary files a/roborioteamnumbersetter/src/main/native/resources/rtns-128.png and /dev/null differ
diff --git a/roborioteamnumbersetter/src/main/native/resources/rtns-16.png b/roborioteamnumbersetter/src/main/native/resources/rtns-16.png
deleted file mode 100644
index b95cd6a645..0000000000
Binary files a/roborioteamnumbersetter/src/main/native/resources/rtns-16.png and /dev/null differ
diff --git a/roborioteamnumbersetter/src/main/native/resources/rtns-256.png b/roborioteamnumbersetter/src/main/native/resources/rtns-256.png
deleted file mode 100644
index 7d07f39143..0000000000
Binary files a/roborioteamnumbersetter/src/main/native/resources/rtns-256.png and /dev/null differ
diff --git a/roborioteamnumbersetter/src/main/native/resources/rtns-32.png b/roborioteamnumbersetter/src/main/native/resources/rtns-32.png
deleted file mode 100644
index 10add53108..0000000000
Binary files a/roborioteamnumbersetter/src/main/native/resources/rtns-32.png and /dev/null differ
diff --git a/roborioteamnumbersetter/src/main/native/resources/rtns-48.png b/roborioteamnumbersetter/src/main/native/resources/rtns-48.png
deleted file mode 100644
index bf31571b29..0000000000
Binary files a/roborioteamnumbersetter/src/main/native/resources/rtns-48.png and /dev/null differ
diff --git a/roborioteamnumbersetter/src/main/native/resources/rtns-512.png b/roborioteamnumbersetter/src/main/native/resources/rtns-512.png
deleted file mode 100644
index 7a86e77e3e..0000000000
Binary files a/roborioteamnumbersetter/src/main/native/resources/rtns-512.png and /dev/null differ
diff --git a/roborioteamnumbersetter/src/main/native/resources/rtns-64.png b/roborioteamnumbersetter/src/main/native/resources/rtns-64.png
deleted file mode 100644
index 30819a5aee..0000000000
Binary files a/roborioteamnumbersetter/src/main/native/resources/rtns-64.png and /dev/null differ
diff --git a/roborioteamnumbersetter/src/main/native/win/roborioteamnumbersetter.ico b/roborioteamnumbersetter/src/main/native/win/roborioteamnumbersetter.ico
deleted file mode 100644
index d3ee2e5e05..0000000000
Binary files a/roborioteamnumbersetter/src/main/native/win/roborioteamnumbersetter.ico and /dev/null differ
diff --git a/roborioteamnumbersetter/src/main/native/win/roborioteamnumbersetter.rc b/roborioteamnumbersetter/src/main/native/win/roborioteamnumbersetter.rc
deleted file mode 100644
index 5d5d358de5..0000000000
--- a/roborioteamnumbersetter/src/main/native/win/roborioteamnumbersetter.rc
+++ /dev/null
@@ -1 +0,0 @@
-IDI_ICON1 ICON "roborioteamnumbersetter.ico"
diff --git a/settings.gradle b/settings.gradle
index b81e6280b8..700aef19e3 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -38,7 +38,6 @@ include 'crossConnIntegrationTests'
include 'fieldImages'
include 'glass'
include 'outlineviewer'
-include 'roborioteamnumbersetter'
include 'datalogtool'
include 'sysid'
include 'simulation:halsim_ds_socket'