1
0
mirror of https://codeberg.org/Freeyourgadget/Gadgetbridge synced 2024-12-14 20:57:50 +01:00

some functions do now work

Signed-off-by: Sophanimus
This commit is contained in:
Sophanimus 2019-04-03 23:59:14 +02:00 committed by Andreas Shimokawa
parent 6faf9fdae8
commit 1087a53216
3 changed files with 171 additions and 42 deletions

View File

@ -6,49 +6,98 @@ import static nodomain.freeyourgadget.gadgetbridge.service.btle.AbstractBTLEDevi
public final class BFH16Constants {
//public static final UUID BFH16_IDENTIFICATION_SERVICE1 = UUID.fromString(String.format(BASE_UUID, "FEF5") );
//Known Services
public static final UUID BFH16_GENERIC_ACCESS_SERVICE = UUID.fromString("00001800-0000-1000-8000-00805f9b34fb");
public static final UUID BFH16_GENERIC_ARTTRIBUTE_SERVICE = UUID.fromString("00001801-0000-1000-8000-00805f9b34fb");
public static final UUID BFH16_IDENTIFICATION_SERVICE1 = UUID.fromString("0000fef5-0000-1000-8000-00805f9b34fb");
//public static final UUID BFH16_IDENTIFICATION_SERVICE2 = UUID.fromString(String.format(BASE_UUID, "FEE7") );
public static final UUID BFH16_IDENTIFICATION_SERVICE2 = UUID.fromString("0000fee7-0000-1000-8000-00805f9b34fb");
public static final UUID BFH16_MAIN_SERVICE = UUID.fromString(String.format(BASE_UUID, "33F4") );
public static final UUID BFH16_SERVICE1 = UUID.fromString("000056ff-0000-1000-8000-00805f9b34fb");
public static final UUID BFH16_SERVICE1_WRITE = UUID.fromString("000033f3-0000-1000-8000-00805f9b34fb");
public static final UUID BFH16_SERVICE1_NOTIFY = UUID.fromString("000033f4-0000-1000-8000-00805f9b34fb");
public static final UUID BFH16_SERVICE2 = UUID.fromString("0000fee7-0000-1000-8000-00805f9b34fb");
public static final UUID BFH16_SERVICE2_WRITE = UUID.fromString("0000fec7-0000-1000-8000-00805f9b34fb");
public static final UUID BFH16_SERVICE2_INDICATE= UUID.fromString("0000fec8-0000-1000-8000-00805f9b34fb");
public static final UUID BFH16_SERVICE2_READ = UUID.fromString("0000fec9-0000-1000-8000-00805f9b34fb");
//Known Services
public static final UUID BFH16_SERVICE_1 = UUID.fromString("00001800-0000-1000-8000-00805f9b34fb");
public static final UUID BFH16_SERVICE_2 = UUID.fromString("00001801-0000-1000-8000-00805f9b34fb"); //Attribute
public static final UUID BFH16_SERVICE_3 = UUID.fromString("000056ff-0000-1000-8000-00805f9b34fb"); //Service
public static final UUID BFH16_SERVICE_4 = UUID.fromString("0000fee7-0000-1000-8000-00805f9b34fb"); //Service
//I Think i discovered that this device (BFH16) uses communication similar to JYOU
//Therefore i copied the following vars:
public static final UUID UUID_CHARACTERISTIC_CONTROL = UUID.fromString("000033f3-0000-1000-8000-00805f9b34fb");
public static final UUID UUID_CHARACTERISTIC_MEASURE = UUID.fromString("000033f4-0000-1000-8000-00805f9b34fb");
public static final UUID UUID_SERVICE_JYOU = UUID.fromString("000056ff-0000-1000-8000-00805f9b34fb");
//Verified command bytes
public static final byte CMD_SET_ALARM_1 = (byte)0x09;
public static final byte CMD_SET_ALARM_2 = (byte)0x22;
public static final byte CMD_SET_ALARM_3 = (byte)0x23;
public static final byte CMD_SET_DATE_AND_TIME = 0x08;
public static final byte CMD_MEASURE_HEART = (byte)0x0D; //param1: 0, param2: 0 -> STOP | 1 -> START
public static final byte CMD_VIBRATE = (byte)0x07; //param1: 0, param2: 1
public static final byte CMD_SWITCH_PHOTO_MODE = (byte)0x25; //param1: 0, param2: 0 -> OFF | 1 -> ON
public static final byte CMD_SWITCH_12HOUR_MODE = (byte)0x3E; //byte1: 1 -> 12HourMode | 0 -> 24HourMode
public static final byte CMD_SWITCH_METRIC_IMPERIAL = (byte)0x3A; //param1: 0, param2: 0 -> METRIC | 1 -> IMPERIAL //Also requests walked steps
//Verified receive bytes
public static final byte RECEIVE_BATTERY_LEVEL = (byte)0xF7;
public static final byte RECEIVE_STEPS_DATA = (byte)0xF9;
public static final byte RECEIVE_HEART_DATA = (byte)0xE8;
public static final byte RECEIVE_PHOTO_TRIGGER = (byte)0xF3;
//Most probably correct command bytes
public static final byte CMD_SET_STEPLENGTH = (byte)0x3F; //param1: 0, param2: STEPLENGTH
//Probably correct command bytes
public static final byte CMD_SET_INACTIVITY_WARNING_TIME = (byte)0x24; //param1: 0, param2: time
public static final byte CMD_SET_HEART_TARGET = (byte)0x01; //param1: 0, param2: HEART TARGET
public static final byte CMD_SET_STEP_TARGET = (byte)0x03; //param1: 0, param2: STEP TARGET
public static final byte CMD_FIND_DEVICE = (byte)0x36; //param1: 0, param2: 1
public static final byte CMD_SET_DISCONNECT_REMIND = (byte)0x37; //param1: 0, param2: 0 -> ??? | 1 -> ???
public static final byte CMD_SET_AUTODETECT_HEART = (byte)0x38; //param1: 0, param2: 0 -> ??? | 1 -> ???
public static final byte CMD_READ_HISTORY_SLEEP_COUNT = (byte)0x32; //param1: 0, param2: 0
public static final byte CMD_SET_NOON_TIME = (byte)0x26; //param1: start time, param2: end time
public static final byte CMD_SET_SLEEP_TIME = (byte)0x27; //param1: start time, param2: end time
//Could be correct command bytes
//Send PhoneName 0x17 and 0x18
//Send PhoneNumber 0x19 and 0x20
//Weather 0x3B
//Power Management 0x39
//User Id 0x35
//
//______________________________________________________________________________________________
//It may be that BFH16 uses the same communication protocol as JYOU
//copied the following JYOU vars:
public static final byte CMD_SET_HEARTRATE_AUTO = 0x38;
public static final byte CMD_SET_HEARTRATE_WARNING_VALUE = 0x01;
public static final byte CMD_SET_TARGET_STEPS = 0x03;
public static final byte CMD_SET_ALARM_1 = 0x09;
public static final byte CMD_SET_ALARM_2 = 0x22;
public static final byte CMD_SET_ALARM_3 = 0x23;
public static final byte CMD_GET_STEP_COUNT = 0x1D;
//public static final byte CMD_GET_STEP_COUNT = 0x1D;
public static final byte CMD_GET_SLEEP_TIME = 0x32;
public static final byte CMD_SET_NOON_TIME = 0x26;
public static final byte CMD_SET_SLEEP_TIME = 0x27;
public static final byte CMD_SET_DND_SETTINGS = 0x39;
public static final byte CMD_SET_INACTIVITY_WARNING_TIME = 0x24;
public static final byte CMD_ACTION_HEARTRATE_SWITCH = 0x0D;
public static final byte CMD_ACTION_SHOW_NOTIFICATION = 0x2C;
public static final byte CMD_ACTION_REBOOT_DEVICE = 0x0E;
public static final byte RECEIVE_BATTERY_LEVEL = (byte)0xF7;
public static final byte RECEIVE_DEVICE_INFO = (byte)0xF6;
public static final byte RECEIVE_STEPS_DATA = (byte)0xF9;
public static final byte RECEIVE_HEARTRATE = (byte)0xE8;
public static final byte ICON_CALL = 0;
public static final byte ICON_SMS = 1;

View File

@ -42,11 +42,11 @@ public class BFH16DeviceCoordinator extends AbstractDeviceCoordinator
@Override
public Collection<? extends ScanFilter> createBLEScanFilters() {
ParcelUuid bfhService = new ParcelUuid(BFH16Constants.BFH16_IDENTIFICATION_SERVICE1);
ParcelUuid bfhService1 = new ParcelUuid(BFH16Constants.BFH16_IDENTIFICATION_SERVICE1);
ParcelUuid bfhService2 = new ParcelUuid(BFH16Constants.BFH16_IDENTIFICATION_SERVICE2);
ScanFilter filter = new ScanFilter.Builder()
.setServiceUuid(bfhService)
.setServiceUuid(bfhService1)
.setServiceUuid(bfhService2)
.build();
@ -134,7 +134,7 @@ public class BFH16DeviceCoordinator extends AbstractDeviceCoordinator
@Override
public boolean supportsFindDevice()
{
return false;
return true;
}
@Override

View File

@ -44,18 +44,19 @@ public class BFH16DeviceSupport extends AbstractBTLEDeviceSupport {
public BFH16DeviceSupport() {
super(LOG);
addSupportedService(BFH16Constants.UUID_SERVICE_JYOU);
addSupportedService(BFH16Constants.BFH16_SERVICE1);
addSupportedService(BFH16Constants.BFH16_SERVICE2);
}
@Override
protected TransactionBuilder initializeDevice(TransactionBuilder builder) {
LOG.info("Initializing");
LOG.info("Initializing BFH16");
gbDevice.setState(GBDevice.State.INITIALIZING);
gbDevice.sendDeviceUpdateIntent(getContext());
measureCharacteristic = getCharacteristic(BFH16Constants.UUID_CHARACTERISTIC_MEASURE);
ctrlCharacteristic = getCharacteristic(BFH16Constants.UUID_CHARACTERISTIC_CONTROL);
measureCharacteristic = getCharacteristic(BFH16Constants.BFH16_SERVICE1_NOTIFY);
ctrlCharacteristic = getCharacteristic(BFH16Constants.BFH16_SERVICE1_WRITE);
builder.setGattCallback(this);
builder.notify(measureCharacteristic, true);
@ -65,7 +66,7 @@ public class BFH16DeviceSupport extends AbstractBTLEDeviceSupport {
gbDevice.setState(GBDevice.State.INITIALIZED);
gbDevice.sendDeviceUpdateIntent(getContext());
LOG.info("Initialization Done");
LOG.info("Initialization BFH16 Done");
return builder;
}
@ -98,10 +99,13 @@ public class BFH16DeviceSupport extends AbstractBTLEDeviceSupport {
int steps = ByteBuffer.wrap(data, 5, 4).getInt();
LOG.info("Number of walked steps: " + steps);
return true;
case BFH16Constants.RECEIVE_HEARTRATE:
LOG.info("Current heart rate: " + data[1]);
LOG.info("Current blood presure: " + data[3] + "/" + data[2]);
LOG.info("Current satiation: " + data[4]);
case BFH16Constants.RECEIVE_HEART_DATA:
LOG.info("Current heart rate: " + data[1]);
LOG.info("Current blood pressure: " + data[2] + "/" + data[3]);
LOG.info("Current satiation: " + data[4]);
return true;
case BFH16Constants.RECEIVE_PHOTO_TRIGGER:
LOG.info("Received photo trigger: " + data[8]);
return true;
default:
LOG.info("Unhandled characteristic change: " + characteristicUUID + " code: " + String.format("0x%1x ...", data[0]));
@ -109,6 +113,7 @@ public class BFH16DeviceSupport extends AbstractBTLEDeviceSupport {
}
}
//Fully working
private void syncDateAndTime(TransactionBuilder builder) {
Calendar cal = Calendar.getInstance();
String strYear = String.valueOf(cal.get(Calendar.YEAR));
@ -128,6 +133,7 @@ public class BFH16DeviceSupport extends AbstractBTLEDeviceSupport {
));
}
//TODO: not checked yet
private void syncSettings(TransactionBuilder builder) {
syncDateAndTime(builder);
@ -139,7 +145,7 @@ public class BFH16DeviceSupport extends AbstractBTLEDeviceSupport {
BFH16Constants.CMD_SET_TARGET_STEPS, 0, 10000
));
builder.write(ctrlCharacteristic, commandWithChecksum(
BFH16Constants.CMD_GET_STEP_COUNT, 0, 0
BFH16Constants.CMD_SWITCH_METRIC_IMPERIAL, 0, 0
));
builder.write(ctrlCharacteristic, commandWithChecksum(
BFH16Constants.CMD_GET_SLEEP_TIME, 0, 0
@ -169,6 +175,7 @@ public class BFH16DeviceSupport extends AbstractBTLEDeviceSupport {
));
}
//TODO: not checked yet + needs rework
private void showNotification(byte icon, String title, String message) {
try {
TransactionBuilder builder = performInitialized("ShowNotification");
@ -212,6 +219,7 @@ public class BFH16DeviceSupport extends AbstractBTLEDeviceSupport {
return true;
}
//TODO: not checked yet + needs rework
@Override
public void onNotification(NotificationSpec notificationSpec) {
String notificationTitle = StringUtils.getFirstOf(notificationSpec.sender, notificationSpec.title);
@ -242,6 +250,7 @@ public class BFH16DeviceSupport extends AbstractBTLEDeviceSupport {
}
//fully working
@Override
public void onSetAlarms(ArrayList<? extends Alarm> alarms) {
try {
@ -288,6 +297,7 @@ public class BFH16DeviceSupport extends AbstractBTLEDeviceSupport {
}
}
//TODO: not checked yet
@Override
public void onSetCallState(CallSpec callSpec) {
switch (callSpec.command) {
@ -370,7 +380,7 @@ public class BFH16DeviceSupport extends AbstractBTLEDeviceSupport {
try {
TransactionBuilder builder = performInitialized("HeartRateTest");
builder.write(ctrlCharacteristic, commandWithChecksum(
BFH16Constants.CMD_ACTION_HEARTRATE_SWITCH, 0, 1
BFH16Constants.CMD_MEASURE_HEART, 0, 1
));
builder.queue(getQueue());
} catch(Exception e) {
@ -384,7 +394,7 @@ public class BFH16DeviceSupport extends AbstractBTLEDeviceSupport {
try {
TransactionBuilder builder = performInitialized("RealTimeHeartMeasurement");
builder.write(ctrlCharacteristic, commandWithChecksum(
BFH16Constants.CMD_SET_HEARTRATE_AUTO, 0, enable ? 1 : 0
BFH16Constants.CMD_MEASURE_HEART, 0, enable ? 1 : 0
));
builder.queue(getQueue());
} catch(Exception e) {
@ -392,6 +402,7 @@ public class BFH16DeviceSupport extends AbstractBTLEDeviceSupport {
}
}
//working
@Override
public void onFindDevice(boolean start) {
if (start) {
@ -402,7 +413,15 @@ public class BFH16DeviceSupport extends AbstractBTLEDeviceSupport {
@Override
public void onSetConstantVibration(int integer) {
try {
TransactionBuilder builder = performInitialized("Vibrate");
builder.write(ctrlCharacteristic, commandWithChecksum(
BFH16Constants.CMD_VIBRATE, 0, 1
));
builder.queue(getQueue());
} catch(Exception e) {
LOG.warn(e.getMessage());
}
}
@Override
@ -443,6 +462,34 @@ public class BFH16DeviceSupport extends AbstractBTLEDeviceSupport {
@Override
public void onTestNewFunction() {
try {
TransactionBuilder builder = performInitialized("TestNewFunction");
//byte cmd = BFH16Constants.CMD_GET_STEP_COUNT;
//Wakeup? Photo?
//builder.write(ctrlCharacteristic, commandWithChecksum((byte) 0x25, 0, 0));
//builder.write(ctrlCharacteristic, commandWithChecksum((byte) 0x25, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00));
builder.write(ctrlCharacteristic, commandWithChecksum( (byte)1, 0, 200));
// builder.write(ctrlCharacteristic, commandWithChecksum((byte) 0xF, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00));
// builder.write(ctrlCharacteristic, commandWithChecksum(
// (byte) 39, (byte) 0, (byte) 0,
// (byte) 189, (byte) 216, (byte) 0,
// (byte) 0, (byte) 196, (byte) 224));
builder.queue(getQueue());
GB.toast(getContext(), "TestNewFunction executed!", Toast.LENGTH_LONG, GB.INFO);
} catch(IOException e) {
LOG.warn(e.getMessage());
}
}
@Override
@ -450,6 +497,38 @@ public class BFH16DeviceSupport extends AbstractBTLEDeviceSupport {
}
/**
* Checksum is calculated by the sum of bytes 0 to 8 and send as byte 9
*/
private byte[] commandWithChecksum(byte s0, byte s1, byte s2, byte s3, byte s4, byte s5, byte s6, byte s7, byte s8)
{
ByteBuffer buf = ByteBuffer.allocate(10);
buf.put(s0);
buf.put(s1);
buf.put(s2);
buf.put(s3);
buf.put(s4);
buf.put(s5);
buf.put(s6);
buf.put(s7);
buf.put(s8);
byte[] bytesToWrite = buf.array();
byte checksum = 0;
for (byte b : bytesToWrite) {
checksum += b;
}
//checksum = (byte) ((byte) checksum & (byte) 0xFF); //TODO EXPERIMENTAL
LOG.debug("Checksum = " + checksum);
bytesToWrite[9] = checksum;
return bytesToWrite;
}
private byte[] commandWithChecksum(byte cmd, int argSlot1, int argSlot2)
{
ByteBuffer buf = ByteBuffer.allocate(10);
@ -493,4 +572,5 @@ public class BFH16DeviceSupport extends AbstractBTLEDeviceSupport {
}
return null;
}
}