package nl.littlerobots.bean.internal.device;
import android.bluetooth.BluetoothGatt;
import android.bluetooth.BluetoothGattCharacteristic;
import android.bluetooth.BluetoothGattService;
import java.util.List;
import nl.littlerobots.bean.internal.ble.BaseProfile;
import nl.littlerobots.bean.internal.ble.GattClient;
import nl.littlerobots.bean.message.DeviceInfo;
public class DeviceProfile extends BaseProfile {
private static final int DEVICE_SERVICE_UUID = 0x180a;
private static final int CHARACTERISTIC_HARDWARE_VERSION = 0x2A27;
private static final int CHARACTERISTIC_FIRMWARE_VERSION = 0x2A26;
private static final int CHARACTERISTIC_SOFTWARE_VERSION = 0x2A28;
private static final String TAG = "DeviceProfile";
private String mSoftwareVersion;
private String mHardwareVersion;
private String mFirmwareVersion;
private BluetoothGattService mDeviceService;
private DeviceInfoCallback mCallback;
public DeviceProfile(GattClient client) {
super(client);
}
@Override
public void onConnectionStateChange(int newState) {
if (newState == BluetoothGatt.STATE_CONNECTED) {
mGattClient.discoverServices();
}
}
@Override
public void onServicesDiscovered(GattClient client) {
List<BluetoothGattService> services = client.getServices();
for (BluetoothGattService service : services) {
if ((service.getUuid().getMostSignificantBits() >> 32) == DEVICE_SERVICE_UUID) {
mDeviceService = service;
}
}
}
@Override
public void onCharacteristicRead(GattClient client, BluetoothGattCharacteristic characteristic) {
if ((characteristic.getUuid().getMostSignificantBits() >> 32) == CHARACTERISTIC_FIRMWARE_VERSION) {
mFirmwareVersion = characteristic.getStringValue(0);
} else if ((characteristic.getUuid().getMostSignificantBits() >> 32) == CHARACTERISTIC_HARDWARE_VERSION) {
mHardwareVersion = characteristic.getStringValue(0);
} else if ((characteristic.getUuid().getMostSignificantBits() >> 32) == CHARACTERISTIC_SOFTWARE_VERSION) {
mSoftwareVersion = characteristic.getStringValue(0);
}
if (mFirmwareVersion != null && mSoftwareVersion != null && mHardwareVersion != null) {
DeviceInfo info = DeviceInfo.create(mHardwareVersion, mSoftwareVersion, mFirmwareVersion);
if (mCallback != null) {
mCallback.onDeviceInfo(info);
mCallback = null;
}
}
}
public void getDeviceInfo(DeviceInfoCallback callback) {
mCallback = callback;
for (BluetoothGattCharacteristic characteristic : mDeviceService.getCharacteristics()) {
if ((characteristic.getUuid().getMostSignificantBits() >> 32) == CHARACTERISTIC_FIRMWARE_VERSION ||
(characteristic.getUuid().getMostSignificantBits() >> 32) == CHARACTERISTIC_SOFTWARE_VERSION ||
(characteristic.getUuid().getMostSignificantBits() >> 32) == CHARACTERISTIC_HARDWARE_VERSION) {
mGattClient.readCharacteristic(characteristic);
}
}
}
public static interface DeviceInfoCallback {
public void onDeviceInfo(DeviceInfo info);
}
}