From b7abd328bbf5be1ee2611df78230f90150d18a14 Mon Sep 17 00:00:00 2001 From: Yukai Li Date: Mon, 5 Oct 2020 03:51:41 -0600 Subject: [PATCH] Lefun: Implement set alarm --- .../devices/lefun/LefunDeviceSupport.java | 21 +++- .../lefun/requests/SetAlarmRequest.java | 100 ++++++++++++++++++ 2 files changed, 120 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/lefun/requests/SetAlarmRequest.java diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/lefun/LefunDeviceSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/lefun/LefunDeviceSupport.java index 1dd1cdaa9..c9b706fad 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/lefun/LefunDeviceSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/lefun/LefunDeviceSupport.java @@ -70,6 +70,7 @@ import nodomain.freeyourgadget.gadgetbridge.service.devices.lefun.requests.GetFi import nodomain.freeyourgadget.gadgetbridge.service.devices.lefun.requests.GetPpgDataRequest; import nodomain.freeyourgadget.gadgetbridge.service.devices.lefun.requests.GetSleepDataRequest; import nodomain.freeyourgadget.gadgetbridge.service.devices.lefun.requests.Request; +import nodomain.freeyourgadget.gadgetbridge.service.devices.lefun.requests.SetAlarmRequest; import nodomain.freeyourgadget.gadgetbridge.service.devices.lefun.requests.SetTimeRequest; import nodomain.freeyourgadget.gadgetbridge.service.devices.lefun.requests.StartPpgRequest; import nodomain.freeyourgadget.gadgetbridge.util.GB; @@ -148,7 +149,25 @@ public class LefunDeviceSupport extends AbstractBTLEDeviceSupport { @Override public void onSetAlarms(ArrayList alarms) { - + int i = 0; + for (Alarm alarm : alarms) { + try { + TransactionBuilder builder = performInitialized(SetAlarmRequest.class.getSimpleName()); + SetAlarmRequest request = new SetAlarmRequest(this, builder); + request.setIndex(i); + request.setEnabled(alarm.getEnabled()); + request.setDayOfWeek(alarm.getRepetition()); + request.setHour(alarm.getHour()); + request.setMinute(alarm.getMinute()); + request.perform(); + inProgressRequests.add(request); + performConnected(builder.getTransaction()); + } catch (IOException e) { + GB.toast(getContext(), "Failed to set alarm", Toast.LENGTH_SHORT, + GB.ERROR, e); + } + ++i; + } } @Override diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/lefun/requests/SetAlarmRequest.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/lefun/requests/SetAlarmRequest.java new file mode 100644 index 000000000..e4e73b4f8 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/lefun/requests/SetAlarmRequest.java @@ -0,0 +1,100 @@ +package nodomain.freeyourgadget.gadgetbridge.service.devices.lefun.requests; + +import nodomain.freeyourgadget.gadgetbridge.devices.lefun.LefunConstants; +import nodomain.freeyourgadget.gadgetbridge.devices.lefun.commands.AlarmCommand; +import nodomain.freeyourgadget.gadgetbridge.devices.lefun.commands.BaseCommand; +import nodomain.freeyourgadget.gadgetbridge.model.Alarm; +import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.lefun.LefunDeviceSupport; +import nodomain.freeyourgadget.gadgetbridge.service.devices.miband.operations.OperationStatus; + +public class SetAlarmRequest extends Request { + private int index; + private boolean enabled; + private int dayOfWeek; + private int hour; + private int minute; + public SetAlarmRequest(LefunDeviceSupport support, TransactionBuilder builder) { + super(support, builder); + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public boolean isEnabled() { + return enabled; + } + + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } + + public int getDayOfWeek() { + return dayOfWeek; + } + + public void setDayOfWeek(int dayOfWeek) { + this.dayOfWeek = dayOfWeek; + } + + public int getHour() { + return hour; + } + + public void setHour(int hour) { + this.hour = hour; + } + + public int getMinute() { + return minute; + } + + public void setMinute(int minute) { + this.minute = minute; + } + + @Override + public byte[] createRequest() { + AlarmCommand cmd = new AlarmCommand(); + cmd.setOp(BaseCommand.OP_SET); + cmd.setIndex((byte) index); + cmd.setEnabled(enabled); + cmd.setNumOfSnoozes((byte) 0); + cmd.setHour((byte) hour); + cmd.setMinute((byte) minute); + + // Translate GB alarm day of week to Lefun day of week + // GB starts on Monday, Lefun starts on Sunday + for (int i = 0; i < 6; ++i) { + if ((dayOfWeek & (1 << i)) != 0) { + cmd.setDayOfWeek(i + 1, true); + } + } + if ((dayOfWeek & Alarm.ALARM_SUN) != 0) { + cmd.setDayOfWeek(AlarmCommand.DOW_SUNDAY, true); + } + + return cmd.serialize(); + } + + @Override + public void handleResponse(byte[] data) { + AlarmCommand cmd = new AlarmCommand(); + cmd.deserialize(data); + + if (cmd.getOp() != BaseCommand.OP_SET || cmd.getIndex() != index || !cmd.isSetSuccess()) + reportFailure("Could not set alarm"); + + operationStatus = OperationStatus.FINISHED; + } + + @Override + public int getCommandId() { + return LefunConstants.CMD_ALARM; + } +}