Sidebar Metrics

This commit is contained in:
James
2025-12-01 12:00:00 -07:00
parent 7919e10c10
commit f0444110c9
4 changed files with 125 additions and 16 deletions
+107 -15
View File
@@ -47,19 +47,47 @@ Sidebar::Sidebar(QWidget *parent) : QFrame(parent), onroad(false), flag_pressed(
void Sidebar::mousePressEvent(QMouseEvent *event) {
// FrogPilot variables
QPoint pos = event->pos();
static constexpr QRect cpuRect = {30, 496, 240, 126};
static constexpr QRect memoryRect = {30, 654, 240, 126};
static constexpr QRect tempRect = {30, 338, 240, 126};
static int showChip = 0;
static int showMemory = 0;
static int showTemp = 0;
FrogPilotUIState *fs = frogpilotUIState();
FrogPilotUIScene &frogpilot_scene = fs->frogpilot_scene;
QJsonObject &frogpilot_toggles = frogpilot_scene.frogpilot_toggles;
if (onroad && home_btn.contains(event->pos())) {
if (cpuRect.contains(pos) && frogpilot_toggles.value("developer_ui").toBool()) {
showChip = (showChip + 1) % 3;
params.putBool("ShowCPU", showChip == 1);
params.putBool("ShowGPU", showChip == 2);
} else if (memoryRect.contains(pos) && frogpilot_toggles.value("developer_ui").toBool()) {
showMemory = (showMemory + 1) % 4;
params.putBool("ShowMemoryUsage", showMemory == 1);
params.putBool("ShowStorageLeft", showMemory == 2);
params.putBool("ShowStorageUsed", showMemory == 3);
} else if (tempRect.contains(pos) && frogpilot_toggles.value("developer_ui").toBool()) {
showTemp = (showTemp + 1) % 3;
params.putBool("Fahrenheit", showTemp == 2);
params.putBool("NumericalTemp", showTemp != 0);
} else if (onroad && home_btn.contains(pos)) {
flag_pressed = true;
update();
} else if (settings_btn.contains(event->pos())) {
} else if (settings_btn.contains(pos)) {
settings_pressed = true;
update();
} else if (recording_audio && mic_indicator_btn.contains(event->pos())) {
mic_indicator_pressed = true;
}
if (!(flag_pressed || mic_indicator_pressed || settings_pressed)) {
update();
updateFrogPilotToggles();
}
}
@@ -115,12 +143,14 @@ void Sidebar::updateState(const UIState &s, const FrogPilotUIState &fs) {
}
setProperty("connectStatus", QVariant::fromValue(connectStatus));
ItemStatus tempStatus = {{tr("TEMP"), tr("HIGH")}, danger_color};
int maxTempC = deviceState.getMaxTempC();
QString max_temp = frogpilot_toggles.value("fahrenheit").toBool() ? QString::number(maxTempC * 9 / 5 + 32) + "°F" : QString::number(maxTempC) + "°C";
ItemStatus tempStatus = {{tr("TEMP"), frogpilot_toggles.value("numerical_temp").toBool() ? max_temp : tr("HIGH")}, danger_color};
auto ts = deviceState.getThermalStatus();
if (ts == cereal::DeviceState::ThermalStatus::GREEN) {
tempStatus = {{tr("TEMP"), tr("GOOD")}, QColor(frogpilot_toggles.value("sidebar_color1").toString())};
tempStatus = {{tr("TEMP"), frogpilot_toggles.value("numerical_temp").toBool() ? max_temp : tr("GOOD")}, QColor(frogpilot_toggles.value("sidebar_color1").toString())};
} else if (ts == cereal::DeviceState::ThermalStatus::YELLOW) {
tempStatus = {{tr("TEMP"), tr("OK")}, warning_color};
tempStatus = {{tr("TEMP"), frogpilot_toggles.value("numerical_temp").toBool() ? max_temp : tr("OK")}, warning_color};
}
setProperty("tempStatus", QVariant::fromValue(tempStatus));
@@ -133,6 +163,50 @@ void Sidebar::updateState(const UIState &s, const FrogPilotUIState &fs) {
setProperty("recordingAudio", s.scene.recording_audio);
// FrogPilot variables
if (frogpilot_toggles.value("cpu_metrics").toBool() || frogpilot_toggles.value("gpu_metrics").toBool()) {
capnp::List<int8_t>::Reader cpu_loads = deviceState.getCpuUsagePercent();
int cpu_usage = cpu_loads.size() != 0 ? std::accumulate(cpu_loads.begin(), cpu_loads.end(), 0) / cpu_loads.size() : 0;
int gpu_usage = deviceState.getGpuUsagePercent();
int usage = frogpilot_toggles.value("cpu_metrics").toBool() ? cpu_usage : gpu_usage;
QString chip_usage = QString::number(usage) + "%";
ItemStatus chipStatus = {{frogpilot_toggles.value("gpu_metrics").toBool() ? tr("GPU") : tr("CPU"), chip_usage}, QColor(frogpilot_toggles.value("sidebar_color2").toString())};
if (usage >= 85) {
chipStatus = {{frogpilot_toggles.value("gpu_metrics").toBool() ? tr("GPU") : tr("CPU"), chip_usage}, danger_color};
} else if (usage >= 70) {
chipStatus = {{frogpilot_toggles.value("gpu_metrics").toBool() ? tr("GPU") : tr("CPU"), chip_usage}, warning_color};
}
setProperty("chipStatus", QVariant::fromValue(chipStatus));
}
if (frogpilot_toggles.value("memory_metrics").toBool() || frogpilot_toggles.value("storage_left_metrics").toBool() || frogpilot_toggles.value("storage_used_metrics").toBool()) {
int free_space = deviceState.getFreeSpacePercent();
int memory_usage = deviceState.getMemoryUsagePercent();
int storage_left = frogpilotDeviceState.getFreeSpace();
int storage_used = frogpilotDeviceState.getUsedSpace();
QString memory = QString::number(memory_usage) + "%";
QString storage = QString::number(frogpilot_toggles.value("storage_left_metrics").toBool() ? storage_left : storage_used) + tr(" GB");
if (frogpilot_toggles.value("memory_metrics").toBool()) {
ItemStatus memoryStatus = {{tr("MEMORY"), memory}, QColor(frogpilot_toggles.value("sidebar_color3").toString())};
if (memory_usage >= 85) {
memoryStatus = {{tr("MEMORY"), memory}, danger_color};
} else if (memory_usage >= 70) {
memoryStatus = {{tr("MEMORY"), memory}, warning_color};
}
setProperty("memoryStatus", QVariant::fromValue(memoryStatus));
} else {
ItemStatus storageStatus = {{frogpilot_toggles.value("storage_left_metrics").toBool() ? tr("LEFT") : tr("USED"), storage}, QColor(frogpilot_toggles.value("sidebar_color3").toString())};
if (free_space < 25 && free_space >= 10) {
storageStatus = {{frogpilot_toggles.value("storage_left_metrics").toBool() ? tr("LEFT") : tr("USED"), storage}, warning_color};
} else if (10 > free_space) {
storageStatus = {{frogpilot_toggles.value("storage_left_metrics").toBool() ? tr("LEFT") : tr("USED"), storage}, danger_color};
}
setProperty("storageStatus", QVariant::fromValue(storageStatus));
}
}
}
void Sidebar::paintEvent(QPaintEvent *event) {
@@ -163,12 +237,20 @@ void Sidebar::paintEvent(QPaintEvent *event) {
QJsonObject &frogpilot_toggles = frogpilot_scene.frogpilot_toggles;
// network
int x = 58;
const QColor gray(0x54, 0x54, 0x54);
for (int i = 0; i < 5; ++i) {
p.setBrush(i < net_strength ? Qt::white : gray);
p.drawEllipse(x, 196, 27, 27);
x += 37;
if (frogpilot_toggles.value("ip_metrics").toBool()) {
p.setPen(QColor(0xff, 0xff, 0xff));
p.save();
p.setFont(InterFont(30));
p.drawText(QRect(50, 196, 225, 27), Qt::AlignLeft | Qt::AlignVCenter, frogpilotUIState()->wifi->getIp4Address());
p.restore();
} else {
int x = 58;
const QColor gray(0x54, 0x54, 0x54);
for (int i = 0; i < 5; ++i) {
p.setBrush(i < net_strength ? Qt::white : gray);
p.drawEllipse(x, 196, 27, 27);
x += 37;
}
}
p.setFont(InterFont(35));
@@ -183,8 +265,18 @@ void Sidebar::paintEvent(QPaintEvent *event) {
// metrics
drawMetric(p, temp_status.first, temp_status.second, 338);
drawMetric(p, panda_status.first, panda_status.second, 496);
drawMetric(p, connect_status.first, connect_status.second, 654);
if (frogpilot_toggles.value("cpu_metrics").toBool() || frogpilot_toggles.value("gpu_metrics").toBool()) {
drawMetric(p, chip_status.first, chip_status.second, 496);
} else {
drawMetric(p, panda_status.first, panda_status.second, 496);
}
if (frogpilot_toggles.value("memory_metrics").toBool()) {
drawMetric(p, memory_status.first, memory_status.second, 654);
} else if (frogpilot_toggles.value("storage_left_metrics").toBool() || frogpilot_toggles.value("storage_used_metrics").toBool()) {
drawMetric(p, storage_status.first, storage_status.second, 654);
} else {
drawMetric(p, connect_status.first, connect_status.second, 654);
}
}
// FrogPilot variables
+4
View File
@@ -21,6 +21,9 @@ class Sidebar : public QFrame {
Q_PROPERTY(bool recordingAudio MEMBER recording_audio NOTIFY valueChanged);
// FrogPilot properties
Q_PROPERTY(ItemStatus chipStatus MEMBER chip_status NOTIFY valueChanged)
Q_PROPERTY(ItemStatus memoryStatus MEMBER memory_status NOTIFY valueChanged)
Q_PROPERTY(ItemStatus storageStatus MEMBER storage_status NOTIFY valueChanged)
public:
explicit Sidebar(QWidget* parent = 0);
@@ -63,6 +66,7 @@ protected:
int net_strength = 0;
// FrogPilot variables
ItemStatus chip_status, memory_status, storage_status;
private:
std::unique_ptr<PubMaster> pm;
+4 -1
View File
@@ -18,7 +18,7 @@ from openpilot.common.params import Params
from openpilot.common.realtime import DT_HW
from openpilot.selfdrive.selfdrived.alertmanager import set_offroad_alert
from openpilot.system.hardware import HARDWARE, TICI, AGNOS, PC
from openpilot.system.loggerd.config import get_available_percent
from openpilot.system.loggerd.config import get_available_bytes, get_available_percent, get_used_bytes
from openpilot.system.statsd import statlog
from openpilot.common.swaglog import cloudlog
from openpilot.system.hardware.power_monitoring import PowerMonitoring
@@ -429,6 +429,9 @@ def hardware_thread(end_event, hw_queue) -> None:
# FrogPilot variables
fpmsg = messaging.new_message('frogpilotDeviceState')
fpmsg.frogpilotDeviceState.freeSpace = round(get_available_bytes(default=32.0 * (2 ** 30)) / (2 ** 30))
fpmsg.frogpilotDeviceState.usedSpace = round(get_used_bytes(default=0.0) / (2 ** 30))
pm.send("frogpilotDeviceState", fpmsg)
# Log to statsd
+10
View File
@@ -30,3 +30,13 @@ def get_available_bytes(default: int) -> int:
# FrogPilot variables
def get_used_bytes(default: int) -> int:
try:
statvfs = os.statvfs(Paths.log_root())
total_bytes = statvfs.f_blocks * statvfs.f_frsize
available_bytes = get_available_bytes(default)
used_bytes = total_bytes - available_bytes
except OSError:
used_bytes = default
return used_bytes