From 79363b0cbb562bc261421d356cc0c6b5065cc3aa Mon Sep 17 00:00:00 2001 From: Arjan Schrijver Date: Fri, 27 Mar 2026 13:21:17 +0100 Subject: [PATCH] Fossil Q: Support calibration of physical hands --- .../devices/qhybrid/QHybridCoordinator.java | 4 ++-- .../adapter/fossil/FossilWatchAdapter.java | 5 ++++- .../adapter/misfit/MisfitWatchAdapter.java | 2 +- .../requests/misfit/MoveHandsRequest.java | 19 ++++++++++++++----- 4 files changed, 21 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/qhybrid/QHybridCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/qhybrid/QHybridCoordinator.java index 759b2b594c..89f9fa5540 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/qhybrid/QHybridCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/qhybrid/QHybridCoordinator.java @@ -269,7 +269,7 @@ public class QHybridCoordinator extends AbstractBLEDeviceCoordinator { deviceSpecificSettings.addRootScreen(R.xml.devicesettings_fossilqhybrid_legacy); deviceSpecificSettings.addRootScreen(R.xml.devicesettings_qhybrid); deviceSpecificSettings.addRootScreen(R.xml.devicesettings_fossilhybridhr_vibration); -// deviceSpecificSettings.addRootScreen(R.xml.devicesettings_fossilhybridhr_calibration); // TODO + deviceSpecificSettings.addRootScreen(R.xml.devicesettings_fossilhybridhr_calibration); final List developer = deviceSpecificSettings.addRootScreen(DeviceSpecificSettingsScreen.DEVELOPER); developer.add(R.xml.devicesettings_fossilhybrids_dev); return deviceSpecificSettings; @@ -345,7 +345,7 @@ public class QHybridCoordinator extends AbstractBLEDeviceCoordinator { return false; } - private boolean isHybridHR(GBDevice device){ + public boolean isHybridHR(GBDevice device){ if(!isFossilHybrid(device)) return false; return device.getName().startsWith("Hybrid HR") || device.getName().equals("Fossil Gen. 6 Hybrid"); } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/adapter/fossil/FossilWatchAdapter.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/adapter/fossil/FossilWatchAdapter.java index a4a21c4647..6ae37c4cb9 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/adapter/fossil/FossilWatchAdapter.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/adapter/fossil/FossilWatchAdapter.java @@ -58,6 +58,7 @@ import nodomain.freeyourgadget.gadgetbridge.database.DBHelper; import nodomain.freeyourgadget.gadgetbridge.devices.qhybrid.HybridHRActivitySampleProvider; import nodomain.freeyourgadget.gadgetbridge.devices.qhybrid.NotificationConfiguration; import nodomain.freeyourgadget.gadgetbridge.devices.qhybrid.PackageConfigHelper; +import nodomain.freeyourgadget.gadgetbridge.devices.qhybrid.QHybridCoordinator; import nodomain.freeyourgadget.gadgetbridge.entities.HybridHRActivitySample; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; import nodomain.freeyourgadget.gadgetbridge.model.ActivityUser; @@ -372,7 +373,9 @@ public class FossilWatchAdapter extends WatchAdapter { @Override public void setHands(MoveHandsRequest.MovementConfiguration movement) { - queueWrite(new MoveHandsRequest(movement), false); + GBDevice dev = getDeviceSupport().getDevice(); + boolean isHybridHR = ((QHybridCoordinator) dev.getDeviceCoordinator()).isHybridHR(dev); + queueWrite(new MoveHandsRequest(movement, isHybridHR), false); } @Override diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/adapter/misfit/MisfitWatchAdapter.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/adapter/misfit/MisfitWatchAdapter.java index 8854c3edbc..1b0af430f8 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/adapter/misfit/MisfitWatchAdapter.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/adapter/misfit/MisfitWatchAdapter.java @@ -385,7 +385,7 @@ public class MisfitWatchAdapter extends WatchAdapter { @Override public void setHands(MoveHandsRequest.MovementConfiguration movement) { - queueWrite(new MoveHandsRequest(movement)); + queueWrite(new MoveHandsRequest(movement, false)); } @Override diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/requests/misfit/MoveHandsRequest.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/requests/misfit/MoveHandsRequest.java index c54c73950f..0a04418d3d 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/requests/misfit/MoveHandsRequest.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/qhybrid/requests/misfit/MoveHandsRequest.java @@ -22,7 +22,10 @@ import java.nio.ByteBuffer; import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.Request; public class MoveHandsRequest extends Request { - public MoveHandsRequest(MovementConfiguration movement){ + private boolean isHybridHR; + + public MoveHandsRequest(MovementConfiguration movement, boolean isHybridHR){ + this.isHybridHR = isHybridHR; init(movement); } @@ -37,8 +40,10 @@ public class MoveHandsRequest extends Request { buffer.put((byte)count); if(movement.isHourSet()){ + short degrees = (short)Math.abs(movement.getHourDegrees()); + if (!isHybridHR && degrees == 1) degrees++; buffer.put((byte)1); - buffer.putShort((short)Math.abs(movement.getHourDegrees())); + buffer.putShort(degrees); if(movement.isRelativeMovement()){ buffer.put(movement.getHourDegrees() >= 0 ? (byte) 1 : (byte) 2); }else { @@ -48,8 +53,10 @@ public class MoveHandsRequest extends Request { } if(movement.isMinuteSet()){ + short degrees = (short)Math.abs(movement.getMinuteDegrees()); + if (!isHybridHR && degrees == 1) degrees++; buffer.put((byte)2); - buffer.putShort((short)Math.abs(movement.getMinuteDegrees())); + buffer.putShort(degrees); if(movement.isRelativeMovement()){ buffer.put(movement.getMinuteDegrees() >= 0 ? (byte) 1 : (byte) 2); }else { @@ -59,8 +66,10 @@ public class MoveHandsRequest extends Request { } if(movement.isSubSet()){ + short degrees = (short)Math.abs(movement.getSubDegrees()); + if (!isHybridHR && degrees == 1) degrees++; buffer.put((byte)3); - buffer.putShort((short)Math.abs(movement.getSubDegrees())); + buffer.putShort(degrees); if(movement.isRelativeMovement()){ buffer.put(movement.getSubDegrees() >= 0 ? (byte) 1 : (byte) 2); }else { @@ -74,7 +83,7 @@ public class MoveHandsRequest extends Request { @Override public byte[] getStartSequence() { - return new byte[]{2, 21, 3}; + return new byte[]{0x02, 0x15, 0x03}; } static public class MovementConfiguration{