//
// Copyright 2015 Google, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at:
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
#pragma once
#include <bluetooth/uuid.h>
#include <array>
#include <memory>
#include <unordered_map>
#include <vector>
#include "hardware/bluetooth.h"
#include "hardware/bt_gatt.h"
namespace bluetooth {
namespace gatt {
// Attribute permission values
const int kPermissionRead = 0x1;
const int kPermissionReadEncrypted = 0x2;
const int kPermissionReadEncryptedMitm = 0x4;
const int kPermissionWrite = 0x10;
const int kPermissionWriteEnecrypted = 0x20;
const int KPermissionWriteEncryptedMitm = 0x40;
const int kPermissionWriteSigned = 0x80;
const int kPermissionWriteSignedMitm = 0x100;
// GATT characteristic properties bit-field values
const int kPropertyBroadcast = 0x1;
const int kPropertyRead = 0x2;
const int kPropertyWriteNoResponse = 0x4;
const int kPropertyWrite = 0x8;
const int kPropertyNotify = 0x10;
const int kPropertyIndicate = 0x20;
const int kPropertySignedWrite = 0x40;
const int kPropertyExtendedProps = 0x80;
// A mapping from string bluetooth addresses to RSSI measurements.
typedef std::unordered_map<std::string, int> ScanResults;
// TODO(armansito): This should be a private internal class though I don't see
// why we even need this class. Instead it should probably be merged into
// Server.
struct ServerInternals;
// Server is threadsafe and internally locked.
// Asynchronous IO is identified via a gatt_pipe FD,
// and synchronously read with 'GetCharacteristicValue'
//
// ****DEPRECATED****
//
// TODO(armansito): This class has been deprecated and is being replaced by
// bluetooth::GattServer. We will remove this entirely once the new code is
// ready.
class Server {
public:
Server();
~Server();
// Register GATT interface, initialize internal state,
// and open a pipe for characteristic write notification.
bool Initialize(const Uuid& service_id, int* gatt_pipe);
// Control the content of service advertisement.
bool SetAdvertisement(const std::vector<Uuid>& ids,
const std::vector<uint8_t>& service_data,
const std::vector<uint8_t>& manufacturer_data,
bool transmit_name);
// Control the content of service scan response.
bool SetScanResponse(const std::vector<Uuid>& ids,
const std::vector<uint8_t>& service_data,
const std::vector<uint8_t>& manufacturer_data,
bool transmit_name);
// Add an ordinary characteristic for reading and/or writing.
bool AddCharacteristic(const Uuid& id, int properties, int permissions);
// Add a special 'blob' characteristic with a corresponding control
// attribute to manipulate which part of the blob the attribute represents.
bool AddBlob(const Uuid& id, const Uuid& control_id, int properties,
int permissions);
// Put a new value into a characeteristic.
// It will be read from a client starting at the next 0-offset read.
bool SetCharacteristicValue(const Uuid& id,
const std::vector<uint8_t>& value);
// Get the current value of a characteristic.
bool GetCharacteristicValue(const Uuid& id, std::vector<uint8_t>* value);
// Start this service. Activate advertisements, allow connections.
// Characteristics should all be created before this.
bool Start();
// Cease advertisements and disallow connections.
bool Stop();
// Enable LE scan. Scan results will be cached internally.
bool ScanEnable();
// Disable LE scan.
bool ScanDisable();
// Copy out the cached scan results.
bool GetScanResults(ScanResults* results);
private:
// Internal data.
std::unique_ptr<ServerInternals> internal_;
};
} // namespace gatt
} // namespace bluetooth