sysstate.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. #include "sysstate.h"
  2. #include "utils.h"
  3. #include "logger.h"
  4. #include "defs.h"
  5. #include <QFile>
  6. #include <QTextStream>
  7. #include <sys/statvfs.h>
  8. #include <math.h>
  9. SysState::SysState(QObject *parent)
  10. : QObject{parent}
  11. , m_cputemp(0)
  12. , m_meminfo(0)
  13. , m_diskinfo(0)
  14. {
  15. connect(&m_detectTimer, &QTimer::timeout, this, &SysState::onDetectSysState);
  16. QTimer::singleShot(0, this, &SysState::onDetectSysState);
  17. m_detectTimer.start(10000);
  18. }
  19. QJsonObject SysState::sysStateInfo()
  20. {
  21. QJsonObject obj;
  22. obj["cputemp"]= (int)floor(m_cputemp);
  23. obj["meminfo"]= (int)floor(m_meminfo);
  24. obj["diskinfo"] = (int)floor(m_diskinfo);
  25. return obj;
  26. }
  27. float SysState::cpuTemperature()
  28. {
  29. QStringList cpuZones = {
  30. BIG_CORE0,
  31. BIG_CORE1,
  32. LITTLE_CORE
  33. };
  34. float maxTemp = 0;
  35. for (const QString &zone : cpuZones) {
  36. QFile file(zone + "/temp");
  37. if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
  38. return -1;
  39. QTextStream in(&file);
  40. in.setCodec("UTF-8");
  41. float temp = in.readLine().toInt() / 1000.0; // 毫摄氏度转 °C
  42. if (temp > maxTemp)
  43. maxTemp = temp; // 也可以取平均值
  44. }
  45. return maxTemp;
  46. }
  47. float SysState::meminfo()
  48. {
  49. FILE *fp = fopen(MEMINFO, "r");
  50. if (fp == NULL) {
  51. LOG_ERROR("get meminfo error");
  52. return -1;
  53. }
  54. char line[256];
  55. long memTotal = 0;
  56. long memAvailable = 0;
  57. while (fgets(line, sizeof(line), fp)) {
  58. if (sscanf(line, "MemTotal: %ld kB", &memTotal) == 1) {
  59. continue;
  60. }
  61. if (sscanf(line, "MemAvailable: %ld kB", &memAvailable) == 1) {
  62. break; // 找到 MemAvailable 后就可以退出
  63. }
  64. }
  65. fclose(fp);
  66. if (memTotal == 0) {
  67. LOG_ERROR("cannot read MemTotal");
  68. return -1;
  69. }
  70. long memUsed = memTotal - memAvailable;
  71. float usagePercent = 1.0 * memUsed / memTotal * 100;
  72. return usagePercent;
  73. }
  74. float SysState::diskinfo()
  75. {
  76. const char *mounts[] = {MOUNT_ROOTFS, MOUNT_USERDATA};
  77. unsigned long long total_all = 0;
  78. unsigned long long free_all = 0;
  79. for (int i = 0; i < 2; i++) {
  80. struct statvfs stat;
  81. if (statvfs(mounts[i], &stat) != 0) {
  82. perror(mounts[i]);
  83. continue;
  84. }
  85. unsigned long long total = (unsigned long long)stat.f_blocks * stat.f_frsize;
  86. unsigned long long free = (unsigned long long)stat.f_bfree * stat.f_frsize;
  87. total_all += total;
  88. free_all += free;
  89. }
  90. unsigned long long used_all = total_all - free_all;
  91. float usagePercent = (total_all == 0) ? 0.0 : 1.0 * used_all / total_all * 100;
  92. return usagePercent;
  93. }
  94. void SysState::onDetectSysState()
  95. {
  96. float cputemp = cpuTemperature();
  97. float sysmeminfo = meminfo();
  98. float sysdiskinfo = diskinfo();
  99. m_cputemp = (int)floor(cputemp);
  100. m_meminfo = (int)floor(sysmeminfo);
  101. m_diskinfo = (int)floor(sysdiskinfo);
  102. }