Refine battery reading

This commit is contained in:
yecong 2026-06-17 19:11:16 +08:00
parent 3b8519392c
commit 1d5a25707c

View File

@ -218,9 +218,13 @@ export default function InfoScreen({ route, navigation }: Props) {
}; };
const readBatteryCharacteristic = async () => { const readBatteryCharacteristic = async () => {
let lastValidBattery: number | null = null; const validSamples: number[] = [];
for (let attempt = 0; attempt < 4; attempt += 1) { // Some devices briefly report a default battery value right after the first
// connection. Read a few samples and prefer the later stable value.
await sleep(250);
for (let attempt = 0; attempt < 5; attempt += 1) {
try { try {
const bytes = await readCharacteristicWithRetry("180f", "2a19", 1); const bytes = await readCharacteristicWithRetry("180f", "2a19", 1);
const batteryValue = bytes[0]; const batteryValue = bytes[0];
@ -230,22 +234,36 @@ export default function InfoScreen({ route, navigation }: Props) {
batteryValue >= 0 && batteryValue >= 0 &&
batteryValue <= 100 batteryValue <= 100
) { ) {
if (lastValidBattery !== null && lastValidBattery === batteryValue) { validSamples.push(batteryValue);
return `${batteryValue}%`; console.log(
} `🔋 battery sample ${attempt + 1}: ${batteryValue}%`
);
lastValidBattery = batteryValue;
} }
} catch { } catch {
// Continue retrying with a short gap below. // Continue retrying with a short gap below.
} }
if (attempt < 3) { if (attempt < 4) {
await sleep(220); await sleep(260);
} }
} }
return lastValidBattery !== null ? `${lastValidBattery}%` : "未知"; if (validSamples.length === 0) {
return "未知";
}
const lastSample = validSamples[validSamples.length - 1];
const previousSample = validSamples[validSamples.length - 2];
if (previousSample !== undefined && previousSample === lastSample) {
return `${lastSample}%`;
}
const lastNonHundredSample = [...validSamples]
.reverse()
.find((value) => value !== 100);
return `${lastNonHundredSample ?? lastSample}%`;
}; };
const subscribePowerDataIfNeeded = async () => { const subscribePowerDataIfNeeded = async () => {
@ -1108,4 +1126,4 @@ const styles = StyleSheet.create({
}); });