WIP: A little more Alert Notification Profile

I think we should rather focus on a code generator, though.
This commit is contained in:
cpfeiffer 2016-09-29 20:32:15 +02:00
parent fabc52fdad
commit 8f36712342
8 changed files with 164 additions and 21 deletions

View File

@ -87,8 +87,8 @@ public class BleNamesResolver {
mServices.put("00001530-0000-3512-2118-0009af100700", "(Propr: Xiaomi Weight Service)"); mServices.put("00001530-0000-3512-2118-0009af100700", "(Propr: Xiaomi Weight Service)");
mCharacteristics.put("00002a43-0000-1000-8000-00805f9b34fb", "Alert Category ID"); mCharacteristics.put("00002a43-0000-1000-8000-00805f9b34fb", "Alert AlertCategory ID");
mCharacteristics.put("00002a42-0000-1000-8000-00805f9b34fb", "Alert Category ID Bit Mask"); mCharacteristics.put("00002a42-0000-1000-8000-00805f9b34fb", "Alert AlertCategory ID Bit Mask");
mCharacteristics.put("00002a06-0000-1000-8000-00805f9b34fb", "Alert Level"); mCharacteristics.put("00002a06-0000-1000-8000-00805f9b34fb", "Alert Level");
mCharacteristics.put("00002a44-0000-1000-8000-00805f9b34fb", "Alert Notification Control Point"); mCharacteristics.put("00002a44-0000-1000-8000-00805f9b34fb", "Alert Notification Control Point");
mCharacteristics.put("00002a3f-0000-1000-8000-00805f9b34fb", "Alert Status"); mCharacteristics.put("00002a3f-0000-1000-8000-00805f9b34fb", "Alert Status");
@ -155,8 +155,8 @@ public class BleNamesResolver {
mCharacteristics.put("00002a25-0000-1000-8000-00805f9b34fb", "Serial Number String"); mCharacteristics.put("00002a25-0000-1000-8000-00805f9b34fb", "Serial Number String");
mCharacteristics.put("00002a05-0000-1000-8000-00805f9b34fb", "Service Changed"); mCharacteristics.put("00002a05-0000-1000-8000-00805f9b34fb", "Service Changed");
mCharacteristics.put("00002a28-0000-1000-8000-00805f9b34fb", "Software Revision String"); mCharacteristics.put("00002a28-0000-1000-8000-00805f9b34fb", "Software Revision String");
mCharacteristics.put("00002a47-0000-1000-8000-00805f9b34fb", "Supported New Alert Category"); mCharacteristics.put("00002a47-0000-1000-8000-00805f9b34fb", "Supported New Alert AlertCategory");
mCharacteristics.put("00002a48-0000-1000-8000-00805f9b34fb", "Supported Unread Alert Category"); mCharacteristics.put("00002a48-0000-1000-8000-00805f9b34fb", "Supported Unread Alert AlertCategory");
mCharacteristics.put("00002a23-0000-1000-8000-00805f9b34fb", "System ID"); mCharacteristics.put("00002a23-0000-1000-8000-00805f9b34fb", "System ID");
mCharacteristics.put("00002a1c-0000-1000-8000-00805f9b34fb", "Temperature Measurement"); mCharacteristics.put("00002a1c-0000-1000-8000-00805f9b34fb", "Temperature Measurement");
mCharacteristics.put("00002a1d-0000-1000-8000-00805f9b34fb", "Temperature Type"); mCharacteristics.put("00002a1d-0000-1000-8000-00805f9b34fb", "Temperature Type");

View File

@ -184,8 +184,8 @@ public class GattCharacteristic {
static { static {
GATTCHARACTERISTIC_DEBUG = new HashMap<>(); GATTCHARACTERISTIC_DEBUG = new HashMap<>();
GATTCHARACTERISTIC_DEBUG.put(UUID_CHARACTERISTIC_ALERT_CATEGORY_ID, "Alert Category ID"); GATTCHARACTERISTIC_DEBUG.put(UUID_CHARACTERISTIC_ALERT_CATEGORY_ID, "Alert AlertCategory ID");
GATTCHARACTERISTIC_DEBUG.put(UUID_CHARACTERISTIC_ALERT_CATEGORY_ID_BIT_MASK, "Alert Category ID Bit Mask"); GATTCHARACTERISTIC_DEBUG.put(UUID_CHARACTERISTIC_ALERT_CATEGORY_ID_BIT_MASK, "Alert AlertCategory ID Bit Mask");
GATTCHARACTERISTIC_DEBUG.put(UUID_CHARACTERISTIC_ALERT_LEVEL, "Alert Level"); GATTCHARACTERISTIC_DEBUG.put(UUID_CHARACTERISTIC_ALERT_LEVEL, "Alert Level");
GATTCHARACTERISTIC_DEBUG.put(UUID_CHARACTERISTIC_ALERT_NOTIFICATION_CONTROL_POINT, "Alert Notification Control Point"); GATTCHARACTERISTIC_DEBUG.put(UUID_CHARACTERISTIC_ALERT_NOTIFICATION_CONTROL_POINT, "Alert Notification Control Point");
GATTCHARACTERISTIC_DEBUG.put(UUID_CHARACTERISTIC_ALERT_STATUS, "Alert Status"); GATTCHARACTERISTIC_DEBUG.put(UUID_CHARACTERISTIC_ALERT_STATUS, "Alert Status");
@ -221,8 +221,8 @@ public class GattCharacteristic {
GATTCHARACTERISTIC_DEBUG.put(UUID_CHARACTERISTIC_SERIAL_NUMBER_STRING, "Serial Number String"); GATTCHARACTERISTIC_DEBUG.put(UUID_CHARACTERISTIC_SERIAL_NUMBER_STRING, "Serial Number String");
GATTCHARACTERISTIC_DEBUG.put(UUID_CHARACTERISTIC_GATT_SERVICE_CHANGED, "Service Changed"); GATTCHARACTERISTIC_DEBUG.put(UUID_CHARACTERISTIC_GATT_SERVICE_CHANGED, "Service Changed");
GATTCHARACTERISTIC_DEBUG.put(UUID_CHARACTERISTIC_SOFTWARE_REVISION_STRING, "Software Revision String"); GATTCHARACTERISTIC_DEBUG.put(UUID_CHARACTERISTIC_SOFTWARE_REVISION_STRING, "Software Revision String");
GATTCHARACTERISTIC_DEBUG.put(UUID_CHARACTERISTIC_SUPPORTED_NEW_ALERT_CATEGORY, "Supported New Alert Category"); GATTCHARACTERISTIC_DEBUG.put(UUID_CHARACTERISTIC_SUPPORTED_NEW_ALERT_CATEGORY, "Supported New Alert AlertCategory");
GATTCHARACTERISTIC_DEBUG.put(UUID_CHARACTERISTIC_SUPPORTED_UNREAD_ALERT_CATEGORY, "Supported Unread Alert Category"); GATTCHARACTERISTIC_DEBUG.put(UUID_CHARACTERISTIC_SUPPORTED_UNREAD_ALERT_CATEGORY, "Supported Unread Alert AlertCategory");
GATTCHARACTERISTIC_DEBUG.put(UUID_CHARACTERISTIC_SYSTEM_ID, "System ID"); GATTCHARACTERISTIC_DEBUG.put(UUID_CHARACTERISTIC_SYSTEM_ID, "System ID");
GATTCHARACTERISTIC_DEBUG.put(UUID_CHARACTERISTIC_TEMPERATURE_MEASUREMENT, "Temperature Measurement"); GATTCHARACTERISTIC_DEBUG.put(UUID_CHARACTERISTIC_TEMPERATURE_MEASUREMENT, "Temperature Measurement");
GATTCHARACTERISTIC_DEBUG.put(UUID_CHARACTERISTIC_TEMPERATURE_TYPE, "Temperature DeviceType"); GATTCHARACTERISTIC_DEBUG.put(UUID_CHARACTERISTIC_TEMPERATURE_TYPE, "Temperature DeviceType");

View File

@ -1,10 +1,13 @@
package nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.alertnotification; package nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.alertnotification;
import java.util.ArrayList;
import java.util.List;
/** /**
* https://www.bluetooth.com/specifications/gatt/viewer?attributeXmlFile=org.bluetooth.characteristic.alert_category_id.xml * https://www.bluetooth.com/specifications/gatt/viewer?attributeXmlFile=org.bluetooth.characteristic.alert_category_id.xml
* https://www.bluetooth.com/specifications/gatt/viewer?attributeXmlFile=org.bluetooth.characteristic.alert_category_id_bit_mask.xml * https://www.bluetooth.com/specifications/gatt/viewer?attributeXmlFile=org.bluetooth.characteristic.alert_category_id_bit_mask.xml
*/ */
public enum Category { public enum AlertCategory {
Simple(0), Simple(0),
Email(1), Email(1),
News(2), News(2),
@ -20,33 +23,57 @@ public enum Category {
private final int id; private final int id;
Category(int id) { AlertCategory(int id) {
this.id = id; this.id = id;
} }
/**
* Returns the numerical ID value of this category
* To be used as uin8 value
* @return the uint8 value for this category
*/
public int getId() { public int getId() {
return id; return id;
} }
private int asBit() { private int realBitNumber() {
return byteNumber() <=7 ? 0 : 1;
}
private int byteNumber() {
return bitNumber() > 7 ? 0 : 1;
}
private int bitNumber() {
// the ID corresponds to the bit for the bitset // the ID corresponds to the bit for the bitset
return id; return id;
} }
public static byte[] toBitmask(Category... categories) { private int bitNumberPerByte() {
// the ID corresponds to the bit for the bitset (per byte)
return realBitNumber() % 8;
}
private int asBit() {
return 1 << bitNumberPerByte();
}
private int byteNumber() {
return id <= 7 ? 0 : 1;
}
/**
* Converts the given categories to an array of bytes.
* @param categories
* @return
*/
public static byte[] toBitmask(AlertCategory... categories) {
byte[] result = new byte[2]; byte[] result = new byte[2];
for (Category category : categories) { for (AlertCategory category : categories) {
result[category.byteNumber()] |= category.asBit(); result[category.byteNumber()] |= category.asBit();
} }
return result; return result;
} }
// SupportedNewAlertCategory
public static AlertCategory[] fromBitMask(byte[] bytes) {
List<AlertCategory> result = new ArrayList<>();
byte b = bytes[0];
return null;
}
} }

View File

@ -0,0 +1,27 @@
package nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.alertnotification;
/**
* https://www.bluetooth.com/specifications/gatt/viewer?attributeXmlFile=org.bluetooth.characteristic.alert_level.xml
*/
public enum AlertLevel {
NoAlert(0),
MildAlert(1),
HighAlert(2);
// 3-255 reserved
private final int id;
AlertLevel(int id) {
this.id = id;
}
/**
* The alert level ID
* To be used as uint8 value
* @return
*/
public int getId() {
return id;
}
}

View File

@ -0,0 +1,8 @@
package nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.alertnotification;
/**
* https://www.bluetooth.com/specifications/gatt/viewer?attributeXmlFile=org.bluetooth.characteristic.alert_notification_control_point.xml
*/
public class AlertNotificationControl {
}

View File

@ -7,4 +7,6 @@ public class AlertNotificationProfile<T extends AbstractBTLEDeviceSupport> exten
public AlertNotificationProfile(T support) { public AlertNotificationProfile(T support) {
super(support); super(support);
} }
} }

View File

@ -0,0 +1,21 @@
package nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.alertnotification;
/**
* https://www.bluetooth.com/specifications/gatt/viewer?attributeXmlFile=org.bluetooth.characteristic.alert_status.xml
* uint8 value (bitmask) of the given values
*/
public class AlertStatus {
public static final int RINGER_ACTIVE_BIT = 1;
public static final int VIBRATE_ACTIVE = 1 << 1;
public static final int DISPLAY_ALERT_ACTIVE = 1 << 2;
public static boolean isRingerActive(int status) {
return (status & RINGER_ACTIVE_BIT) == RINGER_ACTIVE_BIT;
}
public static boolean isVibrateActive(int status) {
return (status & VIBRATE_ACTIVE) == VIBRATE_ACTIVE;
}
public static boolean isDisplayAlertActive(int status) {
return (status & DISPLAY_ALERT_ACTIVE) == DISPLAY_ALERT_ACTIVE;
}
}

View File

@ -0,0 +1,58 @@
package nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.alertnotification;
/**
* https://www.bluetooth.com/specifications/gatt/viewer?attributeXmlFile=org.bluetooth.characteristic.alert_category_id.xml
* https://www.bluetooth.com/specifications/gatt/viewer?attributeXmlFile=org.bluetooth.characteristic.alert_category_id_bit_mask.xml
*/
public class SupportedNewAlertCategory {
private final int id;
//
// public static Ca(byte[] categoryBytes) {
//
// }
public SupportedNewAlertCategory(int id) {
this.id = id;
}
/**
* Returns the numerical ID value of this category
* To be used as uin8 value
* @return the uint8 value for this category
*/
public int getId() {
return id;
}
private int realBitNumber() {
// the ID corresponds to the bit for the bitset
return id;
}
private int bitNumberPerByte() {
// the ID corresponds to the bit for the bitset (per byte)
return realBitNumber() % 8;
}
private int asBit() {
return 1 << bitNumberPerByte();
}
private int byteNumber() {
return id <= 7 ? 0 : 1;
}
/**
* Converts the given categories to an array of bytes.
* @param categories
* @return
*/
public static byte[] toBitmask(SupportedNewAlertCategory... categories) {
byte[] result = new byte[2];
for (SupportedNewAlertCategory category : categories) {
result[category.byteNumber()] |= category.asBit();
}
return result;
}
}