mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge
synced 2024-06-19 03:20:21 +02:00
130 lines
5.2 KiB
Java
130 lines
5.2 KiB
Java
|
/* 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 <http://www.gnu.org/licenses/>. */
|
||
|
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<Workout.WorkoutCount.Response.WorkoutNumbers> 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<Workout.WorkoutCount.Response.WorkoutNumbers> 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<byte[]> 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);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|