1
0
mirror of https://codeberg.org/Freeyourgadget/Gadgetbridge synced 2024-06-02 19:36:14 +02:00
Gadgetbridge/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/messages/DeviceInformationMessage.java
Daniele Gobbetti 4363f94661 Garmin protocol: initial refactoring and basic functionalities
This commit takes aims to bring many new garmin devices up to a working status, with basic functionalities such as:
- garmin protocol initialization
- basic message exchange
- support for some messages in Garmin own format
- support for some messages in protobuf format
2024-05-01 23:35:15 +01:00

92 lines
4.1 KiB
Java

package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.messages;
import android.bluetooth.BluetoothAdapter;
import android.os.Build;
import java.util.Locale;
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventVersionInfo;
public class DeviceInformationMessage extends GFDIMessage {
final int ourUnitNumber = -1;
final int ourSoftwareVersion = 7791;
final int ourMaxPacketSize = -1;
private final int messageType;
private final int incomingProtocolVersion;
private final int ourProtocolVersion = 150;
private final int incomingProductNumber;
private final int ourProductNumber = -1;
private final String incomingUnitNumber;
private final int incomingSoftwareVersion;
private final int incomingMaxPacketSize;
private final String bluetoothFriendlyName;
private final String deviceName;
private final String deviceModel;
// dual-pairing flags & MAC addresses...
public DeviceInformationMessage(int messageType, int protocolVersion, int productNumber, String unitNumber, int softwareVersion, int maxPacketSize, String bluetoothFriendlyName, String deviceName, String deviceModel) {
this.messageType = messageType;
this.incomingProtocolVersion = protocolVersion;
this.incomingProductNumber = productNumber;
this.incomingUnitNumber = unitNumber;
this.incomingSoftwareVersion = softwareVersion;
this.incomingMaxPacketSize = maxPacketSize;
this.bluetoothFriendlyName = bluetoothFriendlyName;
this.deviceName = deviceName;
this.deviceModel = deviceModel;
}
public static DeviceInformationMessage parseIncoming(MessageReader reader, int messageType) {
final int protocolVersion = reader.readShort();
final int productNumber = reader.readShort();
final String unitNumber = Long.toString(reader.readInt() & 0xFFFFFFFFL);
final int softwareVersion = reader.readShort();
final int maxPacketSize = reader.readShort();
final String bluetoothFriendlyName = reader.readString();
final String deviceName = reader.readString();
final String deviceModel = reader.readString();
reader.warnIfLeftover();
return new DeviceInformationMessage(messageType, protocolVersion, productNumber, unitNumber, softwareVersion, maxPacketSize, bluetoothFriendlyName, deviceName, deviceModel);
}
@Override
protected boolean generateOutgoing() {
final int protocolFlags = this.incomingProtocolVersion / 100 == 1 ? 1 : 0;
final MessageWriter writer = new MessageWriter(response);
writer.writeShort(0); // placeholder for packet size
writer.writeShort(GarminMessage.RESPONSE.getId());
writer.writeShort(messageType);
writer.writeByte(Status.ACK.ordinal());
writer.writeShort(ourProtocolVersion);
writer.writeShort(ourProductNumber);
writer.writeInt(ourUnitNumber);
writer.writeShort(ourSoftwareVersion);
writer.writeShort(ourMaxPacketSize);
writer.writeString(BluetoothAdapter.getDefaultAdapter().getName());
writer.writeString(Build.MANUFACTURER);
writer.writeString(Build.DEVICE);
writer.writeByte(protocolFlags);
return true;
}
public GBDeviceEventVersionInfo getGBDeviceEvent() {
LOG.info("Received device information: protocol {}, product {}, unit {}, SW {}, max packet {}, BT name {}, device name {}, device model {}", incomingProtocolVersion, incomingProductNumber, incomingUnitNumber, getSoftwareVersionStr(), incomingMaxPacketSize, bluetoothFriendlyName, deviceName, deviceModel);
GBDeviceEventVersionInfo versionCmd = new GBDeviceEventVersionInfo();
versionCmd.fwVersion = getSoftwareVersionStr();
versionCmd.hwVersion = deviceModel;
return versionCmd;
}
private String getSoftwareVersionStr() {
int softwareVersionMajor = incomingSoftwareVersion / 100;
int softwareVersionMinor = incomingSoftwareVersion % 100;
return String.format(Locale.ROOT, "%d.%02d", softwareVersionMajor, softwareVersionMinor);
}
}