mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge
synced 2024-06-02 19:36:14 +02:00
57db0c7c33
- refactor the logic of Global and Local messages - add some Global messages with naming taken from [1] - Global messages are not enum because there are too many - introduce the concept of FieldDefinitionPrimitive - add new Field Definitions - add support for developer fields and array fields - add test case for FIT files taken from [0] [0] https://github.com/polyvertex/fitdecode/ [1] https://www.fitfileviewer.com/
80 lines
2.4 KiB
Java
80 lines
2.4 KiB
Java
package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit;
|
|
|
|
import java.nio.ByteBuffer;
|
|
|
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.GarminByteBufferReader;
|
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.baseTypes.BaseType;
|
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.messages.MessageWriter;
|
|
|
|
public class FieldDefinition implements FieldInterface {
|
|
protected final BaseType baseType;
|
|
protected final int scale;
|
|
protected final int offset;
|
|
private final int number;
|
|
private final int size;
|
|
private final String name;
|
|
|
|
public FieldDefinition(int number, int size, BaseType baseType, String name, int scale, int offset) {
|
|
this.number = number;
|
|
this.size = size;
|
|
this.baseType = baseType;
|
|
this.name = name;
|
|
this.scale = scale;
|
|
this.offset = offset;
|
|
}
|
|
|
|
public FieldDefinition(int number, int size, BaseType baseType, String name) {
|
|
this(number, size, baseType, name, 1, 0);
|
|
}
|
|
|
|
public static FieldDefinition parseIncoming(GarminByteBufferReader garminByteBufferReader, GlobalFITMessage globalFITMessage) {
|
|
int number = garminByteBufferReader.readByte();
|
|
int size = garminByteBufferReader.readByte();
|
|
int baseTypeIdentifier = garminByteBufferReader.readByte();
|
|
BaseType baseType = BaseType.fromIdentifier(baseTypeIdentifier);
|
|
|
|
FieldDefinition global = globalFITMessage.getFieldDefinition(number, size);
|
|
if (null != global && global.getBaseType().equals(baseType)) {
|
|
return global;
|
|
}
|
|
return new FieldDefinition(number, size, baseType, "");
|
|
}
|
|
|
|
public int getNumber() {
|
|
return number;
|
|
}
|
|
|
|
public int getSize() {
|
|
return size;
|
|
}
|
|
|
|
public BaseType getBaseType() {
|
|
return baseType;
|
|
}
|
|
|
|
public String getName() {
|
|
return name;
|
|
}
|
|
|
|
public void generateOutgoingPayload(MessageWriter writer) {
|
|
writer.writeByte(number);
|
|
writer.writeByte(size);
|
|
writer.writeByte(baseType.getIdentifier());
|
|
}
|
|
|
|
@Override
|
|
public Object decode(ByteBuffer byteBuffer) {
|
|
return baseType.decode(byteBuffer, scale, offset);
|
|
}
|
|
|
|
@Override
|
|
public void encode(ByteBuffer byteBuffer, Object o) {
|
|
baseType.encode(byteBuffer, o, scale, offset);
|
|
}
|
|
|
|
@Override
|
|
public void invalidate(ByteBuffer byteBuffer) {
|
|
baseType.invalidate(byteBuffer);
|
|
}
|
|
}
|