mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-30 02:31:44 +00:00
[hal, wpilib] Add RobotController.getComments() (#4463)
This commit is contained in:
@@ -19,6 +19,7 @@
|
||||
#include <FRC_NetworkCommunication/UsageReporting.h>
|
||||
#include <fmt/format.h>
|
||||
#include <wpi/MemoryBuffer.h>
|
||||
#include <wpi/SmallString.h>
|
||||
#include <wpi/StringExtras.h>
|
||||
#include <wpi/fs.h>
|
||||
#include <wpi/mutex.h>
|
||||
@@ -41,6 +42,10 @@ static std::unique_ptr<tGlobal> global;
|
||||
static std::unique_ptr<tSysWatchdog> watchdog;
|
||||
static uint64_t dsStartTime;
|
||||
|
||||
static char roboRioCommentsString[64];
|
||||
static size_t roboRioCommentsStringSize;
|
||||
static bool roboRioCommentsStringInitialized;
|
||||
|
||||
using namespace hal;
|
||||
|
||||
namespace hal {
|
||||
@@ -287,6 +292,67 @@ size_t HAL_GetSerialNumber(char* buffer, size_t size) {
|
||||
}
|
||||
}
|
||||
|
||||
void InitializeRoboRioComments(void) {
|
||||
if (!roboRioCommentsStringInitialized) {
|
||||
std::error_code ec;
|
||||
std::unique_ptr<wpi::MemoryBuffer> fileBuffer =
|
||||
wpi::MemoryBuffer::GetFile("/etc/machine-info", ec);
|
||||
|
||||
std::string_view fileContents;
|
||||
if (fileBuffer && !ec) {
|
||||
fileContents =
|
||||
std::string_view(reinterpret_cast<const char*>(fileBuffer->begin()),
|
||||
fileBuffer->size());
|
||||
} else {
|
||||
roboRioCommentsStringSize = 0;
|
||||
roboRioCommentsStringInitialized = true;
|
||||
return;
|
||||
}
|
||||
std::string_view searchString = "PRETTY_HOSTNAME=\"";
|
||||
|
||||
size_t start = fileContents.find(searchString);
|
||||
if (start == std::string_view::npos) {
|
||||
roboRioCommentsStringSize = 0;
|
||||
roboRioCommentsStringInitialized = true;
|
||||
return;
|
||||
}
|
||||
start += searchString.size();
|
||||
size_t end = fileContents.find("\"", start);
|
||||
if (end == std::string_view::npos) {
|
||||
end = fileContents.size();
|
||||
}
|
||||
std::string_view escapedComments = wpi::slice(fileContents, start, end);
|
||||
wpi::SmallString<64> buf;
|
||||
auto [unescapedComments, rem] = wpi::UnescapeCString(escapedComments, buf);
|
||||
unescapedComments.copy(roboRioCommentsString,
|
||||
sizeof(roboRioCommentsString));
|
||||
|
||||
if (unescapedComments.size() > sizeof(roboRioCommentsString)) {
|
||||
roboRioCommentsStringSize = sizeof(roboRioCommentsString);
|
||||
} else {
|
||||
roboRioCommentsStringSize = unescapedComments.size();
|
||||
}
|
||||
roboRioCommentsStringInitialized = true;
|
||||
}
|
||||
}
|
||||
|
||||
size_t HAL_GetComments(char* buffer, size_t size) {
|
||||
if (!roboRioCommentsStringInitialized) {
|
||||
InitializeRoboRioComments();
|
||||
}
|
||||
size_t toCopy = size;
|
||||
if (size > roboRioCommentsStringSize) {
|
||||
toCopy = roboRioCommentsStringSize;
|
||||
}
|
||||
std::memcpy(buffer, roboRioCommentsString, toCopy);
|
||||
if (toCopy < size) {
|
||||
buffer[toCopy] = '\0';
|
||||
} else {
|
||||
buffer[toCopy - 1] = '\0';
|
||||
}
|
||||
return toCopy;
|
||||
}
|
||||
|
||||
uint64_t HAL_GetFPGATime(int32_t* status) {
|
||||
hal::init::CheckInit();
|
||||
if (!global) {
|
||||
|
||||
Reference in New Issue
Block a user