1
0
mirror of https://codeberg.org/Freeyourgadget/Gadgetbridge synced 2024-12-25 10:05:49 +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_INTERVALS_SET = "battery_discharge_intervals_set";
public static final String PREF_BATTERY_DISCHARGE_MANAUAL = "battery_discharge_manual"; 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_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("lock");
addPreferenceHandlerFor(PREF_BATTERY_MINIMUM_CHARGE); addPreferenceHandlerFor(PREF_BATTERY_MINIMUM_CHARGE);
addPreferenceHandlerFor(PREF_BATTERY_ALLOW_PASS_THOUGH);
final Preference dischargeIntervalsSet = findPreference(PREF_BATTERY_DISCHARGE_INTERVALS_SET); final Preference dischargeIntervalsSet = findPreference(PREF_BATTERY_DISCHARGE_INTERVALS_SET);
if (dischargeIntervalsSet != null) { if (dischargeIntervalsSet != null) {

View File

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

View File

@ -1,5 +1,6 @@
package nodomain.freeyourgadget.gadgetbridge.service.devices.marstek; 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_INTERVALS_SET;
import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_BATTERY_DISCHARGE_MANAUAL; import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_BATTERY_DISCHARGE_MANAUAL;
import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_BATTERY_MINIMUM_CHARGE; 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_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_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_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 static final Logger LOG = LoggerFactory.getLogger(MarstekB2500DeviceSupport.class);
private int firmwareVersion; private int firmwareVersion;
@ -97,7 +101,7 @@ public class MarstekB2500DeviceSupport extends AbstractBTLEDeviceSupport {
getDevice().setFirmwareVersion2("N/A"); getDevice().setFirmwareVersion2("N/A");
builder.requestMtu(512); builder.requestMtu(512);
builder.notify(getCharacteristic(UUID_CHARACTERISTIC_MAIN), true); builder.notify(getCharacteristic(UUID_CHARACTERISTIC_MAIN), true);
builder.wait(3000); builder.wait(3500);
builder.write(getCharacteristic(UUID_CHARACTERISTIC_MAIN), COMMAND_GET_INFOS1); builder.write(getCharacteristic(UUID_CHARACTERISTIC_MAIN), COMMAND_GET_INFOS1);
builder.wait(750); builder.wait(750);
builder.write(getCharacteristic(UUID_CHARACTERISTIC_MAIN), COMMAND_GET_INFOS2); builder.write(getCharacteristic(UUID_CHARACTERISTIC_MAIN), COMMAND_GET_INFOS2);
@ -130,8 +134,9 @@ public class MarstekB2500DeviceSupport extends AbstractBTLEDeviceSupport {
@Override @Override
public void onSendConfiguration(final String config) { public void onSendConfiguration(final String config) {
if (config.equals(PREF_BATTERY_DISCHARGE_INTERVALS_SET)) {
Prefs devicePrefs = new Prefs(GBApplication.getDeviceSpecificSharedPrefs(getDevice().getAddress())); Prefs devicePrefs = new Prefs(GBApplication.getDeviceSpecificSharedPrefs(getDevice().getAddress()));
switch (config) {
case PREF_BATTERY_DISCHARGE_INTERVALS_SET:
if (devicePrefs.getBoolean(PREF_BATTERY_DISCHARGE_MANAUAL, true)) { if (devicePrefs.getBoolean(PREF_BATTERY_DISCHARGE_MANAUAL, true)) {
sendCommand("set discharge intervals", encodeDischargeIntervalsFromPreferences()); sendCommand("set discharge intervals", encodeDischargeIntervalsFromPreferences());
} else { } else {
@ -139,9 +144,16 @@ public class MarstekB2500DeviceSupport extends AbstractBTLEDeviceSupport {
sendCommand("set channel auto", COMMAND_SET_POWERMETER_CHANNEL1); sendCommand("set channel auto", COMMAND_SET_POWERMETER_CHANNEL1);
} }
return; return;
} else if (config.equals(PREF_BATTERY_MINIMUM_CHARGE)) { case PREF_BATTERY_MINIMUM_CHARGE:
sendCommand("set minimum charge", encodeMinimumChargeFromPreferences()); sendCommand("set minimum charge", encodeMinimumChargeFromPreferences());
return; 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); LOG.warn("Unknown config changed: {}", config);
@ -154,7 +166,7 @@ public class MarstekB2500DeviceSupport extends AbstractBTLEDeviceSupport {
buf.order(ByteOrder.LITTLE_ENDIAN); buf.order(ByteOrder.LITTLE_ENDIAN);
buf.position(12); // skip header and unknown buf.position(12); // skip header and unknown
firmwareVersion = buf.get(); firmwareVersion = buf.get();
boolean charge_before_discharge = buf.get() == 0x01; boolean battery_allow_passthough = buf.get() != 0x01;
boolean manual_discharge_intervals = buf.get() != 0x01; boolean manual_discharge_intervals = buf.get() != 0x01;
buf.position(buf.position() + 3); // skip unknown buf.position(buf.position() + 3); // skip unknown
byte battery_max_use = buf.get(); 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.putString(PREF_BATTERY_MINIMUM_CHARGE, String.valueOf(battery_minimum_charge));
devicePrefsEdit.putBoolean(PREF_BATTERY_DISCHARGE_MANAUAL, manual_discharge_intervals); devicePrefsEdit.putBoolean(PREF_BATTERY_DISCHARGE_MANAUAL, manual_discharge_intervals);
devicePrefsEdit.putBoolean(PREF_BATTERY_ALLOW_PASS_THOUGH, battery_allow_passthough);
devicePrefsEdit.apply(); devicePrefsEdit.apply();
devicePrefsEdit.commit(); devicePrefsEdit.commit();

View File

@ -3559,14 +3559,16 @@
<string name="about_build_details_copied_to_clipboard">Build details copied to clipboard</string> <string name="about_build_details_copied_to_clipboard">Build details copied to clipboard</string>
<string name="devicetype_marstek_b2500">Marstek B2500</string> <string name="devicetype_marstek_b2500">Marstek B2500</string>
<string name="battery_discharge_intervals">Battery Discharge Intervals</string> <string name="battery_discharge_intervals">Battery Discharge Intervals</string>
<string name="discharge_interval_1">Discharge Interval 1</string> <string name="discharge_interval_1">Discharge interval 1</string>
<string name="discharge_interval_2">Discharge Interval 2</string> <string name="discharge_interval_2">Discharge interval 2</string>
<string name="discharge_interval_3">Discharge Interval 3</string> <string name="discharge_interval_3">Discharge interval 3</string>
<string name="discharge_interval_4">Discharge Interval 4</string> <string name="discharge_interval_4">Discharge interval 4</string>
<string name="discharge_interval_5">Discharge Interval 5</string> <string name="discharge_interval_5">Discharge interval 5</string>
<string name="power_w">Power in W</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_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="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> </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" <androidx.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"> xmlns:app="http://schemas.android.com/apk/res-auto">
<PreferenceScreen <PreferenceScreen
android:icon="@drawable/ic_battery" android:icon="@drawable/ic_access_time"
android:key="screen_battery_discharge settings" android:key="screen_battery_discharge settings"
android:persistent="false" android:persistent="false"
android:title="@string/battery_discharge_intervals"> android:title="@string/battery_discharge_intervals">

View File

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