Disable voltage monitoring in hardware_monitor
It was locking up the i2c bus and blocking us from reading images.
Disable voltage monitoring by a flag for now and we can debug it later.
There were some flatbuffer construction issues, fix those too while we
are here.
Change-Id: Ie2728b85ec568e82e0478546c40a152cdbdfc101
Signed-off-by: Austin Schuh <austin.linux@gmail.com>
diff --git a/frc971/orin/hardware_monitor.cc b/frc971/orin/hardware_monitor.cc
index f09d0e6..e1c785b 100644
--- a/frc971/orin/hardware_monitor.cc
+++ b/frc971/orin/hardware_monitor.cc
@@ -10,6 +10,7 @@
#include "frc971/orin/hardware_stats_generated.h"
DEFINE_string(config, "aos_config.json", "File path of aos configuration");
+DEFINE_bool(log_voltages, false, "If true, log voltages too.");
namespace frc971::orin {
namespace {
@@ -68,14 +69,19 @@
// Iterate through all thermal zones
std::vector<flatbuffers::Offset<ThermalZone>> thermal_zones;
for (int zone_id = 0; zone_id < 9; zone_id++) {
+ std::optional<std::string> zone_name = ReadFileFirstLine(absl::StrFormat(
+ "/sys/devices/virtual/thermal/thermal_zone%d/type", zone_id));
+ flatbuffers::Offset<flatbuffers::String> name_offset;
+ if (zone_name) {
+ name_offset = builder.fbb()->CreateString(*zone_name);
+ }
+
ThermalZone::Builder thermal_zone_builder =
builder.MakeBuilder<ThermalZone>();
thermal_zone_builder.add_id(zone_id);
- std::optional<std::string> zone_name = ReadFileFirstLine(absl::StrFormat(
- "/sys/devices/virtual/thermal/thermal_zone%d/type", zone_id));
- if (zone_name) {
- thermal_zone_builder.add_name(builder.fbb()->CreateString(*zone_name));
+ if (!name_offset.IsNull()) {
+ thermal_zone_builder.add_name(name_offset);
}
std::optional<std::string> temperature_str =
@@ -93,54 +99,68 @@
std::optional<std::string> fan_speed_str = ReadFileFirstLine(
absl::StrFormat("/sys/class/hwmon/%s/rpm", fan_hwmon_));
- // Iterate through INA3221 electrical reading channels
- std::vector<flatbuffers::Offset<ElectricalReading>> electrical_readings;
- for (int channel = 1; channel <= 3; channel++) {
- ElectricalReading::Builder electrical_reading_builder =
- builder.MakeBuilder<ElectricalReading>();
- electrical_reading_builder.add_channel(channel);
+ flatbuffers::Offset<
+ flatbuffers::Vector<flatbuffers::Offset<ElectricalReading>>>
+ electrical_readings_offset;
+ if (FLAGS_log_voltages) {
+ std::vector<flatbuffers::Offset<ElectricalReading>> electrical_readings;
+ // Iterate through INA3221 electrical reading channels
+ for (int channel = 1; channel <= 3; channel++) {
+ std::optional<std::string> label = ReadFileFirstLine(absl::StrFormat(
+ "/sys/class/hwmon/%s/in%d_label", electrical_hwmon_, channel));
- std::optional<std::string> label = ReadFileFirstLine(absl::StrFormat(
- "/sys/class/hwmon/%s/in%d_label", electrical_hwmon_, channel));
- if (label) {
- electrical_reading_builder.add_label(
- builder.fbb()->CreateString(*label));
+ flatbuffers::Offset<flatbuffers::String> label_offset;
+ if (label) {
+ label_offset = builder.fbb()->CreateString(*label);
+ }
+
+ ElectricalReading::Builder electrical_reading_builder =
+ builder.MakeBuilder<ElectricalReading>();
+ electrical_reading_builder.add_channel(channel);
+
+ if (!label_offset.IsNull()) {
+ electrical_reading_builder.add_label(label_offset);
+ }
+
+ std::optional<std::string> voltage_str =
+ ReadFileFirstLine(absl::StrFormat("/sys/class/hwmon/%s/in%d_input",
+ electrical_hwmon_, channel));
+ uint64_t voltage = 0;
+ if (voltage_str && absl::SimpleAtoi(*voltage_str, &voltage)) {
+ electrical_reading_builder.add_voltage(voltage);
+ }
+
+ std::optional<std::string> current_str = ReadFileFirstLine(
+ absl::StrFormat("/sys/class/hwmon/%s/curr%d_input",
+ electrical_hwmon_, channel));
+ uint64_t current = 0;
+ if (current_str && absl::SimpleAtoi(*current_str, ¤t)) {
+ electrical_reading_builder.add_current(current);
+ }
+
+ uint64_t power = voltage * current / 1000;
+ if (power != 0) {
+ electrical_reading_builder.add_power(power);
+ }
+
+ electrical_readings.emplace_back(electrical_reading_builder.Finish());
}
-
- std::optional<std::string> voltage_str =
- ReadFileFirstLine(absl::StrFormat("/sys/class/hwmon/%s/in%d_input",
- electrical_hwmon_, channel));
- uint64_t voltage = 0;
- if (voltage_str && absl::SimpleAtoi(*voltage_str, &voltage)) {
- electrical_reading_builder.add_voltage(voltage);
- }
-
- std::optional<std::string> current_str =
- ReadFileFirstLine(absl::StrFormat("/sys/class/hwmon/%s/curr%d_input",
- electrical_hwmon_, channel));
- uint64_t current = 0;
- if (current_str && absl::SimpleAtoi(*current_str, ¤t)) {
- electrical_reading_builder.add_current(current);
- }
-
- uint64_t power = voltage * current / 1000;
- if (power != 0) {
- electrical_reading_builder.add_power(power);
- }
-
- electrical_readings.emplace_back(electrical_reading_builder.Finish());
+ electrical_readings_offset =
+ builder.fbb()->CreateVector(electrical_readings);
}
+ auto thermal_zone_offset = builder.fbb()->CreateVector(thermal_zones);
HardwareStats::Builder hardware_stats_builder =
builder.MakeBuilder<HardwareStats>();
- hardware_stats_builder.add_thermal_zones(
- builder.fbb()->CreateVector(thermal_zones));
+ hardware_stats_builder.add_thermal_zones(thermal_zone_offset);
uint64_t fan_speed = 0;
if (fan_speed_str && absl::SimpleAtoi(*fan_speed_str, &fan_speed)) {
hardware_stats_builder.add_fan_speed(fan_speed);
}
- hardware_stats_builder.add_electrical_readings(
- builder.fbb()->CreateVector(electrical_readings));
+ if (!electrical_readings_offset.IsNull()) {
+ hardware_stats_builder.add_electrical_readings(
+ electrical_readings_offset);
+ }
builder.CheckOk(builder.Send(hardware_stats_builder.Finish()));
}