Skip to content

Commit 588e6da

Browse files
committed
v1.0.0
0 parents  commit 588e6da

12 files changed

+815
-0
lines changed

.gitignore

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# Files and directories created by pub.
2+
.dart_tool/
3+
.packages
4+
5+
# Conventional directory for build output.
6+
build/
7+
8+
lib/generated/
9+
*.exe
10+
.vscode/
11+
12+
5bcli

CHANGELOG.md

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
## 1.0.0
2+
3+
- Initial version.

bin/5bcli.dart

+135
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
import 'dart:io';
2+
3+
import 'package:a5btool/cpu_serial.dart';
4+
import 'package:a5btool/cpu_lottery.dart';
5+
import 'package:a5btool/input_voltage.dart';
6+
import 'package:a5btool/board_rev.dart';
7+
import 'package:a5btool/generated/version.dart';
8+
9+
import 'package:args/args.dart';
10+
11+
/// Usage: 5bcli <命令> [参数]
12+
/// 命令:
13+
/// cpu_serial 获取cpu序列号
14+
/// lottery 获取体质抽奖结果
15+
/// input_voltage 读取输入电压
16+
/// board_rev 获取板子版本
17+
///
18+
int main(List<String> arguments) {
19+
String selfName = Platform.executable.split(Platform.pathSeparator).last;
20+
var parser = ArgParser();
21+
parser.addFlag('help', abbr: 'h', negatable: false, help: '获取帮助');
22+
parser.addFlag('version', abbr: 'v', negatable: false, help: '显示工具版本');
23+
24+
//获取cpu序列号
25+
var cpuSerialParser = ArgParser();
26+
parser.addCommand('cpu_serial', cpuSerialParser);
27+
cpuSerialParser.addFlag('help', abbr: 'h', negatable: false, help: '获取帮助');
28+
29+
//获取体质抽奖结果
30+
var lotteryParser = ArgParser();
31+
parser.addCommand('lottery', lotteryParser);
32+
lotteryParser.addFlag('help', abbr: 'h', negatable: false, help: '获取帮助');
33+
34+
//读取输入电压
35+
var inputVoltageParser = ArgParser();
36+
parser.addCommand('input_voltage', inputVoltageParser);
37+
inputVoltageParser.addFlag('help', abbr: 'h', negatable: false, help: '获取帮助');
38+
39+
//获取板子版本
40+
var boardRevParser = ArgParser();
41+
parser.addCommand('board_rev', boardRevParser);
42+
boardRevParser.addFlag('help', abbr: 'h', negatable: false, help: '获取帮助');
43+
44+
var results = parser.parse(arguments);
45+
46+
var helpText = '''
47+
使用方法: $selfName [参数] <命令> [命令参数]
48+
可用的命令:
49+
cpu_serial 获取cpu序列号
50+
lottery 获取体质抽奖结果
51+
input_voltage 读取输入电压
52+
board_rev 获取板子版本
53+
54+
可用的参数:${parser.usage}
55+
''';
56+
57+
if (results['help']) {
58+
print(helpText);
59+
return 0;
60+
}
61+
62+
if (results['version']) {
63+
print('$selfName 版本: $packageVersion');
64+
return 0;
65+
}
66+
67+
if (results.command == null) {
68+
print('未指定命令');
69+
print(helpText);
70+
return 0;
71+
}
72+
73+
switch (results.command!.name) {
74+
case 'cpu_serial':
75+
if (results.command!['help']) {
76+
print(cpuSerialParser.usage);
77+
return 0;
78+
}
79+
var result = getCpuSerial();
80+
if (result == null) {
81+
print('获取cpu序列号失败');
82+
return 1;
83+
}
84+
print("CPU序列号: ${result}");
85+
break;
86+
case 'lottery':
87+
if (results.command!['help']) {
88+
print(lotteryParser.usage);
89+
return 0;
90+
}
91+
var frequencies = getFreqBigClustersMHz();
92+
if (frequencies == null) {
93+
print("获取cpu频率失败");
94+
return 1;
95+
}
96+
const Map<CpuLotteryResult, String> lotteryMap = {
97+
CpuLotteryResult.level1: "一等奖",
98+
CpuLotteryResult.level2: "二等奖",
99+
CpuLotteryResult.level3: "三等奖",
100+
CpuLotteryResult.levelWorst: "参与奖",
101+
};
102+
var result0 = getCpuLotteryResult(frequencies[0]);
103+
var result1 = getCpuLotteryResult(frequencies[1]);
104+
105+
print("第一组大核频率: ${frequencies[0]}MHz, 抽奖结果: ${lotteryMap[result0]}");
106+
print("第二组大核频率: ${frequencies[1]}MHz, 抽奖结果: ${lotteryMap[result1]}");
107+
break;
108+
case 'input_voltage':
109+
if (results.command!['help']) {
110+
print(inputVoltageParser.usage);
111+
return 0;
112+
}
113+
var result = getInputVoltage();
114+
if (result == null) {
115+
print("获取输入电压失败");
116+
return 1;
117+
}
118+
119+
print("输入电压: ${result.toStringAsFixed(2)}V");
120+
break;
121+
case 'board_rev':
122+
if (results.command!['help']) {
123+
print(boardRevParser.usage);
124+
return 0;
125+
}
126+
var result = getBoardRev();
127+
if (result == null) {
128+
print("获取板子版本失败");
129+
return 1;
130+
}
131+
print("板子版本: $result");
132+
break;
133+
}
134+
return 0;
135+
}

build.yaml

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
targets:
2+
$default:
3+
builders:
4+
build_version:
5+
options:
6+
output: lib/generated/version.dart

lib/board_rev.dart

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
///board_rev.dart --- 获取板子的版本号
2+
///通过读取saradc5的值来判断
3+
///应该不需要root权限
4+
5+
import 'dart:io';
6+
7+
/// 0 -> A
8+
/// 682 -> B
9+
/// 1365 -> C
10+
/// 2047 -> D
11+
/// 2730 -> E
12+
/// 3412 -> F
13+
/// 4095 -> H // 原理图是这么写的
14+
const Map levelVersionMap = {
15+
0: 'A',
16+
682: 'B',
17+
1365: 'C',
18+
2047: 'D',
19+
2730: 'E',
20+
3412: 'F',
21+
4095: 'H',
22+
};
23+
24+
String? getBoardRev() {
25+
//不知为何读取这个dac时第一次读取的值不稳定,所以读取两次
26+
var processResult = Process.runSync(
27+
'cat', ['/sys/bus/iio/devices/iio:device0/in_voltage5_raw']);
28+
if (processResult.exitCode != 0) {
29+
return null;
30+
}
31+
sleep(Duration(milliseconds: 100));
32+
processResult = Process.runSync(
33+
'cat', ['/sys/bus/iio/devices/iio:device0/in_voltage5_raw']);
34+
if (processResult.exitCode != 0) {
35+
return null;
36+
}
37+
var value = int.parse(processResult.stdout.toString().trim());
38+
//找到最接近的值
39+
var min = 4095;
40+
var minKey = 0;
41+
levelVersionMap.forEach((key, v) {
42+
var diff = (key - value).abs();
43+
if (diff < min) {
44+
min = diff;
45+
minKey = key;
46+
}
47+
});
48+
return levelVersionMap[minKey];
49+
}

lib/cpu_lottery.dart

+62
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
///cpu_lottery.dart --- CPU体质大抽奖!
2+
///读取CPU大核的最高频率,判断体质
3+
///应该不需要root权限
4+
5+
import 'dart:io';
6+
7+
enum CpuLotteryResult {
8+
level1,
9+
level2,
10+
level3,
11+
level4,
12+
level5,
13+
levelWorst,
14+
}
15+
16+
const Map freq2LevelMap = {
17+
2250: CpuLotteryResult.levelWorst,
18+
2300: CpuLotteryResult.level3,
19+
2350: CpuLotteryResult.level2,
20+
2400: CpuLotteryResult.level1,
21+
};
22+
23+
const String cpuFreqPathBigCluster1 =
24+
'/sys/devices/system/cpu/cpufreq/policy4/cpuinfo_max_freq';
25+
const String cpuFreqPathBigCluster2 =
26+
'/sys/devices/system/cpu/cpufreq/policy6/cpuinfo_max_freq';
27+
28+
List? getFreqBigClustersMHz() {
29+
var processResult =
30+
Process.runSync('cat', [cpuFreqPathBigCluster1, cpuFreqPathBigCluster2]);
31+
if (processResult.exitCode != 0) {
32+
return null;
33+
}
34+
var lines = processResult.stdout.toString().split('\n');
35+
lines.removeWhere((element) => element.isEmpty);
36+
37+
return lines.map((e) => int.parse(e.trim()) ~/ 1000).toList();
38+
}
39+
40+
CpuLotteryResult getCpuLotteryResult(int freqMHz) {
41+
var minimalFreq = 999999;
42+
for (var key in freq2LevelMap.keys) {
43+
if (key < minimalFreq) {
44+
minimalFreq = key;
45+
}
46+
}
47+
48+
if (freqMHz < minimalFreq) {
49+
return CpuLotteryResult.levelWorst;
50+
}
51+
52+
var min = 2400;
53+
var minKey = 0;
54+
freq2LevelMap.forEach((key, v) {
55+
var diff = (key - freqMHz).abs();
56+
if (diff < min) {
57+
min = diff;
58+
minKey = key;
59+
}
60+
});
61+
return freq2LevelMap[minKey];
62+
}

lib/cpu_serial.dart

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import 'dart:io';
2+
3+
/// 读取/proc/cpuinfo的内容,并保留最后的Serial: xxxxxxxx
4+
/// 应该不需要root权限
5+
/// @return 返回cpu序列号, 如果没有找到则返回null
6+
String? getCpuSerial() {
7+
var processResult = Process.runSync('cat', ['/proc/cpuinfo']);
8+
if (processResult.exitCode != 0) {
9+
return null;
10+
}
11+
var lines = processResult.stdout.toString().split('\n');
12+
var serial = lines.lastWhere((element) => element.startsWith('Serial'),
13+
orElse: () => '');
14+
if (serial.isEmpty) {
15+
return null;
16+
}
17+
return serial.split(':')[1].trim();
18+
}

lib/input_voltage.dart

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
///input_voltage.dart --- 读取输入电压
2+
///通过读取saradc6的值来计算电压
3+
///应该不需要root权限
4+
5+
import 'dart:io';
6+
import 'dart:math';
7+
8+
double? getInputVoltage() {
9+
var processResult = Process.runSync(
10+
'cat', ['/sys/bus/iio/devices/iio:device0/in_voltage6_raw']);
11+
if (processResult.exitCode != 0) {
12+
return null;
13+
}
14+
var value = int.parse(processResult.stdout.toString().trim());
15+
//12bit adc, 8.2k/100k 分压电阻, 1.8v参考电压
16+
return value / pow(2, 12) * 1.8 * (100 + 8.2) / 8.2;
17+
}

0 commit comments

Comments
 (0)