(&self, ec: &CrosEc, unseal_key: Option<u32>)
| 1019 | /// Collect raw battery data into a struct (for dumping or analysis) |
| 1020 | #[allow(clippy::field_reassign_with_default)] |
| 1021 | pub fn collect_data(&self, ec: &CrosEc, unseal_key: Option<u32>) -> EcResult<BatteryData> { |
| 1022 | let mut data = BatteryData::default(); |
| 1023 | |
| 1024 | // Basic registers (no unseal required) |
| 1025 | data.mode = self.read_i16(ec, SmartBatReg::Mode as u16)?; |
| 1026 | data.serial_num = self.read_i16(ec, SmartBatReg::SerialNum as u16)?; |
| 1027 | data.manufacture_date = self.read_i16(ec, SmartBatReg::ManufactureDate as u16)?; |
| 1028 | data.temperature = self.read_i16(ec, SmartBatReg::Temp as u16)?; |
| 1029 | data.voltage = self.read_i16(ec, SmartBatReg::Voltage as u16)?; |
| 1030 | // Per datasheet: 0x3C=Cell4, 0x3D=Cell3, 0x3E=Cell2, 0x3F=Cell1 |
| 1031 | data.cell_voltage1 = self.read_i16(ec, SmartBatReg::CellVoltage1 as u16)?; |
| 1032 | data.cell_voltage2 = self.read_i16(ec, SmartBatReg::CellVoltage2 as u16)?; |
| 1033 | data.cell_voltage3 = self.read_i16(ec, SmartBatReg::CellVoltage3 as u16)?; |
| 1034 | data.cell_voltage4 = self.read_i16(ec, SmartBatReg::CellVoltage4 as u16)?; |
| 1035 | |
| 1036 | // Read firmware version (MAC 0x0002, available in SEALED mode) |
| 1037 | data.firmware_version = self.mac_read(ec, 0x0002, 14).unwrap_or_default(); |
| 1038 | data.cycle_count = self.read_i16(ec, SmartBatReg::CycleCount as u16)?; |
| 1039 | data.device_name = self.read_string(ec, SmartBatReg::DeviceName as u16)?; |
| 1040 | data.manufacturer_name = self.read_string(ec, SmartBatReg::ManufacturerName as u16)?; |
| 1041 | data.current = self.read_i16(ec, SmartBatReg::Current as u16)?; |
| 1042 | data.avg_current = self.read_i16(ec, SmartBatReg::AverageCurrent as u16)?; |
| 1043 | data.rel_state_of_charge = self.read_i16(ec, SmartBatReg::RelativeStateOfCharge as u16)?; |
| 1044 | data.abs_state_of_charge = self.read_i16(ec, SmartBatReg::AbsoluteStateOfCharge as u16)?; |
| 1045 | data.remaining_capacity = self.read_i16(ec, SmartBatReg::RemainingCapacity as u16)?; |
| 1046 | data.full_charge_capacity = self.read_i16(ec, SmartBatReg::FullChargeCapacity as u16)?; |
| 1047 | data.charging_current = self.read_i16(ec, SmartBatReg::ChargingCurrent as u16)?; |
| 1048 | data.charging_voltage = self.read_i16(ec, SmartBatReg::ChargingVoltage as u16)?; |
| 1049 | data.battery_status = self.read_i16(ec, SmartBatReg::BatteryStatus as u16)?; |
| 1050 | data.design_capacity = self.read_i16(ec, SmartBatReg::DesignCapacity as u16)?; |
| 1051 | data.design_voltage = self.read_i16(ec, SmartBatReg::DesignVoltage as u16)?; |
| 1052 | data.device_chemistry = self.read_string(ec, SmartBatReg::DeviceChemistry as u16)?; |
| 1053 | |
| 1054 | // ManufacturerAccess block reads (typically readable in SEALED mode) |
| 1055 | data.state_of_health = self |
| 1056 | .read_bytes(ec, ManufReg::Soh as u16, 4) |
| 1057 | .unwrap_or_default(); |
| 1058 | data.operation_status = self |
| 1059 | .read_i32(ec, ManufReg::OperationStatus as u16) |
| 1060 | .unwrap_or(0); |
| 1061 | data.safety_alert = self.read_i32(ec, ManufReg::SafetyAlert as u16).unwrap_or(0); |
| 1062 | data.safety_status = self |
| 1063 | .read_i32(ec, ManufReg::SafetyStatus as u16) |
| 1064 | .unwrap_or(0); |
| 1065 | data.pf_alert = self.read_i32(ec, ManufReg::PFAlert as u16).unwrap_or(0); |
| 1066 | data.pf_status = self.read_i32(ec, ManufReg::PFStatus as u16).unwrap_or(0); |
| 1067 | data.lifetime1 = self |
| 1068 | .read_bytes(ec, ManufReg::LifeTimeDataBlock1 as u16, 32) |
| 1069 | .unwrap_or_default(); |
| 1070 | data.lifetime2 = self |
| 1071 | .read_bytes(ec, ManufReg::LifeTimeDataBlock2 as u16, 20) |
| 1072 | .unwrap_or_default(); |
| 1073 | data.lifetime3 = self |
| 1074 | .read_block(ec, ManufReg::LifeTimeDataBlock3 as u16, 16) |
| 1075 | .unwrap_or_default(); |
| 1076 | data.lifetime4 = self |
| 1077 | .read_block(ec, ManufReg::LifeTimeDataBlock4 as u16, 32) |
| 1078 | .unwrap_or_default(); |
no test coverage detected