diff --git a/bin/5bcli.dart b/bin/5bcli.dart index 55845fa..2dd3300 100644 --- a/bin/5bcli.dart +++ b/bin/5bcli.dart @@ -31,6 +31,8 @@ int main(List 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: '获取帮助'); //读取输入电压 @@ -100,22 +102,68 @@ ${parser.usage} print(lotteryParser.usage); return 0; } - var frequencies = getFreqBigClustersMHz(); - if (frequencies == null) { - print("获取cpu频率失败"); - return 1; - } const Map 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']) { diff --git a/lib/cpu_lottery.dart b/lib/cpu_lottery.dart index 41c1db5..c738b65 100644 --- a/lib/cpu_lottery.dart +++ b/lib/cpu_lottery.dart @@ -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 = []; + 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; +} diff --git a/pubspec.yaml b/pubspec.yaml index 0fef6cb..9ef86c2 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -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: