mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge
synced 2024-11-25 11:26:47 +01:00
WIP: A little more Alert Notification Profile
I think we should rather focus on a code generator, though.
This commit is contained in:
parent
fabc52fdad
commit
8f36712342
@ -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");
|
||||||
|
@ -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");
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -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 {
|
||||||
|
|
||||||
|
}
|
@ -7,4 +7,6 @@ public class AlertNotificationProfile<T extends AbstractBTLEDeviceSupport> exten
|
|||||||
public AlertNotificationProfile(T support) {
|
public AlertNotificationProfile(T support) {
|
||||||
super(support);
|
super(support);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user