From a25ba5c192121b9130420dcfb94d7184c62a6bfa Mon Sep 17 00:00:00 2001 From: happyme531 <2302004040@qq.com> Date: Thu, 23 Nov 2023 16:50:50 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=80=A7=E8=83=BD=E7=9B=91?= =?UTF-8?q?=E6=8E=A7=E5=8A=9F=E8=83=BD=20-=20=E7=9B=91=E6=B5=8BGPU,=20DMC(?= =?UTF-8?q?=E5=86=85=E5=AD=98=E6=8E=A7=E5=88=B6=E5=99=A8),=20NPU,=20RGA?= =?UTF-8?q?=E7=9A=84=E9=A2=91=E7=8E=87=E5=92=8C=E5=88=A9=E7=94=A8=E7=8E=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/5bcli.dart | 40 +++++- lib/perfmon.dart | 328 ++++++++++++++++++++++++++++++++++++++++++++++ pubspec.lock | 331 +++++++++++++++++++++++++++++------------------ pubspec.yaml | 5 +- readme.md | 6 +- 5 files changed, 576 insertions(+), 134 deletions(-) create mode 100644 lib/perfmon.dart diff --git a/bin/5bcli.dart b/bin/5bcli.dart index 4f085b7..0b76a1f 100644 --- a/bin/5bcli.dart +++ b/bin/5bcli.dart @@ -7,6 +7,7 @@ import 'package:a5btool/input_voltage.dart'; import 'package:a5btool/board_rev.dart'; import 'package:a5btool/usbpd.dart'; import 'package:a5btool/cpuidle.dart'; +import 'package:a5btool/perfmon.dart'; import 'package:a5btool/generated/version.dart'; import 'package:args/args.dart'; @@ -18,6 +19,7 @@ import 'package:args/args.dart'; /// input_voltage 读取输入电压 /// board_rev 获取板子版本 /// usbpd 获取usbpd信息 +/// perfmon 性能监控 /// int main(List arguments) { String selfName = Platform.executable.split(Platform.pathSeparator).last; @@ -61,6 +63,13 @@ int main(List arguments) { cpuidleParser.addFlag('enable', negatable: false, help: '启用cpuidle'); cpuidleParser.addFlag('help', abbr: 'h', negatable: false, help: '获取帮助'); + //性能监控 + var perfmonParser = ArgParser(); + parser.addCommand('perfmon', perfmonParser); + perfmonParser.addFlag('csv', negatable: false, help: '输出csv格式'); + perfmonParser.addOption('interval', abbr: 'i', help: '指定采样间隔, 单位为秒, 默认为1'); + perfmonParser.addFlag('help', abbr: 'h', negatable: false, help: '获取帮助'); + var results = parser.parse(arguments); var helpText = ''' @@ -72,7 +81,8 @@ int main(List arguments) { board_rev 获取板子版本 usbpd 获取当前PD供电状态 cpuidle 控制cpuidle - + perfmon 性能监控 + 可用的参数: ${parser.usage} @@ -274,6 +284,34 @@ ${parser.usage} return 1; } break; + + case 'perfmon': + if (results.command!['help']) { + print(perfmonParser.usage); + return 0; + } + var perfmon = Perfmon(); + perfmon.init(); + var interval = results.command!['interval']; + double intervalValue = 1; + if (interval != null) { + intervalValue = double.parse(interval); + } + if (results.command!['csv']) { + print(perfmon.getCsvHeader()); + while (true) { + sleep(Duration(milliseconds: (intervalValue * 1000).toInt())); + print(perfmon.getCsvLine()); + } + } else { + while (true) { + sleep(Duration(milliseconds: (intervalValue * 1000).toInt())); + var currentTime = DateTime.now().toIso8601String(); + print("\x1b[2J\x1b[H"); //清除屏幕 + print("5bcli 性能监控 - ${intervalValue}s - $currentTime"); + print(perfmon.getUserFriendlyMessage()); + } + } } return 0; } diff --git a/lib/perfmon.dart b/lib/perfmon.dart new file mode 100644 index 0000000..90f12d3 --- /dev/null +++ b/lib/perfmon.dart @@ -0,0 +1,328 @@ +import 'dart:io'; +import 'package:ansicolor/ansicolor.dart'; + +abstract class PerfmonDataSource { + void init() {} + + String getCsvHeader() { + return ''; + } + + String getCsvLine() { + return ''; + } + + String getUserFriendlyLine() { + return ''; + } +} + +AnsiPen pen = AnsiPen(); +String colorPercentage(int percentage) { + // 0-20: blue + // 20-40: cyan + // 40-60: green + // 60-80: magenta + // 80-90: yellow + // 90-100: red + if (percentage < 20) { + pen..blue(); + } else if (percentage < 40) { + pen..cyan(); + } else if (percentage < 60) { + pen..green(); + } else if (percentage < 80) { + pen..magenta(); + } else if (percentage < 90) { + pen..yellow(); + } else { + pen..red(); + } + return pen(percentage.toString()) + '%'; +} + +class CpuNormalizedDataSource extends PerfmonDataSource { + static const path = '/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq'; + static const header_cpu_freq = 'cpu_freq_mhz'; + + int _getData() { + var str = File(path).readAsStringSync(); + return int.parse(str) ~/ 1000; + } + + @override + void init() { + if (!File(path).existsSync()) { + throw Exception('CPU data source not found'); + } + _getData(); + } + + @override + String getCsvHeader() { + return header_cpu_freq; + } + + @override + String getCsvLine() { + var data = _getData(); + return data.toString(); + } + + @override + String getUserFriendlyLine() { + var data = _getData(); + return 'CPU freq: ${(data / 1000).toStringAsFixed(1)}GHz'; + } +} + +class GpuDataSource extends PerfmonDataSource { + static const path = '/sys/class/devfreq/fb000000.gpu/load'; + static RegExp regex = RegExp(r'(\d+)@(\d+)Hz'); + static const header_gpu_load = 'gpu_load'; + static const header_gpu_freq = 'gpu_freq_mhz'; + + List _getData() { + var str = File(path).readAsStringSync(); + var matches = regex.firstMatch(str); + if (matches?.groupCount != 2) { + throw Exception('Cannot parse GPU data source: $str'); + } + return [ + int.parse(matches!.group(1)!), + int.parse(matches.group(2)!) ~/ 1000000 + ]; + } + + @override + void init() { + if (!File(path).existsSync()) { + throw Exception('GPU data source not found'); + } + _getData(); + } + + @override + String getCsvHeader() { + return '$header_gpu_load,$header_gpu_freq'; + } + + @override + String getCsvLine() { + var data = _getData(); + return '${data[0]},${data[1]}'; + } + + @override + String getUserFriendlyLine() { + var data = _getData(); + return 'GPU load: ${colorPercentage(data[0])}, freq: ${(data[1] / 1000).toStringAsFixed(1)}GHz'; + } +} + +class DdrDataSource extends PerfmonDataSource { + static const path = '/sys/class/devfreq/dmc/load'; + static RegExp regex = RegExp(r'(\d+)@(\d+)Hz'); + static const header_ddr_load = 'ddr_load'; + static const header_ddr_freq = 'ddr_freq_mhz'; + + List _getData() { + var str = File(path).readAsStringSync(); + var matches = regex.firstMatch(str); + if (matches?.groupCount != 2) { + throw Exception('Cannot parse DDR data source: $str'); + } + return [ + int.parse(matches!.group(1)!), + int.parse(matches.group(2)!) ~/ 1000000 + ]; + } + + @override + void init() { + if (!File(path).existsSync()) { + throw Exception('DDR data source not found'); + } + _getData(); + } + + @override + String getCsvHeader() { + return '$header_ddr_load,$header_ddr_freq'; + } + + @override + String getCsvLine() { + var data = _getData(); + return '${data[0]},${data[1]}'; + } + + @override + String getUserFriendlyLine() { + var data = _getData(); + return 'DDR load: ${colorPercentage(data[0])}, freq: ${(data[1] / 1000).toStringAsFixed(1)}GHz'; + } +} + +class NpuDataSource extends PerfmonDataSource { + static const path = '/sys/kernel/debug/rknpu/load'; + //Core0: 0%, Core1: 0%, Core2: 0% + static RegExp regex = + RegExp(r'Core0:\s+(\d+)%, Core1:\s+(\d+)%, Core2:\s+(\d+)%'); + static const header_npu_load = 'npu_load'; + + List _getData() { + var str = File(path).readAsStringSync(); + var matches = regex.firstMatch(str); + if (matches?.groupCount != 3) { + throw Exception('Cannot parse NPU data source: $str'); + } + return [ + int.parse(matches!.group(1)!), + int.parse(matches.group(2)!), + int.parse(matches.group(3)!) + ]; + } + + @override + void init() { + if (!File(path).existsSync()) { + throw Exception('NPU data source not found'); + } + _getData(); + } + + @override + String getCsvHeader() { + return '${header_npu_load}_0,${header_npu_load}_1,${header_npu_load}_2'; + } + + @override + String getCsvLine() { + var data = _getData(); + return '${data[0]},${data[1]},${data[2]}'; + } + + @override + String getUserFriendlyLine() { + var data = _getData(); + return 'NPU load: ${colorPercentage(data[0])}, ${colorPercentage(data[1])}, ${colorPercentage(data[2])}'; + } +} + +class RgaDataSource extends PerfmonDataSource { + static const path = '/sys/kernel/debug/rkrga/load'; + /* + num of scheduler = 3 +================= load ================== +scheduler[0]: rga3_core0 + load = 0% +----------------------------------- +scheduler[1]: rga3_core1 + load = 0% +----------------------------------- +scheduler[2]: rga2 + load = 0% +----------------------------------- + */ + static RegExp regex = RegExp(r'load = (\d+)%'); + static const header_rga_load = 'rga_load'; + + List _getData() { + var str = File(path).readAsStringSync(); + var matches = regex.allMatches(str); + if (matches.length != 3) { + throw Exception('Cannot parse RGA data source: $str'); + } + return [ + int.parse(matches.elementAt(0).group(1)!), + int.parse(matches.elementAt(1).group(1)!), + int.parse(matches.elementAt(2).group(1)!) + ]; + } + + @override + void init() { + if (!File(path).existsSync()) { + throw Exception('RGA data source not found'); + } + _getData(); + } + + @override + String getCsvHeader() { + return '${header_rga_load}_3_0,${header_rga_load}_3_1,${header_rga_load}_2'; + } + + @override + String getCsvLine() { + var data = _getData(); + return '${data[0]},${data[1]},${data[2]}'; + } + + @override + String getUserFriendlyLine() { + var data = _getData(); + return 'RGA load: ${colorPercentage(data[0])}, ${colorPercentage(data[1])}, ${colorPercentage(data[2])}'; + } +} + +class Perfmon { + static List dataSources = [ + GpuDataSource(), + DdrDataSource(), + NpuDataSource(), + RgaDataSource(), + ]; + + List _availibilities = []; + + void init() { + for (var dataSource in dataSources) { + try { + dataSource.init(); + _availibilities.add(true); + } catch (e) { + print(e); + _availibilities.add(false); + } + } + } + + bool isAvailable(int index) { + return _availibilities[index]; + } + + String getCsvHeader() { + var header = ''; + header += 'time,'; + for (var i = 0; i < dataSources.length; i++) { + if (isAvailable(i)) { + header += dataSources[i].getCsvHeader() + ','; + } + } + return header; + } + + String getCsvLine() { + var line = ''; + var currentTime = DateTime.now().millisecondsSinceEpoch; + line += currentTime.toString() + ','; + for (var i = 0; i < dataSources.length; i++) { + if (isAvailable(i)) { + line += dataSources[i].getCsvLine() + ','; + } + } + return line; + } + + String getUserFriendlyMessage() { + var message = ''; + for (var i = 0; i < dataSources.length; i++) { + if (isAvailable(i)) { + message += dataSources[i].getUserFriendlyLine() + '\n'; + } + } + return message; + } +} diff --git a/pubspec.lock b/pubspec.lock index 9ffefac..697f687 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,470 +5,545 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - url: "https://pub.dartlang.org" + sha256: "36a321c3d2cbe01cbcb3540a87b8843846e0206df3e691fa7b23e19e78de6d49" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "49.0.0" + version: "65.0.0" analyzer: dependency: transitive description: name: analyzer - url: "https://pub.dartlang.org" + sha256: dfe03b90ec022450e22513b5e5ca1f01c0c01de9c3fba2f7fd233cb57a6b9a07 + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "5.1.0" + version: "6.3.0" + ansicolor: + dependency: "direct main" + description: + name: ansicolor + sha256: "8bf17a8ff6ea17499e40a2d2542c2f481cd7615760c6d34065cb22bfd22e6880" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" + source: hosted + version: "2.0.2" args: dependency: "direct main" description: name: args - url: "https://pub.dartlang.org" + sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596 + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "2.3.1" + version: "2.4.2" async: dependency: transitive description: name: async - url: "https://pub.dartlang.org" + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "2.9.0" + version: "2.11.0" boolean_selector: dependency: transitive description: name: boolean_selector - url: "https://pub.dartlang.org" + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "2.1.0" + version: "2.1.1" build: dependency: transitive description: name: build - url: "https://pub.dartlang.org" + sha256: "80184af8b6cb3e5c1c4ec6d8544d27711700bc3e6d2efad04238c7b5290889f0" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "2.3.1" + version: "2.4.1" build_config: dependency: transitive description: name: build_config - url: "https://pub.dartlang.org" + sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1 + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "1.1.0" + version: "1.1.1" build_daemon: dependency: transitive description: name: build_daemon - url: "https://pub.dartlang.org" + sha256: "0343061a33da9c5810b2d6cee51945127d8f4c060b7fbdd9d54917f0a3feaaa1" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "3.1.0" + version: "4.0.1" build_resolvers: dependency: transitive description: name: build_resolvers - url: "https://pub.dartlang.org" + sha256: "64e12b0521812d1684b1917bc80945625391cb9bdd4312536b1d69dcb6133ed8" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "2.0.10" + version: "2.4.1" build_runner: dependency: "direct dev" description: name: build_runner - url: "https://pub.dartlang.org" + sha256: "10c6bcdbf9d049a0b666702cf1cee4ddfdc38f02a19d35ae392863b47519848b" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "2.2.1" + version: "2.4.6" build_runner_core: dependency: transitive description: name: build_runner_core - url: "https://pub.dartlang.org" + sha256: c9e32d21dd6626b5c163d48b037ce906bbe428bc23ab77bcd77bb21e593b6185 + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "7.2.4" + version: "7.2.11" build_version: dependency: "direct dev" description: name: build_version - url: "https://pub.dartlang.org" + sha256: "4e8eafbf722eac3bd60c8d38f108c04bd69b80100f8792b32be3407725c7fa6a" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "2.1.1" built_collection: dependency: transitive description: name: built_collection - url: "https://pub.dartlang.org" + sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "5.1.1" built_value: dependency: transitive description: name: built_value - url: "https://pub.dartlang.org" + sha256: "723b4021e903217dfc445ec4cf5b42e27975aece1fc4ebbc1ca6329c2d9fb54e" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "8.4.1" + version: "8.7.0" charcode: dependency: transitive description: name: charcode - url: "https://pub.dartlang.org" + sha256: fb98c0f6d12c920a02ee2d998da788bca066ca5f148492b7085ee23372b12306 + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "1.3.1" checked_yaml: dependency: transitive description: name: checked_yaml - url: "https://pub.dartlang.org" + sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "2.0.1" + version: "2.0.3" code_builder: dependency: transitive description: name: code_builder - url: "https://pub.dartlang.org" + sha256: "1be9be30396d7e4c0db42c35ea6ccd7cc6a1e19916b5dc64d6ac216b5544d677" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "4.3.0" + version: "4.7.0" collection: dependency: transitive description: name: collection - url: "https://pub.dartlang.org" + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "1.16.0" + version: "1.18.0" convert: dependency: transitive description: name: convert - url: "https://pub.dartlang.org" + sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "3.0.2" + version: "3.1.1" coverage: dependency: transitive description: name: coverage - url: "https://pub.dartlang.org" + sha256: ac86d3abab0f165e4b8f561280ff4e066bceaac83c424dd19f1ae2c2fcd12ca9 + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "1.6.1" + version: "1.7.1" crypto: dependency: transitive description: name: crypto - url: "https://pub.dartlang.org" + sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "3.0.2" + version: "3.0.3" dart_style: dependency: transitive description: name: dart_style - url: "https://pub.dartlang.org" + sha256: abd7625e16f51f554ea244d090292945ec4d4be7bfbaf2ec8cccea568919d334 + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "2.2.4" + version: "2.3.3" file: dependency: transitive description: name: file - url: "https://pub.dartlang.org" + sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "6.1.4" + version: "7.0.0" fixnum: dependency: transitive description: name: fixnum - url: "https://pub.dartlang.org" + sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "1.0.1" + version: "1.1.0" frontend_server_client: dependency: transitive description: name: frontend_server_client - url: "https://pub.dartlang.org" + sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "2.1.3" + version: "3.2.0" glob: dependency: transitive description: name: glob - url: "https://pub.dartlang.org" + sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "2.1.0" + version: "2.1.2" graphs: dependency: transitive description: name: graphs - url: "https://pub.dartlang.org" + sha256: aedc5a15e78fc65a6e23bcd927f24c64dd995062bcd1ca6eda65a3cff92a4d19 + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "2.1.0" + version: "2.3.1" http_multi_server: dependency: transitive description: name: http_multi_server - url: "https://pub.dartlang.org" + sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "3.2.1" http_parser: dependency: transitive description: name: http_parser - url: "https://pub.dartlang.org" + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "4.0.1" + version: "4.0.2" io: dependency: transitive description: name: io - url: "https://pub.dartlang.org" + sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "1.0.3" + version: "1.0.4" js: dependency: transitive description: name: js - url: "https://pub.dartlang.org" + sha256: cf7243a0c29626284ada2add68a33f5b1102affe3509393e75136e0f6616bd68 + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "0.6.4" + version: "0.6.8" json_annotation: dependency: transitive description: name: json_annotation - url: "https://pub.dartlang.org" + sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467 + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "4.7.0" + version: "4.8.1" lints: dependency: "direct dev" description: name: lints - url: "https://pub.dartlang.org" + sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "2.0.0" + version: "2.1.1" logging: dependency: transitive description: name: logging - url: "https://pub.dartlang.org" + sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "1.0.2" + version: "1.2.0" matcher: dependency: transitive description: name: matcher - url: "https://pub.dartlang.org" + sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "0.12.12" + version: "0.12.16" meta: dependency: transitive description: name: meta - url: "https://pub.dartlang.org" + sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04 + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "1.8.0" + version: "1.11.0" mime: dependency: transitive description: name: mime - url: "https://pub.dartlang.org" + sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "1.0.2" + version: "1.0.4" node_preamble: dependency: transitive description: name: node_preamble - url: "https://pub.dartlang.org" + sha256: "6e7eac89047ab8a8d26cf16127b5ed26de65209847630400f9aefd7cd5c730db" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "2.0.1" + version: "2.0.2" package_config: dependency: transitive description: name: package_config - url: "https://pub.dartlang.org" + sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "2.1.0" path: dependency: transitive description: name: path - url: "https://pub.dartlang.org" + sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "1.8.2" + version: "1.8.3" pool: dependency: transitive description: name: pool - url: "https://pub.dartlang.org" + sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "1.5.1" process_run: dependency: "direct main" description: name: process_run - url: "https://pub.dartlang.org" + sha256: "4539b7c0a34a4a4979e7345d9f5c6358961d9f53901baf2930807159d08ee59b" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "0.12.3+2" + version: "0.12.5+3" pub_semver: dependency: transitive description: name: pub_semver - url: "https://pub.dartlang.org" + sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "2.1.1" + version: "2.1.4" pubspec_parse: dependency: transitive description: name: pubspec_parse - url: "https://pub.dartlang.org" + sha256: c63b2876e58e194e4b0828fcb080ad0e06d051cb607a6be51a9e084f47cb9367 + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "1.2.1" + version: "1.2.3" shelf: dependency: transitive description: name: shelf - url: "https://pub.dartlang.org" + sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4 + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "1.4.0" + version: "1.4.1" shelf_packages_handler: dependency: transitive description: name: shelf_packages_handler - url: "https://pub.dartlang.org" + sha256: "89f967eca29607c933ba9571d838be31d67f53f6e4ee15147d5dc2934fee1b1e" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "3.0.1" + version: "3.0.2" shelf_static: dependency: transitive description: name: shelf_static - url: "https://pub.dartlang.org" + sha256: a41d3f53c4adf0f57480578c1d61d90342cd617de7fc8077b1304643c2d85c1e + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "1.1.1" + version: "1.1.2" shelf_web_socket: dependency: transitive description: name: shelf_web_socket - url: "https://pub.dartlang.org" + sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "1.0.2" + version: "1.0.4" source_map_stack_trace: dependency: transitive description: name: source_map_stack_trace - url: "https://pub.dartlang.org" + sha256: "84cf769ad83aa6bb61e0aa5a18e53aea683395f196a6f39c4c881fb90ed4f7ae" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "2.1.0" + version: "2.1.1" source_maps: dependency: transitive description: name: source_maps - url: "https://pub.dartlang.org" + sha256: "708b3f6b97248e5781f493b765c3337db11c5d2c81c3094f10904bfa8004c703" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "0.10.10" + version: "0.10.12" source_span: dependency: transitive description: name: source_span - url: "https://pub.dartlang.org" + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "1.9.1" + version: "1.10.0" stack_trace: dependency: transitive description: name: stack_trace - url: "https://pub.dartlang.org" + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "1.10.0" + version: "1.11.1" stream_channel: dependency: transitive description: name: stream_channel - url: "https://pub.dartlang.org" + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "2.1.1" + version: "2.1.2" stream_transform: dependency: transitive description: name: stream_transform - url: "https://pub.dartlang.org" + sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "2.0.0" + version: "2.1.0" string_scanner: dependency: transitive description: name: string_scanner - url: "https://pub.dartlang.org" + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "1.1.1" + version: "1.2.0" synchronized: dependency: transitive description: name: synchronized - url: "https://pub.dartlang.org" + sha256: "5fcbd27688af6082f5abd611af56ee575342c30e87541d0245f7ff99faa02c60" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "3.0.0+3" + version: "3.1.0" term_glyph: dependency: transitive description: name: term_glyph - url: "https://pub.dartlang.org" + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "1.2.1" test: dependency: "direct dev" description: name: test - url: "https://pub.dartlang.org" + sha256: a1f7595805820fcc05e5c52e3a231aedd0b72972cb333e8c738a8b1239448b6f + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "1.21.6" + version: "1.24.9" test_api: dependency: transitive description: name: test_api - url: "https://pub.dartlang.org" + sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "0.4.14" + version: "0.6.1" test_core: dependency: transitive description: name: test_core - url: "https://pub.dartlang.org" + sha256: a757b14fc47507060a162cc2530d9a4a2f92f5100a952c7443b5cad5ef5b106a + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "0.4.18" + version: "0.5.9" timing: dependency: transitive description: name: timing - url: "https://pub.dartlang.org" + sha256: "70a3b636575d4163c477e6de42f247a23b315ae20e86442bebe32d3cabf61c32" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "1.0.0" + version: "1.0.1" typed_data: dependency: transitive description: name: typed_data - url: "https://pub.dartlang.org" + sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "1.3.1" + version: "1.3.2" vm_service: dependency: transitive description: name: vm_service - url: "https://pub.dartlang.org" + sha256: b3d56ff4341b8f182b96aceb2fa20e3dcb336b9f867bc0eafc0de10f1048e957 + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "9.4.0" + version: "13.0.0" watcher: dependency: transitive description: name: watcher - url: "https://pub.dartlang.org" + sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "1.0.1" + version: "1.1.0" web_socket_channel: dependency: transitive description: name: web_socket_channel - url: "https://pub.dartlang.org" + sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "2.2.0" + version: "2.4.0" webkit_inspection_protocol: dependency: transitive description: name: webkit_inspection_protocol - url: "https://pub.dartlang.org" + sha256: "87d3f2333bb240704cd3f1c6b5b7acd8a10e7f0bc28c28dcf14e782014f4a572" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "1.2.0" + version: "1.2.1" yaml: dependency: transitive description: name: yaml - url: "https://pub.dartlang.org" + sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "3.1.1" + version: "3.1.2" sdks: - dart: ">=2.19.0-146.2.beta <3.0.0" + dart: ">=3.0.0 <4.0.0" diff --git a/pubspec.yaml b/pubspec.yaml index fc32410..0b3efcf 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: a5btool description: A tool for Rock 5B running Linux -version: 1.3.0 +version: 1.4.0 # homepage: https://www.example.com environment: @@ -10,10 +10,11 @@ environment: # path: ^1.8.0 dev_dependencies: - build_runner: ^2.2.1 + build_runner: build_version: ^2.1.1 lints: ^2.0.0 test: ^1.16.0 dependencies: + ansicolor: ^2.0.2 args: ^2.3.1 process_run: ^0.12.3+2 diff --git a/readme.md b/readme.md index 032781c..54f9fe7 100644 --- a/readme.md +++ b/readme.md @@ -9,7 +9,8 @@ board_rev 获取板子版本 usbpd 获取当前PD供电状态 cpuidle 控制cpuidle - + perfmon 性能监控 + 可用的参数: -h, --help 获取帮助 -v, --version 显示工具版本 @@ -23,9 +24,8 @@ 首先安装Dart SDK, 然后执行: - ```bash dart pub get -dart pub run build_runner build +dart run build_runner build dart compile exe bin/5bcli.dart -o 5bcli ``` \ No newline at end of file