qsysinfo.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512
  1. #include "qappctrl.h"
  2. #include "../../src/defines.h"
  3. /////////////////////////////////////////////////////////////////////////////
  4. /////////////////////////////////////////////////////////////////////////////
  5. /////////////////////////////////////////////////////////////////////////////
  6. #define _countof(a) (sizeof(a) / sizeof(*a))
  7. /////////////////////////////////////////////////////////////////////////////
  8. #define _OPT_STRING(s, o) (*s ? s : o)
  9. #define _NA_STRING(s) _OPT_STRING(s, "n/a")
  10. /////////////////////////////////////////////////////////////////////////////
  11. #define _BYTE_SIZE_KIB (1ULL << 10) // Kibibyte
  12. #define _BYTE_SIZE_MIB (1ULL << 20) // Mebibyte
  13. #define _BYTE_SIZE_GIB (1ULL << 30) // Gibibyte
  14. #define _BYTE_SIZE_TIB (1ULL << 40) // Tebibyte
  15. #define _BYTE_SIZE_PIB (1ULL << 50) // Pebibyte
  16. #define _BYTE_SIZE_EIB (1ULL << 60) // Exbibyte
  17. /////////////////////////////////////////////////////////////////////////////
  18. static const char *_FormatByteSize(unsigned long long nCb, char *pszBuf, size_t nCChBuf, bool bShortUnits = true, int nPrec = 1);
  19. /////////////////////////////////////////////////////////////////////////////
  20. static const char *_FormatByteSize(unsigned long long nCb, char *pszBuf, size_t nCChBuf, bool bShortUnits, int nPrec)
  21. {
  22. if(pszBuf && nCChBuf)
  23. {
  24. double val = nCb;
  25. if(nCb < _BYTE_SIZE_KIB)
  26. {
  27. snprintf(pszBuf, nCChBuf, "%llu %s", nCb, bShortUnits ? "B" : "Byte"); // Byte
  28. }
  29. else if(nCb < _BYTE_SIZE_MIB)
  30. {
  31. val /= _BYTE_SIZE_KIB;
  32. snprintf(pszBuf, nCChBuf, "%.*f %s", nPrec, val, bShortUnits ? "K" : "KiB"); // KiB
  33. }
  34. else if(nCb < _BYTE_SIZE_GIB)
  35. {
  36. val /= _BYTE_SIZE_MIB;
  37. snprintf(pszBuf, nCChBuf, "%.*f %s", nPrec, val, bShortUnits ? "M" : "MiB"); // MiB
  38. }
  39. else if(nCb < _BYTE_SIZE_TIB)
  40. {
  41. val /= _BYTE_SIZE_GIB;
  42. snprintf(pszBuf, nCChBuf, "%.*f %s", nPrec, val, bShortUnits ? "G" : "GiB"); // GiB
  43. }
  44. else if(nCb < _BYTE_SIZE_PIB)
  45. {
  46. val /= _BYTE_SIZE_TIB;
  47. snprintf(pszBuf, nCChBuf, "%.*f %s", nPrec, val, bShortUnits ? "T" : "TiB"); // TiB
  48. }
  49. else if(nCb < _BYTE_SIZE_EIB)
  50. {
  51. val /= _BYTE_SIZE_PIB;
  52. snprintf(pszBuf, nCChBuf, "%.*f %s", nPrec, val, bShortUnits ? "P" : "PiB"); // PiB
  53. }
  54. return pszBuf;
  55. }
  56. return NULL;
  57. }
  58. /////////////////////////////////////////////////////////////////////////////
  59. typedef enum
  60. {
  61. SDR_DiskName = Qt::UserRole,
  62. SDR_DiskDevNode,
  63. SDR_DiskBusType,
  64. SDR_DiskVendorName,
  65. SDR_DiskVendorID,
  66. SDR_DiskProductID,
  67. SDR_PartFsLabel,
  68. SDR_PartFsType,
  69. SDR_PartFsVersion,
  70. SDR_PartDevNode,
  71. SDR_PartMountPoint,
  72. SDR_PartSize,
  73. SDR_PartFsSize,
  74. SDR_PartFsFree,
  75. SDR_PartFsUsed
  76. }StgDevRoles;
  77. typedef struct _STG_DEV_ROLES
  78. {
  79. int nRole;
  80. const char *pszRoleName;
  81. }STG_DEV_ROLES, *LPSTG_DEV_ROLES;
  82. typedef const STG_DEV_ROLES *LPCSTG_DEV_ROLES;
  83. /////////////////////////////////////////////////////////////////////////////
  84. static const STG_DEV_ROLES g_roles[] =
  85. {
  86. {SDR_DiskName, "DiskName"},
  87. {SDR_DiskDevNode, "DiskDevNode"},
  88. {SDR_DiskBusType, "DiskDevType"},
  89. {SDR_DiskVendorName, "DiskVendorName"},
  90. {SDR_DiskVendorID, "DiskVendorID"},
  91. {SDR_DiskProductID, "DiskProductID"},
  92. {SDR_PartFsLabel, "PartFsLabel"},
  93. {SDR_PartFsType, "PartFsType"},
  94. {SDR_PartFsVersion, "PartFsVersion"},
  95. {SDR_PartDevNode, "PartDevNode"},
  96. {SDR_PartMountPoint, "PartMountPoint"},
  97. {SDR_PartSize, "PartSize"},
  98. {SDR_PartFsSize, "PartFsSize"},
  99. {SDR_PartFsFree, "PartFsFree"},
  100. {SDR_PartFsUsed, "PartFsUsed"}
  101. };
  102. /////////////////////////////////////////////////////////////////////////////
  103. QGfaStgDevList::QGfaStgDevList(QObject *pParent) : QAbstractTableModel(pParent)
  104. {
  105. memset(&m_stgDevShadowCpy, 0, sizeof(m_stgDevShadowCpy));
  106. setObjectName("QGfaStgDevList");
  107. }
  108. QGfaStgDevList::~QGfaStgDevList(void)
  109. {
  110. }
  111. int QGfaStgDevList::rowCount(const QModelIndex &parent) const
  112. {
  113. Q_UNUSED(parent);
  114. return (int)m_partVec.size();
  115. }
  116. int QGfaStgDevList::columnCount(const QModelIndex &parent) const
  117. {
  118. Q_UNUSED(parent);
  119. return (int)_countof(g_roles);
  120. }
  121. QVariant QGfaStgDevList::data(const QModelIndex &index, int role) const
  122. {
  123. if(!index.isValid())
  124. return QVariant();
  125. QVariant val;
  126. char szBuf[64];
  127. int nIndex = index.row();
  128. const STG_DEV_DISK_PART &dp = m_partVec[nIndex];
  129. const GFA_SYSINFO_DISK &disk = m_stgDevShadowCpy.disks[dp.nDiskIdx];
  130. const GFA_SYSINFO_PARTITION &part = m_stgDevShadowCpy.parts[dp.nPartIdx];
  131. if(disk.valid && part.valid)
  132. {
  133. switch(role)
  134. {
  135. case SDR_DiskName:
  136. val = _NA_STRING(disk.szName);
  137. break;
  138. case SDR_DiskDevNode:
  139. val = _NA_STRING(disk.szDevNode);
  140. break;
  141. case SDR_DiskBusType:
  142. val = _OPT_STRING(disk.szBus, "mmc");
  143. break;
  144. case SDR_DiskVendorName:
  145. val = _NA_STRING(disk.szVendor);
  146. break;
  147. case SDR_DiskVendorID:
  148. val = (int)disk.nVendorID;
  149. break;
  150. case SDR_DiskProductID:
  151. val = (int)disk.nProductID;
  152. break;
  153. case SDR_PartFsLabel:
  154. val = _NA_STRING(part.szFsLabel);
  155. break;
  156. case SDR_PartFsType:
  157. val = _NA_STRING(part.szFsType);
  158. break;
  159. case SDR_PartFsVersion:
  160. val = _NA_STRING(part.szFsVersion);
  161. break;
  162. case SDR_PartDevNode:
  163. val = _NA_STRING(part.szDevNode);
  164. break;
  165. case SDR_PartMountPoint:
  166. val = _NA_STRING(part.szMntPoint);
  167. break;
  168. case SDR_PartSize:
  169. val = _FormatByteSize(part.nKiBPartSize * _BYTE_SIZE_KIB, szBuf, _countof(szBuf));
  170. break;
  171. case SDR_PartFsSize:
  172. val = _FormatByteSize(part.nKiBSize * _BYTE_SIZE_KIB, szBuf, _countof(szBuf));
  173. break;
  174. case SDR_PartFsFree:
  175. val = _FormatByteSize(part.nKiBFree * _BYTE_SIZE_KIB, szBuf, _countof(szBuf));
  176. break;
  177. case SDR_PartFsUsed:
  178. val = _FormatByteSize(part.nKiBUsed * _BYTE_SIZE_KIB, szBuf, _countof(szBuf));
  179. break;
  180. default:
  181. break;
  182. }
  183. }
  184. return val;
  185. }
  186. QHash<int, QByteArray> QGfaStgDevList::roleNames(void) const
  187. {
  188. QHash<int, QByteArray> roles;
  189. for(size_t i = 0; i < _countof(g_roles); ++i)
  190. {
  191. roles[g_roles[i].nRole] = g_roles[i].pszRoleName;
  192. }
  193. return roles;
  194. }
  195. int QGfaStgDevList::FindPartVecEntry(int nDiskIdx, int nPartIdx)
  196. {
  197. for(auto it = m_partVec.begin(); it != m_partVec.end(); ++it)
  198. {
  199. const STG_DEV_DISK_PART &dp = *it;
  200. if((dp.nDiskIdx == nDiskIdx) && (dp.nPartIdx == nPartIdx))
  201. return it - m_partVec.begin();
  202. }
  203. return -1;
  204. }
  205. void QGfaStgDevList::insertPartition(int nDiskIdx, int nPartIdx)
  206. {
  207. QModelIndex parent = QModelIndex();
  208. int nIndex = (int)m_partVec.size();
  209. emit beginInsertRows(parent, nIndex, nIndex);
  210. m_partVec.emplace_back(nDiskIdx, nPartIdx);
  211. emit endInsertRows();
  212. }
  213. void QGfaStgDevList::removePartition(int nDiskIdx, int nPartIdx)
  214. {
  215. int nIndex;
  216. if((nIndex = FindPartVecEntry(nDiskIdx, nPartIdx)) >= 0)
  217. {
  218. QModelIndex parent = QModelIndex();
  219. emit beginRemoveRows(parent, nIndex, nIndex);
  220. m_partVec.erase(m_partVec.begin() + nIndex);
  221. emit endRemoveRows();
  222. }
  223. }
  224. void QGfaStgDevList::diskAdded(int nIndex, const GFA_SYSINFO_DISK &disk)
  225. {
  226. if((nIndex >= 0) && (nIndex < (int)_countof(m_stgDevShadowCpy.disks)) && !disk.internal)
  227. {
  228. TRACE("Disk [ID=%d] added: %s [%s]\n", nIndex, disk.szDevNode, *disk.szName ? disk.szName : "Unnamed");
  229. memcpy(&m_stgDevShadowCpy.disks[nIndex], &disk, sizeof(GFA_SYSINFO_DISK));
  230. }
  231. }
  232. void QGfaStgDevList::diskRemoved(int nIndex, const GFA_SYSINFO_DISK &disk)
  233. {
  234. if((nIndex >= 0) && (nIndex < (int)_countof(m_stgDevShadowCpy.disks)) && !disk.internal)
  235. {
  236. TRACE("Disk [ID=%d] removed: %s [%s]\n", nIndex, disk.szDevNode, *disk.szName ? disk.szName : "Unnamed");
  237. m_stgDevShadowCpy.disks[nIndex].valid = false;
  238. }
  239. }
  240. void QGfaStgDevList::partitionAdded(int nIndex, const GFA_SYSINFO_PARTITION &part)
  241. {
  242. if((nIndex >= 0) && (nIndex < (int)_countof(m_stgDevShadowCpy.parts)) && !part.internal)
  243. {
  244. TRACE("Partition [ID=%d:%d] added: %s [%s]\n", part.nDiskIdx, nIndex, part.szDevNode, *part.szFsLabel ? part.szFsLabel : "Unnamed");
  245. memcpy(&m_stgDevShadowCpy.parts[nIndex], &part, sizeof(GFA_SYSINFO_PARTITION));
  246. insertPartition(part.nDiskIdx, nIndex);
  247. }
  248. }
  249. void QGfaStgDevList::partitionRemoved(int nIndex, const GFA_SYSINFO_PARTITION &part)
  250. {
  251. if((nIndex >= 0) && (nIndex < (int)_countof(m_stgDevShadowCpy.parts)) && !part.internal)
  252. {
  253. TRACE("Partition [ID=%d:%d] removed: %s [%s]\n", part.nDiskIdx, nIndex, part.szDevNode, *part.szFsLabel ? part.szFsLabel : "Unnamed");
  254. m_stgDevShadowCpy.parts[nIndex].valid = false;
  255. removePartition(part.nDiskIdx, nIndex);
  256. }
  257. }
  258. void QGfaStgDevList::mountAdded(int nIndex, const GFA_SYSINFO_PARTITION &part)
  259. {
  260. if((nIndex >= 0) && (nIndex < (int)_countof(m_stgDevShadowCpy.parts)) && !part.internal)
  261. {
  262. TRACE("Partition [ID=%d:%d] mounted: %s -> %s\n", part.nDiskIdx, nIndex, part.szDevNode, part.szMntPoint);
  263. GFA_SYSINFO_PARTITION &p = m_stgDevShadowCpy.parts[nIndex];
  264. memcpy(&p.szMntPoint, &part.szMntPoint, sizeof(GFA_SYSINFO_PARTITION::szMntPoint));
  265. if((nIndex = FindPartVecEntry(part.nDiskIdx, nIndex)) >= 0)
  266. {
  267. p.nKiBSize = part.nKiBSize;
  268. p.nKiBFree = part.nKiBFree;
  269. p.nKiBUsed = part.nKiBUsed;
  270. QModelIndex i = createIndex(nIndex, 0);
  271. emit dataChanged(i, i, {SDR_PartMountPoint, SDR_PartFsSize, SDR_PartFsFree, SDR_PartFsUsed});
  272. }
  273. }
  274. }
  275. void QGfaStgDevList::mountRemoved(int nIndex, const GFA_SYSINFO_PARTITION &part)
  276. {
  277. if((nIndex >= 0) && (nIndex < (int)_countof(m_stgDevShadowCpy.parts)) && !part.internal)
  278. {
  279. TRACE("Partition [ID=%d:%d] unmounted: %s\n", part.nDiskIdx, nIndex, part.szDevNode);
  280. GFA_SYSINFO_PARTITION &p = m_stgDevShadowCpy.parts[nIndex];
  281. memset(&p.szMntPoint, 0, sizeof(GFA_SYSINFO_PARTITION::szMntPoint));
  282. if((nIndex = FindPartVecEntry(part.nDiskIdx, nIndex)) >= 0)
  283. {
  284. p.nKiBSize = 0;
  285. p.nKiBFree = 0;
  286. p.nKiBUsed = 0;
  287. QModelIndex i = createIndex(nIndex, 0);
  288. emit dataChanged(i, i, {SDR_PartMountPoint, SDR_PartFsSize, SDR_PartFsFree, SDR_PartFsUsed});
  289. }
  290. }
  291. }
  292. void QGfaStgDevList::clearAll(void)
  293. {
  294. int nLast = m_partVec.size() - 1;
  295. if(nLast >= 0)
  296. {
  297. QModelIndex parent = QModelIndex();
  298. emit beginRemoveRows(parent, 0, nLast);
  299. m_partVec.clear();
  300. memset(&m_stgDevShadowCpy, 0, sizeof(m_stgDevShadowCpy));
  301. emit endRemoveRows();
  302. }
  303. }
  304. /////////////////////////////////////////////////////////////////////////////
  305. /////////////////////////////////////////////////////////////////////////////
  306. /////////////////////////////////////////////////////////////////////////////
  307. QGfaSysInfo::QGfaSysInfo(QObject *pParent) : QObject(pParent),
  308. m_bSysInfoRunning(false),
  309. m_nMemTotal(0),
  310. m_nMemUsed(0),
  311. m_nMemFree(0),
  312. m_nMemAvailable(0),
  313. m_nMemBuffers(0),
  314. m_nMemCached(0),
  315. m_bootFromEmmc(false)
  316. {
  317. }
  318. QGfaSysInfo::~QGfaSysInfo(void)
  319. {
  320. setObjectName("QGfaSysInfo");
  321. }
  322. /////////////////////////////////////////////////////////////////////////////
  323. void QGfaSysInfo::setSysInfoRunning(bool bRunning)
  324. {
  325. if(m_bSysInfoRunning != bRunning)
  326. {
  327. if(!(m_bSysInfoRunning = bRunning))
  328. {
  329. setSysMemInfo(NULL);
  330. m_stgDevList.clearAll();
  331. }
  332. }
  333. }
  334. void QGfaSysInfo::setSysMemInfo(LPCGFA_APPCTRL_SYSMEM psm, bool bDoHeavyLoadUpdate)
  335. {
  336. if(psm && m_bSysInfoRunning)
  337. {
  338. if(bDoHeavyLoadUpdate)
  339. {
  340. if(m_nMemTotal != psm->nMemTotal)
  341. {
  342. m_nMemTotal = psm->nMemTotal;
  343. emit memTotalChanged(m_nMemTotal);
  344. }
  345. if(m_nMemUsed != psm->nMemUsed)
  346. {
  347. m_nMemUsed = psm->nMemUsed;
  348. emit memUsedChanged(m_nMemUsed);
  349. }
  350. if(m_nMemFree != psm->nMemFree)
  351. {
  352. m_nMemFree = psm->nMemFree;
  353. emit memFreeChanged(m_nMemFree);
  354. }
  355. if(m_nMemAvailable != psm->nMemAvailable)
  356. {
  357. m_nMemAvailable = psm->nMemAvailable;
  358. emit memAvailableChanged(m_nMemAvailable);
  359. }
  360. if(m_nMemBuffers != psm->nMemBuffers)
  361. {
  362. m_nMemBuffers = psm->nMemBuffers;
  363. emit memBuffersChanged(m_nMemBuffers);
  364. }
  365. if(m_nMemCached != psm->nMemCached)
  366. {
  367. m_nMemCached = psm->nMemCached;
  368. emit memCachedChanged(m_nMemCached);
  369. }
  370. }
  371. }
  372. else
  373. {
  374. if(m_nMemTotal != 0)
  375. {
  376. m_nMemTotal = 0;
  377. emit memTotalChanged(m_nMemTotal);
  378. }
  379. if(m_nMemUsed != 0)
  380. {
  381. m_nMemUsed = 0;
  382. emit memUsedChanged(m_nMemUsed);
  383. }
  384. if(m_nMemFree != 0)
  385. {
  386. m_nMemFree = 0;
  387. emit memFreeChanged(m_nMemFree);
  388. }
  389. if(m_nMemAvailable != 0)
  390. {
  391. m_nMemAvailable = 0;
  392. emit memAvailableChanged(m_nMemAvailable);
  393. }
  394. if(m_nMemBuffers != 0)
  395. {
  396. m_nMemBuffers = 0;
  397. emit memBuffersChanged(m_nMemBuffers);
  398. }
  399. if(m_nMemCached != 0)
  400. {
  401. m_nMemCached = 0;
  402. emit memCachedChanged(m_nMemCached);
  403. }
  404. }
  405. }
  406. /////////////////////////////////////////////////////////////////////////////
  407. quint64 QGfaSysInfo::memTotal(void) const
  408. {
  409. return m_nMemTotal;
  410. }
  411. quint64 QGfaSysInfo::memUsed(void) const
  412. {
  413. return m_nMemUsed;
  414. }
  415. quint64 QGfaSysInfo::memFree(void) const
  416. {
  417. return m_nMemFree;
  418. }
  419. quint64 QGfaSysInfo::memAvailable(void) const
  420. {
  421. return m_nMemAvailable;
  422. }
  423. quint64 QGfaSysInfo::memBuffers(void) const
  424. {
  425. return m_nMemBuffers;
  426. }
  427. quint64 QGfaSysInfo::memCached(void) const
  428. {
  429. return m_nMemCached;
  430. }
  431. QGfaStgDevList* QGfaSysInfo::stgDev(void)
  432. {
  433. return &m_stgDevList;
  434. }
  435. bool QGfaSysInfo::bootFromEmmc(void) const
  436. {
  437. return m_bootFromEmmc;
  438. }
  439. void QGfaSysInfo::setBootFromEmmc(bool bootFromEmmc)
  440. {
  441. if(m_bootFromEmmc != bootFromEmmc)
  442. {
  443. m_bootFromEmmc = bootFromEmmc;
  444. emit bootFromEmmcChanged(m_bootFromEmmc);
  445. }
  446. }