/*
 * Copyright (C) 2012 The Android Open Source Project
 *
 * 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.
 */

#ifndef ANDROID_INCLUDE_BT_PAN_H
#define ANDROID_INCLUDE_BT_PAN_H

__BEGIN_DECLS

#define BTPAN_ROLE_NONE 0
#define BTPAN_ROLE_PANNAP 1
#define BTPAN_ROLE_PANU 2

typedef enum {
  BTPAN_STATE_CONNECTED = 0,
  BTPAN_STATE_CONNECTING = 1,
  BTPAN_STATE_DISCONNECTED = 2,
  BTPAN_STATE_DISCONNECTING = 3
} btpan_connection_state_t;

typedef enum {
  BTPAN_STATE_ENABLED = 0,
  BTPAN_STATE_DISABLED = 1
} btpan_control_state_t;

/**
 * Callback for pan connection state
 */
typedef void (*btpan_connection_state_callback)(btpan_connection_state_t state,
                                                bt_status_t error,
                                                const RawAddress* bd_addr,
                                                int local_role,
                                                int remote_role);
typedef void (*btpan_control_state_callback)(btpan_control_state_t state,
                                             int local_role, bt_status_t error,
                                             const char* ifname);

typedef struct {
  size_t size;
  btpan_control_state_callback control_state_cb;
  btpan_connection_state_callback connection_state_cb;
} btpan_callbacks_t;
typedef struct {
  /** set to size of this struct*/
  size_t size;
  /**
   * Initialize the pan interface and register the btpan callbacks
   */
  bt_status_t (*init)(const btpan_callbacks_t* callbacks);
  /*
   * enable the pan service by specified role. The result state of
   * enabl will be returned by btpan_control_state_callback. when pan-nap is
   * enabled, the state of connecting panu device will be notified by
   * btpan_connection_state_callback
   */
  bt_status_t (*enable)(int local_role);
  /*
   * get current pan local role
   */
  int (*get_local_role)(void);
  /**
   * start bluetooth pan connection to the remote device by specified pan role.
   * The result state will be returned by btpan_connection_state_callback
   */
  bt_status_t (*connect)(const RawAddress* bd_addr, int local_role,
                         int remote_role);
  /**
   * stop bluetooth pan connection. The result state will be returned by
   * btpan_connection_state_callback
   */
  bt_status_t (*disconnect)(const RawAddress* bd_addr);

  /**
   * Cleanup the pan interface
   */
  void (*cleanup)(void);

} btpan_interface_t;

__END_DECLS

#endif /* ANDROID_INCLUDE_BT_PAN_H */
