use of com.nightscout.core.dexcom.records.CalRecord in project android-uploader by nightscout.
the class DexcomG4 method doDownload.
@Override
protected DownloadResults doDownload() {
DownloadStatus status = DownloadStatus.SUCCESS;
try {
transport.open();
} catch (IOException e) {
//TODO record this in the event log later
status = DownloadStatus.IO_ERROR;
}
ReadData readData = new ReadData(transport);
List<EGVRecord> recentRecords = new ArrayList<>();
List<MeterRecord> meterRecords = new ArrayList<>();
List<SensorRecord> sensorRecords = new ArrayList<>();
List<CalRecord> calRecords = new ArrayList<>();
long displayTime = 0;
long timeSinceLastRecord = 0;
int batLevel = 100;
long systemTime = 0;
if (status == DownloadStatus.SUCCESS) {
try {
recentRecords = readData.getRecentEGVsPages(numOfPages);
meterRecords = readData.getRecentMeterRecords();
if (preferences.isSensorUploadEnabled()) {
sensorRecords = readData.getRecentSensorRecords(numOfPages);
}
if (preferences.isCalibrationUploadEnabled()) {
calRecords = readData.getRecentCalRecords();
}
if (recentRecords.size() == 0) {
status = DownloadStatus.NO_DATA;
}
displayTime = readData.readDisplayTime().getTime();
if (status == DownloadStatus.SUCCESS && recentRecords.size() > 0) {
timeSinceLastRecord = readData.getTimeSinceEGVRecord(recentRecords.get(recentRecords.size() - 1));
}
systemTime = readData.readSystemTime();
// FIXME: readData.readBatteryLevel() seems to flake out on battery level reads.
// Removing for now.
batLevel = 100;
// TODO pull in other exceptions once we have the analytics/acra reporters
} catch (IOException e) {
//TODO record this in the event log later
status = DownloadStatus.IO_ERROR;
} catch (InvalidRecordLengthException e) {
status = DownloadStatus.APPLICATION_ERROR;
} finally {
try {
transport.close();
} catch (IOException e) {
//TODO record this in the event log later
status = DownloadStatus.IO_ERROR;
}
}
}
List<SensorGlucoseValueEntry> cookieMonsterG4SGVs = EGVRecord.toProtobufList(recentRecords);
List<CalibrationEntry> cookieMonsterG4Cals = CalRecord.toProtobufList(calRecords);
List<MeterEntry> cookieMonsterG4Meters = MeterRecord.toProtobufList(meterRecords);
List<SensorEntry> cookieMonsterG4Sensors = SensorRecord.toProtobufList(sensorRecords);
G4Download.Builder downloadBuilder = new G4Download.Builder();
downloadBuilder.sgv(cookieMonsterG4SGVs).cal(cookieMonsterG4Cals).sensor(cookieMonsterG4Sensors).meter(cookieMonsterG4Meters).receiver_system_time_sec(systemTime).download_timestamp(new Date().toString()).download_status(status).uploader_battery(uploaderDevice.getBatteryLevel()).receiver_battery(batLevel).units(GlucoseUnit.MGDL);
// TODO: determine if the logic here is correct. I suspect it assumes the last record was
// less than 5
// minutes ago. If a reading is skipped and the device is plugged in then nextUploadTime
// will be set to a negative number. This situation will eventually correct itself.
long nextUploadTime = standardMinutes(5).minus(standardSeconds(timeSinceLastRecord)).getMillis();
// convert into json for d3 plot
JSONArray array = new JSONArray();
for (EGVRecord recentRecord : recentRecords) {
try {
array.put(recentRecord.toJSON());
} catch (JSONException e) {
e.printStackTrace();
}
}
return new DownloadResults(downloadBuilder.build(), nextUploadTime, array, displayTime);
}
use of com.nightscout.core.dexcom.records.CalRecord in project android-uploader by nightscout.
the class ReadData method parsePage.
private <T extends GenericTimestampRecord> List<T> parsePage(byte[] data, Class<T> clazz) {
PageHeader pageHeader = new PageHeader(data);
List<T> records = new ArrayList<>();
try {
for (int i = 0; i < pageHeader.getNumOfRecords(); i++) {
int startIdx;
switch(pageHeader.getRecordType()) {
case EGV_DATA:
startIdx = PageHeader.HEADER_SIZE + (EGVRecord.RECORD_SIZE + 1) * i;
records.add(clazz.cast(new EGVRecord(Arrays.copyOfRange(data, startIdx, startIdx + EGVRecord.RECORD_SIZE))));
break;
case CAL_SET:
int recordLength = (pageHeader.getRevision() <= 2) ? CalRecord.RECORD_SIZE : CalRecord.RECORD_V2_SIZE;
startIdx = PageHeader.HEADER_SIZE + (recordLength + 1) * i;
records.add(clazz.cast(new CalRecord(Arrays.copyOfRange(data, startIdx, startIdx + recordLength))));
break;
case METER_DATA:
startIdx = PageHeader.HEADER_SIZE + (MeterRecord.RECORD_SIZE + 1) * i;
records.add(clazz.cast(new MeterRecord(Arrays.copyOfRange(data, startIdx, startIdx + MeterRecord.RECORD_SIZE))));
break;
case SENSOR_DATA:
startIdx = PageHeader.HEADER_SIZE + (SensorRecord.RECORD_SIZE + 1) * i;
records.add(clazz.cast(new SensorRecord(Arrays.copyOfRange(data, startIdx, startIdx + SensorRecord.RECORD_SIZE))));
break;
default:
throw new IllegalArgumentException(String.format("Unknown record type: %s", pageHeader.getRecordType().name()));
}
}
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
return records;
}
use of com.nightscout.core.dexcom.records.CalRecord in project android-uploader by nightscout.
the class MockFactory method mockCal505Page.
public static List<CalRecord> mockCal505Page() throws ParseException {
List<CalRecord> record = new ArrayList<>();
List<CalSubrecord> subrecord0 = new ArrayList<>();
subrecord0.add(new CalSubrecord(121, 70130, 186705605, 186705180));
subrecord0.add(new CalSubrecord(83, 74480, 186782402, 186782153));
List<CalSubrecord> subrecord1 = new ArrayList<>();
subrecord1.add(new CalSubrecord(121, 70130, 186705605, 186705180));
subrecord1.add(new CalSubrecord(83, 74480, 186782402, 186782153));
record.add(new CalRecord(17791.61320896296, 512.6837392183724, 0.9, 0.5, 186959093, 186980695, subrecord0));
record.add(new CalRecord(17791.61320896296, 512.6837392183724, 0.9, 0.5, 186959393, 186980995, subrecord1));
return record;
}
use of com.nightscout.core.dexcom.records.CalRecord in project android-uploader by nightscout.
the class CalRecordTest method shouldNotParseLargeCal505Record.
@Test(expected = InvalidRecordLengthException.class)
public void shouldNotParseLargeCal505Record() throws Exception {
record505 = Arrays.copyOf(record505, record505.length + 1);
CalRecord calRecord = new CalRecord(record505);
}
use of com.nightscout.core.dexcom.records.CalRecord in project android-uploader by nightscout.
the class CalRecordTest method shouldParse505CalRecord.
@Test
public void shouldParse505CalRecord() throws Exception {
CalRecord calRecord = new CalRecord(record505);
assertThat(calRecord.getSlope(), is(782.9303804407411));
assertThat(calRecord.getIntercept(), is(28720.042100646853));
assertThat(calRecord.getScale(), is(1.0));
assertThat(calRecord.getNumRecords(), is(3));
assertThat(calRecord.getDecay(), is(2.0833333333333335));
assertThat(calRecord.getRawDisplayTimeSeconds(), is(186285017L));
assertThat(calRecord.getRawSystemTimeSeconds(), is(186317086L));
}
Aggregations