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