1
0
mirror of https://codeberg.org/Freeyourgadget/Gadgetbridge synced 2024-11-29 13:26:50 +01:00

Nothing Ear (1): add multiple batteries support

This commit is contained in:
Daniele Gobbetti 2021-10-31 17:15:14 +01:00 committed by vanous
parent 3609af3a18
commit 64b52e5edf

View File

@ -10,6 +10,7 @@ import java.nio.ByteOrder;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
@ -60,6 +61,12 @@ public class NothingProtocol extends GBDeviceProtocol {
private static final short in_ear_detection = (short) 0xf004; private static final short in_ear_detection = (short) 0xf004;
private static final short audio_mode = (short) 0xf00f; private static final short audio_mode = (short) 0xf00f;
private HashMap<Byte, GBDeviceEventBatteryInfo> batteries;
private static final byte battery_earphone_left = 0x02;
private static final byte battery_earphone_right = 0x03;
private static final byte battery_case = 0x04;
@Override @Override
public GBDeviceEvent[] decodeResponse(byte[] responseData) { public GBDeviceEvent[] decodeResponse(byte[] responseData) {
List<GBDeviceEvent> devEvts = new ArrayList<>(); List<GBDeviceEvent> devEvts = new ArrayList<>();
@ -97,7 +104,7 @@ public class NothingProtocol extends GBDeviceProtocol {
switch (getRequestCommand(command)) { switch (getRequestCommand(command)) {
case battery_status: case battery_status:
case battery_status2: case battery_status2:
devEvts.add(handleBatteryInfo(payload)); devEvts.addAll(handleBatteryInfo(payload));
break; break;
case audio_mode_status: case audio_mode_status:
devEvts.add(handleAudioModeStatus(payload)); devEvts.add(handleAudioModeStatus(payload));
@ -218,7 +225,17 @@ public class NothingProtocol extends GBDeviceProtocol {
return super.encodeSendConfiguration(config); return super.encodeSendConfiguration(config);
} }
private GBDeviceEvent handleBatteryInfo(byte[] payload) { @Override
public byte[] encodeSetTime() {
// This are earphones, there is no time to set here. However this method gets called soon
// after connecting, hence we use it to perform some initializations.
// TODO: Find a way to send more requests during the first connection
return encodeAudioModeStatusReq();
}
private List<GBDeviceEvent> handleBatteryInfo(byte[] payload) {
List<GBDeviceEvent> batEvts = new ArrayList<>();
//LOG.debug("Battery payload: " + hexdump(payload)); //LOG.debug("Battery payload: " + hexdump(payload));
/* payload: /* payload:
@ -234,22 +251,31 @@ public class NothingProtocol extends GBDeviceProtocol {
If one of the batteries is recharging, we consider the battery as recharging. If one of the batteries is recharging, we consider the battery as recharging.
*/ */
GBDeviceEventBatteryInfo evBattery = new GBDeviceEventBatteryInfo(); // GBDeviceEventBatteryInfo evBattery = new GBDeviceEventBatteryInfo();
evBattery.level = 0; // evBattery.level = 0;
boolean batteryCharging = false; // boolean batteryCharging = false;
int numBatteries = payload[0]; int numBatteries = payload[0];
for (int i = 0; i < numBatteries; i++) { for (int i = 0; i < numBatteries; i++) {
evBattery.level += (short) ((payload[2 + 2 * i] & MASK_BATTERY) / numBatteries);
if (!batteryCharging) batteries.get(payload[1 + 2 * i]).level = (payload[2 + 2 * i] & MASK_BATTERY);
batteryCharging = ((payload[2 + 2 * i] & MASK_BATTERY_CHARGING) == MASK_BATTERY_CHARGING); batteries.get(payload[1 + 2 * i]).state =
//LOG.debug("single battery level: " + hexdump(payload, 2+2*i,1) +"-"+ ((payload[2+2*i] & 0xff))+":" + evBattery.level); ((payload[2 + 2 * i] & MASK_BATTERY_CHARGING) == MASK_BATTERY_CHARGING) ? BatteryState.BATTERY_CHARGING : BatteryState.BATTERY_NORMAL;
batEvts.add(batteries.get(payload[1 + 2 * i]));
// evBattery.level += (short) ((payload[2 + 2 * i] & MASK_BATTERY) / numBatteries);
// if (!batteryCharging) {
// batteryCharging = ((payload[2 + 2 * i] & MASK_BATTERY_CHARGING) == MASK_BATTERY_CHARGING);
// }
// LOG.debug("single battery level: " + hexdump(payload, 2+2*i,1) +"-"+ ((payload[2+2*i] & 0xff))+":" + evBattery.level);
} }
evBattery.state = BatteryState.UNKNOWN; // evBattery.state = BatteryState.UNKNOWN;
evBattery.state = batteryCharging ? BatteryState.BATTERY_CHARGING : evBattery.state; // evBattery.state = batteryCharging ? BatteryState.BATTERY_CHARGING : evBattery.state;
return evBattery; // return evBattery;
return batEvts;
} }
private short getRequestCommand(short command) { private short getRequestCommand(short command) {
@ -270,6 +296,15 @@ public class NothingProtocol extends GBDeviceProtocol {
protected NothingProtocol(GBDevice device) { protected NothingProtocol(GBDevice device) {
super(device); super(device);
batteries = new HashMap<>(3);
batteries.put(battery_earphone_left, new GBDeviceEventBatteryInfo());
batteries.put(battery_earphone_right, new GBDeviceEventBatteryInfo());
batteries.put(battery_case, new GBDeviceEventBatteryInfo());
batteries.get(battery_case).batteryIndex=0;
batteries.get(battery_earphone_left).batteryIndex=1;
batteries.get(battery_earphone_right).batteryIndex=2;
} }
} }