package com.uxxu.konashi.lib;
import android.bluetooth.BluetoothGatt;
import android.bluetooth.BluetoothGattCharacteristic;
import android.bluetooth.BluetoothGattService;
import com.uxxu.konashi.lib.action.KonashiEnableNotificationAction;
import com.uxxu.konashi.lib.dispatcher.DispatcherContainer;
import com.uxxu.konashi.lib.util.KonashiUtils;
import com.uxxu.konashi.lib.util.SpiUtils;
import com.uxxu.konashi.lib.util.UartUtils;
import org.jdeferred.DoneCallback;
import java.util.UUID;
import info.izumin.android.bletia.Bletia;
import info.izumin.android.bletia.BletiaException;
import info.izumin.android.bletia.BletiaListener;
/**
* Created by izumin on 9/23/15.
*/
class CallbackHandler implements BletiaListener {
private final EventEmitter mEmitter;
private final KonashiManager mManager;
private final DispatcherContainer mDispatcherContainer;
public CallbackHandler(KonashiManager manager, EventEmitter emitter, DispatcherContainer dispatcherContainer) {
mManager = manager;
mEmitter = emitter;
mDispatcherContainer = dispatcherContainer;
}
@Override
public void onConnect(Bletia bletia) {
bletia.discoverServices();
}
@Override
public void onDisconnect(Bletia bletia) {
mEmitter.emitDisconnect(mManager);
}
@Override
public void onError(BletiaException e) {
KonashiUtils.log(e.getType().getName());
mEmitter.emitError(mManager, e);
}
@Override
public void onServicesDiscovered(Bletia bletia, int status) {
// if (status == BluetoothGatt.GATT_SUCCESS) {
// BluetoothGattService service = bletia.getService(KonashiUUID.KONASHI_SERVICE_UUID);
// bletia.enableNotification(service.getCharacteristic(KonashiUUID.PIO_INPUT_NOTIFICATION_UUID), true);
// bletia.enableNotification(service.getCharacteristic(KonashiUUID.UART_RX_NOTIFICATION_UUID), true);
// bletia.enableNotification(service.getCharacteristic(KonashiUUID.HARDWARE_LOW_BAT_NOTIFICATION_UUID), true);
// BluetoothGattCharacteristic spiCharacteristic = service.getCharacteristic(KonashiUUID.SPI_NOTIFICATION_UUID);
// if(spiCharacteristic != null) bletia.enableNotification(spiCharacteristic, true);
// mEmitter.emitConnect(mManager);
// }
if (status == BluetoothGatt.GATT_SUCCESS) {
BluetoothGattService service = bletia.getService(KonashiUUID.KONASHI_SERVICE_UUID);
bletia.execute(new KonashiEnableNotificationAction(service.getCharacteristic(KonashiUUID.PIO_INPUT_NOTIFICATION_UUID), true));
bletia.execute(new KonashiEnableNotificationAction(service.getCharacteristic(KonashiUUID.UART_RX_NOTIFICATION_UUID), true));
bletia.execute(new KonashiEnableNotificationAction(service.getCharacteristic(KonashiUUID.HARDWARE_LOW_BAT_NOTIFICATION_UUID), true));
BluetoothGattCharacteristic spiCharacteristic = service.getCharacteristic(KonashiUUID.SPI_NOTIFICATION_UUID);
if(spiCharacteristic != null) bletia.execute(new KonashiEnableNotificationAction(spiCharacteristic, true));
mEmitter.emitConnect(mManager);
}
}
@Override
public void onCharacteristicChanged(Bletia bletia, BluetoothGattCharacteristic characteristic) {
UUID uuid = characteristic.getUuid();
if (KonashiUUID.PIO_INPUT_NOTIFICATION_UUID.equals(uuid)) {
mDispatcherContainer.getPioDispatcher().onDone(characteristic);
mEmitter.emitUpdatePioOutput(mManager, characteristic.getValue()[0]);
} else if (KonashiUUID.UART_RX_NOTIFICATION_UUID.equals(uuid)) {
mDispatcherContainer.getUartDispatcher().onDone(characteristic);
mEmitter.emitUpdateUartRx(mManager, UartUtils.removeLengthByte(characteristic.getValue()));
} else if (KonashiUUID.SPI_NOTIFICATION_UUID.equals(uuid)) {
mManager.spiRead().then(new DoneCallback<BluetoothGattCharacteristic>() {
@Override
public void onDone(BluetoothGattCharacteristic result) {
mEmitter.emitUpdateSpiMiso(mManager, SpiUtils.getDataFromResult(result.getValue()));
}
});
} else if (KonashiUUID.HARDWARE_LOW_BAT_NOTIFICATION_UUID.equals(uuid)) {
mEmitter.emitUpdateBatteryLevel(mManager, KonashiUtils.getBatteryLevel(characteristic));
}
}
}