BluetoothGattCharacteristic.java revision 9908112fd085d8b0d91e0562d32eebd1884f09a5
19908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta/*
29908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Copyright (C) 2013 The Android Open Source Project
39908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta *
49908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Licensed under the Apache License, Version 2.0 (the "License");
59908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * you may not use this file except in compliance with the License.
69908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * You may obtain a copy of the License at
79908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta *
89908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta *      http://www.apache.org/licenses/LICENSE-2.0
99908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta *
109908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Unless required by applicable law or agreed to in writing, software
119908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * distributed under the License is distributed on an "AS IS" BASIS,
129908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * See the License for the specific language governing permissions and
149908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * limitations under the License.
159908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */
169908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Battapackage android.bluetooth;
179908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
189908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Battaimport java.util.ArrayList;
199908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Battaimport java.util.IllegalFormatConversionException;
209908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Battaimport java.util.List;
219908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Battaimport java.util.UUID;
229908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
239908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta/**
249908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * Represents a Bluetooth Gatt Characteristic
259908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta * @hide
269908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta */
279908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Battapublic class BluetoothGattCharacteristic {
289908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
299908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
309908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Characteristic proprty: Characteristic is broadcastable.
319908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
329908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int PROPERTY_BROADCAST = 0x01;
339908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
349908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
359908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Characteristic property: Characteristic is readable.
369908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
379908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int PROPERTY_READ = 0x02;
389908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
399908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
409908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Characteristic property: Characteristic can be written without response.
419908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
429908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int PROPERTY_WRITE_NO_RESPONSE = 0x04;
439908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
449908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
459908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Characteristic property: Characteristic can be written.
469908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
479908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int PROPERTY_WRITE = 0x08;
489908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
499908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
509908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Characteristic property: Characteristic supports notification
519908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
529908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int PROPERTY_NOTIFY = 0x10;
539908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
549908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
559908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Characteristic property: Characteristic supports indication
569908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
579908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int PROPERTY_INDICATE = 0x20;
589908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
599908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
609908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Characteristic property: Characteristic supports write with signature
619908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
629908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int PROPERTY_SIGNED_WRITE = 0x40;
639908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
649908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
659908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Characteristic property: Characteristic has extended properties
669908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
679908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int PROPERTY_EXTENDED_PROPS = 0x80;
689908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
699908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
709908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Characteristic read permission
719908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
729908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int PERMISSION_READ = 0x01;
739908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
749908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
759908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Characteristic permission: Allow encrypted read operations
769908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
779908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int PERMISSION_READ_ENCRYPTED = 0x02;
789908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
799908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
809908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Characteristic permission: Allow reading with man-in-the-middle protection
819908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
829908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int PERMISSION_READ_ENCRYPTED_MITM = 0x04;
839908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
849908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
859908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Characteristic write permission
869908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
879908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int PERMISSION_WRITE = 0x10;
889908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
899908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
909908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Characteristic permission: Allow encrypted writes
919908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
929908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int PERMISSION_WRITE_ENCRYPTED = 0x20;
939908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
949908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
959908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Characteristic permission: Allow encrypted writes with man-in-the-middle
969908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * protection
979908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
989908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int PERMISSION_WRITE_ENCRYPTED_MITM = 0x40;
999908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
1009908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
1019908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Characteristic permission: Allow signed write operations
1029908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
1039908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int PERMISSION_WRITE_SIGNED = 0x80;
1049908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
1059908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
1069908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Characteristic permission: Allow signed write operations with
1079908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * man-in-the-middle protection
1089908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
1099908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int PERMISSION_WRITE_SIGNED_MITM = 0x100;
1109908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
1119908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
1129908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Write characteristic, requesting acknoledgement by the remote device
1139908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
1149908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int WRITE_TYPE_DEFAULT = 0x02;
1159908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
1169908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
1179908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Wrtite characteristic without requiring a response by the remote device
1189908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
1199908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int WRITE_TYPE_NO_RESPONSE = 0x01;
1209908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
1219908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
1229908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Write characteristic including and authenticated signature
1239908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
1249908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int WRITE_TYPE_SIGNED = 0x04;
1259908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
1269908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
1279908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Characteristic value format type uint8
1289908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
1299908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int FORMAT_UINT8 = 0x11;
1309908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
1319908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
1329908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Characteristic value format type uint16
1339908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
1349908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int FORMAT_UINT16 = 0x12;
1359908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
1369908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
1379908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Characteristic value format type uint32
1389908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
1399908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int FORMAT_UINT32 = 0x14;
1409908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
1419908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
1429908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Characteristic value format type sint8
1439908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
1449908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int FORMAT_SINT8 = 0x21;
1459908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
1469908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
1479908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Characteristic value format type sint16
1489908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
1499908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int FORMAT_SINT16 = 0x22;
1509908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
1519908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
1529908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Characteristic value format type sint32
1539908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
1549908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int FORMAT_SINT32 = 0x24;
1559908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
1569908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
1579908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Characteristic value format type sfloat (16-bit float)
1589908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
1599908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int FORMAT_SFLOAT = 0x32;
1609908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
1619908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
1629908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Characteristic value format type float (32-bit float)
1639908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
1649908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public static final int FORMAT_FLOAT = 0x34;
1659908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
1669908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
1679908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
1689908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * The UUID of this characteristic.
1699908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @hide
1709908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
1719908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    protected UUID mUuid;
1729908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
1739908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
1749908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Instance ID for this characteristic.
1759908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @hide
1769908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
1779908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    protected int mInstance;
1789908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
1799908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
1809908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Characteristic properties.
1819908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @hide
1829908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
1839908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    protected int mProperties;
1849908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
1859908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
1869908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Characteristic permissions.
1879908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @hide
1889908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
1899908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    protected int mPermissions;
1909908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
1919908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
1929908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Key size (default = 16).
1939908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @hide
1949908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
1959908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    protected int mKeySize = 16;
1969908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
1979908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
1989908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Write type for this characteristic.
1999908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * See WRITE_TYPE_* constants.
2009908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @hide
2019908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
2029908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    protected int mWriteType;
2039908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
2049908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
2059908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Back-reference to the service this characteristic belongs to.
2069908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @hide
2079908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
2089908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    protected BluetoothGattService mService;
2099908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
2109908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
2119908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * The cached value of this characteristic.
2129908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @hide
2139908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
2149908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    protected byte[] mValue;
2159908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
2169908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
2179908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * List of descriptors included in this characteristic.
2189908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
2199908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    protected List<BluetoothGattDescriptor> mDescriptors;
2209908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
2219908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
2229908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Create a new BluetoothGattCharacteristic
2239908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @hide
2249908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
2259908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /*package*/ BluetoothGattCharacteristic(BluetoothGattService service,
2269908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                                            UUID uuid, int instanceId,
2279908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                                            int properties, int permissions) {
2289908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        mUuid = uuid;
2299908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        mInstance = instanceId;
2309908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        mProperties = properties;
2319908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        mPermissions = permissions;
2329908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        mService = service;
2339908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        mValue = null;
2349908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        mDescriptors = new ArrayList<BluetoothGattDescriptor>();
2359908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
2369908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        if ((mProperties & PROPERTY_WRITE_NO_RESPONSE) != 0) {
2379908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            mWriteType = WRITE_TYPE_NO_RESPONSE;
2389908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        } else {
2399908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            mWriteType = WRITE_TYPE_DEFAULT;
2409908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        }
2419908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
2429908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
2439908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
2449908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Returns the deisred key size.
2459908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @hide
2469908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
2479908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /*package*/ int getKeySize() {
2489908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return mKeySize;
2499908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
2509908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
2519908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
2529908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Add a descriptor to this characteristic
2539908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @hide
2549908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
2559908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /*package*/ void addDescriptor(BluetoothGattDescriptor descriptor) {
2569908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        mDescriptors.add(descriptor);
2579908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
2589908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
2599908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
2609908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Returns the service this characteristic belongs to.
2619908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @return The asscociated service
2629908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
2639908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public BluetoothGattService getService() {
2649908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return mService;
2659908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
2669908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
2679908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
2689908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Returns the UUID of this characteristic
2699908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission.
2709908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
2719908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @return UUID of this characteristic
2729908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
2739908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public UUID getUuid() {
2749908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return mUuid;
2759908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
2769908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
2779908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
2789908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Returns the instance ID for this characteristic.
2799908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
2809908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * <p>If a remote device offers multiple characteristics with the same UUID,
2819908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * the instance ID is used to distuinguish between characteristics.
2829908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
2839908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission.
2849908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
2859908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @return Instance ID of this characteristic
2869908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
2879908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public int getInstanceId() {
2889908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return mInstance;
2899908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
2909908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
2919908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
2929908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Returns the properties of this characteristic.
2939908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
2949908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * <p>The properties contain a bit mask of property flags indicating
2959908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * the features of this characteristic.
2969908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
2979908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission.
2989908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
2999908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @return Properties of this characteristic
3009908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
3019908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public int getProperties() {
3029908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return mProperties;
3039908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
3049908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
3059908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
3069908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Returns the permissions for this characteristic.
3079908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission.
3089908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
3099908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @return Permissions of this characteristic
3109908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
3119908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public int getPermissions() {
3129908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return mPermissions;
3139908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
3149908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
3159908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
3169908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Gets the write type for this characteristic.
3179908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission.
3189908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
3199908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @return Write type for this characteristic
3209908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
3219908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public int getWriteType() {
3229908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return mWriteType;
3239908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
3249908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
3259908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
3269908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Set the write type for this characteristic
3279908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
3289908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * <p>Setting the write type of a characteristic determines how the
3299908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * {@link BluetoothGatt#writeCharacteristic} function write this
3309908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * characteristic.
3319908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
3329908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * <p>The default write type for a characteristic is
3339908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * {@link #WRITE_TYPE_DEFAULT}.
3349908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
3359908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission.
3369908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
3379908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @param writeType The write type to for this characteristic. Can be one
3389908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *                  of:
3399908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *                  {@link #WRITE_TYPE_DEFAULT},
3409908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *                  {@link #WRITE_TYPE_NO_RESPONSE} or
3419908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *                  {@link #WRITE_TYPE_SIGNED}.
3429908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
3439908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public void setWriteType(int writeType) {
3449908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        mWriteType = writeType;
3459908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
3469908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
3479908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
3489908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Returns a list of descriptors for this characteristic.
3499908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission.
3509908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
3519908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @return Descriptors for this characteristic
3529908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
3539908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public List<BluetoothGattDescriptor> getDescriptors() {
3549908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return mDescriptors;
3559908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
3569908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
3579908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
3589908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Returns a descriptor with a given UUID out of the list of
3599908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * descriptors for this characteristic.
3609908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
3619908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission.
3629908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
3639908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @return Gatt descriptor object or null if no descriptor with the
3649908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *         given UUID was found.
3659908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
3669908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public BluetoothGattDescriptor getDescriptor(UUID uuid) {
3679908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        for(BluetoothGattDescriptor descriptor : mDescriptors) {
3689908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            if (descriptor.getUuid().equals(uuid)) {
3699908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                return descriptor;
3709908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            }
3719908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        }
3729908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return null;
3739908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
3749908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
3759908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
3769908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Get the stored value for this characteristic.
3779908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
3789908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * <p>This function returns the stored value for this characteristic as
3799908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * retrieved by calling {@link BluetoothGatt#readCharacteristic}. To cached
3809908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * value of the characteristic is updated as a result of a read characteristic
3819908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * operation or if a characteristic update notification has been received.
3829908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
3839908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission.
3849908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
3859908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @return Cached value of the characteristic
3869908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
3879908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public byte[] getValue() {
3889908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return mValue;
3899908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
3909908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
3919908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
3929908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Return the stored value of this characteristic.
3939908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
3949908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * <p>The formatType parameter determines how the characteristic value
3959908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * is to be interpreted. For example, settting formatType to
3969908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * {@link #FORMAT_UINT16} specifies that the first two bytes of the
3979908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * characteristic value at the given offset are interpreted to generate the
3989908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * return value.
3999908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
4009908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission.
4019908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
4029908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @param formatType The format type used to interpret the characteristic
4039908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *                   value.
4049908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @param offset Offset at which the integer value can be found.
4059908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @return Cached value of the characteristic or null of offset exceeds
4069908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *         value size.
4079908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
4089908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public Integer getIntValue(int formatType, int offset) {
4099908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        if ((offset + getTypeLen(formatType)) > mValue.length) return null;
4109908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
4119908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        switch (formatType) {
4129908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            case FORMAT_UINT8:
4139908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                return unsignedByteToInt(mValue[offset]);
4149908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
4159908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            case FORMAT_UINT16:
4169908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                return unsignedBytesToInt(mValue[offset], mValue[offset+1]);
4179908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
4189908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            case FORMAT_UINT32:
4199908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                return unsignedBytesToInt(mValue[offset],   mValue[offset+1],
4209908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                                          mValue[offset+2], mValue[offset+3]);
4219908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            case FORMAT_SINT8:
4229908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                return unsignedToSigned(unsignedByteToInt(mValue[offset]), 8);
4239908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
4249908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            case FORMAT_SINT16:
4259908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                return unsignedToSigned(unsignedBytesToInt(mValue[offset],
4269908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                                                           mValue[offset+1]), 16);
4279908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
4289908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            case FORMAT_SINT32:
4299908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                return unsignedToSigned(unsignedBytesToInt(mValue[offset],
4309908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                        mValue[offset+1], mValue[offset+2], mValue[offset+3]), 32);
4319908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        }
4329908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
4339908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return null;
4349908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
4359908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
4369908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
4379908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Return the stored value of this characteristic.
4389908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * <p>See {@link #getValue} for details.
4399908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission.
4409908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
4419908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @param formatType The format type used to interpret the characteristic
4429908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *                   value.
4439908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @param offset Offset at which the float value can be found.
4449908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @return Cached value of the characteristic at a given offset or null
4459908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *         if the requested offset exceeds the value size.
4469908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
4479908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public Float getFloatValue(int formatType, int offset) {
4489908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        if ((offset + getTypeLen(formatType)) > mValue.length) return null;
4499908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
4509908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        switch (formatType) {
4519908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            case FORMAT_SFLOAT:
4529908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                return bytesToFloat(mValue[offset], mValue[offset+1]);
4539908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
4549908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            case FORMAT_FLOAT:
4559908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                return bytesToFloat(mValue[offset],   mValue[offset+1],
4569908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                                    mValue[offset+2], mValue[offset+3]);
4579908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        }
4589908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
4599908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return null;
4609908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
4619908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
4629908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
4639908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Return the stored value of this characteristic.
4649908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * <p>See {@link #getValue} for details.
4659908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission.
4669908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @param offset Offset at which the string value can be found.
4679908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @return Cached value of the characteristic
4689908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
4699908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public String getStringValue(int offset) {
4709908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        if (offset > mValue.length) return null;
4719908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        byte[] strBytes = new byte[mValue.length - offset];
4729908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        for (int i=0; i != (mValue.length-offset); ++i) strBytes[i] = mValue[offset+i];
4739908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return new String(strBytes);
4749908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
4759908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
4769908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
4779908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Updates the locally stored value of this characteristic.
4789908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
4799908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * <p>This function modifies the locally stored cached value of this
4809908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * characteristic. To send the value to the remote device, call
4819908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * {@link BluetoothGatt#writeCharacteristic} to send the value to the
4829908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * remote device.
4839908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
4849908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission.
4859908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
4869908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @param value New value for this characteristic
4879908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @return true if the locally stored value has been set, false if the
4889908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *              requested value could not be stored locally.
4899908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
4909908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public boolean setValue(byte[] value) {
4919908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        mValue = value;
4929908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return true;
4939908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
4949908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
4959908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
4969908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Set the locally stored value of this characteristic.
4979908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * <p>See {@link #setValue(byte[])} for details.
4989908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission.
4999908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     *
5009908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @param value New value for this characteristic
5019908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @param formatType Integer format type used to transform the value parameter
5029908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @param offset Offset at which the value should be placed
5039908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @return true if the locally stored value has been set
5049908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
5059908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public boolean setValue(int value, int formatType, int offset) {
5069908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        int len = offset + getTypeLen(formatType);
5079908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        if (mValue == null) mValue = new byte[len];
5089908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        if (len > mValue.length) return false;
5099908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
5109908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        switch (formatType) {
5119908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            case FORMAT_SINT8:
5129908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                value = intToSignedBits(value, 8);
5139908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                // Fall-through intended
5149908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            case FORMAT_UINT8:
5159908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                mValue[offset] = (byte)(value & 0xFF);
5169908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                break;
5179908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
5189908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            case FORMAT_SINT16:
5199908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                value = intToSignedBits(value, 16);
5209908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                // Fall-through intended
5219908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            case FORMAT_UINT16:
5229908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                mValue[offset++] = (byte)(value & 0xFF);
5239908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                mValue[offset] = (byte)((value >> 8) & 0xFF);
5249908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                break;
5259908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
5269908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            case FORMAT_SINT32:
5279908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                value = intToSignedBits(value, 32);
5289908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                // Fall-through intended
5299908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            case FORMAT_UINT32:
5309908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                mValue[offset++] = (byte)(value & 0xFF);
5319908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                mValue[offset++] = (byte)((value >> 8) & 0xFF);
5329908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                mValue[offset] = (byte)((value >> 16) & 0xFF);
5339908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                break;
5349908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
5359908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            default:
5369908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                return false;
5379908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        }
5389908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return true;
5399908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
5409908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
5419908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
5429908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Set the locally stored value of this characteristic.
5439908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * <p>See {@link #setValue(byte[])} for details.
5449908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission.
5459908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @param mantissa Mantissa for this characteristic
5469908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @param exponent  exponent value for this characteristic
5479908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @param formatType Float format type used to transform the value parameter
5489908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @param offset Offset at which the value should be placed
5499908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @return true if the locally stored value has been set
5509908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
5519908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public boolean setValue(int mantissa, int exponent, int formatType, int offset) {
5529908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        int len = offset + getTypeLen(formatType);
5539908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        if (mValue == null) mValue = new byte[len];
5549908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        if (len > mValue.length) return false;
5559908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
5569908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        switch (formatType) {
5579908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            case FORMAT_SFLOAT:
5589908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                mantissa = intToSignedBits(mantissa, 12);
5599908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                exponent = intToSignedBits(exponent, 4);
5609908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                mValue[offset++] = (byte)(mantissa & 0xFF);
5619908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                mValue[offset] = (byte)((mantissa >> 8) & 0x0F);
5629908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                mValue[offset] += (byte)((exponent & 0x0F) << 4);
5639908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                break;
5649908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
5659908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            case FORMAT_FLOAT:
5669908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                mantissa = intToSignedBits(mantissa, 24);
5679908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                exponent = intToSignedBits(exponent, 8);
5689908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                mValue[offset++] = (byte)(mantissa & 0xFF);
5699908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                mValue[offset++] = (byte)((mantissa >> 8) & 0xFF);
5709908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                mValue[offset++] = (byte)((mantissa >> 16) & 0xFF);
5719908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                mValue[offset] += (byte)(exponent & 0xFF);
5729908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                break;
5739908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
5749908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            default:
5759908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                return false;
5769908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        }
5779908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
5789908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return true;
5799908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
5809908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
5819908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
5829908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Set the locally stored value of this characteristic.
5839908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * <p>See {@link #setValue(byte[])} for details.
5849908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission.
5859908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @param value New value for this characteristic
5869908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @return true if the locally stored value has been set
5879908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
5889908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    public boolean setValue(String value) {
5899908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        mValue = value.getBytes();
5909908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return true;
5919908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
5929908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
5939908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
5949908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Returns the size of a give value type.
5959908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @hide
5969908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
5979908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    private int getTypeLen(int formatType) {
5989908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return formatType & 0xF;
5999908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
6009908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
6019908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
6029908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Convert a signed byte to an unsigned int.
6039908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @hide
6049908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
6059908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    private int unsignedByteToInt(byte b) {
6069908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return b & 0xFF;
6079908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
6089908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
6099908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
6109908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Convert signed bytes to a 16-bit unsigned int.
6119908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @hide
6129908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
6139908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    private int unsignedBytesToInt(byte b0, byte b1) {
6149908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return (unsignedByteToInt(b0) + (unsignedByteToInt(b1) << 8));
6159908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
6169908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
6179908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
6189908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Convert signed bytes to a 32-bit unsigned int.
6199908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @hide
6209908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
6219908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    private int unsignedBytesToInt(byte b0, byte b1, byte b2, byte b3) {
6229908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return (unsignedByteToInt(b0) + (unsignedByteToInt(b1) << 8))
6239908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta             + (unsignedByteToInt(b2) << 16) + (unsignedByteToInt(b3) << 24);
6249908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
6259908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
6269908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
6279908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Convert signed bytes to a 16-bit short float value.
6289908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @hide
6299908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
6309908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    private float bytesToFloat(byte b0, byte b1) {
6319908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        int mantissa = unsignedToSigned(unsignedByteToInt(b0)
6329908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                        + ((unsignedByteToInt(b1) & 0x0F) << 8), 12);
6339908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        int exponent = unsignedToSigned(unsignedByteToInt(b1) >> 4, 4);
6349908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return (float)(mantissa * Math.pow(10, exponent));
6359908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
6369908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
6379908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
6389908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Convert signed bytes to a 32-bit short float value.
6399908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @hide
6409908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
6419908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    private float bytesToFloat(byte b0, byte b1, byte b2, byte b3) {
6429908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        int mantissa = unsignedToSigned(unsignedByteToInt(b0)
6439908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                        + (unsignedByteToInt(b1) << 8)
6449908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta                        + (unsignedByteToInt(b2) << 16), 24);
6459908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return (float)(mantissa * Math.pow(10, b3));
6469908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
6479908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
6489908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
6499908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Convert an unsigned integer value to a two's-complement encoded
6509908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * signed value.
6519908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @hide
6529908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
6539908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    private int unsignedToSigned(int unsigned, int size) {
6549908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        if ((unsigned & (1 << size-1)) != 0) {
6559908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            unsigned = -1 * ((1 << size-1) - (unsigned & ((1 << size-1) - 1)));
6569908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        }
6579908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return unsigned;
6589908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
6599908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta
6609908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    /**
6619908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * Convert an integer into the signed bits of a given length.
6629908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     * @hide
6639908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta     */
6649908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    private int intToSignedBits(int i, int size) {
6659908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        if (i < 0) {
6669908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta            i = (1 << size-1) + (i & ((1 << size-1) - 1));
6679908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        }
6689908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta        return i;
6699908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta    }
6709908112fd085d8b0d91e0562d32eebd1884f09a5Ganesh Ganapathi Batta}
671