From 8f36712342478d4df5e3f51643897fe6833d29dc Mon Sep 17 00:00:00 2001 From: cpfeiffer Date: Thu, 29 Sep 2016 20:32:15 +0200 Subject: [PATCH] WIP: A little more Alert Notification Profile I think we should rather focus on a code generator, though. --- .../service/btle/BleNamesResolver.java | 8 +-- .../service/btle/GattCharacteristic.java | 8 +-- .../{Category.java => AlertCategory.java} | 53 ++++++++++++----- .../alertnotification/AlertLevel.java | 27 +++++++++ .../AlertNotificationControl.java | 8 +++ .../AlertNotificationProfile.java | 2 + .../alertnotification/AlertStatus.java | 21 +++++++ .../SupportedNewAlertCategory.java | 58 +++++++++++++++++++ 8 files changed, 164 insertions(+), 21 deletions(-) rename app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/profiles/alertnotification/{Category.java => AlertCategory.java} (51%) create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/profiles/alertnotification/AlertLevel.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/profiles/alertnotification/AlertNotificationControl.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/profiles/alertnotification/AlertStatus.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/profiles/alertnotification/SupportedNewAlertCategory.java diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/BleNamesResolver.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/BleNamesResolver.java index c411233d..c48a362a 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/BleNamesResolver.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/BleNamesResolver.java @@ -87,8 +87,8 @@ public class BleNamesResolver { mServices.put("00001530-0000-3512-2118-0009af100700", "(Propr: Xiaomi Weight Service)"); - mCharacteristics.put("00002a43-0000-1000-8000-00805f9b34fb", "Alert Category ID"); - mCharacteristics.put("00002a42-0000-1000-8000-00805f9b34fb", "Alert Category ID Bit Mask"); + mCharacteristics.put("00002a43-0000-1000-8000-00805f9b34fb", "Alert AlertCategory ID"); + mCharacteristics.put("00002a42-0000-1000-8000-00805f9b34fb", "Alert AlertCategory ID Bit Mask"); mCharacteristics.put("00002a06-0000-1000-8000-00805f9b34fb", "Alert Level"); mCharacteristics.put("00002a44-0000-1000-8000-00805f9b34fb", "Alert Notification Control Point"); 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("00002a05-0000-1000-8000-00805f9b34fb", "Service Changed"); mCharacteristics.put("00002a28-0000-1000-8000-00805f9b34fb", "Software Revision String"); - mCharacteristics.put("00002a47-0000-1000-8000-00805f9b34fb", "Supported New Alert Category"); - mCharacteristics.put("00002a48-0000-1000-8000-00805f9b34fb", "Supported Unread Alert Category"); + mCharacteristics.put("00002a47-0000-1000-8000-00805f9b34fb", "Supported New Alert AlertCategory"); + mCharacteristics.put("00002a48-0000-1000-8000-00805f9b34fb", "Supported Unread Alert AlertCategory"); mCharacteristics.put("00002a23-0000-1000-8000-00805f9b34fb", "System ID"); mCharacteristics.put("00002a1c-0000-1000-8000-00805f9b34fb", "Temperature Measurement"); mCharacteristics.put("00002a1d-0000-1000-8000-00805f9b34fb", "Temperature Type"); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/GattCharacteristic.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/GattCharacteristic.java index 6f9f0f51..812454a4 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/GattCharacteristic.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/GattCharacteristic.java @@ -184,8 +184,8 @@ public class GattCharacteristic { static { GATTCHARACTERISTIC_DEBUG = new HashMap<>(); - GATTCHARACTERISTIC_DEBUG.put(UUID_CHARACTERISTIC_ALERT_CATEGORY_ID, "Alert Category ID"); - GATTCHARACTERISTIC_DEBUG.put(UUID_CHARACTERISTIC_ALERT_CATEGORY_ID_BIT_MASK, "Alert Category ID Bit Mask"); + GATTCHARACTERISTIC_DEBUG.put(UUID_CHARACTERISTIC_ALERT_CATEGORY_ID, "Alert AlertCategory ID"); + 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_NOTIFICATION_CONTROL_POINT, "Alert Notification Control Point"); 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_GATT_SERVICE_CHANGED, "Service Changed"); 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_UNREAD_ALERT_CATEGORY, "Supported Unread 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 AlertCategory"); GATTCHARACTERISTIC_DEBUG.put(UUID_CHARACTERISTIC_SYSTEM_ID, "System ID"); GATTCHARACTERISTIC_DEBUG.put(UUID_CHARACTERISTIC_TEMPERATURE_MEASUREMENT, "Temperature Measurement"); GATTCHARACTERISTIC_DEBUG.put(UUID_CHARACTERISTIC_TEMPERATURE_TYPE, "Temperature DeviceType"); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/profiles/alertnotification/Category.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/profiles/alertnotification/AlertCategory.java similarity index 51% rename from app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/profiles/alertnotification/Category.java rename to app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/profiles/alertnotification/AlertCategory.java index 49eee240..9dfcc01c 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/profiles/alertnotification/Category.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/profiles/alertnotification/AlertCategory.java @@ -1,10 +1,13 @@ 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_bit_mask.xml */ -public enum Category { +public enum AlertCategory { Simple(0), Email(1), News(2), @@ -20,33 +23,57 @@ public enum Category { private final int id; - Category(int id) { + AlertCategory(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 asBit() { - return byteNumber() <=7 ? 0 : 1; - } - - private int byteNumber() { - return bitNumber() > 7 ? 0 : 1; - } - - private int bitNumber() { + private int realBitNumber() { // the ID corresponds to the bit for the bitset 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]; - for (Category category : categories) { + for (AlertCategory category : categories) { result[category.byteNumber()] |= category.asBit(); } return result; } + +// SupportedNewAlertCategory + public static AlertCategory[] fromBitMask(byte[] bytes) { + List result = new ArrayList<>(); + byte b = bytes[0]; + + return null; + } + } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/profiles/alertnotification/AlertLevel.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/profiles/alertnotification/AlertLevel.java new file mode 100644 index 00000000..dd6f22f1 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/profiles/alertnotification/AlertLevel.java @@ -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; + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/profiles/alertnotification/AlertNotificationControl.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/profiles/alertnotification/AlertNotificationControl.java new file mode 100644 index 00000000..48c88a9c --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/profiles/alertnotification/AlertNotificationControl.java @@ -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 { + +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/profiles/alertnotification/AlertNotificationProfile.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/profiles/alertnotification/AlertNotificationProfile.java index a5d2309f..1f37e42a 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/profiles/alertnotification/AlertNotificationProfile.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/profiles/alertnotification/AlertNotificationProfile.java @@ -7,4 +7,6 @@ public class AlertNotificationProfile exten public AlertNotificationProfile(T support) { super(support); } + + } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/profiles/alertnotification/AlertStatus.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/profiles/alertnotification/AlertStatus.java new file mode 100644 index 00000000..38f2dd35 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/profiles/alertnotification/AlertStatus.java @@ -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; + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/profiles/alertnotification/SupportedNewAlertCategory.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/profiles/alertnotification/SupportedNewAlertCategory.java new file mode 100644 index 00000000..4eb53a2d --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/profiles/alertnotification/SupportedNewAlertCategory.java @@ -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; + } +}