mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge.git
synced 2025-06-05 21:49:48 +02:00
Fossil Hybrid: use polled supported file versions
This commit is contained in:
@@ -53,6 +53,9 @@ import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fos
|
|||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.SetDeviceStateRequest;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.SetDeviceStateRequest;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.alarm.AlarmsSetRequest;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.alarm.AlarmsSetRequest;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.configuration.ConfigurationPutRequest;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.configuration.ConfigurationPutRequest;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.device_info.DeviceInfo;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.device_info.GetDeviceInfoRequest;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.device_info.SupportedFileVersionsInfo;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.file.FilePutRequest;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.file.FilePutRequest;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.notification.NotificationFilterPutRequest;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.notification.NotificationFilterPutRequest;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.notification.PlayTextNotificationRequest;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.notification.PlayTextNotificationRequest;
|
||||||
@@ -87,6 +90,8 @@ public class FossilWatchAdapter extends WatchAdapter {
|
|||||||
|
|
||||||
protected Logger logger = LoggerFactory.getLogger(getClass().getSimpleName());
|
protected Logger logger = LoggerFactory.getLogger(getClass().getSimpleName());
|
||||||
|
|
||||||
|
SupportedFileVersionsInfo supportedFileVersions;
|
||||||
|
|
||||||
public FossilWatchAdapter(QHybridSupport deviceSupport) {
|
public FossilWatchAdapter(QHybridSupport deviceSupport) {
|
||||||
super(deviceSupport);
|
super(deviceSupport);
|
||||||
}
|
}
|
||||||
@@ -98,30 +103,39 @@ public class FossilWatchAdapter extends WatchAdapter {
|
|||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
||||||
queueWrite(new RequestMtuRequest(512), false);
|
queueWrite(new RequestMtuRequest(512), false);
|
||||||
}
|
}
|
||||||
// queueWrite(new FileCloseRequest((short) 0xFFFF));
|
|
||||||
// queueWrite(new ConfigurationGetRequest(this), false);
|
|
||||||
|
|
||||||
|
getDeviceInfos();
|
||||||
|
}
|
||||||
|
|
||||||
|
public short getSupportedFileVersion(FileHandle handle){
|
||||||
|
return this.supportedFileVersions.getSupportedFileVersion(handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void initializeWithSupportedFileVersions() {
|
||||||
syncConfiguration();
|
syncConfiguration();
|
||||||
|
|
||||||
syncNotificationSettings();
|
syncNotificationSettings();
|
||||||
|
|
||||||
syncButtonSettings();
|
syncButtonSettings();
|
||||||
|
|
||||||
/* queueWrite(new ButtonConfigurationGetRequest(this) {
|
|
||||||
@Override
|
|
||||||
public void onConfigurationsGet(ConfigPayload[] configs) {
|
|
||||||
super.onConfigurationsGet(configs);
|
|
||||||
|
|
||||||
JSONArray buttons = new JSONArray();
|
|
||||||
for (ConfigPayload payload : configs) buttons.put(String.valueOf(payload));
|
|
||||||
String json = buttons.toString();
|
|
||||||
getDeviceSupport().getDevice().addDeviceInfo(new GenericItem(ITEM_BUTTONS, json));
|
|
||||||
}
|
|
||||||
}); */
|
|
||||||
|
|
||||||
queueWrite(new SetDeviceStateRequest(GBDevice.State.INITIALIZED), false);
|
queueWrite(new SetDeviceStateRequest(GBDevice.State.INITIALIZED), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void getDeviceInfos(){
|
||||||
|
queueWrite(new GetDeviceInfoRequest(this){
|
||||||
|
@Override
|
||||||
|
public void handleDeviceInfos(DeviceInfo[] deviceInfos) {
|
||||||
|
for(DeviceInfo info : deviceInfos){
|
||||||
|
if(info instanceof SupportedFileVersionsInfo){
|
||||||
|
FossilWatchAdapter.this.supportedFileVersions = (SupportedFileVersionsInfo) info;
|
||||||
|
initializeWithSupportedFileVersions();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
private void syncButtonSettings(){
|
private void syncButtonSettings(){
|
||||||
String buttonConfig = getDeviceSpecificPreferences().getString(CONFIG_ITEM_BUTTONS, null);
|
String buttonConfig = getDeviceSpecificPreferences().getString(CONFIG_ITEM_BUTTONS, null);
|
||||||
getDeviceSupport().getDevice().addDeviceInfo(new GenericItem(ITEM_BUTTONS, buttonConfig));
|
getDeviceSupport().getDevice().addDeviceInfo(new GenericItem(ITEM_BUTTONS, buttonConfig));
|
||||||
|
@@ -137,6 +137,11 @@ public class FossilHRWatchAdapter extends FossilWatchAdapter {
|
|||||||
queueWrite(new RequestMtuRequest(512));
|
queueWrite(new RequestMtuRequest(512));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getDeviceInfos();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void initializeWithSupportedFileVersions() {
|
||||||
queueWrite(new SetDeviceStateRequest(GBDevice.State.AUTHENTICATING));
|
queueWrite(new SetDeviceStateRequest(GBDevice.State.AUTHENTICATING));
|
||||||
|
|
||||||
negotiateSymmetricKey();
|
negotiateSymmetricKey();
|
||||||
|
@@ -29,27 +29,12 @@ import nodomain.freeyourgadget.gadgetbridge.util.Version;
|
|||||||
|
|
||||||
public class AlarmsSetRequest extends FilePutRequest {
|
public class AlarmsSetRequest extends FilePutRequest {
|
||||||
public AlarmsSetRequest(Alarm[] alarms, FossilWatchAdapter adapter) {
|
public AlarmsSetRequest(Alarm[] alarms, FossilWatchAdapter adapter) {
|
||||||
super(FileHandle.ALARMS, createFileFromAlarms(alarms, isNewFormat(adapter)), isNewFormat(adapter) ? (short) 3 : (short) 2, adapter); // TODO version 3
|
super(FileHandle.ALARMS, createFileFromAlarms(alarms, adapter.getSupportedFileVersion(FileHandle.ALARMS)), adapter);
|
||||||
}
|
}
|
||||||
|
|
||||||
static private boolean isNewFormat(FossilWatchAdapter adapter) {
|
static public byte[] createFileFromAlarms(Alarm[] alarms, short fileFormat) {
|
||||||
GBDevice device = adapter.getDeviceSupport().getDevice();
|
|
||||||
String firmware = device.getFirmwareVersion();
|
|
||||||
|
|
||||||
Version newFormatVersion = new Version("1.0.2.17");
|
|
||||||
Pattern versionPattern = Pattern.compile("([0-9]+)\\.([0-9]+)\\.([0-9]+)\\.([0-9]+)");
|
|
||||||
Matcher matcher = versionPattern.matcher(firmware);
|
|
||||||
|
|
||||||
if (matcher.find()) {
|
|
||||||
String thisVersion = matcher.group(0);
|
|
||||||
return newFormatVersion.compareTo(new Version(thisVersion)) != 1;
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static public byte[] createFileFromAlarms(Alarm[] alarms, boolean newFormat) {
|
|
||||||
ByteBuffer buffer;
|
ByteBuffer buffer;
|
||||||
|
boolean newFormat = fileFormat == 0x03;
|
||||||
if (!newFormat) {
|
if (!newFormat) {
|
||||||
buffer = ByteBuffer.allocate(alarms.length * 3);
|
buffer = ByteBuffer.allocate(alarms.length * 3);
|
||||||
for (Alarm alarm : alarms) buffer.put(alarm.getData());
|
for (Alarm alarm : alarms) buffer.put(alarm.getData());
|
||||||
|
@@ -0,0 +1,5 @@
|
|||||||
|
package nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.device_info;
|
||||||
|
|
||||||
|
public interface DeviceInfo {
|
||||||
|
public void parsePayload(byte[] payload);
|
||||||
|
}
|
@@ -0,0 +1,78 @@
|
|||||||
|
package nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.device_info;
|
||||||
|
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
import java.nio.ByteOrder;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.concurrent.atomic.AtomicReferenceArray;
|
||||||
|
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.adapter.fossil.FossilWatchAdapter;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.file.FileHandle;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.file.FileGetRequest;
|
||||||
|
|
||||||
|
public class GetDeviceInfoRequest extends FileGetRequest {
|
||||||
|
enum INFO_CLASS{
|
||||||
|
SUPPORTED_FILE_VERSIONS((short) 0x0a, SupportedFileVersionsInfo.class),
|
||||||
|
;
|
||||||
|
private short identifier;
|
||||||
|
private Class<? extends DeviceInfo> itemClass;
|
||||||
|
|
||||||
|
private INFO_CLASS(short identifier, Class<? extends DeviceInfo> itemClass){
|
||||||
|
this.identifier = identifier;
|
||||||
|
this.itemClass = itemClass;
|
||||||
|
}
|
||||||
|
|
||||||
|
static INFO_CLASS getByIdentifier(short identifier){
|
||||||
|
for(INFO_CLASS infoClass : values()){
|
||||||
|
if(infoClass.getIdentifier() == identifier) return infoClass;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public short getIdentifier() {
|
||||||
|
return identifier;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Class<? extends DeviceInfo> getItemClass() {
|
||||||
|
return itemClass;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public GetDeviceInfoRequest(FossilWatchAdapter adapter) {
|
||||||
|
super(FileHandle.DEVICE_INFO, adapter);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void handleFileData(byte[] fileData) {
|
||||||
|
ByteBuffer buffer = ByteBuffer.wrap(fileData);
|
||||||
|
buffer.order(ByteOrder.LITTLE_ENDIAN);
|
||||||
|
buffer.position(12);
|
||||||
|
|
||||||
|
ArrayList<DeviceInfo> deviceInfos = new ArrayList<>();
|
||||||
|
|
||||||
|
while(buffer.remaining() > 4){
|
||||||
|
short type = buffer.getShort();
|
||||||
|
int length = buffer.get();
|
||||||
|
byte[] payload = new byte[length];
|
||||||
|
buffer.get(payload);
|
||||||
|
|
||||||
|
INFO_CLASS infoClass = INFO_CLASS.getByIdentifier(type);
|
||||||
|
if(infoClass == null) continue;
|
||||||
|
|
||||||
|
Class<? extends DeviceInfo> infoC = infoClass.getItemClass();
|
||||||
|
try {
|
||||||
|
DeviceInfo info = infoC.newInstance();
|
||||||
|
info.parsePayload(payload);
|
||||||
|
deviceInfos.add(info);
|
||||||
|
} catch (IllegalAccessException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (InstantiationException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
handleDeviceInfos(deviceInfos.toArray(new DeviceInfo[0]));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void handleDeviceInfos(DeviceInfo[] deviceInfos){
|
||||||
|
log("got infos");
|
||||||
|
};
|
||||||
|
}
|
@@ -0,0 +1,35 @@
|
|||||||
|
package nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.device_info;
|
||||||
|
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
import java.nio.ByteOrder;
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.file.FileHandle;
|
||||||
|
|
||||||
|
public class SupportedFileVersionsInfo implements DeviceInfo {
|
||||||
|
private HashMap<Byte, Short> supportedFileVersions = new HashMap<>();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void parsePayload(byte[] payload) {
|
||||||
|
ByteBuffer buffer = ByteBuffer.wrap(payload);
|
||||||
|
buffer.order(ByteOrder.LITTLE_ENDIAN);
|
||||||
|
|
||||||
|
while(buffer.remaining() > 0){
|
||||||
|
byte handle = buffer.get();
|
||||||
|
short version = buffer.getShort();
|
||||||
|
supportedFileVersions.put(handle, version);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public short getSupportedFileVersion(FileHandle fileHandle){
|
||||||
|
return getSupportedFileVersion(fileHandle.getHandle());
|
||||||
|
}
|
||||||
|
|
||||||
|
public short getSupportedFileVersion(short fileHandle){
|
||||||
|
return getSupportedFileVersion((byte)((fileHandle >> 8) & 0xFF));
|
||||||
|
}
|
||||||
|
|
||||||
|
public short getSupportedFileVersion(byte fileHandle){
|
||||||
|
return supportedFileVersions.get(fileHandle);
|
||||||
|
}
|
||||||
|
}
|
@@ -47,7 +47,7 @@ public class FilePutRequest extends FilePutRawRequest {
|
|||||||
private int fullCRC;
|
private int fullCRC;
|
||||||
|
|
||||||
public FilePutRequest(FileHandle fileHandle, byte[] file, FossilWatchAdapter adapter) {
|
public FilePutRequest(FileHandle fileHandle, byte[] file, FossilWatchAdapter adapter) {
|
||||||
super(fileHandle, createFilePayload(fileHandle, file, (short) 0), adapter);
|
super(fileHandle, createFilePayload(fileHandle, file, adapter.getSupportedFileVersion(fileHandle)), adapter);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static byte[] createFilePayload(FileHandle fileHandle, byte[] file, short fileVersion){
|
private static byte[] createFilePayload(FileHandle fileHandle, byte[] file, short fileVersion){
|
||||||
|
@@ -9,7 +9,7 @@ import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fos
|
|||||||
|
|
||||||
public class TranslationsPutRequest extends FilePutRequest {
|
public class TranslationsPutRequest extends FilePutRequest {
|
||||||
public TranslationsPutRequest(TranslationData translationData, FossilWatchAdapter adapter) {
|
public TranslationsPutRequest(TranslationData translationData, FossilWatchAdapter adapter) {
|
||||||
super(FileHandle.ASSET_TRANSLATIONS, createPayload(translationData), (short) 0x0d02, adapter);
|
super(FileHandle.ASSET_TRANSLATIONS, createPayload(translationData), adapter);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static byte[] createPayload(TranslationData translationData){
|
private static byte[] createPayload(TranslationData translationData){
|
||||||
|
Reference in New Issue
Block a user