/******************************************************************************
 *
 *  Copyright 2014 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 "hci_layer.h"

typedef struct thread_t thread_t;
typedef struct vendor_t vendor_t;

typedef struct low_power_manager_t {
  // Initialize the low power manager, and use |post_thread| to synchronize
  // actions.
  void (*init)(thread_t* post_thread);

  // Clean up the low power manager and release resources.
  void (*cleanup)(void);

  // Performs |command| synchronized on the thread that was provided
  // at initialization time.
  void (*post_command)(low_power_command_t command);

  // Assert wake (for transmission). Must be called on the thread provided
  // at initialization time.
  void (*wake_assert)(void);

  // Tell the low power manager that you're done transmitting data. Must be
  // called on the thread provided at initialization time.
  void (*transmit_done)(void);
} low_power_manager_t;

const low_power_manager_t* low_power_manager_get_interface();
const low_power_manager_t* low_power_manager_get_test_interface(
    const vendor_t* vendor_interface);
