19908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta/* 29908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Copyright (C) 2013 The Android Open Source Project 39908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * 49908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Licensed under the Apache License, Version 2.0 (the "License"); 59908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * you may not use this file except in compliance with the License. 69908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * You may obtain a copy of the License at 79908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * 89908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * http://www.apache.org/licenses/LICENSE-2.0 99908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * 109908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Unless required by applicable law or agreed to in writing, software 119908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * distributed under the License is distributed on an "AS IS" BASIS, 129908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * See the License for the specific language governing permissions and 149908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * limitations under the License. 159908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 169908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Battapackage android.bluetooth; 179908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 188d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowskiimport android.os.Parcel; 198d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowskiimport android.os.Parcelable; 208d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowskiimport android.os.ParcelUuid; 219908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Battaimport java.util.ArrayList; 229908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Battaimport java.util.List; 239908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Battaimport java.util.UUID; 249908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 259908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta/** 26ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * Represents a Bluetooth GATT Characteristic 2733ec9840c70ddc7cd008ecf2660c441defc5f302Matthew Xie * 2833ec9840c70ddc7cd008ecf2660c441defc5f302Matthew Xie * <p>A GATT characteristic is a basic data element used to construct a GATT service, 2933ec9840c70ddc7cd008ecf2660c441defc5f302Matthew Xie * {@link BluetoothGattService}. The characteristic contains a value as well as 3033ec9840c70ddc7cd008ecf2660c441defc5f302Matthew Xie * additional information and optional GATT descriptors, {@link BluetoothGattDescriptor}. 319908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 328d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowskipublic class BluetoothGattCharacteristic implements Parcelable { 339908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 349908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 359908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Characteristic proprty: Characteristic is broadcastable. 369908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 379908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta public static final int PROPERTY_BROADCAST = 0x01; 389908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 399908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 409908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Characteristic property: Characteristic is readable. 419908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 429908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta public static final int PROPERTY_READ = 0x02; 439908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 449908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 459908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Characteristic property: Characteristic can be written without response. 469908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 479908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta public static final int PROPERTY_WRITE_NO_RESPONSE = 0x04; 489908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 499908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 509908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Characteristic property: Characteristic can be written. 519908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 529908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta public static final int PROPERTY_WRITE = 0x08; 539908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 549908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 559908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Characteristic property: Characteristic supports notification 569908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 579908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta public static final int PROPERTY_NOTIFY = 0x10; 589908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 599908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 609908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Characteristic property: Characteristic supports indication 619908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 629908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta public static final int PROPERTY_INDICATE = 0x20; 639908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 649908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 659908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Characteristic property: Characteristic supports write with signature 669908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 679908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta public static final int PROPERTY_SIGNED_WRITE = 0x40; 689908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 699908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 709908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Characteristic property: Characteristic has extended properties 719908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 729908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta public static final int PROPERTY_EXTENDED_PROPS = 0x80; 739908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 749908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 759908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Characteristic read permission 769908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 779908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta public static final int PERMISSION_READ = 0x01; 789908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 799908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 809908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Characteristic permission: Allow encrypted read operations 819908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 829908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta public static final int PERMISSION_READ_ENCRYPTED = 0x02; 839908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 849908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 859908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Characteristic permission: Allow reading with man-in-the-middle protection 869908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 879908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta public static final int PERMISSION_READ_ENCRYPTED_MITM = 0x04; 889908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 899908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 909908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Characteristic write permission 919908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 929908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta public static final int PERMISSION_WRITE = 0x10; 939908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 949908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 959908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Characteristic permission: Allow encrypted writes 969908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 979908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta public static final int PERMISSION_WRITE_ENCRYPTED = 0x20; 989908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 999908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 1009908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Characteristic permission: Allow encrypted writes with man-in-the-middle 1019908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * protection 1029908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 1039908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta public static final int PERMISSION_WRITE_ENCRYPTED_MITM = 0x40; 1049908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 1059908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 1069908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Characteristic permission: Allow signed write operations 1079908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 1089908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta public static final int PERMISSION_WRITE_SIGNED = 0x80; 1099908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 1109908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 1119908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Characteristic permission: Allow signed write operations with 1129908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * man-in-the-middle protection 1139908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 1149908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta public static final int PERMISSION_WRITE_SIGNED_MITM = 0x100; 1159908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 1169908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 1179908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Write characteristic, requesting acknoledgement by the remote device 1189908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 1199908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta public static final int WRITE_TYPE_DEFAULT = 0x02; 1209908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 1219908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 1229908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Wrtite characteristic without requiring a response by the remote device 1239908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 1249908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta public static final int WRITE_TYPE_NO_RESPONSE = 0x01; 1259908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 1269908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 127ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * Write characteristic including authentication signature 1289908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 1299908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta public static final int WRITE_TYPE_SIGNED = 0x04; 1309908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 1319908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 1329908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Characteristic value format type uint8 1339908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 1349908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta public static final int FORMAT_UINT8 = 0x11; 1359908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 1369908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 1379908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Characteristic value format type uint16 1389908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 1399908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta public static final int FORMAT_UINT16 = 0x12; 1409908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 1419908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 1429908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Characteristic value format type uint32 1439908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 1449908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta public static final int FORMAT_UINT32 = 0x14; 1459908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 1469908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 1479908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Characteristic value format type sint8 1489908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 1499908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta public static final int FORMAT_SINT8 = 0x21; 1509908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 1519908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 1529908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Characteristic value format type sint16 1539908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 1549908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta public static final int FORMAT_SINT16 = 0x22; 1559908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 1569908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 1579908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Characteristic value format type sint32 1589908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 1599908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta public static final int FORMAT_SINT32 = 0x24; 1609908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 1619908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 1629908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Characteristic value format type sfloat (16-bit float) 1639908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 1649908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta public static final int FORMAT_SFLOAT = 0x32; 1659908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 1669908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 1679908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Characteristic value format type float (32-bit float) 1689908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 1699908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta public static final int FORMAT_FLOAT = 0x34; 1709908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 1719908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 1729908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 1739908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * The UUID of this characteristic. 1749908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * @hide 1759908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 1769908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta protected UUID mUuid; 1779908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 1789908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 1799908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Instance ID for this characteristic. 1809908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * @hide 1819908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 1829908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta protected int mInstance; 1839908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 1849908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 1859908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Characteristic properties. 1869908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * @hide 1879908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 1889908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta protected int mProperties; 1899908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 1909908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 1919908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Characteristic permissions. 1929908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * @hide 1939908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 1949908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta protected int mPermissions; 1959908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 1969908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 1979908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Key size (default = 16). 1989908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * @hide 1999908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 2009908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta protected int mKeySize = 16; 2019908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 2029908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 2039908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Write type for this characteristic. 2049908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * See WRITE_TYPE_* constants. 2059908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * @hide 2069908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 2079908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta protected int mWriteType; 2089908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 2099908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 2109908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Back-reference to the service this characteristic belongs to. 2119908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * @hide 2129908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 2139908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta protected BluetoothGattService mService; 2149908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 2159908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 2169908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * The cached value of this characteristic. 2179908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * @hide 2189908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 2199908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta protected byte[] mValue; 2209908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 2219908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 2229908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * List of descriptors included in this characteristic. 2239908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 2249908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta protected List<BluetoothGattDescriptor> mDescriptors; 2259908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 2269908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 227ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * Create a new BluetoothGattCharacteristic. 228ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission. 229ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * 230ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * @param uuid The UUID for this characteristic 231ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * @param properties Properties of this characteristic 232ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * @param permissions Permissions for this characteristic 233ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie */ 234ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie public BluetoothGattCharacteristic(UUID uuid, int properties, int permissions) { 235ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie initCharacteristic(null, uuid, 0, properties, permissions); 236ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie } 237ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie 238ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie /** 2399908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Create a new BluetoothGattCharacteristic 2409908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * @hide 2419908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 2429908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /*package*/ BluetoothGattCharacteristic(BluetoothGattService service, 2439908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta UUID uuid, int instanceId, 2449908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta int properties, int permissions) { 245ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie initCharacteristic(service, uuid, instanceId, properties, permissions); 246ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie } 247ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie 2488d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski /** 2498d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski * Create a new BluetoothGattCharacteristic 2508d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski * @hide 2518d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski */ 2528d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski public BluetoothGattCharacteristic(UUID uuid, int instanceId, 2538d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski int properties, int permissions) { 2548d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski initCharacteristic(null, uuid, instanceId, properties, permissions); 2558d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski } 2568d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski 257ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie private void initCharacteristic(BluetoothGattService service, 258ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie UUID uuid, int instanceId, 259ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie int properties, int permissions) { 2609908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta mUuid = uuid; 2619908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta mInstance = instanceId; 2629908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta mProperties = properties; 2639908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta mPermissions = permissions; 2649908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta mService = service; 2659908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta mValue = null; 2669908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta mDescriptors = new ArrayList<BluetoothGattDescriptor>(); 2679908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 2689908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta if ((mProperties & PROPERTY_WRITE_NO_RESPONSE) != 0) { 2699908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta mWriteType = WRITE_TYPE_NO_RESPONSE; 2709908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta } else { 2719908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta mWriteType = WRITE_TYPE_DEFAULT; 2729908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta } 2739908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta } 2749908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 2759908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 2768d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski * @hide 2778d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski */ 2788d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski public int describeContents() { 2798d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski return 0; 2808d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski } 2818d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski 2828d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski public void writeToParcel(Parcel out, int flags) { 2838d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski out.writeParcelable(new ParcelUuid(mUuid), 0); 2848d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski out.writeInt(mInstance); 2858d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski out.writeInt(mProperties); 2868d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski out.writeInt(mPermissions); 2872168fc29a297dfef46c0b8e2575092fa89fba996Jakub Pawlowski out.writeInt(mKeySize); 2882168fc29a297dfef46c0b8e2575092fa89fba996Jakub Pawlowski out.writeInt(mWriteType); 2898d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski out.writeTypedList(mDescriptors); 2908d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski } 2918d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski 2928d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski public static final Parcelable.Creator<BluetoothGattCharacteristic> CREATOR 2938d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski = new Parcelable.Creator<BluetoothGattCharacteristic>() { 2948d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski public BluetoothGattCharacteristic createFromParcel(Parcel in) { 2958d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski return new BluetoothGattCharacteristic(in); 2968d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski } 2978d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski 2988d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski public BluetoothGattCharacteristic[] newArray(int size) { 2998d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski return new BluetoothGattCharacteristic[size]; 3008d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski } 3018d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski }; 3028d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski 3038d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski private BluetoothGattCharacteristic(Parcel in) { 3048d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski mUuid = ((ParcelUuid)in.readParcelable(null)).getUuid(); 3058d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski mInstance = in.readInt(); 3068d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski mProperties = in.readInt(); 3078d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski mPermissions = in.readInt(); 3082168fc29a297dfef46c0b8e2575092fa89fba996Jakub Pawlowski mKeySize = in.readInt(); 3092168fc29a297dfef46c0b8e2575092fa89fba996Jakub Pawlowski mWriteType = in.readInt(); 3108d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski 3118d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski mDescriptors = new ArrayList<BluetoothGattDescriptor>(); 3128d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski 3138d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski ArrayList<BluetoothGattDescriptor> descs = 3148d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski in.createTypedArrayList(BluetoothGattDescriptor.CREATOR); 3158d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski if (descs != null) { 3168d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski for (BluetoothGattDescriptor desc: descs) { 3178d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski desc.setCharacteristic(this); 3188d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski mDescriptors.add(desc); 3198d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski } 3208d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski } 3218d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski } 3228d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski 3238d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski /** 324d75f512aa2a2b55607af3f217c6ad7c81291135cJakub Pawlowski * Returns the desired key size. 3259908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * @hide 3269908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 327d75f512aa2a2b55607af3f217c6ad7c81291135cJakub Pawlowski public int getKeySize() { 3289908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta return mKeySize; 3299908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta } 3309908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 3319908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 332ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * Adds a descriptor to this characteristic. 333ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission. 334ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * 335ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * @param descriptor Descriptor to be added to this characteristic. 336ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * @return true, if the descriptor was added to the characteristic 3379908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 338ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie public boolean addDescriptor(BluetoothGattDescriptor descriptor) { 3399908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta mDescriptors.add(descriptor); 340ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie descriptor.setCharacteristic(this); 341ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie return true; 3429908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta } 3439908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 3449908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 34525b9cf953bd3e97f726f8c27d7a752b27c9a2373Andre Eisenbach * Get a descriptor by UUID and isntance id. 34625b9cf953bd3e97f726f8c27d7a752b27c9a2373Andre Eisenbach * @hide 34725b9cf953bd3e97f726f8c27d7a752b27c9a2373Andre Eisenbach */ 34825b9cf953bd3e97f726f8c27d7a752b27c9a2373Andre Eisenbach /*package*/ BluetoothGattDescriptor getDescriptor(UUID uuid, int instanceId) { 34925b9cf953bd3e97f726f8c27d7a752b27c9a2373Andre Eisenbach for(BluetoothGattDescriptor descriptor : mDescriptors) { 35025b9cf953bd3e97f726f8c27d7a752b27c9a2373Andre Eisenbach if (descriptor.getUuid().equals(uuid) 35125b9cf953bd3e97f726f8c27d7a752b27c9a2373Andre Eisenbach && descriptor.getInstanceId() == instanceId) { 35225b9cf953bd3e97f726f8c27d7a752b27c9a2373Andre Eisenbach return descriptor; 35325b9cf953bd3e97f726f8c27d7a752b27c9a2373Andre Eisenbach } 35425b9cf953bd3e97f726f8c27d7a752b27c9a2373Andre Eisenbach } 35525b9cf953bd3e97f726f8c27d7a752b27c9a2373Andre Eisenbach return null; 35625b9cf953bd3e97f726f8c27d7a752b27c9a2373Andre Eisenbach } 35725b9cf953bd3e97f726f8c27d7a752b27c9a2373Andre Eisenbach 35825b9cf953bd3e97f726f8c27d7a752b27c9a2373Andre Eisenbach /** 3599908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Returns the service this characteristic belongs to. 3609908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * @return The asscociated service 3619908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 3629908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta public BluetoothGattService getService() { 3639908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta return mService; 3649908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta } 3659908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 3669908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 367ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * Sets the service associated with this device. 368ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * @hide 369ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie */ 370ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie /*package*/ void setService(BluetoothGattService service) { 371ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie mService = service; 372ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie } 373ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie 374ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie /** 3759908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Returns the UUID of this characteristic 3769908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * 3779908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * @return UUID of this characteristic 3789908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 3799908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta public UUID getUuid() { 3809908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta return mUuid; 3819908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta } 3829908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 3839908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 3849908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Returns the instance ID for this characteristic. 3859908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * 3869908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * <p>If a remote device offers multiple characteristics with the same UUID, 3879908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * the instance ID is used to distuinguish between characteristics. 3889908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * 3899908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * @return Instance ID of this characteristic 3909908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 3919908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta public int getInstanceId() { 3929908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta return mInstance; 3939908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta } 3949908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 3959908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 396d75f512aa2a2b55607af3f217c6ad7c81291135cJakub Pawlowski * Force the instance ID. 397d75f512aa2a2b55607af3f217c6ad7c81291135cJakub Pawlowski * @hide 398d75f512aa2a2b55607af3f217c6ad7c81291135cJakub Pawlowski */ 399d75f512aa2a2b55607af3f217c6ad7c81291135cJakub Pawlowski public void setInstanceId(int instanceId) { 400d75f512aa2a2b55607af3f217c6ad7c81291135cJakub Pawlowski mInstance = instanceId; 401d75f512aa2a2b55607af3f217c6ad7c81291135cJakub Pawlowski } 402d75f512aa2a2b55607af3f217c6ad7c81291135cJakub Pawlowski 403d75f512aa2a2b55607af3f217c6ad7c81291135cJakub Pawlowski /** 4049908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Returns the properties of this characteristic. 4059908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * 4069908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * <p>The properties contain a bit mask of property flags indicating 4079908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * the features of this characteristic. 4089908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * 4099908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * @return Properties of this characteristic 4109908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 4119908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta public int getProperties() { 4129908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta return mProperties; 4139908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta } 4149908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 4159908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 4169908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Returns the permissions for this characteristic. 4179908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * 4189908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * @return Permissions of this characteristic 4199908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 4209908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta public int getPermissions() { 4219908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta return mPermissions; 4229908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta } 4239908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 4249908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 4259908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Gets the write type for this characteristic. 4269908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * 4279908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * @return Write type for this characteristic 4289908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 4299908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta public int getWriteType() { 4309908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta return mWriteType; 4319908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta } 4329908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 4339908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 4349908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Set the write type for this characteristic 4359908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * 4369908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * <p>Setting the write type of a characteristic determines how the 4379908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * {@link BluetoothGatt#writeCharacteristic} function write this 4389908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * characteristic. 4399908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * 4409908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * @param writeType The write type to for this characteristic. Can be one 4419908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * of: 4429908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * {@link #WRITE_TYPE_DEFAULT}, 4439908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * {@link #WRITE_TYPE_NO_RESPONSE} or 4449908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * {@link #WRITE_TYPE_SIGNED}. 4459908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 4469908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta public void setWriteType(int writeType) { 4479908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta mWriteType = writeType; 4489908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta } 4499908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 4509908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 451ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * Set the desired key size. 452ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * @hide 453ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie */ 454ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie public void setKeySize(int keySize) { 455ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie mKeySize = keySize; 456ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie } 457ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie 458ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie /** 4599908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Returns a list of descriptors for this characteristic. 4609908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * 4619908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * @return Descriptors for this characteristic 4629908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 4639908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta public List<BluetoothGattDescriptor> getDescriptors() { 4649908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta return mDescriptors; 4659908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta } 4669908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 4679908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 4689908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Returns a descriptor with a given UUID out of the list of 4699908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * descriptors for this characteristic. 4709908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * 471ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * @return GATT descriptor object or null if no descriptor with the 4729908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * given UUID was found. 4739908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 4749908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta public BluetoothGattDescriptor getDescriptor(UUID uuid) { 4759908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta for(BluetoothGattDescriptor descriptor : mDescriptors) { 4769908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta if (descriptor.getUuid().equals(uuid)) { 4779908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta return descriptor; 4789908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta } 4799908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta } 4809908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta return null; 4819908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta } 4829908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 4839908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 4849908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Get the stored value for this characteristic. 4859908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * 4869908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * <p>This function returns the stored value for this characteristic as 487ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * retrieved by calling {@link BluetoothGatt#readCharacteristic}. The cached 4889908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * value of the characteristic is updated as a result of a read characteristic 4899908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * operation or if a characteristic update notification has been received. 4909908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * 4919908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * @return Cached value of the characteristic 4929908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 4939908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta public byte[] getValue() { 4949908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta return mValue; 4959908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta } 4969908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 4979908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 4989908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Return the stored value of this characteristic. 4999908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * 5009908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * <p>The formatType parameter determines how the characteristic value 5019908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * is to be interpreted. For example, settting formatType to 5029908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * {@link #FORMAT_UINT16} specifies that the first two bytes of the 5039908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * characteristic value at the given offset are interpreted to generate the 5049908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * return value. 5059908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * 5069908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * @param formatType The format type used to interpret the characteristic 5079908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * value. 5089908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * @param offset Offset at which the integer value can be found. 5099908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * @return Cached value of the characteristic or null of offset exceeds 5109908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * value size. 5119908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 5129908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta public Integer getIntValue(int formatType, int offset) { 5139908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta if ((offset + getTypeLen(formatType)) > mValue.length) return null; 5149908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 5159908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta switch (formatType) { 5169908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta case FORMAT_UINT8: 5179908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta return unsignedByteToInt(mValue[offset]); 5189908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 5199908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta case FORMAT_UINT16: 5209908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta return unsignedBytesToInt(mValue[offset], mValue[offset+1]); 5219908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 5229908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta case FORMAT_UINT32: 5239908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta return unsignedBytesToInt(mValue[offset], mValue[offset+1], 5249908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta mValue[offset+2], mValue[offset+3]); 5259908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta case FORMAT_SINT8: 5269908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta return unsignedToSigned(unsignedByteToInt(mValue[offset]), 8); 5279908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 5289908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta case FORMAT_SINT16: 5299908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta return unsignedToSigned(unsignedBytesToInt(mValue[offset], 5309908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta mValue[offset+1]), 16); 5319908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 5329908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta case FORMAT_SINT32: 5339908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta return unsignedToSigned(unsignedBytesToInt(mValue[offset], 5349908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta mValue[offset+1], mValue[offset+2], mValue[offset+3]), 32); 5359908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta } 5369908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 5379908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta return null; 5389908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta } 5399908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 5409908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 5419908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Return the stored value of this characteristic. 5429908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * <p>See {@link #getValue} for details. 5439908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * 5449908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * @param formatType The format type used to interpret the characteristic 5459908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * value. 5469908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * @param offset Offset at which the float value can be found. 5479908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * @return Cached value of the characteristic at a given offset or null 5489908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * if the requested offset exceeds the value size. 5499908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 5509908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta public Float getFloatValue(int formatType, int offset) { 5519908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta if ((offset + getTypeLen(formatType)) > mValue.length) return null; 5529908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 5539908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta switch (formatType) { 5549908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta case FORMAT_SFLOAT: 5559908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta return bytesToFloat(mValue[offset], mValue[offset+1]); 5569908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 5579908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta case FORMAT_FLOAT: 5589908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta return bytesToFloat(mValue[offset], mValue[offset+1], 5599908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta mValue[offset+2], mValue[offset+3]); 5609908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta } 5619908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 5629908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta return null; 5639908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta } 5649908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 5659908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 5669908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Return the stored value of this characteristic. 5679908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * <p>See {@link #getValue} for details. 568ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * 5699908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * @param offset Offset at which the string value can be found. 5709908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * @return Cached value of the characteristic 5719908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 5729908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta public String getStringValue(int offset) { 5730fd06a19bdc56fec8eb736d248abb56fe5a2727dAndre Eisenbach if (mValue == null || offset > mValue.length) return null; 5749908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta byte[] strBytes = new byte[mValue.length - offset]; 5759908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta for (int i=0; i != (mValue.length-offset); ++i) strBytes[i] = mValue[offset+i]; 5769908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta return new String(strBytes); 5779908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta } 5789908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 5799908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 5809908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Updates the locally stored value of this characteristic. 5819908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * 5829908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * <p>This function modifies the locally stored cached value of this 5839908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * characteristic. To send the value to the remote device, call 5849908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * {@link BluetoothGatt#writeCharacteristic} to send the value to the 5859908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * remote device. 5869908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * 5879908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * @param value New value for this characteristic 5889908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * @return true if the locally stored value has been set, false if the 5899908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * requested value could not be stored locally. 5909908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 5919908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta public boolean setValue(byte[] value) { 5929908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta mValue = value; 5939908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta return true; 5949908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta } 5959908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 5969908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 5979908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Set the locally stored value of this characteristic. 5989908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * <p>See {@link #setValue(byte[])} for details. 5999908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * 6009908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * @param value New value for this characteristic 6019908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * @param formatType Integer format type used to transform the value parameter 6029908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * @param offset Offset at which the value should be placed 6039908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * @return true if the locally stored value has been set 6049908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 6059908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta public boolean setValue(int value, int formatType, int offset) { 6069908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta int len = offset + getTypeLen(formatType); 6079908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta if (mValue == null) mValue = new byte[len]; 6089908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta if (len > mValue.length) return false; 6099908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 6109908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta switch (formatType) { 6119908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta case FORMAT_SINT8: 6129908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta value = intToSignedBits(value, 8); 6139908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta // Fall-through intended 6149908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta case FORMAT_UINT8: 6159908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta mValue[offset] = (byte)(value & 0xFF); 6169908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta break; 6179908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 6189908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta case FORMAT_SINT16: 6199908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta value = intToSignedBits(value, 16); 6209908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta // Fall-through intended 6219908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta case FORMAT_UINT16: 6229908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta mValue[offset++] = (byte)(value & 0xFF); 6239908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta mValue[offset] = (byte)((value >> 8) & 0xFF); 6249908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta break; 6259908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 6269908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta case FORMAT_SINT32: 6279908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta value = intToSignedBits(value, 32); 6289908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta // Fall-through intended 6299908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta case FORMAT_UINT32: 6309908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta mValue[offset++] = (byte)(value & 0xFF); 6319908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta mValue[offset++] = (byte)((value >> 8) & 0xFF); 6323f36660a60ce065b71f6d5eb24911012b6d66fddAndre Eisenbach mValue[offset++] = (byte)((value >> 16) & 0xFF); 6333f36660a60ce065b71f6d5eb24911012b6d66fddAndre Eisenbach mValue[offset] = (byte)((value >> 24) & 0xFF); 6349908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta break; 6359908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 6369908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta default: 6379908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta return false; 6389908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta } 6399908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta return true; 6409908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta } 6419908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 6429908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 6439908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Set the locally stored value of this characteristic. 6449908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * <p>See {@link #setValue(byte[])} for details. 645ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * 6469908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * @param mantissa Mantissa for this characteristic 6479908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * @param exponent exponent value for this characteristic 6489908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * @param formatType Float format type used to transform the value parameter 6499908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * @param offset Offset at which the value should be placed 6509908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * @return true if the locally stored value has been set 6519908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 6529908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta public boolean setValue(int mantissa, int exponent, int formatType, int offset) { 6539908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta int len = offset + getTypeLen(formatType); 6549908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta if (mValue == null) mValue = new byte[len]; 6559908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta if (len > mValue.length) return false; 6569908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 6579908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta switch (formatType) { 6589908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta case FORMAT_SFLOAT: 6599908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta mantissa = intToSignedBits(mantissa, 12); 6609908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta exponent = intToSignedBits(exponent, 4); 6619908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta mValue[offset++] = (byte)(mantissa & 0xFF); 6629908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta mValue[offset] = (byte)((mantissa >> 8) & 0x0F); 6639908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta mValue[offset] += (byte)((exponent & 0x0F) << 4); 6649908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta break; 6659908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 6669908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta case FORMAT_FLOAT: 6679908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta mantissa = intToSignedBits(mantissa, 24); 6689908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta exponent = intToSignedBits(exponent, 8); 6699908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta mValue[offset++] = (byte)(mantissa & 0xFF); 6709908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta mValue[offset++] = (byte)((mantissa >> 8) & 0xFF); 6719908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta mValue[offset++] = (byte)((mantissa >> 16) & 0xFF); 6729908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta mValue[offset] += (byte)(exponent & 0xFF); 6739908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta break; 6749908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 6759908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta default: 6769908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta return false; 6779908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta } 6789908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 6799908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta return true; 6809908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta } 6819908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 6829908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 6839908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Set the locally stored value of this characteristic. 6849908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * <p>See {@link #setValue(byte[])} for details. 685ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * 6869908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * @param value New value for this characteristic 6879908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * @return true if the locally stored value has been set 6889908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 6899908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta public boolean setValue(String value) { 6909908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta mValue = value.getBytes(); 6919908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta return true; 6929908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta } 6939908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 6949908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 6959908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Returns the size of a give value type. 6969908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 6979908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta private int getTypeLen(int formatType) { 6989908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta return formatType & 0xF; 6999908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta } 7009908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 7019908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 7029908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Convert a signed byte to an unsigned int. 7039908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 7049908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta private int unsignedByteToInt(byte b) { 7059908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta return b & 0xFF; 7069908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta } 7079908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 7089908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 7099908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Convert signed bytes to a 16-bit unsigned int. 7109908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 7119908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta private int unsignedBytesToInt(byte b0, byte b1) { 7129908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta return (unsignedByteToInt(b0) + (unsignedByteToInt(b1) << 8)); 7139908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta } 7149908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 7159908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 7169908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Convert signed bytes to a 32-bit unsigned int. 7179908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 7189908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta private int unsignedBytesToInt(byte b0, byte b1, byte b2, byte b3) { 7199908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta return (unsignedByteToInt(b0) + (unsignedByteToInt(b1) << 8)) 7209908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta + (unsignedByteToInt(b2) << 16) + (unsignedByteToInt(b3) << 24); 7219908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta } 7229908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 7239908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 7249908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Convert signed bytes to a 16-bit short float value. 7259908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 7269908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta private float bytesToFloat(byte b0, byte b1) { 7279908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta int mantissa = unsignedToSigned(unsignedByteToInt(b0) 7289908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta + ((unsignedByteToInt(b1) & 0x0F) << 8), 12); 7299908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta int exponent = unsignedToSigned(unsignedByteToInt(b1) >> 4, 4); 7309908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta return (float)(mantissa * Math.pow(10, exponent)); 7319908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta } 7329908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 7339908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 7349908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Convert signed bytes to a 32-bit short float value. 7359908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 7369908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta private float bytesToFloat(byte b0, byte b1, byte b2, byte b3) { 7379908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta int mantissa = unsignedToSigned(unsignedByteToInt(b0) 7389908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta + (unsignedByteToInt(b1) << 8) 7399908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta + (unsignedByteToInt(b2) << 16), 24); 7409908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta return (float)(mantissa * Math.pow(10, b3)); 7419908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta } 7429908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 7439908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 7449908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Convert an unsigned integer value to a two's-complement encoded 7459908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * signed value. 7469908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 7479908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta private int unsignedToSigned(int unsigned, int size) { 7489908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta if ((unsigned & (1 << size-1)) != 0) { 7499908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta unsigned = -1 * ((1 << size-1) - (unsigned & ((1 << size-1) - 1))); 7509908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta } 7519908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta return unsigned; 7529908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta } 7539908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta 7549908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta /** 7559908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Convert an integer into the signed bits of a given length. 7569908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */ 7579908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta private int intToSignedBits(int i, int size) { 7589908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta if (i < 0) { 7599908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta i = (1 << size-1) + (i & ((1 << size-1) - 1)); 7609908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta } 7619908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta return i; 7629908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta } 7639908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta} 764