/******************************************************************************
 *
 *  Copyright (C) 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);
