| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- #include "sysstate.h"
- #include "utils.h"
- #include "logger.h"
- #include "defs.h"
- #include <QFile>
- #include <QTextStream>
- #include <sys/statvfs.h>
- #include <math.h>
- SysState::SysState(QObject *parent)
- : QObject{parent}
- , m_cputemp(0)
- , m_meminfo(0)
- , m_diskinfo(0)
- {
- connect(&m_detectTimer, &QTimer::timeout, this, &SysState::onDetectSysState);
- QTimer::singleShot(0, this, &SysState::onDetectSysState);
- m_detectTimer.start(10000);
- }
- QJsonObject SysState::sysStateInfo()
- {
- QJsonObject obj;
- obj["cputemp"]= (int)floor(m_cputemp);
- obj["meminfo"]= (int)floor(m_meminfo);
- obj["diskinfo"] = (int)floor(m_diskinfo);
- return obj;
- }
- float SysState::cpuTemperature()
- {
- QStringList cpuZones = {
- BIG_CORE0,
- BIG_CORE1,
- LITTLE_CORE
- };
- float maxTemp = 0;
- for (const QString &zone : cpuZones) {
- QFile file(zone + "/temp");
- if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
- return -1;
- QTextStream in(&file);
- in.setCodec("UTF-8");
- float temp = in.readLine().toInt() / 1000.0; // 毫摄氏度转 °C
- if (temp > maxTemp)
- maxTemp = temp; // 也可以取平均值
- }
- return maxTemp;
- }
- float SysState::meminfo()
- {
- FILE *fp = fopen(MEMINFO, "r");
- if (fp == NULL) {
- LOG_ERROR("get meminfo error");
- return -1;
- }
- char line[256];
- long memTotal = 0;
- long memAvailable = 0;
- while (fgets(line, sizeof(line), fp)) {
- if (sscanf(line, "MemTotal: %ld kB", &memTotal) == 1) {
- continue;
- }
- if (sscanf(line, "MemAvailable: %ld kB", &memAvailable) == 1) {
- break; // 找到 MemAvailable 后就可以退出
- }
- }
- fclose(fp);
- if (memTotal == 0) {
- LOG_ERROR("cannot read MemTotal");
- return -1;
- }
- long memUsed = memTotal - memAvailable;
- float usagePercent = 1.0 * memUsed / memTotal * 100;
- return usagePercent;
- }
- float SysState::diskinfo()
- {
- const char *mounts[] = {MOUNT_ROOTFS, MOUNT_USERDATA};
- unsigned long long total_all = 0;
- unsigned long long free_all = 0;
- for (int i = 0; i < 2; i++) {
- struct statvfs stat;
- if (statvfs(mounts[i], &stat) != 0) {
- perror(mounts[i]);
- continue;
- }
- unsigned long long total = (unsigned long long)stat.f_blocks * stat.f_frsize;
- unsigned long long free = (unsigned long long)stat.f_bfree * stat.f_frsize;
- total_all += total;
- free_all += free;
- }
- unsigned long long used_all = total_all - free_all;
- float usagePercent = (total_all == 0) ? 0.0 : 1.0 * used_all / total_all * 100;
- return usagePercent;
- }
- void SysState::onDetectSysState()
- {
- float cputemp = cpuTemperature();
- float sysmeminfo = meminfo();
- float sysdiskinfo = diskinfo();
- m_cputemp = (int)floor(cputemp);
- m_meminfo = (int)floor(sysmeminfo);
- m_diskinfo = (int)floor(sysdiskinfo);
- }
|