Skip to content

Commit

Permalink
Fix issue when only one record is returned in CGMS profile.
Browse files Browse the repository at this point in the history
ContinuousGlucoseMeasurementResponse class on..Received() method
can be invoked multiple times but the class can only store a single
record. As a result old values were lost. To save all the values
the class has been modified to use ArrayList as a values storage.
  • Loading branch information
Sylwester Zieliński committed Feb 16, 2022
1 parent 8602225 commit 0148398
Show file tree
Hide file tree
Showing 2 changed files with 157 additions and 88 deletions.
Expand Up @@ -27,7 +27,7 @@
import android.os.Parcelable;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import java.util.ArrayList;
import no.nordicsemi.android.ble.data.Data;
import no.nordicsemi.android.ble.exception.InvalidDataException;
import no.nordicsemi.android.ble.exception.RequestFailedException;
Expand All @@ -53,14 +53,7 @@
*/
@SuppressWarnings("unused")
public final class ContinuousGlucoseMeasurementResponse extends ContinuousGlucoseMeasurementDataCallback implements CRCSecuredResponse, Parcelable {
private float glucoseConcentration;
@Nullable
private Float trend;
@Nullable
private Float quality;
@Nullable
private CGMStatus status;
private int timeOffset;
private ArrayList<ContinuousGlucoseMeasurementResponseItem> items = new ArrayList<>();
private boolean secured;
private boolean crcValid;

Expand All @@ -72,13 +65,16 @@ public ContinuousGlucoseMeasurementResponse() {
public void onContinuousGlucoseMeasurementReceived(@NonNull final BluetoothDevice device, final float glucoseConcentration,
@Nullable final Float cgmTrend, @Nullable final Float cgmQuality,
@Nullable final CGMStatus status, final int timeOffset, final boolean secured) {
this.glucoseConcentration = glucoseConcentration;
this.trend = cgmTrend;
this.quality = cgmQuality;
this.status = status;
this.timeOffset = timeOffset;

ContinuousGlucoseMeasurementResponseItem item = new ContinuousGlucoseMeasurementResponseItem(
glucoseConcentration,
cgmTrend,
cgmQuality,
status,
timeOffset
);
items.add(item);
this.secured = secured;
this.crcValid = secured;
}

@Override
Expand All @@ -88,91 +84,73 @@ public void onContinuousGlucoseMeasurementReceivedWithCrcError(@NonNull final Bl
this.crcValid = false;
}

public float getGlucoseConcentration() {
return glucoseConcentration;
}

@Nullable
public Float getTrend() {
return trend;
}

@Nullable
public Float getQuality() {
return quality;
}

@Nullable
public CGMStatus getStatus() {
return status;
}

public int getTimeOffset() {
return timeOffset;
}

@Override
public boolean isSecured() {
return secured;
}

@Override
public boolean isCrcValid() {
return crcValid;
}

// Parcelable
private ContinuousGlucoseMeasurementResponse(final Parcel in) {
super(in);
glucoseConcentration = in.readFloat();
if (in.readByte() == 0) {
trend = null;
} else {
trend = in.readFloat();
}
if (in.readByte() == 0) {
quality = null;
} else {
quality = in.readFloat();
}
if (in.readByte() == 0) {
status = null;
} else {
final int warningStatus = in.readInt();
final int calibrationTempStatus = in.readInt();
final int sensorStatus = in.readInt();
status = new CGMStatus(warningStatus, calibrationTempStatus, sensorStatus);

ArrayList<ContinuousGlucoseMeasurementResponseItem> newItems = new ArrayList<>();

int size = in.readInt();
for (int i=0; i<size; i++) {
ContinuousGlucoseMeasurementResponseItem item = new ContinuousGlucoseMeasurementResponseItem();
item.setGlucoseConcentration(in.readFloat());
if (in.readByte() == 0) {
item.setTrend(null);
} else {
item.setTrend(in.readFloat());
}
if (in.readByte() == 0) {
item.setQuality(null);
} else {
item.setQuality(in.readFloat());
}
if (in.readByte() == 0) {
item.setStatus(null);
} else {
final int warningStatus = in.readInt();
final int calibrationTempStatus = in.readInt();
final int sensorStatus = in.readInt();
item.setStatus(new CGMStatus(warningStatus, calibrationTempStatus, sensorStatus));
}
item.setTimeOffset(in.readInt());
items.add(item);
}
timeOffset = in.readInt();

secured = in.readByte() != 0;
crcValid = in.readByte() != 0;

items = newItems;
}

@Override
public void writeToParcel(final Parcel dest, final int flags) {
super.writeToParcel(dest, flags);
dest.writeFloat(glucoseConcentration);
if (trend == null) {
dest.writeByte((byte) 0);
} else {
dest.writeByte((byte) 1);
dest.writeFloat(trend);
}
if (quality == null) {
dest.writeByte((byte) 0);
} else {
dest.writeByte((byte) 1);
dest.writeFloat(quality);
}
if (status == null) {
dest.writeByte((byte) 0);
} else {
dest.writeByte((byte) 1);
dest.writeInt(status.warningStatus);
dest.writeInt(status.calibrationTempStatus);
dest.writeInt(status.sensorStatus);

dest.writeInt(items.size());
for (ContinuousGlucoseMeasurementResponseItem item : items) {
dest.writeFloat(item.getGlucoseConcentration());
if (item.getTrend() == null) {
dest.writeByte((byte) 0);
} else {
dest.writeByte((byte) 1);
dest.writeFloat(item.getTrend());
}
if (item.getQuality() == null) {
dest.writeByte((byte) 0);
} else {
dest.writeByte((byte) 1);
dest.writeFloat(item.getQuality());
}
if (item.getStatus() == null) {
dest.writeByte((byte) 0);
} else {
dest.writeByte((byte) 1);
dest.writeInt(item.getStatus().warningStatus);
dest.writeInt(item.getStatus().calibrationTempStatus);
dest.writeInt(item.getStatus().sensorStatus);
}
dest.writeInt(item.getTimeOffset());
}
dest.writeInt(timeOffset);
dest.writeByte((byte) (secured ? 1 : 0));
dest.writeByte((byte) (crcValid ? 1 : 0));
}
Expand All @@ -188,4 +166,18 @@ public ContinuousGlucoseMeasurementResponse[] newArray(final int size) {
return new ContinuousGlucoseMeasurementResponse[size];
}
};

public ArrayList<ContinuousGlucoseMeasurementResponseItem> getItems() {
return items;
}

@Override
public boolean isSecured() {
return secured;
}

@Override
public boolean isCrcValid() {
return crcValid;
}
}
@@ -0,0 +1,77 @@
package no.nordicsemi.android.ble.common.callback.cgm;

import androidx.annotation.Nullable;

import no.nordicsemi.android.ble.common.profile.cgm.CGMTypes;

public class ContinuousGlucoseMeasurementResponseItem {
private float glucoseConcentration;
@Nullable
private Float trend;
@Nullable
private Float quality;
@Nullable
private CGMTypes.CGMStatus status;
private int timeOffset;

ContinuousGlucoseMeasurementResponseItem() { }

public ContinuousGlucoseMeasurementResponseItem(
float glucoseConcentration,
@Nullable Float trend,
@Nullable Float quality,
@Nullable CGMTypes.CGMStatus status,
int timeOffset
) {
this.glucoseConcentration = glucoseConcentration;
this.trend = trend;
this.quality = quality;
this.status = status;
this.timeOffset = timeOffset;
}


public float getGlucoseConcentration() {
return glucoseConcentration;
}

@Nullable
public Float getTrend() {
return trend;
}

@Nullable
public Float getQuality() {
return quality;
}

@Nullable
public CGMTypes.CGMStatus getStatus() {
return status;
}

public int getTimeOffset() {
return timeOffset;
}

public void setGlucoseConcentration(float glucoseConcentration) {
this.glucoseConcentration = glucoseConcentration;
}

public void setTrend(Float trend) {
this.trend = trend;
}

public void setQuality(Float quality) {
this.quality = quality;
}

public void setStatus(CGMTypes.CGMStatus status) {
this.status = status;
}

public void setTimeOffset(int timeOffset) {
this.timeOffset = timeOffset;
}

}

0 comments on commit 0148398

Please sign in to comment.