/* Copyright (C) 2019-2024 Daniel Dakhno 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.service.devices.qhybrid.requests.fossil.microapp; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.ArrayList; import java.util.List; import java.util.zip.CRC32; import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.adapter.fossil.FossilWatchAdapter; import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.file.FileHandle; import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.file.FilePutRequest; public class PlayCrazyShitRequest extends FilePutRequest { public PlayCrazyShitRequest(byte[] appData, FossilWatchAdapter adapter) { super(FileHandle.HAND_ACTIONS, createPayload(appData), adapter); } private static byte[] createPayload(byte[] appData) { List commands = new ArrayList<>(); commands.add(new StartCriticalCommand()); // commands.add(new RepeatStartCommand((byte) 10)); commands.add(new VibrateCommand(VibrationType.NORMAL)); commands.add(new DelayCommand(1)); // commands.add(new RepeatStopCommand()); // commands.add(new StreamCommand((byte) 0b11111111)); // commands.add(new AnimationCommand((short) 300, (short) 60)); // commands.add(new DelayCommand(2)); commands.add(new CloseCommand()); int length = 0; for (MicroAppCommand command : commands) length += command.getData().length; ByteBuffer buffer = ByteBuffer.allocate( 3 /* magic bytes */ + 8 /* button header copy */ + 1 /* 0xFF */ + 2 /* payload length */ + length + 4 /* crc */ ); buffer.order(ByteOrder.LITTLE_ENDIAN); buffer.put((byte) 0x01); buffer.put((byte) 0x00); buffer.put((byte) 0x08); buffer.put(appData, 3, 8); buffer.put((byte) 0xFF); buffer.putShort((short)(length + 3)); for(MicroAppCommand command : commands) buffer.put(command.getData()); CRC32 crc = new CRC32(); crc.update(buffer.array(), 0, buffer.position()); buffer.putInt((int) crc.getValue()); return buffer.array(); } }