10f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray//
20f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray//  Copyright (C) 2015 Google, Inc.
30f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray//
40f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray//  Licensed under the Apache License, Version 2.0 (the "License");
50f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray//  you may not use this file except in compliance with the License.
60f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray//  You may obtain a copy of the License at:
70f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray//
80f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray//  http://www.apache.org/licenses/LICENSE-2.0
90f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray//
100f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray//  Unless required by applicable law or agreed to in writing, software
110f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray//  distributed under the License is distributed on an "AS IS" BASIS,
120f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray//  See the License for the specific language governing permissions and
140f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray//  limitations under the License.
150f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray//
160f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray#pragma once
170f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray
180f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray#include <array>
190f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray#include <memory>
200f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray#include <unordered_map>
210f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray#include <vector>
220f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray
230f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray#include "hardware/bluetooth.h"
240f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray#include "hardware/bt_gatt.h"
25234138e2606dd7a54fbcc540643511abc0a3598dArman Uguray#include "service/common/bluetooth/uuid.h"
260f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray
270f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguraynamespace bluetooth {
280f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguraynamespace gatt {
290f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray
300f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray// Attribute permission values
310f2d4897046f037a9f181f47f3d349a9dd646478Arman Ugurayconst int kPermissionRead = 0x1;
320f2d4897046f037a9f181f47f3d349a9dd646478Arman Ugurayconst int kPermissionReadEncrypted = 0x2;
330f2d4897046f037a9f181f47f3d349a9dd646478Arman Ugurayconst int kPermissionReadEncryptedMitm = 0x4;
340f2d4897046f037a9f181f47f3d349a9dd646478Arman Ugurayconst int kPermissionWrite = 0x10;
350f2d4897046f037a9f181f47f3d349a9dd646478Arman Ugurayconst int kPermissionWriteEnecrypted = 0x20;
360f2d4897046f037a9f181f47f3d349a9dd646478Arman Ugurayconst int KPermissionWriteEncryptedMitm = 0x40;
370f2d4897046f037a9f181f47f3d349a9dd646478Arman Ugurayconst int kPermissionWriteSigned = 0x80;
380f2d4897046f037a9f181f47f3d349a9dd646478Arman Ugurayconst int kPermissionWriteSignedMitm = 0x100;
390f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray
400f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray// GATT characteristic properties bit-field values
410f2d4897046f037a9f181f47f3d349a9dd646478Arman Ugurayconst int kPropertyBroadcast = 0x1;
420f2d4897046f037a9f181f47f3d349a9dd646478Arman Ugurayconst int kPropertyRead = 0x2;
430f2d4897046f037a9f181f47f3d349a9dd646478Arman Ugurayconst int kPropertyWriteNoResponse = 0x4;
440f2d4897046f037a9f181f47f3d349a9dd646478Arman Ugurayconst int kPropertyWrite = 0x8;
450f2d4897046f037a9f181f47f3d349a9dd646478Arman Ugurayconst int kPropertyNotify = 0x10;
460f2d4897046f037a9f181f47f3d349a9dd646478Arman Ugurayconst int kPropertyIndicate = 0x20;
470f2d4897046f037a9f181f47f3d349a9dd646478Arman Ugurayconst int kPropertySignedWrite = 0x40;
480f2d4897046f037a9f181f47f3d349a9dd646478Arman Ugurayconst int kPropertyExtendedProps = 0x80;
490f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray
500f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray// A mapping from string bluetooth addresses to RSSI measurements.
510f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguraytypedef std::unordered_map<std::string, int> ScanResults;
520f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray
530f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray// TODO(armansito): This should be a private internal class though I don't see
540f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray// why we even need this class. Instead it should probably be merged into
550f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray// Server.
560f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguraystruct ServerInternals;
570f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray
580f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray// Server is threadsafe and internally locked.
590f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray// Asynchronous IO is identified via a gatt_pipe FD,
600f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray// and synchronously read with 'GetCharacteristicValue'
610f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray//
620f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray// ****DEPRECATED****
630f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray//
640f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray// TODO(armansito): This class has been deprecated and is being replaced by
650f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray// bluetooth::GattServer. We will remove this entirely once the new code is
660f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray// ready.
670f2d4897046f037a9f181f47f3d349a9dd646478Arman Ugurayclass Server {
680f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray public:
690f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray  Server();
700f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray  ~Server();
710f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray
720f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray  // Register GATT interface, initialize internal state,
730f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray  // and open a pipe for characteristic write notification.
740f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray  bool Initialize(const UUID& service_id, int* gatt_pipe);
750f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray
760f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray  // Control the content of service advertisement.
770f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray  bool SetAdvertisement(const std::vector<UUID>& ids,
780f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray                        const std::vector<uint8_t>& service_data,
790f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray                        const std::vector<uint8_t>& manufacturer_data,
800f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray                        bool transmit_name);
810f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray
820f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray  // Control the content of service scan response.
830f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray  bool SetScanResponse(const std::vector<UUID>& ids,
840f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray                       const std::vector<uint8_t>& service_data,
850f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray                       const std::vector<uint8_t>& manufacturer_data,
860f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray                       bool transmit_name);
870f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray
880f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray  // Add an ordinary characteristic for reading and/or writing.
890f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray  bool AddCharacteristic(const UUID &id, int properties, int permissions);
900f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray
910f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray  // Add a special 'blob' characteristic with a corresponding control
920f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray  // attribute to manipulate which part of the blob the attribute represents.
930f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray  bool AddBlob(const UUID &id, const UUID &control_id, int properties,
940f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray               int permissions);
950f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray
960f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray  // Put a new value into a characeteristic.
970f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray  // It will be read from a client starting at the next 0-offset read.
980f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray  bool SetCharacteristicValue(const UUID &id, const std::vector<uint8_t> &value);
990f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray
1000f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray  // Get the current value of a characteristic.
1010f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray  bool GetCharacteristicValue(const UUID &id, std::vector<uint8_t> *value);
1020f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray
1030f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray  // Start this service. Activate advertisements, allow connections.
1040f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray  // Characteristics should all be created before this.
1050f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray  bool Start();
1060f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray
1070f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray  // Cease advertisements and disallow connections.
1080f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray  bool Stop();
1090f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray
1100f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray  // Enable LE scan. Scan results will be cached internally.
1110f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray  bool ScanEnable();
1120f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray
1130f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray  // Disable LE scan.
1140f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray  bool ScanDisable();
1150f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray
1160f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray  // Copy out the cached scan results.
1170f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray  bool GetScanResults(ScanResults *results);
1180f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray
1190f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray private:
1200f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray  // Internal data.
1210f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray  std::unique_ptr<ServerInternals> internal_;
1220f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray};
1230f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray
1240f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray}  // namespace gatt
1250f2d4897046f037a9f181f47f3d349a9dd646478Arman Uguray}  // namespace bluetooth
126