mirror of
https://github.com/lollipopkit/flutter_server_box.git
synced 2025-12-17 23:34:24 +01:00
#48 display all support devices temperature
This commit is contained in:
@@ -1,8 +1,7 @@
|
||||
class CpuStatus {
|
||||
List<OneTimeCpuStatus> _pre;
|
||||
List<OneTimeCpuStatus> _now;
|
||||
String temp;
|
||||
CpuStatus(this._pre, this._now, this.temp);
|
||||
CpuStatus(this._pre, this._now);
|
||||
|
||||
double usedPercent({int coreIdx = 0}) {
|
||||
if (_now.length != _pre.length) return 0;
|
||||
@@ -12,10 +11,9 @@ class CpuStatus {
|
||||
return used.isNaN ? 0 : 100 - used * 100;
|
||||
}
|
||||
|
||||
void update(List<OneTimeCpuStatus> newStatus, String newTemp) {
|
||||
void update(List<OneTimeCpuStatus> newStatus) {
|
||||
_pre = _now;
|
||||
_now = newStatus;
|
||||
temp = newTemp;
|
||||
}
|
||||
|
||||
int get coresCount => _now.length;
|
||||
@@ -96,27 +94,3 @@ List<OneTimeCpuStatus> parseCPU(String raw) {
|
||||
}
|
||||
return cpus;
|
||||
}
|
||||
|
||||
final cpuTempReg = RegExp(r'(x86_pkg_temp|cpu_thermal)');
|
||||
|
||||
String parseCPUTemp(String type, String value) {
|
||||
const noMatch = "/sys/class/thermal/thermal_zone*/type";
|
||||
// Not support to get CPU temperature
|
||||
if (type.contains(noMatch) || value.isEmpty || type.isEmpty) {
|
||||
return '';
|
||||
}
|
||||
final split = type.split('\n');
|
||||
// if no match, use idx 0
|
||||
int idx = 0;
|
||||
for (var item in split) {
|
||||
if (item.contains(cpuTempReg)) {
|
||||
break;
|
||||
}
|
||||
idx++;
|
||||
}
|
||||
final valueSplited = value.split('\n');
|
||||
if (idx >= valueSplited.length) return '';
|
||||
final temp = int.tryParse(valueSplited[idx].trim());
|
||||
if (temp == null) return '';
|
||||
return '${(temp / 1000).toStringAsFixed(1)}°C';
|
||||
}
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import 'package:toolbox/data/model/server/temp.dart';
|
||||
|
||||
import 'cpu_status.dart';
|
||||
import 'disk_info.dart';
|
||||
import 'memory.dart';
|
||||
@@ -13,6 +15,7 @@ class ServerStatus {
|
||||
List<DiskInfo> disk;
|
||||
ConnStatus tcp;
|
||||
NetSpeed netSpeed;
|
||||
Temperatures temps;
|
||||
String? failedInfo;
|
||||
|
||||
ServerStatus({
|
||||
@@ -24,6 +27,7 @@ class ServerStatus {
|
||||
required this.tcp,
|
||||
required this.netSpeed,
|
||||
required this.swap,
|
||||
required this.temps,
|
||||
this.failedInfo,
|
||||
});
|
||||
}
|
||||
|
||||
@@ -24,6 +24,7 @@ extension _SegmentsExt on List<String> {
|
||||
Future<ServerStatus> getStatus(ServerStatusUpdateReq req) async {
|
||||
final net = parseNetSpeed(req.segments.at(CmdType.net));
|
||||
req.ss.netSpeed.update(net);
|
||||
|
||||
final sys = _parseSysVer(
|
||||
req.segments.at(CmdType.sys),
|
||||
req.segments.at(CmdType.host),
|
||||
@@ -32,22 +33,29 @@ Future<ServerStatus> getStatus(ServerStatusUpdateReq req) async {
|
||||
if (sys != null) {
|
||||
req.ss.sysVer = sys;
|
||||
}
|
||||
|
||||
final cpus = parseCPU(req.segments.at(CmdType.cpu));
|
||||
final cpuTemp = parseCPUTemp(
|
||||
req.ss.cpu.update(cpus);
|
||||
|
||||
req.ss.temps.parse(
|
||||
req.segments.at(CmdType.tempType),
|
||||
req.segments.at(CmdType.tempVal),
|
||||
);
|
||||
req.ss.cpu.update(cpus, cpuTemp);
|
||||
|
||||
final tcp = parseConn(req.segments.at(CmdType.conn));
|
||||
if (tcp != null) {
|
||||
req.ss.tcp = tcp;
|
||||
}
|
||||
|
||||
req.ss.disk = parseDisk(req.segments.at(CmdType.disk));
|
||||
|
||||
req.ss.mem = parseMem(req.segments.at(CmdType.mem));
|
||||
|
||||
final uptime = _parseUpTime(req.segments.at(CmdType.uptime));
|
||||
if (uptime != null) {
|
||||
req.ss.uptime = uptime;
|
||||
}
|
||||
|
||||
req.ss.swap = parseSwap(req.segments.at(CmdType.mem));
|
||||
return req.ss;
|
||||
}
|
||||
|
||||
61
lib/data/model/server/temp.dart
Normal file
61
lib/data/model/server/temp.dart
Normal file
@@ -0,0 +1,61 @@
|
||||
class Temperatures {
|
||||
final Map<String, double> _map = {};
|
||||
|
||||
Temperatures();
|
||||
|
||||
void parse(String type, String value) {
|
||||
const noMatch = "/sys/class/thermal/thermal_zone*/type";
|
||||
// Not support to get CPU temperature
|
||||
if (type.contains(noMatch) || value.isEmpty || type.isEmpty) {
|
||||
return;
|
||||
}
|
||||
final typeSplited = type.split('\n');
|
||||
final valueSplited = value.split('\n');
|
||||
if (typeSplited.length != valueSplited.length) {
|
||||
return;
|
||||
}
|
||||
for (var i = 0; i < typeSplited.length; i++) {
|
||||
final t = typeSplited[i];
|
||||
final v = valueSplited[i];
|
||||
if (t.isEmpty || v.isEmpty) {
|
||||
continue;
|
||||
}
|
||||
final name = t.split('/').last;
|
||||
final temp = double.tryParse(v);
|
||||
if (temp == null) {
|
||||
continue;
|
||||
}
|
||||
_map[name] = temp / 1000;
|
||||
}
|
||||
}
|
||||
|
||||
void add(String name, double value) {
|
||||
_map[name] = value;
|
||||
}
|
||||
|
||||
double? get(String name) {
|
||||
return _map[name];
|
||||
}
|
||||
|
||||
Iterable<String> get devices {
|
||||
return _map.keys;
|
||||
}
|
||||
|
||||
bool get isEmpty {
|
||||
return _map.isEmpty;
|
||||
}
|
||||
|
||||
double? get first {
|
||||
if (_map.isEmpty) {
|
||||
return null;
|
||||
}
|
||||
for (final key in _map.keys) {
|
||||
if (cpuTempReg.hasMatch(key)) {
|
||||
return _map[key];
|
||||
}
|
||||
}
|
||||
return _map.values.first;
|
||||
}
|
||||
}
|
||||
|
||||
final cpuTempReg = RegExp(r'(x86_pkg_temp|cpu_thermal)');
|
||||
Reference in New Issue
Block a user