BluetoothGattCharacteristic.java revision 25b9cf953bd3e97f726f8c27d7a752b27c9a2373
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
189908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Battaimport java.util.ArrayList;
199908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Battaimport java.util.IllegalFormatConversionException;
209908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Battaimport java.util.List;
219908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Battaimport java.util.UUID;
229908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
239908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta/**
24ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * Represents a Bluetooth GATT Characteristic
2533ec9840c70ddc7cd008ecf2660c441defc5f302Matthew Xie *
2633ec9840c70ddc7cd008ecf2660c441defc5f302Matthew Xie * <p>A GATT characteristic is a basic data element used to construct a GATT service,
2733ec9840c70ddc7cd008ecf2660c441defc5f302Matthew Xie * {@link BluetoothGattService}. The characteristic contains a value as well as
2833ec9840c70ddc7cd008ecf2660c441defc5f302Matthew Xie * additional information and optional GATT descriptors, {@link BluetoothGattDescriptor}.
299908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */
309908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Battapublic class BluetoothGattCharacteristic {
319908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
329908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
339908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Characteristic proprty: Characteristic is broadcastable.
349908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
359908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int PROPERTY_BROADCAST = 0x01;
369908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
379908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
389908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Characteristic property: Characteristic is readable.
399908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
409908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int PROPERTY_READ = 0x02;
419908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
429908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
439908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Characteristic property: Characteristic can be written without response.
449908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
459908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int PROPERTY_WRITE_NO_RESPONSE = 0x04;
469908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
479908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
489908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Characteristic property: Characteristic can be written.
499908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
509908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int PROPERTY_WRITE = 0x08;
519908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
529908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
539908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Characteristic property: Characteristic supports notification
549908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
559908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int PROPERTY_NOTIFY = 0x10;
569908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
579908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
589908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Characteristic property: Characteristic supports indication
599908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
609908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int PROPERTY_INDICATE = 0x20;
619908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
629908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
639908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Characteristic property: Characteristic supports write with signature
649908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
659908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int PROPERTY_SIGNED_WRITE = 0x40;
669908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
679908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
689908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Characteristic property: Characteristic has extended properties
699908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
709908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int PROPERTY_EXTENDED_PROPS = 0x80;
719908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
729908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
739908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Characteristic read permission
749908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
759908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int PERMISSION_READ = 0x01;
769908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
779908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
789908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Characteristic permission: Allow encrypted read operations
799908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
809908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int PERMISSION_READ_ENCRYPTED = 0x02;
819908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
829908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
839908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Characteristic permission: Allow reading with man-in-the-middle protection
849908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
859908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int PERMISSION_READ_ENCRYPTED_MITM = 0x04;
869908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
879908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
889908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Characteristic write permission
899908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
909908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int PERMISSION_WRITE = 0x10;
919908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
929908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
939908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Characteristic permission: Allow encrypted writes
949908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
959908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int PERMISSION_WRITE_ENCRYPTED = 0x20;
969908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
979908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
989908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Characteristic permission: Allow encrypted writes with man-in-the-middle
999908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * protection
1009908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
1019908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int PERMISSION_WRITE_ENCRYPTED_MITM = 0x40;
1029908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
1039908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
1049908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Characteristic permission: Allow signed write operations
1059908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
1069908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int PERMISSION_WRITE_SIGNED = 0x80;
1079908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
1089908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
1099908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Characteristic permission: Allow signed write operations with
1109908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * man-in-the-middle protection
1119908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
1129908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int PERMISSION_WRITE_SIGNED_MITM = 0x100;
1139908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
1149908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
1159908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Write characteristic, requesting acknoledgement by the remote device
1169908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
1179908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int WRITE_TYPE_DEFAULT = 0x02;
1189908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
1199908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
1209908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Wrtite characteristic without requiring a response by the remote device
1219908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
1229908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int WRITE_TYPE_NO_RESPONSE = 0x01;
1239908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
1249908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
125ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie     * Write characteristic including authentication signature
1269908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
1279908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int WRITE_TYPE_SIGNED = 0x04;
1289908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
1299908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
1309908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Characteristic value format type uint8
1319908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
1329908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int FORMAT_UINT8 = 0x11;
1339908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
1349908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
1359908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Characteristic value format type uint16
1369908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
1379908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int FORMAT_UINT16 = 0x12;
1389908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
1399908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
1409908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Characteristic value format type uint32
1419908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
1429908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int FORMAT_UINT32 = 0x14;
1439908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
1449908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
1459908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Characteristic value format type sint8
1469908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
1479908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int FORMAT_SINT8 = 0x21;
1489908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
1499908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
1509908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Characteristic value format type sint16
1519908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
1529908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int FORMAT_SINT16 = 0x22;
1539908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
1549908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
1559908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Characteristic value format type sint32
1569908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
1579908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int FORMAT_SINT32 = 0x24;
1589908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
1599908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
1609908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Characteristic value format type sfloat (16-bit float)
1619908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
1629908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int FORMAT_SFLOAT = 0x32;
1639908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
1649908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
1659908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Characteristic value format type float (32-bit float)
1669908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
1679908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int FORMAT_FLOAT = 0x34;
1689908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
1699908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
1709908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
1719908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * The UUID of this characteristic.
1729908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @hide
1739908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
1749908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    protected UUID mUuid;
1759908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
1769908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
1779908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Instance ID for this characteristic.
1789908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @hide
1799908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
1809908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    protected int mInstance;
1819908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
1829908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
1839908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Characteristic properties.
1849908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @hide
1859908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
1869908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    protected int mProperties;
1879908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
1889908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
1899908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Characteristic permissions.
1909908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @hide
1919908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
1929908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    protected int mPermissions;
1939908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
1949908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
1959908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Key size (default = 16).
1969908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @hide
1979908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
1989908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    protected int mKeySize = 16;
1999908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
2009908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
2019908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Write type for this characteristic.
2029908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * See WRITE_TYPE_* constants.
2039908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @hide
2049908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
2059908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    protected int mWriteType;
2069908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
2079908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
2089908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Back-reference to the service this characteristic belongs to.
2099908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @hide
2109908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
2119908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    protected BluetoothGattService mService;
2129908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
2139908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
2149908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * The cached value of this characteristic.
2159908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @hide
2169908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
2179908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    protected byte[] mValue;
2189908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
2199908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
2209908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * List of descriptors included in this characteristic.
2219908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
2229908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    protected List<BluetoothGattDescriptor> mDescriptors;
2239908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
2249908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
225ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie     * Create a new BluetoothGattCharacteristic.
226ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie     * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission.
227ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie     *
228ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie     * @param uuid The UUID for this characteristic
229ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie     * @param properties Properties of this characteristic
230ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie     * @param permissions Permissions for this characteristic
231ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie     */
232ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie    public BluetoothGattCharacteristic(UUID uuid, int properties, int permissions) {
233ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie        initCharacteristic(null, uuid, 0, properties, permissions);
234ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie    }
235ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie
236ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie    /**
2379908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Create a new BluetoothGattCharacteristic
2389908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @hide
2399908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
2409908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /*package*/ BluetoothGattCharacteristic(BluetoothGattService service,
2419908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                                            UUID uuid, int instanceId,
2429908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                                            int properties, int permissions) {
243ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie        initCharacteristic(service, uuid, instanceId, properties, permissions);
244ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie    }
245ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie
246ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie    private void initCharacteristic(BluetoothGattService service,
247ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie                                    UUID uuid, int instanceId,
248ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie                                    int properties, int permissions) {
2499908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        mUuid = uuid;
2509908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        mInstance = instanceId;
2519908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        mProperties = properties;
2529908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        mPermissions = permissions;
2539908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        mService = service;
2549908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        mValue = null;
2559908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        mDescriptors = new ArrayList<BluetoothGattDescriptor>();
2569908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
2579908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        if ((mProperties & PROPERTY_WRITE_NO_RESPONSE) != 0) {
2589908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            mWriteType = WRITE_TYPE_NO_RESPONSE;
2599908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        } else {
2609908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            mWriteType = WRITE_TYPE_DEFAULT;
2619908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        }
2629908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
2639908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
2649908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
2659908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Returns the deisred key size.
2669908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @hide
2679908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
2689908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /*package*/ int getKeySize() {
2699908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return mKeySize;
2709908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
2719908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
2729908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
273ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie     * Adds a descriptor to this characteristic.
274ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie     * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission.
275ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie     *
276ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie     * @param descriptor Descriptor to be added to this characteristic.
277ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie     * @return true, if the descriptor was added to the characteristic
2789908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
279ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie    public boolean addDescriptor(BluetoothGattDescriptor descriptor) {
2809908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        mDescriptors.add(descriptor);
281ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie        descriptor.setCharacteristic(this);
282ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie        return true;
2839908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
2849908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
2859908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
28625b9cf953bd3e97f726f8c27d7a752b27c9a2373Andre Eisenbach     * Get a descriptor by UUID and isntance id.
28725b9cf953bd3e97f726f8c27d7a752b27c9a2373Andre Eisenbach     * @hide
28825b9cf953bd3e97f726f8c27d7a752b27c9a2373Andre Eisenbach     */
28925b9cf953bd3e97f726f8c27d7a752b27c9a2373Andre Eisenbach    /*package*/  BluetoothGattDescriptor getDescriptor(UUID uuid, int instanceId) {
29025b9cf953bd3e97f726f8c27d7a752b27c9a2373Andre Eisenbach        for(BluetoothGattDescriptor descriptor : mDescriptors) {
29125b9cf953bd3e97f726f8c27d7a752b27c9a2373Andre Eisenbach            if (descriptor.getUuid().equals(uuid)
29225b9cf953bd3e97f726f8c27d7a752b27c9a2373Andre Eisenbach             && descriptor.getInstanceId() == instanceId) {
29325b9cf953bd3e97f726f8c27d7a752b27c9a2373Andre Eisenbach                return descriptor;
29425b9cf953bd3e97f726f8c27d7a752b27c9a2373Andre Eisenbach            }
29525b9cf953bd3e97f726f8c27d7a752b27c9a2373Andre Eisenbach        }
29625b9cf953bd3e97f726f8c27d7a752b27c9a2373Andre Eisenbach        return null;
29725b9cf953bd3e97f726f8c27d7a752b27c9a2373Andre Eisenbach    }
29825b9cf953bd3e97f726f8c27d7a752b27c9a2373Andre Eisenbach
29925b9cf953bd3e97f726f8c27d7a752b27c9a2373Andre Eisenbach    /**
3009908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Returns the service this characteristic belongs to.
3019908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @return The asscociated service
3029908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
3039908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public BluetoothGattService getService() {
3049908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return mService;
3059908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
3069908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
3079908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
308ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie     * Sets the service associated with this device.
309ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie     * @hide
310ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie     */
311ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie    /*package*/ void setService(BluetoothGattService service) {
312ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie        mService = service;
313ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie    }
314ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie
315ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie    /**
3169908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Returns the UUID of this characteristic
3179908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
3189908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @return UUID of this characteristic
3199908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
3209908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public UUID getUuid() {
3219908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return mUuid;
3229908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
3239908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
3249908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
3259908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Returns the instance ID for this characteristic.
3269908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
3279908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * <p>If a remote device offers multiple characteristics with the same UUID,
3289908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * the instance ID is used to distuinguish between characteristics.
3299908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
3309908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @return Instance ID of this characteristic
3319908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
3329908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public int getInstanceId() {
3339908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return mInstance;
3349908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
3359908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
3369908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
3379908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Returns the properties of this characteristic.
3389908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
3399908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * <p>The properties contain a bit mask of property flags indicating
3409908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * the features of this characteristic.
3419908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
3429908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @return Properties of this characteristic
3439908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
3449908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public int getProperties() {
3459908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return mProperties;
3469908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
3479908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
3489908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
3499908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Returns the permissions for this characteristic.
3509908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
3519908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @return Permissions of this characteristic
3529908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
3539908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public int getPermissions() {
3549908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return mPermissions;
3559908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
3569908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
3579908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
3589908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Gets the write type for this characteristic.
3599908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
3609908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @return Write type for this characteristic
3619908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
3629908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public int getWriteType() {
3639908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return mWriteType;
3649908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
3659908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
3669908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
3679908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Set the write type for this characteristic
3689908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
3699908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * <p>Setting the write type of a characteristic determines how the
3709908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * {@link BluetoothGatt#writeCharacteristic} function write this
3719908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * characteristic.
3729908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
3739908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @param writeType The write type to for this characteristic. Can be one
3749908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *                  of:
3759908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *                  {@link #WRITE_TYPE_DEFAULT},
3769908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *                  {@link #WRITE_TYPE_NO_RESPONSE} or
3779908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *                  {@link #WRITE_TYPE_SIGNED}.
3789908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
3799908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public void setWriteType(int writeType) {
3809908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        mWriteType = writeType;
3819908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
3829908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
3839908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
384ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie     * Set the desired key size.
385ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie     * @hide
386ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie     */
387ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie    public void setKeySize(int keySize) {
388ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie        mKeySize = keySize;
389ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie    }
390ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie
391ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie    /**
3929908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Returns a list of descriptors for this characteristic.
3939908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
3949908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @return Descriptors for this characteristic
3959908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
3969908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public List<BluetoothGattDescriptor> getDescriptors() {
3979908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return mDescriptors;
3989908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
3999908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
4009908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
4019908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Returns a descriptor with a given UUID out of the list of
4029908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * descriptors for this characteristic.
4039908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
404ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie     * @return GATT descriptor object or null if no descriptor with the
4059908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *         given UUID was found.
4069908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
4079908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public BluetoothGattDescriptor getDescriptor(UUID uuid) {
4089908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        for(BluetoothGattDescriptor descriptor : mDescriptors) {
4099908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            if (descriptor.getUuid().equals(uuid)) {
4109908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                return descriptor;
4119908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            }
4129908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        }
4139908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return null;
4149908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
4159908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
4169908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
4179908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Get the stored value for this characteristic.
4189908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
4199908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * <p>This function returns the stored value for this characteristic as
420ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie     * retrieved by calling {@link BluetoothGatt#readCharacteristic}. The cached
4219908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * value of the characteristic is updated as a result of a read characteristic
4229908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * operation or if a characteristic update notification has been received.
4239908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
4249908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @return Cached value of the characteristic
4259908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
4269908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public byte[] getValue() {
4279908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return mValue;
4289908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
4299908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
4309908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
4319908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Return the stored value of this characteristic.
4329908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
4339908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * <p>The formatType parameter determines how the characteristic value
4349908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * is to be interpreted. For example, settting formatType to
4359908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * {@link #FORMAT_UINT16} specifies that the first two bytes of the
4369908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * characteristic value at the given offset are interpreted to generate the
4379908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * return value.
4389908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
4399908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @param formatType The format type used to interpret the characteristic
4409908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *                   value.
4419908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @param offset Offset at which the integer value can be found.
4429908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @return Cached value of the characteristic or null of offset exceeds
4439908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *         value size.
4449908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
4459908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public Integer getIntValue(int formatType, int offset) {
4469908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        if ((offset + getTypeLen(formatType)) > mValue.length) return null;
4479908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
4489908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        switch (formatType) {
4499908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            case FORMAT_UINT8:
4509908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                return unsignedByteToInt(mValue[offset]);
4519908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
4529908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            case FORMAT_UINT16:
4539908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                return unsignedBytesToInt(mValue[offset], mValue[offset+1]);
4549908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
4559908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            case FORMAT_UINT32:
4569908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                return unsignedBytesToInt(mValue[offset],   mValue[offset+1],
4579908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                                          mValue[offset+2], mValue[offset+3]);
4589908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            case FORMAT_SINT8:
4599908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                return unsignedToSigned(unsignedByteToInt(mValue[offset]), 8);
4609908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
4619908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            case FORMAT_SINT16:
4629908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                return unsignedToSigned(unsignedBytesToInt(mValue[offset],
4639908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                                                           mValue[offset+1]), 16);
4649908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
4659908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            case FORMAT_SINT32:
4669908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                return unsignedToSigned(unsignedBytesToInt(mValue[offset],
4679908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                        mValue[offset+1], mValue[offset+2], mValue[offset+3]), 32);
4689908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        }
4699908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
4709908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return null;
4719908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
4729908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
4739908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
4749908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Return the stored value of this characteristic.
4759908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * <p>See {@link #getValue} for details.
4769908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
4779908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @param formatType The format type used to interpret the characteristic
4789908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *                   value.
4799908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @param offset Offset at which the float value can be found.
4809908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @return Cached value of the characteristic at a given offset or null
4819908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *         if the requested offset exceeds the value size.
4829908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
4839908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public Float getFloatValue(int formatType, int offset) {
4849908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        if ((offset + getTypeLen(formatType)) > mValue.length) return null;
4859908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
4869908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        switch (formatType) {
4879908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            case FORMAT_SFLOAT:
4889908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                return bytesToFloat(mValue[offset], mValue[offset+1]);
4899908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
4909908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            case FORMAT_FLOAT:
4919908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                return bytesToFloat(mValue[offset],   mValue[offset+1],
4929908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                                    mValue[offset+2], mValue[offset+3]);
4939908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        }
4949908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
4959908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return null;
4969908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
4979908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
4989908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
4999908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Return the stored value of this characteristic.
5009908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * <p>See {@link #getValue} for details.
501ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie     *
5029908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @param offset Offset at which the string value can be found.
5039908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @return Cached value of the characteristic
5049908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
5059908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public String getStringValue(int offset) {
5069908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        if (offset > mValue.length) return null;
5079908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        byte[] strBytes = new byte[mValue.length - offset];
5089908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        for (int i=0; i != (mValue.length-offset); ++i) strBytes[i] = mValue[offset+i];
5099908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return new String(strBytes);
5109908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
5119908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
5129908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
5139908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Updates the locally stored value of this characteristic.
5149908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
5159908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * <p>This function modifies the locally stored cached value of this
5169908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * characteristic. To send the value to the remote device, call
5179908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * {@link BluetoothGatt#writeCharacteristic} to send the value to the
5189908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * remote device.
5199908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
5209908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @param value New value for this characteristic
5219908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @return true if the locally stored value has been set, false if the
5229908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *              requested value could not be stored locally.
5239908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
5249908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public boolean setValue(byte[] value) {
5259908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        mValue = value;
5269908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return true;
5279908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
5289908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
5299908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
5309908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Set the locally stored value of this characteristic.
5319908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * <p>See {@link #setValue(byte[])} for details.
5329908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
5339908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @param value New value for this characteristic
5349908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @param formatType Integer format type used to transform the value parameter
5359908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @param offset Offset at which the value should be placed
5369908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @return true if the locally stored value has been set
5379908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
5389908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public boolean setValue(int value, int formatType, int offset) {
5399908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        int len = offset + getTypeLen(formatType);
5409908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        if (mValue == null) mValue = new byte[len];
5419908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        if (len > mValue.length) return false;
5429908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
5439908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        switch (formatType) {
5449908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            case FORMAT_SINT8:
5459908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                value = intToSignedBits(value, 8);
5469908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                // Fall-through intended
5479908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            case FORMAT_UINT8:
5489908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                mValue[offset] = (byte)(value & 0xFF);
5499908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                break;
5509908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
5519908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            case FORMAT_SINT16:
5529908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                value = intToSignedBits(value, 16);
5539908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                // Fall-through intended
5549908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            case FORMAT_UINT16:
5559908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                mValue[offset++] = (byte)(value & 0xFF);
5569908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                mValue[offset] = (byte)((value >> 8) & 0xFF);
5579908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                break;
5589908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
5599908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            case FORMAT_SINT32:
5609908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                value = intToSignedBits(value, 32);
5619908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                // Fall-through intended
5629908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            case FORMAT_UINT32:
5639908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                mValue[offset++] = (byte)(value & 0xFF);
5649908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                mValue[offset++] = (byte)((value >> 8) & 0xFF);
5653f36660a60ce065b71f6d5eb24911012b6d66fddAndre Eisenbach                mValue[offset++] = (byte)((value >> 16) & 0xFF);
5663f36660a60ce065b71f6d5eb24911012b6d66fddAndre Eisenbach                mValue[offset] = (byte)((value >> 24) & 0xFF);
5679908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                break;
5689908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
5699908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            default:
5709908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                return false;
5719908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        }
5729908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return true;
5739908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
5749908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
5759908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
5769908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Set the locally stored value of this characteristic.
5779908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * <p>See {@link #setValue(byte[])} for details.
578ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie     *
5799908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @param mantissa Mantissa for this characteristic
5809908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @param exponent  exponent value for this characteristic
5819908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @param formatType Float format type used to transform the value parameter
5829908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @param offset Offset at which the value should be placed
5839908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @return true if the locally stored value has been set
5849908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
5859908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public boolean setValue(int mantissa, int exponent, int formatType, int offset) {
5869908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        int len = offset + getTypeLen(formatType);
5879908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        if (mValue == null) mValue = new byte[len];
5889908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        if (len > mValue.length) return false;
5899908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
5909908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        switch (formatType) {
5919908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            case FORMAT_SFLOAT:
5929908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                mantissa = intToSignedBits(mantissa, 12);
5939908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                exponent = intToSignedBits(exponent, 4);
5949908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                mValue[offset++] = (byte)(mantissa & 0xFF);
5959908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                mValue[offset] = (byte)((mantissa >> 8) & 0x0F);
5969908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                mValue[offset] += (byte)((exponent & 0x0F) << 4);
5979908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                break;
5989908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
5999908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            case FORMAT_FLOAT:
6009908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                mantissa = intToSignedBits(mantissa, 24);
6019908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                exponent = intToSignedBits(exponent, 8);
6029908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                mValue[offset++] = (byte)(mantissa & 0xFF);
6039908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                mValue[offset++] = (byte)((mantissa >> 8) & 0xFF);
6049908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                mValue[offset++] = (byte)((mantissa >> 16) & 0xFF);
6059908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                mValue[offset] += (byte)(exponent & 0xFF);
6069908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                break;
6079908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
6089908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            default:
6099908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                return false;
6109908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        }
6119908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
6129908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return true;
6139908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
6149908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
6159908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
6169908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Set the locally stored value of this characteristic.
6179908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * <p>See {@link #setValue(byte[])} for details.
618ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie     *
6199908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @param value New value for this characteristic
6209908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @return true if the locally stored value has been set
6219908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
6229908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public boolean setValue(String value) {
6239908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        mValue = value.getBytes();
6249908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return true;
6259908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
6269908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
6279908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
6289908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Returns the size of a give value type.
6299908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
6309908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    private int getTypeLen(int formatType) {
6319908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return formatType & 0xF;
6329908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
6339908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
6349908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
6359908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Convert a signed byte to an unsigned int.
6369908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
6379908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    private int unsignedByteToInt(byte b) {
6389908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return b & 0xFF;
6399908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
6409908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
6419908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
6429908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Convert signed bytes to a 16-bit unsigned int.
6439908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
6449908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    private int unsignedBytesToInt(byte b0, byte b1) {
6459908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return (unsignedByteToInt(b0) + (unsignedByteToInt(b1) << 8));
6469908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
6479908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
6489908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
6499908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Convert signed bytes to a 32-bit unsigned int.
6509908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
6519908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    private int unsignedBytesToInt(byte b0, byte b1, byte b2, byte b3) {
6529908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return (unsignedByteToInt(b0) + (unsignedByteToInt(b1) << 8))
6539908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta             + (unsignedByteToInt(b2) << 16) + (unsignedByteToInt(b3) << 24);
6549908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
6559908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
6569908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
6579908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Convert signed bytes to a 16-bit short float value.
6589908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
6599908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    private float bytesToFloat(byte b0, byte b1) {
6609908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        int mantissa = unsignedToSigned(unsignedByteToInt(b0)
6619908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                        + ((unsignedByteToInt(b1) & 0x0F) << 8), 12);
6629908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        int exponent = unsignedToSigned(unsignedByteToInt(b1) >> 4, 4);
6639908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return (float)(mantissa * Math.pow(10, exponent));
6649908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
6659908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
6669908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
6679908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Convert signed bytes to a 32-bit short float value.
6689908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
6699908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    private float bytesToFloat(byte b0, byte b1, byte b2, byte b3) {
6709908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        int mantissa = unsignedToSigned(unsignedByteToInt(b0)
6719908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                        + (unsignedByteToInt(b1) << 8)
6729908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                        + (unsignedByteToInt(b2) << 16), 24);
6739908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return (float)(mantissa * Math.pow(10, b3));
6749908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
6759908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
6769908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
6779908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Convert an unsigned integer value to a two's-complement encoded
6789908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * signed value.
6799908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
6809908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    private int unsignedToSigned(int unsigned, int size) {
6819908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        if ((unsigned & (1 << size-1)) != 0) {
6829908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            unsigned = -1 * ((1 << size-1) - (unsigned & ((1 << size-1) - 1)));
6839908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        }
6849908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return unsigned;
6859908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
6869908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
6879908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
6889908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Convert an integer into the signed bits of a given length.
6899908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
6909908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    private int intToSignedBits(int i, int size) {
6919908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        if (i < 0) {
6929908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            i = (1 << size-1) + (i & ((1 << size-1) - 1));
6939908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        }
6949908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return i;
6959908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
6969908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta}
697