Mi Smart Scale: Mark device as busy while fetching weight history

This commit is contained in:
José Rebelo
2025-04-26 14:18:50 +01:00
parent 04f4b2f448
commit 5e7c5ac059
4 changed files with 43 additions and 7 deletions
@@ -18,6 +18,7 @@ package nodomain.freeyourgadget.gadgetbridge.devices.miscale;
import androidx.annotation.NonNull;
import java.util.EnumSet;
import java.util.regex.Pattern;
import de.greenrobot.dao.query.QueryBuilder;
@@ -32,6 +33,7 @@ import nodomain.freeyourgadget.gadgetbridge.entities.MiScaleWeightSampleDao;
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
import nodomain.freeyourgadget.gadgetbridge.model.WeightSample;
import nodomain.freeyourgadget.gadgetbridge.service.DeviceSupport;
import nodomain.freeyourgadget.gadgetbridge.service.ServiceDeviceSupport;
import nodomain.freeyourgadget.gadgetbridge.service.devices.miscale.MiSmartScaleDeviceSupport;
public class MiSmartScaleCoordinator extends AbstractBLEDeviceCoordinator {
@@ -128,4 +130,9 @@ public class MiSmartScaleCoordinator extends AbstractBLEDeviceCoordinator {
public Class<? extends DeviceSupport> getDeviceSupportClass(final GBDevice device) {
return MiSmartScaleDeviceSupport.class;
}
@Override
public EnumSet<ServiceDeviceSupport.Flags> getInitialFlags() {
return EnumSet.noneOf(ServiceDeviceSupport.Flags.class);
}
}
@@ -365,9 +365,9 @@ public class GBDevice implements Parcelable {
throw new IllegalArgumentException("busy task must not be null");
}
if (mBusyTask != null) {
LOG.warn("Attempt to mark device as busy with: " + task + ", but is already busy with: " + mBusyTask);
LOG.warn("Attempt to mark device as busy with: {}, but is already busy with: {}", task, mBusyTask);
}
LOG.info("Mark device as busy: " + task);
LOG.info("Mark device as busy: {}", task);
mBusyTask = task;
}
@@ -379,7 +379,7 @@ public class GBDevice implements Parcelable {
LOG.error("Attempt to mark device as not busy anymore, but was not busy before.");
return;
}
LOG.info("Mark device as NOT busy anymore: " + mBusyTask);
LOG.info("Mark device as NOT busy anymore: {}", mBusyTask);
mBusyTask = null;
}
@@ -31,6 +31,7 @@ import java.util.List;
import java.util.UUID;
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
import nodomain.freeyourgadget.gadgetbridge.R;
import nodomain.freeyourgadget.gadgetbridge.database.DBHandler;
import nodomain.freeyourgadget.gadgetbridge.database.DBHelper;
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventVersionInfo;
@@ -43,10 +44,12 @@ import nodomain.freeyourgadget.gadgetbridge.service.btle.BLETypeConversions;
import nodomain.freeyourgadget.gadgetbridge.service.btle.GattCharacteristic;
import nodomain.freeyourgadget.gadgetbridge.service.btle.GattService;
import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder;
import nodomain.freeyourgadget.gadgetbridge.service.btle.actions.SetDeviceBusyAction;
import nodomain.freeyourgadget.gadgetbridge.service.btle.actions.SetDeviceStateAction;
import nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.deviceinfo.DeviceInfo;
import nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.deviceinfo.DeviceInfoProfile;
import nodomain.freeyourgadget.gadgetbridge.service.serial.GBDeviceProtocol;
import nodomain.freeyourgadget.gadgetbridge.util.GB;
import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.*;
@@ -118,11 +121,8 @@ public class MiSmartScaleDeviceSupport extends AbstractBTLEDeviceSupport {
setTime(builder);
builder.notify(getCharacteristic(GattCharacteristic.UUID_CHARACTERISTIC_WEIGHT_MEASUREMENT), true);
builder.notify(getCharacteristic(UUID_CHARACTERISTIC_WEIGHT_HISTORY), true);
// Query weight measurements saved by the scale
sendHistoryCommand(builder, CMD_HISTORY_START, true);
sendHistoryCommand(builder, CMD_HISTORY_QUERY, false);
fetchWeightHistory(builder);
builder.add(new SetDeviceStateAction(getDevice(), GBDevice.State.INITIALIZED, getContext()));
@@ -150,6 +150,9 @@ public class MiSmartScaleDeviceSupport extends AbstractBTLEDeviceSupport {
sendHistoryCommand(builder, CMD_HISTORY_END, true);
builder.notify(getCharacteristic(UUID_CHARACTERISTIC_WEIGHT_HISTORY), false);
builder.queue(getQueue());
getDevice().unsetBusyTask();
GB.updateTransferNotification(null, "", false, 100, getContext());
getDevice().sendDeviceUpdateIntent(getContext());
} else {
ByteBuffer buf = ByteBuffer.wrap(characteristic.getValue());
List<WeightMeasurement> measurements = new ArrayList<>();
@@ -210,6 +213,31 @@ public class MiSmartScaleDeviceSupport extends AbstractBTLEDeviceSupport {
return false;
}
@Override
public void onFetchRecordedData(final int dataTypes) {
if (getDevice().isBusy()) {
// already busy
return;
}
final TransactionBuilder builder = createTransactionBuilder("fetch weight history");
fetchWeightHistory(builder);
builder.queue(getQueue());
}
public void fetchWeightHistory(final TransactionBuilder builder) {
final String fetchMessage = getContext().getString(R.string.busy_task_fetch_weight_data);
GB.updateTransferNotification(fetchMessage,"", true, 0, getContext());
builder.add(new SetDeviceBusyAction(getDevice(), fetchMessage, getContext()));
builder.notify(getCharacteristic(UUID_CHARACTERISTIC_WEIGHT_HISTORY), true);
// Query weight measurements saved by the scale
sendHistoryCommand(builder, CMD_HISTORY_START, true);
sendHistoryCommand(builder, CMD_HISTORY_QUERY, false);
builder.queue(getQueue());
}
private void setTime(TransactionBuilder builder) {
GregorianCalendar now = BLETypeConversions.createCalendar();
byte[] time = BLETypeConversions.calendarToCurrentTime(now, 0);
+1
View File
@@ -724,6 +724,7 @@
<string name="busy_task_fetch_sleep_respiratory_rate_data">Fetching sleep respiratory rate data</string>
<string name="busy_task_fetch_temperature">Fetching temperature data</string>
<string name="busy_task_fetch_statistics">Fetching statistics</string>
<string name="busy_task_fetch_weight_data">Fetching weight data</string>
<string name="sleep_activity_date_range">From %1$s to %2$s</string>
<string name="prefs_wearside">Wearing left or right?</string>
<string name="prefs_weardirection">Wearing direction</string>