BluetoothGattCharacteristic.java revision 8d312a84d627dd50f23291fb0ed97b871ef28bb7
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);
2878d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski        out.writeTypedList(mDescriptors);
2888d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski    }
2898d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski
2908d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski    public static final Parcelable.Creator<BluetoothGattCharacteristic> CREATOR
2918d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski            = new Parcelable.Creator<BluetoothGattCharacteristic>() {
2928d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski        public BluetoothGattCharacteristic createFromParcel(Parcel in) {
2938d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski            return new BluetoothGattCharacteristic(in);
2948d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski        }
2958d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski
2968d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski        public BluetoothGattCharacteristic[] newArray(int size) {
2978d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski            return new BluetoothGattCharacteristic[size];
2988d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski        }
2998d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski    };
3008d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski
3018d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski    private BluetoothGattCharacteristic(Parcel in) {
3028d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski        mUuid = ((ParcelUuid)in.readParcelable(null)).getUuid();
3038d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski        mInstance = in.readInt();
3048d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski        mProperties = in.readInt();
3058d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski        mPermissions = in.readInt();
3068d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski
3078d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski        mDescriptors = new ArrayList<BluetoothGattDescriptor>();
3088d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski
3098d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski        ArrayList<BluetoothGattDescriptor> descs =
3108d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski                in.createTypedArrayList(BluetoothGattDescriptor.CREATOR);
3118d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski        if (descs != null) {
3128d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski            for (BluetoothGattDescriptor desc: descs) {
3138d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski                desc.setCharacteristic(this);
3148d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski                mDescriptors.add(desc);
3158d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski            }
3168d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski        }
3178d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski    }
3188d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski
3198d312a84d627dd50f23291fb0ed97b871ef28bb7Jakub Pawlowski    /**
3209908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Returns the deisred key size.
3219908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @hide
3229908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
3239908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /*package*/ int getKeySize() {
3249908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return mKeySize;
3259908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
3269908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
3279908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
328ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie     * Adds a descriptor to this characteristic.
329ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie     * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission.
330ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie     *
331ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie     * @param descriptor Descriptor to be added to this characteristic.
332ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie     * @return true, if the descriptor was added to the characteristic
3339908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
334ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie    public boolean addDescriptor(BluetoothGattDescriptor descriptor) {
3359908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        mDescriptors.add(descriptor);
336ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie        descriptor.setCharacteristic(this);
337ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie        return true;
3389908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
3399908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
3409908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
34125b9cf953bd3e97f726f8c27d7a752b27c9a2373Andre Eisenbach     * Get a descriptor by UUID and isntance id.
34225b9cf953bd3e97f726f8c27d7a752b27c9a2373Andre Eisenbach     * @hide
34325b9cf953bd3e97f726f8c27d7a752b27c9a2373Andre Eisenbach     */
34425b9cf953bd3e97f726f8c27d7a752b27c9a2373Andre Eisenbach    /*package*/  BluetoothGattDescriptor getDescriptor(UUID uuid, int instanceId) {
34525b9cf953bd3e97f726f8c27d7a752b27c9a2373Andre Eisenbach        for(BluetoothGattDescriptor descriptor : mDescriptors) {
34625b9cf953bd3e97f726f8c27d7a752b27c9a2373Andre Eisenbach            if (descriptor.getUuid().equals(uuid)
34725b9cf953bd3e97f726f8c27d7a752b27c9a2373Andre Eisenbach             && descriptor.getInstanceId() == instanceId) {
34825b9cf953bd3e97f726f8c27d7a752b27c9a2373Andre Eisenbach                return descriptor;
34925b9cf953bd3e97f726f8c27d7a752b27c9a2373Andre Eisenbach            }
35025b9cf953bd3e97f726f8c27d7a752b27c9a2373Andre Eisenbach        }
35125b9cf953bd3e97f726f8c27d7a752b27c9a2373Andre Eisenbach        return null;
35225b9cf953bd3e97f726f8c27d7a752b27c9a2373Andre Eisenbach    }
35325b9cf953bd3e97f726f8c27d7a752b27c9a2373Andre Eisenbach
35425b9cf953bd3e97f726f8c27d7a752b27c9a2373Andre Eisenbach    /**
3559908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Returns the service this characteristic belongs to.
3569908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @return The asscociated service
3579908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
3589908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public BluetoothGattService getService() {
3599908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return mService;
3609908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
3619908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
3629908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
363ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie     * Sets the service associated with this device.
364ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie     * @hide
365ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie     */
366ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie    /*package*/ void setService(BluetoothGattService service) {
367ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie        mService = service;
368ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie    }
369ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie
370ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie    /**
3719908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Returns the UUID of this characteristic
3729908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
3739908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @return UUID of this characteristic
3749908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
3759908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public UUID getUuid() {
3769908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return mUuid;
3779908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
3789908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
3799908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
3809908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Returns the instance ID for this characteristic.
3819908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
3829908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * <p>If a remote device offers multiple characteristics with the same UUID,
3839908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * the instance ID is used to distuinguish between characteristics.
3849908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
3859908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @return Instance ID of this characteristic
3869908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
3879908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public int getInstanceId() {
3889908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return mInstance;
3899908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
3909908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
3919908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
3929908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Returns the properties of this characteristic.
3939908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
3949908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * <p>The properties contain a bit mask of property flags indicating
3959908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * the features of this characteristic.
3969908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
3979908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @return Properties of this characteristic
3989908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
3999908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public int getProperties() {
4009908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return mProperties;
4019908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
4029908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
4039908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
4049908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Returns the permissions for this characteristic.
4059908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
4069908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @return Permissions of this characteristic
4079908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
4089908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public int getPermissions() {
4099908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return mPermissions;
4109908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
4119908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
4129908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
4139908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Gets the write type for this characteristic.
4149908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
4159908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @return Write type for this characteristic
4169908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
4179908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public int getWriteType() {
4189908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return mWriteType;
4199908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
4209908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
4219908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
4229908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Set the write type for this characteristic
4239908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
4249908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * <p>Setting the write type of a characteristic determines how the
4259908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * {@link BluetoothGatt#writeCharacteristic} function write this
4269908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * characteristic.
4279908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
4289908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @param writeType The write type to for this characteristic. Can be one
4299908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *                  of:
4309908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *                  {@link #WRITE_TYPE_DEFAULT},
4319908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *                  {@link #WRITE_TYPE_NO_RESPONSE} or
4329908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *                  {@link #WRITE_TYPE_SIGNED}.
4339908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
4349908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public void setWriteType(int writeType) {
4359908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        mWriteType = writeType;
4369908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
4379908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
4389908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
439ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie     * Set the desired key size.
440ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie     * @hide
441ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie     */
442ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie    public void setKeySize(int keySize) {
443ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie        mKeySize = keySize;
444ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie    }
445ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie
446ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie    /**
4479908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Returns a list of descriptors for this characteristic.
4489908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
4499908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @return Descriptors for this characteristic
4509908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
4519908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public List<BluetoothGattDescriptor> getDescriptors() {
4529908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return mDescriptors;
4539908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
4549908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
4559908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
4569908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Returns a descriptor with a given UUID out of the list of
4579908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * descriptors for this characteristic.
4589908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
459ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie     * @return GATT descriptor object or null if no descriptor with the
4609908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *         given UUID was found.
4619908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
4629908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public BluetoothGattDescriptor getDescriptor(UUID uuid) {
4639908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        for(BluetoothGattDescriptor descriptor : mDescriptors) {
4649908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            if (descriptor.getUuid().equals(uuid)) {
4659908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                return descriptor;
4669908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            }
4679908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        }
4689908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return null;
4699908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
4709908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
4719908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
4729908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Get the stored value for this characteristic.
4739908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
4749908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * <p>This function returns the stored value for this characteristic as
475ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie     * retrieved by calling {@link BluetoothGatt#readCharacteristic}. The cached
4769908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * value of the characteristic is updated as a result of a read characteristic
4779908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * operation or if a characteristic update notification has been received.
4789908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
4799908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @return Cached value of the characteristic
4809908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
4819908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public byte[] getValue() {
4829908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return mValue;
4839908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
4849908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
4859908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
4869908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Return the stored value of this characteristic.
4879908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
4889908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * <p>The formatType parameter determines how the characteristic value
4899908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * is to be interpreted. For example, settting formatType to
4909908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * {@link #FORMAT_UINT16} specifies that the first two bytes of the
4919908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * characteristic value at the given offset are interpreted to generate the
4929908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * return value.
4939908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
4949908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @param formatType The format type used to interpret the characteristic
4959908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *                   value.
4969908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @param offset Offset at which the integer value can be found.
4979908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @return Cached value of the characteristic or null of offset exceeds
4989908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *         value size.
4999908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
5009908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public Integer getIntValue(int formatType, int offset) {
5019908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        if ((offset + getTypeLen(formatType)) > mValue.length) return null;
5029908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
5039908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        switch (formatType) {
5049908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            case FORMAT_UINT8:
5059908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                return unsignedByteToInt(mValue[offset]);
5069908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
5079908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            case FORMAT_UINT16:
5089908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                return unsignedBytesToInt(mValue[offset], mValue[offset+1]);
5099908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
5109908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            case FORMAT_UINT32:
5119908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                return unsignedBytesToInt(mValue[offset],   mValue[offset+1],
5129908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                                          mValue[offset+2], mValue[offset+3]);
5139908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            case FORMAT_SINT8:
5149908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                return unsignedToSigned(unsignedByteToInt(mValue[offset]), 8);
5159908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
5169908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            case FORMAT_SINT16:
5179908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                return unsignedToSigned(unsignedBytesToInt(mValue[offset],
5189908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                                                           mValue[offset+1]), 16);
5199908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
5209908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            case FORMAT_SINT32:
5219908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                return unsignedToSigned(unsignedBytesToInt(mValue[offset],
5229908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                        mValue[offset+1], mValue[offset+2], mValue[offset+3]), 32);
5239908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        }
5249908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
5259908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return null;
5269908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
5279908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
5289908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
5299908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Return the stored value of this characteristic.
5309908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * <p>See {@link #getValue} for details.
5319908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
5329908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @param formatType The format type used to interpret the characteristic
5339908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *                   value.
5349908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @param offset Offset at which the float value can be found.
5359908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @return Cached value of the characteristic at a given offset or null
5369908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *         if the requested offset exceeds the value size.
5379908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
5389908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public Float getFloatValue(int formatType, int offset) {
5399908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        if ((offset + getTypeLen(formatType)) > mValue.length) return null;
5409908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
5419908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        switch (formatType) {
5429908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            case FORMAT_SFLOAT:
5439908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                return bytesToFloat(mValue[offset], mValue[offset+1]);
5449908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
5459908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            case FORMAT_FLOAT:
5469908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                return bytesToFloat(mValue[offset],   mValue[offset+1],
5479908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                                    mValue[offset+2], mValue[offset+3]);
5489908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        }
5499908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
5509908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return null;
5519908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
5529908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
5539908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
5549908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Return the stored value of this characteristic.
5559908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * <p>See {@link #getValue} for details.
556ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie     *
5579908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @param offset Offset at which the string value can be found.
5589908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @return Cached value of the characteristic
5599908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
5609908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public String getStringValue(int offset) {
5610fd06a19bdc56fec8eb736d248abb56fe5a2727dAndre Eisenbach        if (mValue == null || offset > mValue.length) return null;
5629908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        byte[] strBytes = new byte[mValue.length - offset];
5639908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        for (int i=0; i != (mValue.length-offset); ++i) strBytes[i] = mValue[offset+i];
5649908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return new String(strBytes);
5659908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
5669908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
5679908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
5689908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Updates the locally stored value of this characteristic.
5699908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
5709908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * <p>This function modifies the locally stored cached value of this
5719908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * characteristic. To send the value to the remote device, call
5729908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * {@link BluetoothGatt#writeCharacteristic} to send the value to the
5739908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * remote device.
5749908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
5759908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @param value New value for this characteristic
5769908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @return true if the locally stored value has been set, false if the
5779908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *              requested value could not be stored locally.
5789908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
5799908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public boolean setValue(byte[] value) {
5809908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        mValue = value;
5819908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return true;
5829908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
5839908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
5849908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
5859908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Set the locally stored value of this characteristic.
5869908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * <p>See {@link #setValue(byte[])} for details.
5879908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
5889908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @param value New value for this characteristic
5899908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @param formatType Integer format type used to transform the value parameter
5909908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @param offset Offset at which the value should be placed
5919908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @return true if the locally stored value has been set
5929908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
5939908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public boolean setValue(int value, int formatType, int offset) {
5949908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        int len = offset + getTypeLen(formatType);
5959908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        if (mValue == null) mValue = new byte[len];
5969908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        if (len > mValue.length) return false;
5979908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
5989908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        switch (formatType) {
5999908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            case FORMAT_SINT8:
6009908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                value = intToSignedBits(value, 8);
6019908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                // Fall-through intended
6029908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            case FORMAT_UINT8:
6039908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                mValue[offset] = (byte)(value & 0xFF);
6049908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                break;
6059908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
6069908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            case FORMAT_SINT16:
6079908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                value = intToSignedBits(value, 16);
6089908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                // Fall-through intended
6099908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            case FORMAT_UINT16:
6109908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                mValue[offset++] = (byte)(value & 0xFF);
6119908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                mValue[offset] = (byte)((value >> 8) & 0xFF);
6129908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                break;
6139908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
6149908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            case FORMAT_SINT32:
6159908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                value = intToSignedBits(value, 32);
6169908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                // Fall-through intended
6179908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            case FORMAT_UINT32:
6189908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                mValue[offset++] = (byte)(value & 0xFF);
6199908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                mValue[offset++] = (byte)((value >> 8) & 0xFF);
6203f36660a60ce065b71f6d5eb24911012b6d66fddAndre Eisenbach                mValue[offset++] = (byte)((value >> 16) & 0xFF);
6213f36660a60ce065b71f6d5eb24911012b6d66fddAndre Eisenbach                mValue[offset] = (byte)((value >> 24) & 0xFF);
6229908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                break;
6239908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
6249908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            default:
6259908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                return false;
6269908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        }
6279908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return true;
6289908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
6299908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
6309908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
6319908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Set the locally stored value of this characteristic.
6329908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * <p>See {@link #setValue(byte[])} for details.
633ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie     *
6349908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @param mantissa Mantissa for this characteristic
6359908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @param exponent  exponent value for this characteristic
6369908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @param formatType Float format type used to transform the value parameter
6379908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @param offset Offset at which the value should be placed
6389908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @return true if the locally stored value has been set
6399908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
6409908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public boolean setValue(int mantissa, int exponent, int formatType, int offset) {
6419908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        int len = offset + getTypeLen(formatType);
6429908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        if (mValue == null) mValue = new byte[len];
6439908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        if (len > mValue.length) return false;
6449908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
6459908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        switch (formatType) {
6469908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            case FORMAT_SFLOAT:
6479908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                mantissa = intToSignedBits(mantissa, 12);
6489908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                exponent = intToSignedBits(exponent, 4);
6499908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                mValue[offset++] = (byte)(mantissa & 0xFF);
6509908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                mValue[offset] = (byte)((mantissa >> 8) & 0x0F);
6519908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                mValue[offset] += (byte)((exponent & 0x0F) << 4);
6529908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                break;
6539908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
6549908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            case FORMAT_FLOAT:
6559908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                mantissa = intToSignedBits(mantissa, 24);
6569908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                exponent = intToSignedBits(exponent, 8);
6579908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                mValue[offset++] = (byte)(mantissa & 0xFF);
6589908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                mValue[offset++] = (byte)((mantissa >> 8) & 0xFF);
6599908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                mValue[offset++] = (byte)((mantissa >> 16) & 0xFF);
6609908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                mValue[offset] += (byte)(exponent & 0xFF);
6619908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                break;
6629908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
6639908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            default:
6649908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                return false;
6659908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        }
6669908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
6679908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return true;
6689908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
6699908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
6709908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
6719908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Set the locally stored value of this characteristic.
6729908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * <p>See {@link #setValue(byte[])} for details.
673ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie     *
6749908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @param value New value for this characteristic
6759908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @return true if the locally stored value has been set
6769908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
6779908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public boolean setValue(String value) {
6789908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        mValue = value.getBytes();
6799908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return true;
6809908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
6819908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
6829908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
6839908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Returns the size of a give value type.
6849908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
6859908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    private int getTypeLen(int formatType) {
6869908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return formatType & 0xF;
6879908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
6889908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
6899908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
6909908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Convert a signed byte to an unsigned int.
6919908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
6929908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    private int unsignedByteToInt(byte b) {
6939908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return b & 0xFF;
6949908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
6959908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
6969908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
6979908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Convert signed bytes to a 16-bit unsigned int.
6989908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
6999908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    private int unsignedBytesToInt(byte b0, byte b1) {
7009908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return (unsignedByteToInt(b0) + (unsignedByteToInt(b1) << 8));
7019908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
7029908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
7039908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
7049908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Convert signed bytes to a 32-bit unsigned int.
7059908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
7069908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    private int unsignedBytesToInt(byte b0, byte b1, byte b2, byte b3) {
7079908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return (unsignedByteToInt(b0) + (unsignedByteToInt(b1) << 8))
7089908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta             + (unsignedByteToInt(b2) << 16) + (unsignedByteToInt(b3) << 24);
7099908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
7109908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
7119908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
7129908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Convert signed bytes to a 16-bit short float value.
7139908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
7149908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    private float bytesToFloat(byte b0, byte b1) {
7159908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        int mantissa = unsignedToSigned(unsignedByteToInt(b0)
7169908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                        + ((unsignedByteToInt(b1) & 0x0F) << 8), 12);
7179908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        int exponent = unsignedToSigned(unsignedByteToInt(b1) >> 4, 4);
7189908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return (float)(mantissa * Math.pow(10, exponent));
7199908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
7209908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
7219908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
7229908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Convert signed bytes to a 32-bit short float value.
7239908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
7249908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    private float bytesToFloat(byte b0, byte b1, byte b2, byte b3) {
7259908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        int mantissa = unsignedToSigned(unsignedByteToInt(b0)
7269908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                        + (unsignedByteToInt(b1) << 8)
7279908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                        + (unsignedByteToInt(b2) << 16), 24);
7289908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return (float)(mantissa * Math.pow(10, b3));
7299908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
7309908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
7319908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
7329908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Convert an unsigned integer value to a two's-complement encoded
7339908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * signed value.
7349908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
7359908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    private int unsignedToSigned(int unsigned, int size) {
7369908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        if ((unsigned & (1 << size-1)) != 0) {
7379908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            unsigned = -1 * ((1 << size-1) - (unsigned & ((1 << size-1) - 1)));
7389908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        }
7399908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return unsigned;
7409908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
7419908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
7429908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
7439908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Convert an integer into the signed bits of a given length.
7449908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
7459908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    private int intToSignedBits(int i, int size) {
7469908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        if (i < 0) {
7479908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            i = (1 << size-1) + (i & ((1 << size-1) - 1));
7489908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        }
7499908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return i;
7509908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
7519908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta}
752