// Copyright 2023 The Pigweed Authors
//
// 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
//
//     https://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 "fsl_dc_fb_dsi_cmd.h"
#include "fsl_mipi_dsi.h"
#include "fsl_mipi_dsi_smartdma.h"
#include "fsl_rm67162.h"
#include "pw_coordinates/vec_int.h"
#include "pw_framebuffer_pool/framebuffer_pool.h"
#include "pw_mipi_dsi/device.h"
#include "pw_mipi_dsi_mcuxpresso/framebuffer_device.h"
#include "pw_status/status.h"

namespace pw::mipi::dsi {

constexpr size_t kBytesPerPixel = sizeof(pw::color::color_rgb565_t);
constexpr uint32_t kMaxDSITxArraySize =
    (((FSL_DSI_TX_MAX_PAYLOAD_BYTE)-1U) / kBytesPerPixel) * kBytesPerPixel;

#if !defined(USE_DSI_SMARTDMA)
#error "USE_DSI_SMARTDMA not defined"
#endif

// MIPI DSI Device implementation for the MCUXpresso platform.
class MCUXpressoDevice : public Device {
 public:
  MCUXpressoDevice(const pw::framebuffer::pool::PoolData& fb_pool,
                   const pw::coordinates::Size<uint16_t>& panel_size,
                   video_pixel_format_t pixel_format);
  virtual ~MCUXpressoDevice();

  Status Init();

  // pw::mipi::dsi::Device implementation:
  pw::framebuffer::FramebufferRgb565 GetFramebuffer() override;
  Status ReleaseFramebuffer(
      pw::framebuffer::FramebufferRgb565 framebuffer) override;

 public:
  static status_t DSI_Transfer(dsi_transfer_t* xfer);
  static status_t DSI_MemWrite(uint8_t virtualChannel,
                               const uint8_t* data,
                               uint32_t length);
  static void PullPanelResetPin(bool pullUp);
  static void PullPanelPowerPin(bool pullUp);
  void DisplayTEPinHandler();
  Status PrepareDisplayController();

 private:
  struct DSIMemWriteContext {
    volatile bool ongoing;
    const uint8_t* tx_data;
    uint32_t num_bytes_remaining;
    uint8_t dsc_cmd;
  };

  static void DsiSmartDMAMemWriteCallback(MIPI_DSI_HOST_Type* base,
                                          dsi_smartdma_handle_t* handle,
                                          status_t status,
                                          void* userData);
  static void DsiMemWriteCallback(MIPI_DSI_HOST_Type* base,
                                  dsi_handle_t* handle,
                                  status_t status,
                                  void* userData);
  status_t DsiMemWriteSendChunck();
  Status InitDisplayInterface();
  Status InitLcdPanel();
  void InitMipiPanelTEPin();
  void InitMipiDsiClock();
  void SetMipiDsiConfig();
#if USE_DSI_SMARTDMA
  void InitSmartDMA();
#endif

  const pw::framebuffer::pool::PoolData& fb_pool_;
  FramebufferDevice fbdev_;
  dsi_smartdma_handle_t dsi_smartdma_driver_handle_ = {};
  DSIMemWriteContext dsi_mem_write_ctx_ = {};
  dsi_transfer_t dsi_mem_write_xfer_ = {};
  dsi_handle_t dsi_driver_handle_ = {};
  uint8_t dsi_mem_write_tmp_array_[kMaxDSITxArraySize];
  uint32_t mipi_dsi_tx_esc_clk_freq_hz_ = 0;
  uint32_t mipi_dsi_dphy_bit_clk_freq_hz_ = 0;
  mipi_dsi_device_t dsi_device_;
  rm67162_resource_t rm67162_resource_;
  display_handle_t display_handle_;
  dc_fb_dsi_cmd_handle_t dc_fb_dsi_cmd_handle_;
  const dc_fb_dsi_cmd_config_t panel_config_;
  dc_fb_t dc_;
};

}  // namespace pw::mipi::dsi
