Skip to content

Commit

Permalink
更新新版(基于PVTM的)CPU抽奖算法
Browse files Browse the repository at this point in the history
  • Loading branch information
happyme531 committed Nov 10, 2022
1 parent 600283c commit ddc0b2d
Show file tree
Hide file tree
Showing 3 changed files with 103 additions and 10 deletions.
66 changes: 57 additions & 9 deletions bin/5bcli.dart
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ int main(List<String> arguments) {
//获取体质抽奖结果
var lotteryParser = ArgParser();
parser.addCommand('lottery', lotteryParser);
lotteryParser.addFlag('list', abbr: 'l', negatable: false, help: '列出所有结果');
lotteryParser.addFlag('legacy', negatable: false, help: '使用旧版方式获取体质抽奖结果');
lotteryParser.addFlag('help', abbr: 'h', negatable: false, help: '获取帮助');

//读取输入电压
Expand Down Expand Up @@ -100,22 +102,68 @@ ${parser.usage}
print(lotteryParser.usage);
return 0;
}
var frequencies = getFreqBigClustersMHz();
if (frequencies == null) {
print("获取cpu频率失败");
return 1;
}
const Map<CpuLotteryResult, String> lotteryMap = {
CpuLotteryResult.level1: "一等奖",
CpuLotteryResult.level2: "二等奖",
CpuLotteryResult.level3: "三等奖",
CpuLotteryResult.levelWorst: "参与奖",
};
var result0 = getCpuLotteryResult(frequencies[0]);
var result1 = getCpuLotteryResult(frequencies[1]);

print("第一组大核频率: ${frequencies[0]}MHz, 抽奖结果: ${lotteryMap[result0]}");
print("第二组大核频率: ${frequencies[1]}MHz, 抽奖结果: ${lotteryMap[result1]}");
if (results.command!['list']) {
print("所有体质抽奖结果:");
if (results.command!['legacy']) {
freq2LevelMap.forEach((key, value) {
print("频率近似值: $key, 结果: ${lotteryMap[value]}");
});
} else {
var lastValue = -1;
var lastResult = CpuLotteryResult.levelWorst;
pvtm2LevelMap.forEach((key, value) {
if (lastValue != -1) {
print(
"PVTM值: $lastValue - ${key - 1}, 结果: ${lotteryMap[lastResult]}");
}
lastValue = key;
lastResult = value;
});
}
return 0;
}

if (results.command!['legacy']) {
var frequencies = getFreqBigClustersMHz();
if (frequencies == null) {
print("获取cpu频率失败");
return 1;
}

var result0 = getCpuLotteryResult(frequencies[0]);
var result1 = getCpuLotteryResult(frequencies[1]);

print("第一组大核频率: ${frequencies[0]}MHz, 抽奖结果: ${lotteryMap[result0]}");
print("第二组大核频率: ${frequencies[1]}MHz, 抽奖结果: ${lotteryMap[result1]}");
print("抽奖结果受温度影响, 可以在不同温度下多次测试以获得更准确的结果");
print("使用 --list 参数以列出所有可能结果");
} else {
try {
var pvtmValues = getPvtmBigClusters();
if (pvtmValues == null) {
print("获取pvtm失败");
return 1;
}

var result0 = getPvtmCpuLotteryResult(pvtmValues[0]);
var result1 = getPvtmCpuLotteryResult(pvtmValues[1]);

print("第一组大核pvtm值: ${pvtmValues[0]}, 抽奖结果: ${lotteryMap[result0]}");
print("第二组大核pvtm值: ${pvtmValues[1]}, 抽奖结果: ${lotteryMap[result1]}");
print("抽奖结果受温度影响, 可以在不同温度下多次测试以获得更准确的结果");
print("使用 --list 参数以列出所有可能结果");
} catch (e) {
print("体质抽奖失败: $e");
}
}

break;
case 'input_voltage':
if (results.command!['help']) {
Expand Down
45 changes: 45 additions & 0 deletions lib/cpu_lottery.dart
Original file line number Diff line number Diff line change
Expand Up @@ -60,3 +60,48 @@ CpuLotteryResult getCpuLotteryResult(int freqMHz) {
});
return freq2LevelMap[minKey];
}

//
const Map pvtm2LevelMap = {
0: CpuLotteryResult.levelWorst,
1616: CpuLotteryResult.level3,
1641: CpuLotteryResult.level2,
1676: CpuLotteryResult.levelWorst,
1711: CpuLotteryResult.level3,
1744: CpuLotteryResult.level2,
1777: CpuLotteryResult.level1,
9999: CpuLotteryResult.level1
};

///获取CPU大核PVTM值
///目前只能通过读取内核日志来获取...
List? getPvtmBigClusters() {
var dmesgProc = Process.runSync('dmesg', []);
if (dmesgProc.exitCode != 0) {
throw Exception('无法读取内核日志. 权限不足?');
}
//获取cpu4和cpu6(两组大核)的pvtm值
RegExp cpuPvtmRegExp = RegExp(r'cpu[4-6]: pvtm=([0-9]+)');
String kernelMsg = dmesgProc.stdout.toString();
var lines = kernelMsg.split('\n');
var pvtmList = <int>[];
for (var line in lines) {
var match = cpuPvtmRegExp.firstMatch(line);
if (match != null) {
var pvtm = int.parse(match.group(1)!);
pvtmList.add(pvtm);
}
}
return pvtmList;
}

///通过PVTM值判断体质
CpuLotteryResult getPvtmCpuLotteryResult(int pvtmVal) {
CpuLotteryResult result = CpuLotteryResult.levelWorst;
pvtm2LevelMap.forEach((key, v) {
if (pvtmVal >= key) {
result = v;
}
});
return result;
}
2 changes: 1 addition & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: a5btool
description: A tool for Rock 5B running Linux
version: 1.1.0
version: 1.2.0
# homepage: https://www.example.com

environment:
Expand Down

0 comments on commit ddc0b2d

Please sign in to comment.