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