/* Copyright (C) 2022 Gaignon Damien Copyright (C) 2022-2023 MartinJM 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.huawei.requests; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Arrays; import java.util.List; import nodomain.freeyourgadget.gadgetbridge.devices.huawei.HuaweiPacket; import nodomain.freeyourgadget.gadgetbridge.devices.huawei.packets.Workout; import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.HuaweiSupportProvider; import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.HuaweiWorkoutGbParser; public class GetWorkoutDataRequest extends Request { private static final Logger LOG = LoggerFactory.getLogger(GetWorkoutDataRequest.class); Workout.WorkoutCount.Response.WorkoutNumbers workoutNumbers; List remainder; short number; Long databaseId; /** * Request to get workout totals * @param support The support * @param workoutNumbers The numbers of the current workout * @param remainder The numbers of the remainder if the workouts to get * @param number The number of this data request */ public GetWorkoutDataRequest(HuaweiSupportProvider support, Workout.WorkoutCount.Response.WorkoutNumbers workoutNumbers, List remainder, short number, Long databaseId) { super(support); this.serviceId = Workout.id; this.commandId = Workout.WorkoutData.id; this.workoutNumbers = workoutNumbers; this.remainder = remainder; this.number = number; this.databaseId = databaseId; } @Override protected List createRequest() throws RequestCreationException { try { return new Workout.WorkoutData.Request(paramsProvider, workoutNumbers.workoutNumber, this.number).serialize(); } catch (HuaweiPacket.CryptoException e) { throw new RequestCreationException(e); } } @Override protected void processResponse() throws ResponseParseException { if (!(receivedPacket instanceof Workout.WorkoutData.Response)) throw new ResponseTypeMismatchException(receivedPacket, Workout.WorkoutData.Response.class); Workout.WorkoutData.Response packet = (Workout.WorkoutData.Response) receivedPacket; if (packet.workoutNumber != this.workoutNumbers.workoutNumber) throw new WorkoutParseException("Incorrect workout number!"); if (packet.dataNumber != this.number) throw new WorkoutParseException("Incorrect data number!"); LOG.info("Workout {} data {}:", this.workoutNumbers.workoutNumber, this.number); LOG.info("Workout : " + packet.workoutNumber); LOG.info("Data num: " + packet.dataNumber); LOG.info("Header : " + Arrays.toString(packet.rawHeader)); LOG.info("Header : " + packet.header); LOG.info("Data : " + Arrays.toString(packet.rawData)); LOG.info("Data : " + Arrays.toString(packet.dataList.toArray())); LOG.info("Bitmap : " + packet.innerBitmap); this.supportProvider.addWorkoutSampleData( this.databaseId, packet.dataList ); if (this.workoutNumbers.dataCount > this.number + 1) { GetWorkoutDataRequest nextRequest = new GetWorkoutDataRequest( this.supportProvider, this.workoutNumbers, this.remainder, (short) (this.number + 1), databaseId ); nextRequest.setFinalizeReq(this.finalizeReq); this.nextRequest(nextRequest); } else if (this.workoutNumbers.paceCount > 0) { GetWorkoutPaceRequest nextRequest = new GetWorkoutPaceRequest( this.supportProvider, this.workoutNumbers, this.remainder, (short) 0, this.databaseId ); nextRequest.setFinalizeReq(this.finalizeReq); this.nextRequest(nextRequest); } else { HuaweiWorkoutGbParser.parseWorkout(this.databaseId); if (remainder.size() > 0) { GetWorkoutTotalsRequest nextRequest = new GetWorkoutTotalsRequest( this.supportProvider, remainder.remove(0), remainder ); nextRequest.setFinalizeReq(this.finalizeReq); this.nextRequest(nextRequest); } } } }