diff --git a/wpilibc/src/main/native/cpp/PneumaticHub.cpp b/wpilibc/src/main/native/cpp/PneumaticHub.cpp index 9520559684..d6784ab730 100644 --- a/wpilibc/src/main/native/cpp/PneumaticHub.cpp +++ b/wpilibc/src/main/native/cpp/PneumaticHub.cpp @@ -4,6 +4,7 @@ #include "frc/PneumaticHub.h" +#include #include #include #include @@ -11,6 +12,7 @@ #include "frc/Compressor.h" #include "frc/DoubleSolenoid.h" #include "frc/Errors.h" +#include "frc/RobotBase.h" #include "frc/SensorUtil.h" #include "frc/Solenoid.h" #include "frc/fmt/Units.h" @@ -56,6 +58,29 @@ class PneumaticHub::DataStore { std::shared_ptr{this, wpi::NullDeleter()}; auto version = m_moduleObject.GetVersion(); + + if (version.FirmwareMajor > 0 && RobotBase::IsReal()) { + // Write PH firmware version to roboRIO + std::FILE* file = nullptr; + file = std::fopen( + fmt::format("/tmp/frc_versions/REV_PH_{:0>2}_WPILib_Version.ini", + module) + .c_str(), + "w"); + if (file != nullptr) { + std::fputs("[Version]\n", file); + std::fputs(fmt::format("model=REV PH\n").c_str(), file); + std::fputs(fmt::format("deviceID={:x}\n", (0x9052600 | module)).c_str(), + file); + std::fputs(fmt::format("currentVersion={}.{}.{}", version.FirmwareMajor, + version.FirmwareMinor, version.FirmwareFix) + .c_str(), + file); + std::fclose(file); + } + } + + // Check PH firmware version if (version.FirmwareMajor > 0 && version.FirmwareMajor < 22) { throw FRC_MakeError( err::AssertionFailure, diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/PneumaticHub.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/PneumaticHub.java index b109180741..7b077a8fb0 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/PneumaticHub.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/PneumaticHub.java @@ -9,6 +9,11 @@ import edu.wpi.first.hal.REVPHFaults; import edu.wpi.first.hal.REVPHJNI; import edu.wpi.first.hal.REVPHStickyFaults; import edu.wpi.first.hal.REVPHVersion; +import java.io.File; +import java.io.IOException; +import java.io.OutputStream; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; import java.util.HashMap; import java.util.Map; @@ -29,9 +34,38 @@ public class PneumaticHub implements PneumaticsBase { m_handleMap.put(module, this); final REVPHVersion version = REVPHJNI.getVersion(m_handle); + final String fwVersion = + version.firmwareMajor + "." + version.firmwareMinor + "." + version.firmwareFix; + + if (version.firmwareMajor > 0 && RobotBase.isReal()) { + // Write PH firmware version to roboRIO + final String fileName = "REV_PH_" + String.format("%02d", module) + "_WPILib_Version.ini"; + final File file = new File("/tmp/frc_versions/" + fileName); + try { + if (file.exists() && !file.delete()) { + throw new IOException("Failed to delete " + fileName); + } + + if (!file.createNewFile()) { + throw new IOException("Failed to create new " + fileName); + } + + try (OutputStream output = Files.newOutputStream(file.toPath())) { + output.write("[Version]\n".getBytes(StandardCharsets.UTF_8)); + output.write("model=REV PH\n".getBytes(StandardCharsets.UTF_8)); + output.write( + ("deviceID=" + Integer.toHexString(0x9052600 | module) + "\n") + .getBytes(StandardCharsets.UTF_8)); + output.write(("currentVersion=" + fwVersion).getBytes(StandardCharsets.UTF_8)); + } + } catch (IOException ex) { + DriverStation.reportError( + "Could not write " + fileName + ": " + ex.toString(), ex.getStackTrace()); + } + } + + // Check PH firmware version if (version.firmwareMajor > 0 && version.firmwareMajor < 22) { - final String fwVersion = - version.firmwareMajor + "." + version.firmwareMinor + "." + version.firmwareFix; throw new IllegalStateException( "The Pneumatic Hub has firmware version " + fwVersion