1
0
mirror of https://codeberg.org/Freeyourgadget/Gadgetbridge synced 2024-12-25 01:55:50 +01:00

Marstek B2500: support battery pass-though, cleanups

This commit is contained in:
Andreas Shimokawa 2024-12-16 02:00:37 +01:00
parent 3ef6f092b3
commit 899f283a1b
8 changed files with 53 additions and 28 deletions

View File

@ -598,4 +598,5 @@ public class DeviceSettingsPreferenceConst {
public static final String PREF_BATTERY_DISCHARGE_INTERVALS_SET = "battery_discharge_intervals_set";
public static final String PREF_BATTERY_DISCHARGE_MANAUAL = "battery_discharge_manual";
public static final String PREF_BATTERY_MINIMUM_CHARGE = "battery_minimum_charge";
public static final String PREF_BATTERY_ALLOW_PASS_THOUGH = "battery_allow_pass_though";
}

View File

@ -884,6 +884,7 @@ public class DeviceSpecificSettingsFragment extends AbstractPreferenceFragment i
addPreferenceHandlerFor("lock");
addPreferenceHandlerFor(PREF_BATTERY_MINIMUM_CHARGE);
addPreferenceHandlerFor(PREF_BATTERY_ALLOW_PASS_THOUGH);
final Preference dischargeIntervalsSet = findPreference(PREF_BATTERY_DISCHARGE_INTERVALS_SET);
if (dischargeIntervalsSet != null) {

View File

@ -61,6 +61,7 @@ public class MarstekB2500DeviceCoordinator extends AbstractDeviceCoordinator {
@Override
public int[] getSupportedDeviceSpecificSettings(GBDevice device) {
return new int[]{
R.xml.devicesettings_battery_allow_pass_though,
R.xml.devicesettings_battery_minimum_charge,
R.xml.devicesettings_battery_discharge_5
};

View File

@ -1,5 +1,6 @@
package nodomain.freeyourgadget.gadgetbridge.service.devices.marstek;
import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_BATTERY_ALLOW_PASS_THOUGH;
import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_BATTERY_DISCHARGE_INTERVALS_SET;
import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_BATTERY_DISCHARGE_MANAUAL;
import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_BATTERY_MINIMUM_CHARGE;
@ -45,6 +46,9 @@ public class MarstekB2500DeviceSupport extends AbstractBTLEDeviceSupport {
private static final byte[] COMMAND_REBOOT = new byte[]{COMMAND_PREFIX, 0x06, COMMAND, OPCODE_REBOOT, 0x01, 0x72};
private static final byte[] COMMAND_SET_AUTO_DISCHARGE = new byte[]{COMMAND_PREFIX, 0x06, COMMAND, 0x11, 0x00, 0x47};
private static final byte[] COMMAND_SET_POWERMETER_CHANNEL1 = new byte[]{COMMAND_PREFIX, 0x06, COMMAND, 0x2a, 0x00, 0x7c};
private static final byte[] COMMAND_SET_BATTERY_ALLOW_PASS_THOUGH = new byte[]{COMMAND_PREFIX, 0x06, COMMAND, 0x0d, 0x00, 0x5b};
private static final byte[] COMMAND_SET_BATTERY_DISALLOW_PASS_THOUGH = new byte[]{COMMAND_PREFIX, 0x06, COMMAND, 0x0d, 0x01, 0x5a};
private static final Logger LOG = LoggerFactory.getLogger(MarstekB2500DeviceSupport.class);
private int firmwareVersion;
@ -97,7 +101,7 @@ public class MarstekB2500DeviceSupport extends AbstractBTLEDeviceSupport {
getDevice().setFirmwareVersion2("N/A");
builder.requestMtu(512);
builder.notify(getCharacteristic(UUID_CHARACTERISTIC_MAIN), true);
builder.wait(3000);
builder.wait(3500);
builder.write(getCharacteristic(UUID_CHARACTERISTIC_MAIN), COMMAND_GET_INFOS1);
builder.wait(750);
builder.write(getCharacteristic(UUID_CHARACTERISTIC_MAIN), COMMAND_GET_INFOS2);
@ -130,8 +134,9 @@ public class MarstekB2500DeviceSupport extends AbstractBTLEDeviceSupport {
@Override
public void onSendConfiguration(final String config) {
if (config.equals(PREF_BATTERY_DISCHARGE_INTERVALS_SET)) {
Prefs devicePrefs = new Prefs(GBApplication.getDeviceSpecificSharedPrefs(getDevice().getAddress()));
switch (config) {
case PREF_BATTERY_DISCHARGE_INTERVALS_SET:
if (devicePrefs.getBoolean(PREF_BATTERY_DISCHARGE_MANAUAL, true)) {
sendCommand("set discharge intervals", encodeDischargeIntervalsFromPreferences());
} else {
@ -139,9 +144,16 @@ public class MarstekB2500DeviceSupport extends AbstractBTLEDeviceSupport {
sendCommand("set channel auto", COMMAND_SET_POWERMETER_CHANNEL1);
}
return;
} else if (config.equals(PREF_BATTERY_MINIMUM_CHARGE)) {
case PREF_BATTERY_MINIMUM_CHARGE:
sendCommand("set minimum charge", encodeMinimumChargeFromPreferences());
return;
case PREF_BATTERY_ALLOW_PASS_THOUGH:
if (devicePrefs.getBoolean(PREF_BATTERY_ALLOW_PASS_THOUGH, true)) {
sendCommand("set allow pass-though", COMMAND_SET_BATTERY_ALLOW_PASS_THOUGH);
} else {
sendCommand("set disallow pass-though", COMMAND_SET_BATTERY_DISALLOW_PASS_THOUGH);
}
return;
}
LOG.warn("Unknown config changed: {}", config);
@ -154,7 +166,7 @@ public class MarstekB2500DeviceSupport extends AbstractBTLEDeviceSupport {
buf.order(ByteOrder.LITTLE_ENDIAN);
buf.position(12); // skip header and unknown
firmwareVersion = buf.get();
boolean charge_before_discharge = buf.get() == 0x01;
boolean battery_allow_passthough = buf.get() != 0x01;
boolean manual_discharge_intervals = buf.get() != 0x01;
buf.position(buf.position() + 3); // skip unknown
byte battery_max_use = buf.get();
@ -169,7 +181,7 @@ public class MarstekB2500DeviceSupport extends AbstractBTLEDeviceSupport {
devicePrefsEdit.putString(PREF_BATTERY_MINIMUM_CHARGE, String.valueOf(battery_minimum_charge));
devicePrefsEdit.putBoolean(PREF_BATTERY_DISCHARGE_MANAUAL, manual_discharge_intervals);
devicePrefsEdit.putBoolean(PREF_BATTERY_ALLOW_PASS_THOUGH, battery_allow_passthough);
devicePrefsEdit.apply();
devicePrefsEdit.commit();

View File

@ -3559,14 +3559,16 @@
<string name="about_build_details_copied_to_clipboard">Build details copied to clipboard</string>
<string name="devicetype_marstek_b2500">Marstek B2500</string>
<string name="battery_discharge_intervals">Battery Discharge Intervals</string>
<string name="discharge_interval_1">Discharge Interval 1</string>
<string name="discharge_interval_2">Discharge Interval 2</string>
<string name="discharge_interval_3">Discharge Interval 3</string>
<string name="discharge_interval_4">Discharge Interval 4</string>
<string name="discharge_interval_5">Discharge Interval 5</string>
<string name="discharge_interval_1">Discharge interval 1</string>
<string name="discharge_interval_2">Discharge interval 2</string>
<string name="discharge_interval_3">Discharge interval 3</string>
<string name="discharge_interval_4">Discharge interval 4</string>
<string name="discharge_interval_5">Discharge interval 5</string>
<string name="power_w">Power in W</string>
<string name="manual_discharge_summary">when disabled, this assumes intelligent discharge controlled by an external power meter (not supported by Gadgetbridge)</string>
<string name="manual_discharge">Manual Discharge Intervals</string>
<string name="manual_discharge">Manual discharge intervals</string>
<string name="summary_battery_discharge_intervals_set">Send configuration below to device</string>
<string name="battery_minimum_charge">Minimum allowed charge in %</string>
<string name="battery_minimum_charge">Minimum battery charge in %</string>
<string name="battery_allow_pass_though_summary">When enabled, the battery can be charged while discharging</string>
<string name="battery_allow_pass_through">Allow battery pass-though</string>
</resources>

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<SwitchPreferenceCompat
android:defaultValue="false"
android:key="battery_charge_before_discharge"
android:layout="@layout/preference_checkbox"
android:summary="@string/battery_allow_pass_though_summary"
android:title="@string/battery_allow_pass_through" />
</androidx.preference.PreferenceScreen>

View File

@ -2,7 +2,7 @@
<androidx.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<PreferenceScreen
android:icon="@drawable/ic_battery"
android:icon="@drawable/ic_access_time"
android:key="screen_battery_discharge settings"
android:persistent="false"
android:title="@string/battery_discharge_intervals">

View File

@ -2,7 +2,6 @@
<androidx.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<EditTextPreference
android:icon="@drawable/ic_battery"
android:defaultValue="10"
android:inputType="number"
android:key="battery_minimum_charge"