/*
 * Copyright (C) 2016 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 SYSTEM_PERIPHERALMANAGER_DAEMON_PERIPHERAL_MANAGER_CLIENT_H_
#define SYSTEM_PERIPHERALMANAGER_DAEMON_PERIPHERAL_MANAGER_CLIENT_H_

#include <map>
#include <memory>
#include <string>

#include <base/macros.h>

#include <android/os/BnPeripheralManagerClient.h>

#include "gpio_manager.h"
#include "i2c_manager.h"
#include "led_manager.h"
#include "spi_manager.h"

using android::binder::Status;
using android::os::BnPeripheralManagerClient;

namespace android {

class PeripheralManagerClient : public BnPeripheralManagerClient {
 public:
  PeripheralManagerClient();
  ~PeripheralManagerClient();

  // Gpio functions.
  virtual Status ListGpio(std::vector<std::string>* gpios) override;

  virtual Status OpenGpio(const std::string& name) override;

  virtual Status ReleaseGpio(const std::string& name) override;

  virtual Status SetGpioEdge(const std::string& name, int type) override;

  virtual Status SetGpioActiveType(const std::string& name, int type) override;

  virtual Status SetGpioDirection(const std::string& name,
                                  int direction) override;

  virtual Status SetGpioValue(const std::string& name, bool value) override;

  virtual Status GetGpioValue(const std::string& name, bool* value) override;

  virtual Status GetGpioPollingFd(const std::string& name,
                                  ::android::base::unique_fd* fd) override;

  // Spi functions.
  virtual Status ListSpiBuses(std::vector<std::string>* buses) override;

  virtual Status OpenSpiDevice(const std::string& name) override;

  virtual Status ReleaseSpiDevice(const std::string& name) override;

  virtual Status SpiDeviceWriteByte(const std::string& name,
                                    int8_t byte) override;

  virtual Status SpiDeviceWriteBuffer(
      const std::string& name,
      const std::vector<uint8_t>& buffer) override;

  virtual Status SpiDeviceTransfer(
      const std::string& name,
      const std::unique_ptr<std::vector<uint8_t>>& tx_data,
      std::unique_ptr<std::vector<uint8_t>>* rx_data,
      int len) override;

  virtual Status SpiDeviceSetMode(const std::string& name, int mode) override;

  virtual Status SpiDeviceSetFrequency(const std::string& name,
                                       int frequency_hz) override;

  virtual Status SpiDeviceSetBitJustification(const std::string& name,
                                              bool lsb_first) override;

  virtual Status SpiDeviceSetBitsPerWord(const std::string& name,
                                         int nbits) override;

  virtual Status SpiDeviceSetDelay(const std::string& name,
                                   int delay_usecs) override;

  // Led functions.
  virtual Status ListLeds(std::vector<std::string>* leds) override;

  virtual Status OpenLed(const std::string& name) override;

  virtual Status ReleaseLed(const std::string& name) override;

  virtual Status LedGetBrightness(const std::string& name,
                                  int* brightness) override;
  virtual Status LedGetMaxBrightness(const std::string& name,
                                     int* max_brightness) override;
  virtual Status LedSetBrightness(const std::string& name,
                                  int brightness) override;

  // I2c functions.
  virtual Status ListI2cBuses(std::vector<std::string>* buses) override;

  virtual Status OpenI2cDevice(const std::string& name,
                               int32_t address) override;

  virtual Status ReleaseI2cDevice(const std::string& name,
                                  int32_t address) override;

  virtual Status I2cRead(const std::string& name,
                         int32_t address,
                         std::vector<uint8_t>* data,
                         int32_t size,
                         int32_t* bytes_read) override;

  virtual Status I2cReadRegByte(const std::string& name,
                                int32_t address,
                                int32_t reg,
                                int32_t* val) override;

  virtual Status I2cReadRegWord(const std::string& name,
                                int32_t address,
                                int32_t reg,
                                int32_t* val) override;

  virtual Status I2cReadRegBuffer(const std::string& name,
                                  int32_t address,
                                  int32_t reg,
                                  std::vector<uint8_t>* data,
                                  int32_t size,
                                  int32_t* bytes_read) override;

  virtual Status I2cWrite(const std::string& name,
                          int32_t address,
                          const std::vector<uint8_t>& data,
                          int32_t* bytes_written) override;

  virtual Status I2cWriteRegByte(const std::string& name,
                                 int32_t address,
                                 int32_t reg,
                                 int8_t val) override;

  virtual Status I2cWriteRegWord(const std::string& name,
                                 int32_t address,
                                 int32_t reg,
                                 int32_t val) override;

  virtual Status I2cWriteRegBuffer(const std::string& name,
                                   int32_t address,
                                   int32_t reg,
                                   const std::vector<uint8_t>& data,
                                   int32_t* bytes_written) override;

 private:
  std::map<std::string, std::unique_ptr<GpioPin>> gpios_;
  std::map<std::pair<std::string, uint32_t>, std::unique_ptr<I2cDevice>>
      i2c_devices_;
  std::map<std::string, std::unique_ptr<SpiDevice>> spi_devices_;
  std::map<std::string, std::unique_ptr<Led>> leds_;
  DISALLOW_COPY_AND_ASSIGN(PeripheralManagerClient);
};

}  // namespace android

#endif  // SYSTEM_PERIPHERALMANAGER_DAEMON_PERIPHERAL_MANAGER_CLIENT_H_
