/* Copyright (C) 2020-2024 Yukai Li This file is part of Gadgetbridge. Gadgetbridge is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Gadgetbridge is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package nodomain.freeyourgadget.gadgetbridge.devices.lefun.commands; import java.nio.ByteBuffer; import nodomain.freeyourgadget.gadgetbridge.devices.lefun.LefunConstants; public class AlarmCommand extends BaseCommand { public static final int DOW_SUNDAY = 0; public static final int DOW_MONDAY = 1; public static final int DOW_TUESDAY = 2; public static final int DOW_WEDNESDAY = 3; public static final int DOW_THURSDAY = 4; public static final int DOW_FRIDAY = 5; public static final int DOW_SATURDAY = 6; private byte op; private byte index; private boolean enabled; // Snooze is not implemented how you think it would be // Number of snoozes is decremented every time the alarm triggers, and the alarm time // is moved forward by number of minutes in snooze time. It never gets reset to the // original time. private byte numOfSnoozes; private byte snoozeTime; private byte dayOfWeek; private byte hour; private byte minute; private boolean setSuccess; public byte getOp() { return op; } public void setOp(byte op) { if (op != OP_GET && op != OP_SET) throw new IllegalArgumentException("Operation must be get or set"); this.op = op; } public byte getIndex() { return index; } public void setIndex(byte index) { if (index < 0 || index >= LefunConstants.NUM_ALARM_SLOTS) throw new IllegalArgumentException("Index must be between 0 and " + (LefunConstants.NUM_ALARM_SLOTS - 1) + " inclusive"); this.index = index; } public boolean isEnabled() { return enabled; } public void setEnabled(boolean enabled) { this.enabled = enabled; } public byte getNumOfSnoozes() { return numOfSnoozes; } public void setNumOfSnoozes(byte numOfSnoozes) { this.numOfSnoozes = numOfSnoozes; } public byte getSnoozeTime() { return snoozeTime; } public void setSnoozeTime(byte snoozeTime) { this.snoozeTime = snoozeTime; } public boolean getDayOfWeek(int day) { if (day < 0 || day > 6) throw new IllegalArgumentException("Invalid day of week"); return getBit(dayOfWeek, 1 << day); } public void setDayOfWeek(int day, boolean enabled) { if (day < 0 || day > 6) throw new IllegalArgumentException("Invalid day of week"); dayOfWeek = setBit(dayOfWeek, 1 << day, enabled); } public byte getHour() { return hour; } public void setHour(byte hour) { if (hour < 0 || hour > 23) throw new IllegalArgumentException("Hour must be between 0 and 23 inclusive"); this.hour = hour; } public byte getMinute() { return minute; } public void setMinute(byte minute) { if (minute < 0 || minute > 59) throw new IllegalArgumentException("Minute must be between 0 and 59 inclusive"); this.minute = minute; } public boolean isSetSuccess() { return setSuccess; } @Override protected void deserializeParams(byte id, ByteBuffer params) { validateId(id, LefunConstants.CMD_ALARM); int paramsLength = params.limit() - params.position(); if (paramsLength < 2) throwUnexpectedLength(); op = params.get(); index = params.get(); if (op == OP_GET) { if (paramsLength != 8) throwUnexpectedLength(); enabled = params.get() == 1; numOfSnoozes = params.get(); snoozeTime = params.get(); dayOfWeek = params.get(); hour = params.get(); minute = params.get(); } else if (op == OP_SET) { if (paramsLength != 3) throwUnexpectedLength(); setSuccess = params.get() == 1; } else { throw new IllegalArgumentException("Invalid operation type received"); } } @Override protected byte serializeParams(ByteBuffer params) { params.put(op); // No alarm ID for get; all of them are returned if (op == OP_SET) { params.put(index); params.put((byte)(enabled ? 1: 0)); params.put(numOfSnoozes); params.put(snoozeTime); params.put(dayOfWeek); params.put(hour); params.put(minute); } return LefunConstants.CMD_ALARM; } }