From 5c40e71355ea39bf5194f8b624e0832137ec82af Mon Sep 17 00:00:00 2001 From: 115ek Date: Tue, 30 Jun 2020 20:35:56 +0200 Subject: [PATCH] TLW64: Support alarms --- .../devices/tlw64/TLW64Constants.java | 9 +++ .../devices/tlw64/TLW64Coordinator.java | 2 +- .../service/devices/tlw64/TLW64Support.java | 62 +++++++++++++++++++ 3 files changed, 72 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/tlw64/TLW64Constants.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/tlw64/TLW64Constants.java index 9c969ab32..d1c8accda 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/tlw64/TLW64Constants.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/tlw64/TLW64Constants.java @@ -47,4 +47,13 @@ public final class TLW64Constants { public static final byte ICON_WECHAT = (byte) 0x02; public static final byte ICON_MAIL = (byte) 0x04; + // Alarm arguments + public static final byte ARG_SET_ALARM_REMINDER_REPEAT_SUNDAY = (byte) 0x01; + public static final byte ARG_SET_ALARM_REMINDER_REPEAT_MONDAY = (byte) 0x02; + public static final byte ARG_SET_ALARM_REMINDER_REPEAT_TUESDAY = (byte) 0x04; + public static final byte ARG_SET_ALARM_REMINDER_REPEAT_WEDNESDAY = (byte) 0x08; + public static final byte ARG_SET_ALARM_REMINDER_REPEAT_THURSDAY = (byte) 0x10; + public static final byte ARG_SET_ALARM_REMINDER_REPEAT_FRIDAY = (byte) 0x20; + public static final byte ARG_SET_ALARM_REMINDER_REPEAT_SATURDAY = (byte) 0x40; + } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/tlw64/TLW64Coordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/tlw64/TLW64Coordinator.java index 640766c3a..6ce26b085 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/tlw64/TLW64Coordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/tlw64/TLW64Coordinator.java @@ -91,7 +91,7 @@ public class TLW64Coordinator extends AbstractDeviceCoordinator { @Override public int getAlarmSlotCount() { - return 0; + return 3; } @Override diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/tlw64/TLW64Support.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/tlw64/TLW64Support.java index 4c552d3dd..4c9346775 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/tlw64/TLW64Support.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/tlw64/TLW64Support.java @@ -59,6 +59,7 @@ import nodomain.freeyourgadget.gadgetbridge.service.btle.actions.SetDeviceStateA import nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.IntentListener; import nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.battery.BatteryInfoProfile; import nodomain.freeyourgadget.gadgetbridge.service.serial.GBDeviceProtocol; +import nodomain.freeyourgadget.gadgetbridge.util.AlarmUtils; import nodomain.freeyourgadget.gadgetbridge.util.GB; import static org.apache.commons.lang3.math.NumberUtils.min; @@ -214,7 +215,68 @@ public class TLW64Support extends AbstractBTLEDeviceSupport { @Override public void onSetAlarms(ArrayList alarms) { + try { + TransactionBuilder builder = performInitialized("Set alarm"); + boolean anyAlarmEnabled = false; + for (Alarm alarm : alarms) { + anyAlarmEnabled |= alarm.getEnabled(); + Calendar calendar = AlarmUtils.toCalendar(alarm); + int maxAlarms = 3; + if (alarm.getPosition() >= maxAlarms) { + if (alarm.getEnabled()) { + GB.toast(getContext(), "Only 3 alarms are supported.", Toast.LENGTH_LONG, GB.WARN); + } + return; + } + + byte repetition = 0x00; + + switch (alarm.getRepetition()) { + // TODO: case Alarm.ALARM_ONCE is not supported! Need to notify user somehow... + case Alarm.ALARM_MON: + repetition |= TLW64Constants.ARG_SET_ALARM_REMINDER_REPEAT_MONDAY; + case Alarm.ALARM_TUE: + repetition |= TLW64Constants.ARG_SET_ALARM_REMINDER_REPEAT_TUESDAY; + case Alarm.ALARM_WED: + repetition |= TLW64Constants.ARG_SET_ALARM_REMINDER_REPEAT_WEDNESDAY; + case Alarm.ALARM_THU: + repetition |= TLW64Constants.ARG_SET_ALARM_REMINDER_REPEAT_THURSDAY; + case Alarm.ALARM_FRI: + repetition |= TLW64Constants.ARG_SET_ALARM_REMINDER_REPEAT_FRIDAY; + case Alarm.ALARM_SAT: + repetition |= TLW64Constants.ARG_SET_ALARM_REMINDER_REPEAT_SATURDAY; + case Alarm.ALARM_SUN: + repetition |= TLW64Constants.ARG_SET_ALARM_REMINDER_REPEAT_SUNDAY; + break; + + default: + LOG.warn("invalid alarm repetition " + alarm.getRepetition()); + break; + } + + byte[] alarmMessage = new byte[]{ + TLW64Constants.CMD_ALARM, + (byte) repetition, + (byte) calendar.get(Calendar.HOUR_OF_DAY), + (byte) calendar.get(Calendar.MINUTE), + (byte) (alarm.getEnabled() ? 2 : 0), // vibration duration + (byte) (alarm.getEnabled() ? 10 : 0), // vibration count + (byte) (alarm.getEnabled() ? 2 : 0), // unknown + (byte) 0, + (byte) (alarm.getPosition() + 1) + }; + builder.write(ctrlCharacteristic, alarmMessage); + } + builder.queue(getQueue()); + if (anyAlarmEnabled) { + GB.toast(getContext(), getContext().getString(R.string.user_feedback_miband_set_alarms_ok), Toast.LENGTH_SHORT, GB.INFO); + } else { + GB.toast(getContext(), getContext().getString(R.string.user_feedback_all_alarms_disabled), Toast.LENGTH_SHORT, GB.INFO); + } + } catch (IOException ex) { + GB.toast(getContext(), getContext().getString(R.string.user_feedback_miband_set_alarms_failed), Toast.LENGTH_LONG, GB.ERROR, ex); + } } @Override