Fossil Q: Support calibration of physical hands

This commit is contained in:
Arjan Schrijver
2026-04-05 14:18:10 +02:00
committed by Arjan Schrijver
parent 9e3e381680
commit 79363b0cbb
4 changed files with 21 additions and 9 deletions
@@ -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<Integer> 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");
}
@@ -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
@@ -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
@@ -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{