mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge
synced 2024-11-30 22:12:55 +01:00
add local time service to PineTime, fixed standard ble format
This commit is contained in:
parent
c05734ed0f
commit
5097327234
@ -40,9 +40,8 @@ public class BLETypeConversions {
|
|||||||
* @return
|
* @return
|
||||||
* @see GattCharacteristic#UUID_CHARACTERISTIC_CURRENT_TIME
|
* @see GattCharacteristic#UUID_CHARACTERISTIC_CURRENT_TIME
|
||||||
*/
|
*/
|
||||||
public static byte[] calendarToRawBytes(Calendar timestamp) {
|
public static byte[] calendarToCurrentTime(Calendar timestamp) {
|
||||||
// MiBand2:
|
// year,year,month,dayofmonth,hour,minute,second,dayofweek,fractions256,reason
|
||||||
// year,year,month,dayofmonth,hour,minute,second,dayofweek,0,0,tz
|
|
||||||
|
|
||||||
byte[] year = fromUint16(timestamp.get(Calendar.YEAR));
|
byte[] year = fromUint16(timestamp.get(Calendar.YEAR));
|
||||||
return new byte[] {
|
return new byte[] {
|
||||||
@ -54,9 +53,33 @@ public class BLETypeConversions {
|
|||||||
fromUint8(timestamp.get(Calendar.MINUTE)),
|
fromUint8(timestamp.get(Calendar.MINUTE)),
|
||||||
fromUint8(timestamp.get(Calendar.SECOND)),
|
fromUint8(timestamp.get(Calendar.SECOND)),
|
||||||
dayOfWeekToRawBytes(timestamp),
|
dayOfWeekToRawBytes(timestamp),
|
||||||
0, // fractions256 (not set)
|
fromUint8((int) (timestamp.get(Calendar.MILLISECOND) / 1000. * 256)),
|
||||||
// 0 (DST offset?) Mi2
|
0, // reason (not set)
|
||||||
// k (tz) Mi2
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts a timestamp to the byte sequence to be sent to the local time characteristic
|
||||||
|
*
|
||||||
|
* Values are expressed in quarters of hours
|
||||||
|
* Following the BLE specification, timezone is constant over dst changes
|
||||||
|
*
|
||||||
|
* @param timestamp
|
||||||
|
* @return
|
||||||
|
* @see GattCharacteristic#UUID_CHARACTERISTIC_LOCAL_TIME
|
||||||
|
*/
|
||||||
|
public static byte[] calendarToLocalTime(Calendar timestamp) {
|
||||||
|
TimeZone timeZone = timestamp.getTimeZone();
|
||||||
|
int offsetMillisTimezone = timeZone.getRawOffset();
|
||||||
|
int utcOffsetInQuarterHours = (offsetMillisTimezone / (1000 * 60 * 15));
|
||||||
|
|
||||||
|
int offsetMillisIncludingDST = timestamp.getTimeZone().getOffset(timestamp.getTimeInMillis());
|
||||||
|
int dstOffsetMillis = offsetMillisIncludingDST - offsetMillisTimezone;
|
||||||
|
int dstOffsetInQuarterHours = (dstOffsetMillis / (1000 * 60 * 15));
|
||||||
|
|
||||||
|
return new byte[] {
|
||||||
|
fromUint8(utcOffsetInQuarterHours),
|
||||||
|
fromUint8(dstOffsetInQuarterHours),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -47,7 +47,7 @@ public class GattCharacteristic {
|
|||||||
public static final UUID UUID_CHARACTERISTIC_EXACT_TIME_256 = UUID.fromString((String.format(AbstractBTLEDeviceSupport.BASE_UUID, "2A0C")));
|
public static final UUID UUID_CHARACTERISTIC_EXACT_TIME_256 = UUID.fromString((String.format(AbstractBTLEDeviceSupport.BASE_UUID, "2A0C")));
|
||||||
public static final UUID UUID_CHARACTERISTIC_DST_OFFSET = UUID.fromString((String.format(AbstractBTLEDeviceSupport.BASE_UUID, "2A0D")));
|
public static final UUID UUID_CHARACTERISTIC_DST_OFFSET = UUID.fromString((String.format(AbstractBTLEDeviceSupport.BASE_UUID, "2A0D")));
|
||||||
public static final UUID UUID_CHARACTERISTIC_TIME_ZONE = UUID.fromString((String.format(AbstractBTLEDeviceSupport.BASE_UUID, "2A0E")));
|
public static final UUID UUID_CHARACTERISTIC_TIME_ZONE = UUID.fromString((String.format(AbstractBTLEDeviceSupport.BASE_UUID, "2A0E")));
|
||||||
public static final UUID UUID_CHARACTERISTIC_LOCAL_TIME_INFORMATION = UUID.fromString((String.format(AbstractBTLEDeviceSupport.BASE_UUID, "2A0F")));
|
public static final UUID UUID_CHARACTERISTIC_LOCAL_TIME = UUID.fromString((String.format(AbstractBTLEDeviceSupport.BASE_UUID, "2A0F")));
|
||||||
public static final UUID UUID_CHARACTERISTIC_TIME_WITH_DST = UUID.fromString((String.format(AbstractBTLEDeviceSupport.BASE_UUID, "2A11")));
|
public static final UUID UUID_CHARACTERISTIC_TIME_WITH_DST = UUID.fromString((String.format(AbstractBTLEDeviceSupport.BASE_UUID, "2A11")));
|
||||||
public static final UUID UUID_CHARACTERISTIC_TIME_ACCURACY = UUID.fromString((String.format(AbstractBTLEDeviceSupport.BASE_UUID, "2A12")));
|
public static final UUID UUID_CHARACTERISTIC_TIME_ACCURACY = UUID.fromString((String.format(AbstractBTLEDeviceSupport.BASE_UUID, "2A12")));
|
||||||
public static final UUID UUID_CHARACTERISTIC_TIME_SOURCE = UUID.fromString((String.format(AbstractBTLEDeviceSupport.BASE_UUID, "2A13")));
|
public static final UUID UUID_CHARACTERISTIC_TIME_SOURCE = UUID.fromString((String.format(AbstractBTLEDeviceSupport.BASE_UUID, "2A13")));
|
||||||
|
@ -404,15 +404,20 @@ public abstract class HuamiSupport extends AbstractBTLEDeviceSupport implements
|
|||||||
return weatherSpec.windSpeedAsBeaufort() + ""; // cast to string
|
return weatherSpec.windSpeedAsBeaufort() + ""; // cast to string
|
||||||
}
|
}
|
||||||
|
|
||||||
public byte[] getTimeBytes(final Calendar calendar, final TimeUnit precision) {
|
public byte[] getTimeBytes(Calendar calendar, TimeUnit precision) {
|
||||||
|
if (precision == TimeUnit.MINUTES) {
|
||||||
final byte[] bytes = BLETypeConversions.shortCalendarToRawBytes(calendar);
|
final byte[] bytes = BLETypeConversions.shortCalendarToRawBytes(calendar);
|
||||||
|
//add nonstandard extension
|
||||||
if (precision != TimeUnit.MINUTES && precision != TimeUnit.SECONDS) {
|
final byte[] tail = new byte[] { 0, BLETypeConversions.mapTimeZone(calendar, BLETypeConversions.TZ_FLAG_INCLUDE_DST_IN_TZ) };
|
||||||
throw new IllegalArgumentException("Unsupported precision, only MINUTES and SECONDS are supported");
|
return BLETypeConversions.join(bytes, tail);
|
||||||
|
} else if (precision == TimeUnit.SECONDS) {
|
||||||
|
final byte[] bytes = BLETypeConversions.calendarToCurrentTime(calendar);
|
||||||
|
//add nonstandard extension, only one byte needed, as format is different from above
|
||||||
|
final byte[] tail = new byte[] { BLETypeConversions.mapTimeZone(calendar, BLETypeConversions.TZ_FLAG_INCLUDE_DST_IN_TZ) };
|
||||||
|
return BLETypeConversions.join(bytes, tail);
|
||||||
|
} else {
|
||||||
|
throw new IllegalArgumentException("Unsupported precision, only MINUTES and SECONDS are supported till now");
|
||||||
}
|
}
|
||||||
final byte seconds = precision == TimeUnit.SECONDS ? fromUint8(calendar.get(Calendar.SECOND)) : 0;
|
|
||||||
final byte tz = BLETypeConversions.mapTimeZone(calendar, BLETypeConversions.TZ_FLAG_INCLUDE_DST_IN_TZ);
|
|
||||||
return BLETypeConversions.join(bytes, new byte[]{seconds, tz});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Calendar fromTimeBytes(byte[] bytes) {
|
public Calendar fromTimeBytes(byte[] bytes) {
|
||||||
|
@ -316,12 +316,12 @@ public class PineTimeJFSupport extends AbstractBTLEDeviceSupport implements DfuL
|
|||||||
public void onSetTime() {
|
public void onSetTime() {
|
||||||
// Since this is a standard we should generalize this in Gadgetbridge (properly)
|
// Since this is a standard we should generalize this in Gadgetbridge (properly)
|
||||||
GregorianCalendar now = BLETypeConversions.createCalendar();
|
GregorianCalendar now = BLETypeConversions.createCalendar();
|
||||||
byte[] bytes = BLETypeConversions.calendarToRawBytes(now);
|
byte[] bytesCurrentTime = BLETypeConversions.calendarToCurrentTime(now);
|
||||||
byte[] tail = new byte[]{0, BLETypeConversions.mapTimeZone(now, BLETypeConversions.TZ_FLAG_INCLUDE_DST_IN_TZ)};
|
byte[] bytesLocalTime = BLETypeConversions.calendarToLocalTime(now);
|
||||||
byte[] all = BLETypeConversions.join(bytes, tail);
|
|
||||||
|
|
||||||
TransactionBuilder builder = new TransactionBuilder("set time");
|
TransactionBuilder builder = new TransactionBuilder("set time");
|
||||||
builder.write(getCharacteristic(GattCharacteristic.UUID_CHARACTERISTIC_CURRENT_TIME), all);
|
builder.write(getCharacteristic(GattCharacteristic.UUID_CHARACTERISTIC_CURRENT_TIME), bytesCurrentTime);
|
||||||
|
builder.write(getCharacteristic(GattCharacteristic.UUID_CHARACTERISTIC_LOCAL_TIME), bytesLocalTime);
|
||||||
builder.queue(getQueue());
|
builder.queue(getQueue());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user