From e10697448ca5f420e04463d443ce07cbffa5d34a Mon Sep 17 00:00:00 2001
From: uli <cybuzuma@vnxs.de>
Date: Sun, 29 May 2022 23:41:19 +0200
Subject: [PATCH] added local time characteristic

---
 infinitime.go | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/infinitime.go b/infinitime.go
index d48e902..d0edb1d 100644
--- a/infinitime.go
+++ b/infinitime.go
@@ -33,6 +33,7 @@ const (
 	MotionValChar   = "00030002-78fc-48fe-8e23-433b3a1942d0"
 	FirmwareVerChar = "00002a26-0000-1000-8000-00805f9b34fb"
 	CurrentTimeChar = "00002a2b-0000-1000-8000-00805f9b34fb"
+	LocalTimeChar   = "00002a0f-0000-1000-8000-00805f9b34fb"
 	BatteryLvlChar  = "00002a19-0000-1000-8000-00805f9b34fb"
 	HeartRateChar   = "00002a37-0000-1000-8000-00805f9b34fb"
 	FSTransferChar  = "adaf0200-4669-6c65-5472-616e73666572"
@@ -47,6 +48,7 @@ var charNames = map[string]string{
 	MotionValChar:   "Motion Values",
 	FirmwareVerChar: "Firmware Version",
 	CurrentTimeChar: "Current Time",
+	LocalTimeChar:   "Local Time",
 	BatteryLvlChar:  "Battery Level",
 	HeartRateChar:   "Heart Rate",
 	FSTransferChar:  "Filesystem Transfer",
@@ -62,6 +64,7 @@ type Device struct {
 	motionValChar   *gatt.GattCharacteristic1
 	fwVersionChar   *gatt.GattCharacteristic1
 	currentTimeChar *gatt.GattCharacteristic1
+	localTimeChar   *gatt.GattCharacteristic1
 	battLevelChar   *gatt.GattCharacteristic1
 	heartRateChar   *gatt.GattCharacteristic1
 	fsVersionChar   *gatt.GattCharacteristic1
@@ -406,6 +409,8 @@ func (i *Device) resolveChars() error {
 			i.fwVersionChar = char
 		case CurrentTimeChar:
 			i.currentTimeChar = char
+		case LocalTimeChar:
+			i.localTimeChar = char
 		case BatteryLvlChar:
 			i.battLevelChar = char
 		case HeartRateChar:
@@ -711,6 +716,23 @@ func (i *Device) SetTime(t time.Time) error {
 	return i.currentTimeChar.WriteValue(buf.Bytes(), nil)
 }
 
+// SetTimezone sets the watch's timezone information using the Local Time Service
+func (i *Device) SetTimezone(t time.Time) error {
+	if err := i.checkStatus(i.localTimeChar, LocalTimeChar); err != nil {
+		return err
+	}
+	_, offset := t.Zone()
+	dst := 0
+	if t.IsDST() {
+		dst = 3600
+		offset = offset - 3600
+	}
+	buf := &bytes.Buffer{}
+	binary.Write(buf, binary.LittleEndian, uint8(offset / 3600 * 4))
+	binary.Write(buf, binary.LittleEndian, uint8(dst / 3600 * 4))
+	return i.localTimeChar.WriteValue(buf.Bytes(), nil)
+}
+
 // Notify sends a notification to InfiniTime via
 // the Alert Notification Service (ANS)
 func (i *Device) Notify(title, body string) error {