From 527e161264d127fc0bee366c193f5370414e4936 Mon Sep 17 00:00:00 2001 From: lollipopkit Date: Thu, 21 Dec 2023 17:34:04 +0800 Subject: [PATCH] opt.: battery status --- ios/Runner.xcodeproj/project.pbxproj | 36 +-- lib/core/extension/listx.dart | 20 ++ lib/data/model/app/shell_func.dart | 2 +- lib/data/model/server/battery.dart | 25 +- .../server/server_status_update_req.dart | 14 +- lib/data/res/build_data.dart | 6 +- lib/view/page/server/detail.dart | 8 +- test/battery_test.dart | 215 ++++++++++++++++++ 8 files changed, 286 insertions(+), 40 deletions(-) create mode 100644 test/battery_test.dart diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index c19c2a30..df522679 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -586,7 +586,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 686; + CURRENT_PROJECT_VERSION = 688; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; @@ -596,7 +596,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.686; + MARKETING_VERSION = 1.0.688; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -720,7 +720,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 686; + CURRENT_PROJECT_VERSION = 688; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; @@ -730,7 +730,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.686; + MARKETING_VERSION = 1.0.688; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -748,7 +748,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 686; + CURRENT_PROJECT_VERSION = 688; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; @@ -758,7 +758,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.686; + MARKETING_VERSION = 1.0.688; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -779,7 +779,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 686; + CURRENT_PROJECT_VERSION = 688; DEVELOPMENT_TEAM = BA88US33G6; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -792,7 +792,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.686; + MARKETING_VERSION = 1.0.688; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget; @@ -818,7 +818,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 686; + CURRENT_PROJECT_VERSION = 688; DEVELOPMENT_TEAM = BA88US33G6; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -831,7 +831,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.686; + MARKETING_VERSION = 1.0.688; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -854,7 +854,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 686; + CURRENT_PROJECT_VERSION = 688; DEVELOPMENT_TEAM = BA88US33G6; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -867,7 +867,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.686; + MARKETING_VERSION = 1.0.688; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -890,7 +890,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 686; + CURRENT_PROJECT_VERSION = 688; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_PREVIEWS = YES; @@ -902,7 +902,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.686; + MARKETING_VERSION = 1.0.688; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd; @@ -931,7 +931,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 686; + CURRENT_PROJECT_VERSION = 688; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_PREVIEWS = YES; @@ -943,7 +943,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.686; + MARKETING_VERSION = 1.0.688; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd; PRODUCT_NAME = ServerBox; @@ -969,7 +969,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 686; + CURRENT_PROJECT_VERSION = 688; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_PREVIEWS = YES; @@ -981,7 +981,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.686; + MARKETING_VERSION = 1.0.688; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd; PRODUCT_NAME = ServerBox; diff --git a/lib/core/extension/listx.dart b/lib/core/extension/listx.dart index b5b0396e..32af008f 100644 --- a/lib/core/extension/listx.dart +++ b/lib/core/extension/listx.dart @@ -14,4 +14,24 @@ extension ListX on List { } return list; } + + T? get firstOrNull => isEmpty ? null : first; + + T? get lastOrNull => isEmpty ? null : last; + + T? firstWhereOrNull(bool Function(T element) test) { + try { + return firstWhere(test); + } catch (_) { + return null; + } + } + + T? lastWhereOrNull(bool Function(T element) test) { + try { + return lastWhere(test); + } catch (_) { + return null; + } + } } diff --git a/lib/data/model/app/shell_func.dart b/lib/data/model/app/shell_func.dart index b9bb8099..ab85fd8f 100644 --- a/lib/data/model/app/shell_func.dart +++ b/lib/data/model/app/shell_func.dart @@ -220,7 +220,7 @@ const _statusCmds = [ 'cat /sys/class/thermal/thermal_zone*/temp', 'hostname', 'cat /proc/diskstats', - 'cat /sys/class/power_supply/*/uevent', + 'for f in /sys/class/power_supply/*/uevent; do cat "\$f"; echo; done', 'nvidia-smi -q -x', ]; diff --git a/lib/data/model/server/battery.dart b/lib/data/model/server/battery.dart index 630f0828..7272f765 100644 --- a/lib/data/model/server/battery.dart +++ b/lib/data/model/server/battery.dart @@ -17,14 +17,14 @@ class Battery { final BatteryStatus status; final String? name; final int? cycle; - final int? powerNow; + final String? tech; const Battery({ required this.status, this.percent, this.name, this.cycle, - this.powerNow, + this.tech, }); factory Battery.fromRaw(String raw) { @@ -38,16 +38,25 @@ class Battery { final capacity = map['POWER_SUPPLY_CAPACITY']; // 30% final cycle = map['POWER_SUPPLY_CYCLE_COUNT']; // 30 - final powerNow = map['POWER_SUPPLY_POWER_NOW']; // 30W + + var name = map['POWER_SUPPLY_MODEL_NAME']; + name ??= map['POWER_SUPPLY_NAME']; return Battery( percent: capacity == null ? null : int.tryParse(capacity), status: BatteryStatus.parse(map['POWER_SUPPLY_STATUS']), - name: map['POWER_SUPPLY_MODEL_NAME'], + name: name, cycle: cycle == null ? null : int.tryParse(cycle), - powerNow: powerNow == null ? null : int.tryParse(powerNow), + tech: map['POWER_SUPPLY_TECHNOLOGY'], ); } + + @override + String toString() { + return 'Battery{$percent, $status, $name, $cycle}'; + } + + bool get isLiPoly => tech == 'Li-poly'; } enum BatteryStatus { @@ -72,14 +81,16 @@ enum BatteryStatus { } abstract final class Batteries { - static List parse(String raw) { + static List parse(String raw, [bool onlyLiPoly = false]) { final lines = raw.split('\n'); final batteries = []; final oneBatLines = []; for (final line in lines) { if (line.isEmpty) { try { - batteries.add(Battery.fromRaw(oneBatLines.join('\n'))); + final bat = Battery.fromRaw(oneBatLines.join('\n')); + if (onlyLiPoly && !bat.isLiPoly) continue; + batteries.add(bat); } catch (e, s) { Loggers.parse.warning(e, s); } diff --git a/lib/data/model/server/server_status_update_req.dart b/lib/data/model/server/server_status_update_req.dart index 9e71eeeb..f05f1e47 100644 --- a/lib/data/model/server/server_status_update_req.dart +++ b/lib/data/model/server/server_status_update_req.dart @@ -24,12 +24,10 @@ class ServerStatusUpdateReq { } Future getStatus(ServerStatusUpdateReq req) async { - switch (req.system) { - case SystemType.linux: - return _getLinuxStatus(req); - case SystemType.bsd: - return _getBsdStatus(req); - } + return switch (req.system) { + SystemType.linux => _getLinuxStatus(req), + SystemType.bsd => _getBsdStatus(req), + }; } // Wrap each operation with a try-catch, so that if one operation fails, @@ -130,7 +128,9 @@ Future _getLinuxStatus(ServerStatusUpdateReq req) async { try { final battery = StatusCmdType.battery.find(segments); - final batteries = Batteries.parse(battery); + + /// Only collect li-poly batteries + final batteries = Batteries.parse(battery, true); req.ss.batteries.clear(); if (batteries.isNotEmpty) { req.ss.batteries.addAll(batteries); diff --git a/lib/data/res/build_data.dart b/lib/data/res/build_data.dart index ad44a757..9dc61108 100644 --- a/lib/data/res/build_data.dart +++ b/lib/data/res/build_data.dart @@ -2,9 +2,9 @@ class BuildData { static const String name = "ServerBox"; - static const int build = 686; + static const int build = 688; static const String engine = "3.16.4"; - static const String buildAt = "2023-12-20 17:26:32"; - static const int modifications = 2; + static const String buildAt = "2023-12-21 16:19:00"; + static const int modifications = 6; static const int script = 33; } diff --git a/lib/view/page/server/detail.dart b/lib/view/page/server/detail.dart index 11ac7a95..67de5d01 100644 --- a/lib/view/page/server/detail.dart +++ b/lib/view/page/server/detail.dart @@ -463,7 +463,7 @@ class _ServerDetailPageState extends State children: [ Text( disk.dev, - style: UIs.text12Bold, + style: UIs.text12, textScaler: _textFactor, ), Text( @@ -485,7 +485,7 @@ class _ServerDetailPageState extends State backgroundColor: DynamicColors.progress.resolve(context), color: primaryColor, ), - Text('${disk.usedPercent}%', style: UIs.text13Grey) + Text('${disk.usedPercent}%', style: UIs.text12Grey) ], ), ) @@ -560,7 +560,7 @@ class _ServerDetailPageState extends State children: [ Text( device, - style: UIs.text12Bold, + style: UIs.text12, textScaler: _textFactor, maxLines: 1, overflow: TextOverflow.fade, @@ -642,7 +642,7 @@ class _ServerDetailPageState extends State children: [ Text('${battery.name}', style: UIs.text15), Text( - '${battery.status.name} - ${battery.cycle} - ${battery.powerNow}', + '${battery.status.name} - ${battery.cycle}', style: UIs.text13Grey, ), ], diff --git a/test/battery_test.dart b/test/battery_test.dart new file mode 100644 index 00000000..a3808975 --- /dev/null +++ b/test/battery_test.dart @@ -0,0 +1,215 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:toolbox/data/model/server/battery.dart'; + +const _raw = ''' +POWER_SUPPLY_NAME=battery +POWER_SUPPLY_INPUT_SUSPEND=0 +POWER_SUPPLY_BATTERY_INPUT_SUSPEND=0 +POWER_SUPPLY_STATUS=Discharging +POWER_SUPPLY_HEALTH=Good +POWER_SUPPLY_PRESENT=1 +POWER_SUPPLY_CHARGE_TYPE=N/A +POWER_SUPPLY_CAPACITY=73 +POWER_SUPPLY_CHARGER_TEMP_MAX=800 +POWER_SUPPLY_INPUT_CURRENT_LIMITED=0 +POWER_SUPPLY_VOLTAGE_NOW=4002675 +POWER_SUPPLY_VOLTAGE_MAX=4480000 +POWER_SUPPLY_VOLTAGE_QNOVO=-22 +POWER_SUPPLY_CURRENT_NOW=157714 +POWER_SUPPLY_CURRENT_QNOVO=-22 +POWER_SUPPLY_CONSTANT_CHARGE_CURRENT_MAX=6000000 +POWER_SUPPLY_CONSTANT_CHARGE_CURRENT=4600000 +POWER_SUPPLY_CHARGE_TERM_CURRENT=-220 +POWER_SUPPLY_TEMP=235 +POWER_SUPPLY_TECHNOLOGY=Li-poly +POWER_SUPPLY_STEP_CHARGING_ENABLED=0 +POWER_SUPPLY_SW_JEITA_ENABLED=1 +POWER_SUPPLY_CHARGE_DONE=0 +POWER_SUPPLY_PARALLEL_DISABLE=0 +POWER_SUPPLY_SET_SHIP_MODE=0 +POWER_SUPPLY_DIE_HEALTH=Unknown +POWER_SUPPLY_DC_THERMAL_LEVELS=0 +POWER_SUPPLY_RERUN_AICL=0 +POWER_SUPPLY_DP_DM=0 +POWER_SUPPLY_CHARGE_CONTROL_LIMIT_MAX=16 +POWER_SUPPLY_CHARGE_CONTROL_LIMIT=0 +POWER_SUPPLY_CHARGE_COUNTER=2033341 +POWER_SUPPLY_CYCLE_COUNT=1 +POWER_SUPPLY_RECHARGE_SOC=99 +POWER_SUPPLY_RECHARGE_VBAT=-22 +POWER_SUPPLY_NIGHT_CHARGING=0 +POWER_SUPPLY_CHARGE_FULL=3022000 +POWER_SUPPLY_FORCE_RECHARGE=0 +POWER_SUPPLY_CHARGE_FULL_DESIGN=4700000 +POWER_SUPPLY_FCC_STEPPER_ENABLE=0 +POWER_SUPPLY_BATTERY_CHARGING_ENABLED=1 +POWER_SUPPLY_DP_DM_BQ=0 +POWER_SUPPLY_TYPE_RECHECK=0 +POWER_SUPPLY_WARM_FAKE_CHARGING=0 +POWER_SUPPLY_STEP_VFLOAT_INDEX=0 +POWER_SUPPLY_CAPACITY_LEVEL=Normal + +POWER_SUPPLY_NAME=bms +POWER_SUPPLY_AUTHENTIC=1 +POWER_SUPPLY_ROMID=9f,e8,41,99,10,f0,04,42 +POWER_SUPPLY_DS_STATUS=00,00,08,03,02,00,ff,e8 +POWER_SUPPLY_PAGE0_DATA=53,42,4d,34,51,30,33,32,00,3e,b0,46,4d,44,31,31 +POWER_SUPPLY_CHIP_OK=1 +POWER_SUPPLY_CAPACITY=73 +POWER_SUPPLY_REAL_CAPACITY=73 +POWER_SUPPLY_SHUTDOWN_DELAY=0 +POWER_SUPPLY_CAPACITY_RAW=7340 +POWER_SUPPLY_SOC_DECIMAL=40 +POWER_SUPPLY_SOC_DECIMAL_RATE=30 +POWER_SUPPLY_CC_SOC=6318 +POWER_SUPPLY_TEMP=235 +POWER_SUPPLY_VOLTAGE_NOW=4002675 +POWER_SUPPLY_VOLTAGE_OCV=4039556 +POWER_SUPPLY_VOLTAGE_AVG=3989287 +POWER_SUPPLY_CURRENT_NOW=157714 +POWER_SUPPLY_CURRENT_AVG=329915 +POWER_SUPPLY_RESISTANCE_ID=100700 +POWER_SUPPLY_RESISTANCE=186278 +POWER_SUPPLY_ESR_ACTUAL=-22 +POWER_SUPPLY_ESR_NOMINAL=-22 +POWER_SUPPLY_BATTERY_TYPE=j11sun_4700mah +POWER_SUPPLY_CHARGE_FULL_DESIGN=4700000 +POWER_SUPPLY_VOLTAGE_MAX_DESIGN=4450000 +POWER_SUPPLY_CHARGE_NOW_RAW=2974065 +POWER_SUPPLY_CHARGE_NOW=0 +POWER_SUPPLY_CHARGE_FULL=3022000 +POWER_SUPPLY_CHARGE_COUNTER=2033341 +POWER_SUPPLY_CHARGE_COUNTER_SHADOW=2033435 +POWER_SUPPLY_CYCLE_COUNT=1 +POWER_SUPPLY_CYCLE_COUNTS=15 335 526 552 493 398 287 141 +POWER_SUPPLY_SOC_REPORTING_READY=1 +POWER_SUPPLY_CLEAR_SOH=0 +POWER_SUPPLY_SOH=50 +POWER_SUPPLY_DEBUG_BATTERY=0 +POWER_SUPPLY_CONSTANT_CHARGE_VOLTAGE=4439948 +POWER_SUPPLY_TIME_TO_FULL_AVG=-1 +POWER_SUPPLY_TIME_TO_EMPTY_AVG=18366 +POWER_SUPPLY_CC_STEP=0 +POWER_SUPPLY_CC_STEP_SEL=0 +POWER_SUPPLY_BATT_AGE_LEVEL=-22 +POWER_SUPPLY_POWER_NOW=26828590 +POWER_SUPPLY_POWER_AVG=16967163 +POWER_SUPPLY_SCALE_MODE_EN=0 +POWER_SUPPLY_CALIBRATE=-22 +POWER_SUPPLY_FASTCHARGE_MODE=0 +POWER_SUPPLY_FFC_TERMINATION_CURRENT=-800 +POWER_SUPPLY_SYS_TERMINATION_CURRENT=-300 +POWER_SUPPLY_FFC_SYS_TERMINATION_CURRENT=-900 +POWER_SUPPLY_VBATT_FULL_VOL=4440 +POWER_SUPPLY_FCC_VBATT_FULL_VOL=4490 +POWER_SUPPLY_KI_COEFF_CURRENT=3900 + +POWER_SUPPLY_NAME=bq2597x-standalone +POWER_SUPPLY_PRESENT=0 +POWER_SUPPLY_CHARGING_ENABLED=0 +POWER_SUPPLY_STATUS=Unknown +POWER_SUPPLY_TI_BATTERY_PRESENT=1 +POWER_SUPPLY_TI_VBUS_PRESENT=0 +POWER_SUPPLY_TI_BATTERY_VOLTAGE=4004 +POWER_SUPPLY_TI_BATTERY_CURRENT=0 +POWER_SUPPLY_TI_BATTERY_TEMPERATURE=0 +POWER_SUPPLY_TI_BUS_VOLTAGE=0 +POWER_SUPPLY_TI_BUS_CURRENT=0 +POWER_SUPPLY_TI_BUS_TEMPERATURE=0 +POWER_SUPPLY_TI_DIE_TEMPERATURE=0 +POWER_SUPPLY_TI_ALARM_STATUS=0 +POWER_SUPPLY_TI_FAULT_STATUS=0 +POWER_SUPPLY_TI_REG_STATUS=0 +POWER_SUPPLY_TI_SET_BUS_PROTECTION_FOR_QC3=0 +POWER_SUPPLY_MODEL_NAME=bq2597x-standalone + +POWER_SUPPLY_NAME=dc +POWER_SUPPLY_INPUT_SUSPEND=0 +POWER_SUPPLY_PRESENT=0 +POWER_SUPPLY_ONLINE=0 +POWER_SUPPLY_CURRENT_MAX=100000 +POWER_SUPPLY_VOLTAGE_MAX=12000000 +POWER_SUPPLY_REAL_TYPE=Wireless +POWER_SUPPLY_DC_RESET=0 +POWER_SUPPLY_AICL_DONE=0 + +POWER_SUPPLY_NAME=main +POWER_SUPPLY_VOLTAGE_MAX=4450000 +POWER_SUPPLY_CONSTANT_CHARGE_CURRENT_MAX=4600000 +POWER_SUPPLY_TYPE=Main +POWER_SUPPLY_INPUT_CURRENT_SETTLED=0 +POWER_SUPPLY_INPUT_VOLTAGE_SETTLED=5000000 +POWER_SUPPLY_FCC_DELTA=0 +POWER_SUPPLY_CURRENT_MAX=0 +POWER_SUPPLY_FLASH_ACTIVE=0 +POWER_SUPPLY_FLASH_TRIGGER=0 +POWER_SUPPLY_TOGGLE_STAT=0 +POWER_SUPPLY_MAIN_FCC_MAX=-22 +POWER_SUPPLY_IRQ_STATUS=0 +POWER_SUPPLY_FORCE_MAIN_FCC=4600000 +POWER_SUPPLY_FORCE_MAIN_ICL=100000 +POWER_SUPPLY_COMP_CLAMP_LEVEL=0 +POWER_SUPPLY_HEALTH=Unknown +POWER_SUPPLY_TEMP_HOT=0 + +POWER_SUPPLY_NAME=pc_port +POWER_SUPPLY_TYPE=USB +POWER_SUPPLY_ONLINE=0 +POWER_SUPPLY_VOLTAGE_MAX=5000000 +POWER_SUPPLY_CURRENT_MAX=0 + +POWER_SUPPLY_NAME=usb +POWER_SUPPLY_PRESENT=0 +POWER_SUPPLY_ONLINE=0 +POWER_SUPPLY_VOLTAGE_NOW=0 +POWER_SUPPLY_PD_CURRENT_MAX=-22 +POWER_SUPPLY_CURRENT_MAX=0 +POWER_SUPPLY_TYPE=USB_PD +POWER_SUPPLY_TYPEC_MODE=Nothing attached +POWER_SUPPLY_TYPEC_POWER_ROLE=dual power role +POWER_SUPPLY_TYPEC_CC_ORIENTATION=0 +POWER_SUPPLY_PD_ACTIVE=0 +POWER_SUPPLY_INPUT_CURRENT_SETTLED=0 +POWER_SUPPLY_INPUT_CURRENT_NOW=0 +POWER_SUPPLY_BOOST_CURRENT=0 +POWER_SUPPLY_PE_START=0 +POWER_SUPPLY_CTM_CURRENT_MAX=-22 +POWER_SUPPLY_HW_CURRENT_MAX=0 +POWER_SUPPLY_REAL_TYPE=Unknown +POWER_SUPPLY_HVDCP3_TYPE=0 +POWER_SUPPLY_QUICK_CHARGE_TYPE=0 +POWER_SUPPLY_PD_VOLTAGE_MAX=5000000 +POWER_SUPPLY_PD_VOLTAGE_MIN=5000000 +POWER_SUPPLY_CONNECTOR_TYPE=0 +POWER_SUPPLY_CONNECTOR_HEALTH=Cool +POWER_SUPPLY_CONNECTOR_TEMP=293 +POWER_SUPPLY_VBUS_DISABLE=0 +POWER_SUPPLY_VOLTAGE_MAX=5000000 +POWER_SUPPLY_VOLTAGE_MAX_DESIGN=5000000 +POWER_SUPPLY_VOLTAGE_MAX_LIMIT=5000000 +POWER_SUPPLY_SMB_EN_MODE=0 +POWER_SUPPLY_SMB_EN_REASON=0 +POWER_SUPPLY_ADAPTER_CC_MODE=0 +POWER_SUPPLY_SCOPE=Unknown +POWER_SUPPLY_MOISTURE_DETECTED=0 +POWER_SUPPLY_HVDCP_OPTI_ALLOWED=1 +POWER_SUPPLY_QC_OPTI_DISABLE=0 +POWER_SUPPLY_VOLTAGE_VPH=3995694 +POWER_SUPPLY_THERM_ICL_LIMIT=-22 +POWER_SUPPLY_FASTCHARGE_MODE=0 +POWER_SUPPLY_PD_AUTHENTICATION=0 +POWER_SUPPLY_SKIN_HEALTH=Unknown +POWER_SUPPLY_APSD_RERUN=0 +POWER_SUPPLY_APSD_TIMEOUT=0 +POWER_SUPPLY_APDO_MAX=0 +POWER_SUPPLY_CHARGER_STATUS=0 +POWER_SUPPLY_INPUT_VOLTAGE_SETTLED=0 +POWER_SUPPLY_MOISTURE_DETECTION_ENABLED=0 +'''; + +void main() { + test('parse battery', () { + final result = Batteries.parse(_raw); + expect(result.length, 7); + }); +} \ No newline at end of file