use of com.polidea.rxandroidble2.exceptions.BleGattCharacteristicException in project xDrip-plus by jamorham.
the class InPenService method getRecords.
private void getRecords(final int firstIndex, final int lastIndex) {
final int numberOfRecords = lastIndex - firstIndex;
if (numberOfRecords > 30) {
I.connection.writeCharacteristic(KEEPALIVE, new KeepAliveTx().getBytes()).subscribe(value -> {
UserError.Log.d(TAG, "Wrote keep alive for " + numberOfRecords);
}, throwable -> {
UserError.Log.d(TAG, "Got exception in keep alive" + throwable);
});
}
final RecordTx packet = new RecordTx(firstIndex, lastIndex);
UserError.Log.d(TAG, "getRecords called, loading: " + firstIndex + " to " + lastIndex);
I.connection.setupIndication(RECORD_INDICATE).doOnNext(notificationObservable -> {
I.connection.writeCharacteristic(RECORD_START, packet.startBytes()).subscribe(valueS -> {
UserError.Log.d(TAG, "Wrote record start: " + bytesToHex(valueS));
I.connection.writeCharacteristic(RECORD_END, packet.endBytes()).subscribe(valueE -> {
UserError.Log.d(TAG, "Wrote record end: " + bytesToHex(valueE));
I.connection.writeCharacteristic(RECORD_REQUEST, packet.triggerBytes()).subscribe(characteristicValue -> {
if (D)
UserError.Log.d(TAG, "Wrote record request request: " + bytesToHex(characteristicValue));
}, throwable -> {
UserError.Log.e(TAG, "Failed to write record request: " + throwable);
if (throwable instanceof BleGattCharacteristicException) {
final int status = ((BleGattCharacteristicException) throwable).getStatus();
UserError.Log.e(TAG, "Got status message: " + Helper.getStatusName(status));
}
});
}, throwable -> {
UserError.Log.d(TAG, "Throwable in Record End write: " + throwable);
});
}, throwable -> {
UserError.Log.d(TAG, "Throwable in Record Start write: " + throwable);
// throws BleGattCharacteristicException status = 128 for "no resources" eg nothing matches
});
}).flatMap(notificationObservable -> notificationObservable).timeout(120, TimeUnit.SECONDS).observeOn(Schedulers.newThread()).subscribe(bytes -> {
records.add(bytes);
UserError.Log.d(TAG, "INDICATE INDICATE: " + HexDump.dumpHexString(bytes));
}, throwable -> {
if (!(throwable instanceof OperationSuccess)) {
if (throwable instanceof BleDisconnectedException) {
UserError.Log.d(TAG, "Disconnected when waiting to receive indication: " + throwable);
} else {
UserError.Log.e(TAG, "Error receiving indication: " + throwable);
}
Inevitable.task("check-records-queue", 100, this::processRecordsQueue);
}
});
}
use of com.polidea.rxandroidble2.exceptions.BleGattCharacteristicException in project xDrip-plus by jamorham.
the class Ob1G5StateMachine method doReset.
@SuppressLint("CheckResult")
public static boolean doReset(Ob1G5CollectionService parent, RxBleConnection connection) {
if (connection == null)
return false;
parent.msg("Hard Resetting Transmitter");
connection.writeCharacteristic(Control, nn(new ResetTxMessage().byteSequence)).subscribe(characteristicValue -> {
if (d)
UserError.Log.d(TAG, "Wrote ResetTxMessage request!!");
parent.msg("Hard Reset Sent");
}, throwable -> {
parent.msg("Hard Reset maybe Failed");
UserError.Log.e(TAG, "Failed to write ResetTxMessage: " + throwable);
if (throwable instanceof BleGattCharacteristicException) {
final int status = ((BleGattCharacteristicException) throwable).getStatus();
UserError.Log.e(TAG, "Got status message: " + getStatusName(status));
}
});
return true;
}
use of com.polidea.rxandroidble2.exceptions.BleGattCharacteristicException in project xDrip-plus by jamorham.
the class BlueJayService method bulkSend.
// write the data packets
private void bulkSend(final int opcode, final byte[] buffer, final int offset, boolean quiet) {
UserError.Log.d(TAG, "bulksend called: opcode " + opcode + " total " + buffer.length + " offset: " + offset + " quiet:" + quiet);
if (buffer != null && offset < buffer.length) {
final BulkUpTx packet = (opcode >= OPCODE_BULK_R_XFER_0 ? new RBulkUpTx(opcode, buffer, offset) : new BulkUpTx(opcode, buffer, offset));
if (quiet) {
packet.setQuiet();
}
if (offset == 0) {
// reset counter as this is new bulk up
revisedOffset = 0;
lastActionedRevisedOffset = -1;
// TODO we should check it if we have failed to act on revised offset
}
I.connection.writeCharacteristic(quiet ? THINJAM_BULK : THINJAM_WRITE, packet.getBytes()).observeOn(Schedulers.newThread()).subscribe(response -> {
if (D)
UserError.Log.d(TAG, "Bulk Up Send response: " + bytesToHex(response));
if (packet.responseOk(response)) {
// WARNING recursion
final int nextOffset;
if (revisedOffset != 0 && revisedOffset < offset && revisedOffset != lastActionedRevisedOffset) {
// TODO we only catch this if we send a packet
nextOffset = revisedOffset;
lastActionedRevisedOffset = nextOffset;
UserError.Log.d(TAG, "Retrying bulk send from: " + nextOffset);
} else {
nextOffset = offset + packet.getBytesIncluded();
}
revisedOffset = 0;
if (nextOffset < buffer.length) {
if (!quiet) {
JoH.threadSleep(100);
} else {
JoH.threadSleep(1);
}
bulkSend(opcode, buffer, nextOffset, packet.isQuiet());
} else {
UserError.Log.d(TAG, "Bulk send completed!");
if (!(packet instanceof RBulkUpTx)) {
// removes first item from the queue which should be the one we just processed!
commandQueue.poll();
//
Inevitable.task("tj-next-queue", 10, this::processQueue);
} else {
// wait 1 second and then retry this upload if we get success reply notification then we remove it elsewhere
Inevitable.task("tj-next-queue", 4000, this::processQueue);
}
}
} else {
UserError.Log.d(TAG, "Bulk Send failed: " + packet.responseText(response));
if (!quiet) {
// retry shortly
Inevitable.task("tj-next-queue", 20000, this::processQueue);
if (JoH.ratelimit("tj-allow-bulk-retry", 2)) {
UserError.Log.d(TAG, "Retrying packet");
// retry packet send
bulkSend(opcode, buffer, offset, quiet);
}
} else {
UserError.Log.d(TAG, "Quiet is set so not attempting any response to failure here");
}
}
}, throwable -> {
UserError.Log.e(TAG, "Failed to write bulk Send: " + throwable);
if (throwable instanceof BleGattCharacteristicException) {
final int status = ((BleGattCharacteristicException) throwable).getStatus();
UserError.Log.e(TAG, "Got status message: " + Helper.getStatusName(status));
} else {
UserError.Log.d(TAG, "Throwable in Bulk SEnd write: " + throwable);
}
});
} else {
UserError.Log.d(TAG, "Invalid buffer in bulkSend");
Inevitable.task("tj-next-queue", 4000, this::processQueue);
}
}
use of com.polidea.rxandroidble2.exceptions.BleGattCharacteristicException in project xDrip-plus by jamorham.
the class BlueJayService method sendTime.
// Not using packet queue due to reactive time sensitive nature
private void sendTime() {
final String func = "SetTime";
final SetTimeTx outbound = new SetTimeTx();
UserError.Log.d(TAG, "Outbound: " + bytesToHex(outbound.getBytes()));
I.connection.writeCharacteristic(THINJAM_WRITE, outbound.getBytes()).subscribe(response -> {
SetTimeTx reply = new SetTimeTx(response);
if (D)
UserError.Log.d(TAG, func + " response: " + bytesToHex(response) + " " + reply.toS());
UserError.Log.e(TAG, "Time difference with watch: " + ((outbound.getTimestamp() - reply.getTimestamp()) / 1000d));
changeNextState();
}, throwable -> {
UserError.Log.e(TAG, "Failed to write " + func + " request: " + throwable);
if (throwable instanceof BleGattCharacteristicException) {
final int status = ((BleGattCharacteristicException) throwable).getStatus();
UserError.Log.e(TAG, "Got status message: " + Helper.getStatusName(status));
} else {
UserError.Log.d(TAG, "Throwable in " + func + " " + throwable);
if (throwable instanceof BleCharacteristicNotFoundException) {
UserError.Log.d(TAG, "Assuming wrong firmware version");
changeNextState();
} else {
changeState(CLOSE);
}
}
});
}
Aggregations