WIP: A little more Alert Notification Profile

I think we should rather focus on a code generator, though.
master
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)");
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");

View File

@ -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");

View File

@ -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<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) {
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;
}
}