Skip to content

Commit ddc0b2d

Browse files
committed
更新新版(基于PVTM的)CPU抽奖算法
1 parent 600283c commit ddc0b2d

File tree

3 files changed

+103
-10
lines changed

3 files changed

+103
-10
lines changed

bin/5bcli.dart

+57-9
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ int main(List<String> arguments) {
3131
//获取体质抽奖结果
3232
var lotteryParser = ArgParser();
3333
parser.addCommand('lottery', lotteryParser);
34+
lotteryParser.addFlag('list', abbr: 'l', negatable: false, help: '列出所有结果');
35+
lotteryParser.addFlag('legacy', negatable: false, help: '使用旧版方式获取体质抽奖结果');
3436
lotteryParser.addFlag('help', abbr: 'h', negatable: false, help: '获取帮助');
3537

3638
//读取输入电压
@@ -100,22 +102,68 @@ ${parser.usage}
100102
print(lotteryParser.usage);
101103
return 0;
102104
}
103-
var frequencies = getFreqBigClustersMHz();
104-
if (frequencies == null) {
105-
print("获取cpu频率失败");
106-
return 1;
107-
}
108105
const Map<CpuLotteryResult, String> lotteryMap = {
109106
CpuLotteryResult.level1: "一等奖",
110107
CpuLotteryResult.level2: "二等奖",
111108
CpuLotteryResult.level3: "三等奖",
112109
CpuLotteryResult.levelWorst: "参与奖",
113110
};
114-
var result0 = getCpuLotteryResult(frequencies[0]);
115-
var result1 = getCpuLotteryResult(frequencies[1]);
116111

117-
print("第一组大核频率: ${frequencies[0]}MHz, 抽奖结果: ${lotteryMap[result0]}");
118-
print("第二组大核频率: ${frequencies[1]}MHz, 抽奖结果: ${lotteryMap[result1]}");
112+
if (results.command!['list']) {
113+
print("所有体质抽奖结果:");
114+
if (results.command!['legacy']) {
115+
freq2LevelMap.forEach((key, value) {
116+
print("频率近似值: $key, 结果: ${lotteryMap[value]}");
117+
});
118+
} else {
119+
var lastValue = -1;
120+
var lastResult = CpuLotteryResult.levelWorst;
121+
pvtm2LevelMap.forEach((key, value) {
122+
if (lastValue != -1) {
123+
print(
124+
"PVTM值: $lastValue - ${key - 1}, 结果: ${lotteryMap[lastResult]}");
125+
}
126+
lastValue = key;
127+
lastResult = value;
128+
});
129+
}
130+
return 0;
131+
}
132+
133+
if (results.command!['legacy']) {
134+
var frequencies = getFreqBigClustersMHz();
135+
if (frequencies == null) {
136+
print("获取cpu频率失败");
137+
return 1;
138+
}
139+
140+
var result0 = getCpuLotteryResult(frequencies[0]);
141+
var result1 = getCpuLotteryResult(frequencies[1]);
142+
143+
print("第一组大核频率: ${frequencies[0]}MHz, 抽奖结果: ${lotteryMap[result0]}");
144+
print("第二组大核频率: ${frequencies[1]}MHz, 抽奖结果: ${lotteryMap[result1]}");
145+
print("抽奖结果受温度影响, 可以在不同温度下多次测试以获得更准确的结果");
146+
print("使用 --list 参数以列出所有可能结果");
147+
} else {
148+
try {
149+
var pvtmValues = getPvtmBigClusters();
150+
if (pvtmValues == null) {
151+
print("获取pvtm失败");
152+
return 1;
153+
}
154+
155+
var result0 = getPvtmCpuLotteryResult(pvtmValues[0]);
156+
var result1 = getPvtmCpuLotteryResult(pvtmValues[1]);
157+
158+
print("第一组大核pvtm值: ${pvtmValues[0]}, 抽奖结果: ${lotteryMap[result0]}");
159+
print("第二组大核pvtm值: ${pvtmValues[1]}, 抽奖结果: ${lotteryMap[result1]}");
160+
print("抽奖结果受温度影响, 可以在不同温度下多次测试以获得更准确的结果");
161+
print("使用 --list 参数以列出所有可能结果");
162+
} catch (e) {
163+
print("体质抽奖失败: $e");
164+
}
165+
}
166+
119167
break;
120168
case 'input_voltage':
121169
if (results.command!['help']) {

lib/cpu_lottery.dart

+45
Original file line numberDiff line numberDiff line change
@@ -60,3 +60,48 @@ CpuLotteryResult getCpuLotteryResult(int freqMHz) {
6060
});
6161
return freq2LevelMap[minKey];
6262
}
63+
64+
//
65+
const Map pvtm2LevelMap = {
66+
0: CpuLotteryResult.levelWorst,
67+
1616: CpuLotteryResult.level3,
68+
1641: CpuLotteryResult.level2,
69+
1676: CpuLotteryResult.levelWorst,
70+
1711: CpuLotteryResult.level3,
71+
1744: CpuLotteryResult.level2,
72+
1777: CpuLotteryResult.level1,
73+
9999: CpuLotteryResult.level1
74+
};
75+
76+
///获取CPU大核PVTM值
77+
///目前只能通过读取内核日志来获取...
78+
List? getPvtmBigClusters() {
79+
var dmesgProc = Process.runSync('dmesg', []);
80+
if (dmesgProc.exitCode != 0) {
81+
throw Exception('无法读取内核日志. 权限不足?');
82+
}
83+
//获取cpu4和cpu6(两组大核)的pvtm值
84+
RegExp cpuPvtmRegExp = RegExp(r'cpu[4-6]: pvtm=([0-9]+)');
85+
String kernelMsg = dmesgProc.stdout.toString();
86+
var lines = kernelMsg.split('\n');
87+
var pvtmList = <int>[];
88+
for (var line in lines) {
89+
var match = cpuPvtmRegExp.firstMatch(line);
90+
if (match != null) {
91+
var pvtm = int.parse(match.group(1)!);
92+
pvtmList.add(pvtm);
93+
}
94+
}
95+
return pvtmList;
96+
}
97+
98+
///通过PVTM值判断体质
99+
CpuLotteryResult getPvtmCpuLotteryResult(int pvtmVal) {
100+
CpuLotteryResult result = CpuLotteryResult.levelWorst;
101+
pvtm2LevelMap.forEach((key, v) {
102+
if (pvtmVal >= key) {
103+
result = v;
104+
}
105+
});
106+
return result;
107+
}

pubspec.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: a5btool
22
description: A tool for Rock 5B running Linux
3-
version: 1.1.0
3+
version: 1.2.0
44
# homepage: https://www.example.com
55

66
environment:

0 commit comments

Comments
 (0)