Search in sources :

Example 11 with BleGattCharacteristicException

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);
        }
    });
}
Also used : KeepAliveTx(com.eveningoutpost.dexdrip.insulin.inpen.messages.KeepAliveTx) Arrays(java.util.Arrays) TypeToken(com.google.gson.reflect.TypeToken) AdvertRx(com.eveningoutpost.dexdrip.insulin.inpen.messages.AdvertRx) ProcessPenData(com.eveningoutpost.dexdrip.insulin.shared.ProcessPenData) GsonBuilder(com.google.gson.GsonBuilder) Inevitable(com.eveningoutpost.dexdrip.UtilityModels.Inevitable) Pref(com.eveningoutpost.dexdrip.UtilityModels.Pref) HexDump.dumpHexString(com.eveningoutpost.dexdrip.ImportedLibraries.usbserial.util.HexDump.dumpHexString) Map(java.util.Map) BleGattCharacteristicException(com.polidea.rxandroidble2.exceptions.BleGattCharacteristicException) TargetApi(android.annotation.TargetApi) INFO_CHARACTERISTICS(com.eveningoutpost.dexdrip.insulin.inpen.Constants.INFO_CHARACTERISTICS) RECORD_INDEX(com.eveningoutpost.dexdrip.insulin.inpen.Constants.RECORD_INDEX) DEFAULT_BOND_UNITS(com.eveningoutpost.dexdrip.insulin.inpen.InPen.DEFAULT_BOND_UNITS) RECORD_REQUEST(com.eveningoutpost.dexdrip.insulin.inpen.Constants.RECORD_REQUEST) JoH(com.eveningoutpost.dexdrip.Models.JoH) JoH.bytesToHex(com.eveningoutpost.dexdrip.Models.JoH.bytesToHex) BOND_NONE(android.bluetooth.BluetoothDevice.BOND_NONE) STORE_INPEN_ADVERT(com.eveningoutpost.dexdrip.insulin.inpen.InPen.STORE_INPEN_ADVERT) RecordRx(com.eveningoutpost.dexdrip.insulin.inpen.messages.RecordRx) BATTERY(com.eveningoutpost.dexdrip.insulin.inpen.Constants.BATTERY) PenData(com.eveningoutpost.dexdrip.Models.PenData) STORE_INPEN_BATTERY(com.eveningoutpost.dexdrip.insulin.inpen.InPen.STORE_INPEN_BATTERY) BluetoothGattCharacteristic(android.bluetooth.BluetoothGattCharacteristic) WakeLockTrampoline(com.eveningoutpost.dexdrip.utils.framework.WakeLockTrampoline) BatteryRx(com.eveningoutpost.dexdrip.insulin.inpen.messages.BatteryRx) GOOD(com.eveningoutpost.dexdrip.UtilityModels.StatusItem.Highlight.GOOD) BONDCONTROL(com.eveningoutpost.dexdrip.insulin.inpen.Constants.BONDCONTROL) HexDump(com.eveningoutpost.dexdrip.ImportedLibraries.usbserial.util.HexDump) ArrayList(java.util.ArrayList) BOND_AUTHORITY(com.eveningoutpost.dexdrip.insulin.inpen.InPenService.InPenState.BOND_AUTHORITY) Helper(com.eveningoutpost.dexdrip.utils.bt.Helper) Observable(io.reactivex.Observable) JamBaseBluetoothSequencer(com.eveningoutpost.dexdrip.Services.JamBaseBluetoothSequencer) RxBleDeviceServices(com.polidea.rxandroidble2.RxBleDeviceServices) BONDAGE(com.eveningoutpost.dexdrip.insulin.inpen.InPenService.InPenState.BONDAGE) BondTx(com.eveningoutpost.dexdrip.insulin.inpen.messages.BondTx) Converters(com.eveningoutpost.dexdrip.utils.math.Converters) JoH.ratelimit(com.eveningoutpost.dexdrip.Models.JoH.ratelimit) JoH.quietratelimit(com.eveningoutpost.dexdrip.Models.JoH.quietratelimit) RecordTx(com.eveningoutpost.dexdrip.insulin.inpen.messages.RecordTx) RECORD_END(com.eveningoutpost.dexdrip.insulin.inpen.Constants.RECORD_END) GET_AUTH_STATE(com.eveningoutpost.dexdrip.insulin.inpen.InPenService.InPenState.GET_AUTH_STATE) UserError(com.eveningoutpost.dexdrip.Models.UserError) PersistentStore(com.eveningoutpost.dexdrip.UtilityModels.PersistentStore) HEXDUMP_INFO_CHARACTERISTICS(com.eveningoutpost.dexdrip.insulin.inpen.Constants.HEXDUMP_INFO_CHARACTERISTICS) InPenEntry.isStarted(com.eveningoutpost.dexdrip.insulin.inpen.InPenEntry.isStarted) PendingIntent(android.app.PendingIntent) INIT(com.eveningoutpost.dexdrip.Services.JamBaseBluetoothSequencer.BaseState.INIT) PEN_ATTACH_TIME(com.eveningoutpost.dexdrip.insulin.inpen.Constants.PEN_ATTACH_TIME) GET_BATTERY(com.eveningoutpost.dexdrip.insulin.inpen.InPenService.InPenState.GET_BATTERY) PowerManager(android.os.PowerManager) StatusItem(com.eveningoutpost.dexdrip.UtilityModels.StatusItem) KEEP_ALIVE(com.eveningoutpost.dexdrip.insulin.inpen.InPenService.InPenState.KEEP_ALIVE) Gson(com.google.gson.Gson) Schedulers(io.reactivex.schedulers.Schedulers) GET_INDEX(com.eveningoutpost.dexdrip.insulin.inpen.InPenService.InPenState.GET_INDEX) BAD(com.eveningoutpost.dexdrip.UtilityModels.StatusItem.Highlight.BAD) GET_RECORDS(com.eveningoutpost.dexdrip.insulin.inpen.InPenService.InPenState.GET_RECORDS) INPEN_SERVICE_FAILOVER_ID(com.eveningoutpost.dexdrip.UtilityModels.Constants.INPEN_SERVICE_FAILOVER_ID) CLOSE(com.eveningoutpost.dexdrip.Services.JamBaseBluetoothSequencer.BaseState.CLOSE) NORMAL(com.eveningoutpost.dexdrip.UtilityModels.StatusItem.Highlight.NORMAL) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) KEEPALIVE(com.eveningoutpost.dexdrip.insulin.inpen.Constants.KEEPALIVE) Helper.getCharactersticName(com.eveningoutpost.dexdrip.utils.bt.Helper.getCharactersticName) UUID(java.util.UUID) GET_TIME(com.eveningoutpost.dexdrip.insulin.inpen.InPenService.InPenState.GET_TIME) List(java.util.List) Disposable(io.reactivex.disposables.Disposable) BleDisconnectedException(com.polidea.rxandroidble2.exceptions.BleDisconnectedException) R(com.eveningoutpost.dexdrip.R) REMAINING_INDEX(com.eveningoutpost.dexdrip.insulin.inpen.Constants.REMAINING_INDEX) Queue(java.util.Queue) ConcurrentLinkedQueue(java.util.concurrent.ConcurrentLinkedQueue) BluetoothDevice(android.bluetooth.BluetoothDevice) GET_AUTH_STATE2(com.eveningoutpost.dexdrip.insulin.inpen.InPenService.InPenState.GET_AUTH_STATE2) RECORD_INDICATE(com.eveningoutpost.dexdrip.insulin.inpen.Constants.RECORD_INDICATE) Intent(android.content.Intent) HashMap(java.util.HashMap) GET_A_TIME(com.eveningoutpost.dexdrip.insulin.inpen.InPenService.InPenState.GET_A_TIME) JoH.dateTimeText(com.eveningoutpost.dexdrip.Models.JoH.dateTimeText) JoH.hourMinuteString(com.eveningoutpost.dexdrip.Models.JoH.hourMinuteString) Scheduler(io.reactivex.Scheduler) BleGattException(com.polidea.rxandroidble2.exceptions.BleGattException) ID_INPEN(com.eveningoutpost.dexdrip.insulin.inpen.InPenEntry.ID_INPEN) STORE_INPEN_INFOS(com.eveningoutpost.dexdrip.insulin.inpen.InPen.STORE_INPEN_INFOS) Build(android.os.Build) TimeRx(com.eveningoutpost.dexdrip.insulin.inpen.messages.TimeRx) SlidingWindowConstraint(com.eveningoutpost.dexdrip.utils.time.SlidingWindowConstraint) AUTHENTICATION(com.eveningoutpost.dexdrip.insulin.inpen.Constants.AUTHENTICATION) PRINTABLE_INFO_CHARACTERISTICS(com.eveningoutpost.dexdrip.insulin.inpen.Constants.PRINTABLE_INFO_CHARACTERISTICS) JoH.emptyString(com.eveningoutpost.dexdrip.Models.JoH.emptyString) BluetoothGattService(android.bluetooth.BluetoothGattService) PEN_TIME(com.eveningoutpost.dexdrip.insulin.inpen.Constants.PEN_TIME) RECORD_START(com.eveningoutpost.dexdrip.insulin.inpen.Constants.RECORD_START) GET_IDENTITY(com.eveningoutpost.dexdrip.insulin.inpen.InPenService.InPenState.GET_IDENTITY) JoH.msSince(com.eveningoutpost.dexdrip.Models.JoH.msSince) TimeUnit(java.util.concurrent.TimeUnit) BOND_BONDED(android.bluetooth.BluetoothDevice.BOND_BONDED) KeepAliveTx(com.eveningoutpost.dexdrip.insulin.inpen.messages.KeepAliveTx) SECOND_IN_MS(com.eveningoutpost.dexdrip.UtilityModels.Constants.SECOND_IN_MS) MINUTE_IN_MS(com.eveningoutpost.dexdrip.UtilityModels.Constants.MINUTE_IN_MS) BleGattCharacteristicException(com.polidea.rxandroidble2.exceptions.BleGattCharacteristicException) RecordTx(com.eveningoutpost.dexdrip.insulin.inpen.messages.RecordTx) BleDisconnectedException(com.polidea.rxandroidble2.exceptions.BleDisconnectedException) SlidingWindowConstraint(com.eveningoutpost.dexdrip.utils.time.SlidingWindowConstraint)

Example 12 with BleGattCharacteristicException

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;
}
Also used : BleGattCharacteristicException(com.polidea.rxandroidble2.exceptions.BleGattCharacteristicException) SuppressLint(android.annotation.SuppressLint) SuppressLint(android.annotation.SuppressLint)

Example 13 with BleGattCharacteristicException

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);
    }
}
Also used : BleGattCharacteristicException(com.polidea.rxandroidble2.exceptions.BleGattCharacteristicException) RBulkUpTx(com.eveningoutpost.dexdrip.watch.thinjam.messages.RBulkUpTx) SuppressLint(android.annotation.SuppressLint) SlidingWindowConstraint(com.eveningoutpost.dexdrip.utils.time.SlidingWindowConstraint) BulkUpTx(com.eveningoutpost.dexdrip.watch.thinjam.messages.BulkUpTx) RBulkUpTx(com.eveningoutpost.dexdrip.watch.thinjam.messages.RBulkUpTx)

Example 14 with BleGattCharacteristicException

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);
            }
        }
    });
}
Also used : BleGattCharacteristicException(com.polidea.rxandroidble2.exceptions.BleGattCharacteristicException) BleCharacteristicNotFoundException(com.polidea.rxandroidble2.exceptions.BleCharacteristicNotFoundException) SetTimeTx(com.eveningoutpost.dexdrip.watch.thinjam.messages.SetTimeTx) SuppressLint(android.annotation.SuppressLint) SlidingWindowConstraint(com.eveningoutpost.dexdrip.utils.time.SlidingWindowConstraint)

Aggregations

BleGattCharacteristicException (com.polidea.rxandroidble2.exceptions.BleGattCharacteristicException)14 SuppressLint (android.annotation.SuppressLint)12 SlidingWindowConstraint (com.eveningoutpost.dexdrip.utils.time.SlidingWindowConstraint)10 BleDisconnectedException (com.polidea.rxandroidble2.exceptions.BleDisconnectedException)6 Build (android.os.Build)4 PowerManager (android.os.PowerManager)4 HexDump (com.eveningoutpost.dexdrip.ImportedLibraries.usbserial.util.HexDump)4 JoH (com.eveningoutpost.dexdrip.Models.JoH)4 JoH.msSince (com.eveningoutpost.dexdrip.Models.JoH.msSince)4 UserError (com.eveningoutpost.dexdrip.Models.UserError)4 R (com.eveningoutpost.dexdrip.R)4 TargetApi (android.annotation.TargetApi)2 PendingIntent (android.app.PendingIntent)2 BluetoothDevice (android.bluetooth.BluetoothDevice)2 BOND_BONDED (android.bluetooth.BluetoothDevice.BOND_BONDED)2 BOND_NONE (android.bluetooth.BluetoothDevice.BOND_NONE)2 BluetoothGatt (android.bluetooth.BluetoothGatt)2 BluetoothGattCharacteristic (android.bluetooth.BluetoothGattCharacteristic)2 BluetoothGattService (android.bluetooth.BluetoothGattService)2 Intent (android.content.Intent)2