# Copyright 2022 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.

import("//build_overrides/pi_pico.gni")
import("//build_overrides/pigweed.gni")
import("$dir_pigweed_experimental/third_party/imgui/imgui.gni")
import("$dir_pw_build/target_types.gni")
import("app_common_vars.gni")

config("common_flags") {
  cflags = [
    "-DDISPLAY_WIDTH=" + pw_app_common_DISPLAY_WIDTH,
    "-DDISPLAY_HEIGHT=" + pw_app_common_DISPLAY_HEIGHT,
    "-DDISPLAY_RESET_GPIO=" + pw_app_common_DISPLAY_RESET_GPIO,
    "-DDISPLAY_TE_GPIO=" + pw_app_common_DISPLAY_TE_GPIO,
    "-DBACKLIGHT_GPIO=" + pw_app_common_BACKLIGHT_GPIO,
    "-DFRAMEBUFFER_WIDTH=" + pw_app_common_FRAMEBUFFER_WIDTH,
    "-DFRAMEBUFFER_START_X=" + pw_app_common_FRAMEBUFFER_START_X,
    "-DFRAMEBUFFER_START_Y=" + pw_app_common_FRAMEBUFFER_START_Y,
  ]
}

config("spi_flags") {
  cflags = [
    "-DDISPLAY_CS_GPIO=" + pw_app_common_DISPLAY_CS_GPIO,
    "-DDISPLAY_DC_GPIO=" + pw_app_common_DISPLAY_DC_GPIO,
    "-DSPI_MISO_GPIO=" + pw_app_common_SPI_MISO_GPIO,
    "-DSPI_MOSI_GPIO=" + pw_app_common_SPI_MOSI_GPIO,
    "-DSPI_CLOCK_GPIO=" + pw_app_common_SPI_CLOCK_GPIO,
  ]
}

config("rp2040_pio_flags") {
  cflags = [
    "-DUSE_PIO=1",
    # Overclock the rp2040 in common_pico.cc
    # "-DOVERCLOCK_250=1",
  ]
}

config("rp2040_i2c_flags") {
  cflags = [
    "-DI2C_BUS0_SCL=" + pw_app_common_I2C_BUS0_SCL,
    "-DI2C_BUS0_SDA=" + pw_app_common_I2C_BUS0_SDA,
    "-DI2C_BUS1_SCL=" + pw_app_common_I2C_BUS1_SCL,
    "-DI2C_BUS1_SDA=" + pw_app_common_I2C_BUS1_SDA,
  ]
}

_pico_common_deps = [
  "$PICO_ROOT/src/common/pico_base",
  "$PICO_ROOT/src/common/pico_stdlib",
  "$PICO_ROOT/src/rp2_common/hardware_pwm",
  "$PICO_ROOT/src/rp2_common/hardware_spi",
  "$PICO_ROOT/src/rp2_common/hardware_vreg",
  "$dir_pw_digital_io_rp2040",
  "$dir_pw_display",
  "$dir_pw_framebuffer_pool",
  "$dir_pw_i2c_rp2040",
  "$dir_pw_log",
  "$dir_pw_spi_rp2040",
  "$dir_pw_sync:borrow",
  "$dir_pw_sync:mutex",
  "$dir_pw_thread:thread",
  "$dir_pw_thread_freertos:thread",
  "//applications/app_common:app_common.facade",
  "//lib/ft6236",
  "//lib/icm42670p",
  "//lib/kudzu_imu_icm42670p",
  "//lib/max17048",
  "//lib/pi4ioe5v6416",
]

pw_source_set("pico_st7789") {
  public_configs = [
    ":common_flags",
    ":spi_flags",
    ":rp2040_i2c_flags",
  ]
  cflags = [ "-DDISPLAY_TYPE_ST7789" ]
  deps = _pico_common_deps
  deps += [ "$dir_pw_display_driver_st7789" ]
  sources = [ "common_pico.cc" ]
  remove_configs = [ "$dir_pw_build:strict_warnings" ]
}

pw_source_set("pico_st7789_pio") {
  public_configs = [
    ":common_flags",
    ":spi_flags",
    ":rp2040_pio_flags",
    ":rp2040_i2c_flags",
  ]
  cflags = [ "-DDISPLAY_TYPE_ST7789_PIO" ]
  deps = _pico_common_deps
  deps += [
    "$dir_pw_display_driver_st7789",
    "$dir_pw_pixel_pusher_rp2040_pio",
    "//lib/pw_touchscreen_ft6236",
  ]
  sources = [ "common_pico.cc" ]
  remove_configs = [ "$dir_pw_build:strict_warnings" ]
}

pw_source_set("host_imgui") {
  public_configs = [ ":common_flags" ]
  deps = [
    "$dir_pw_display_driver_imgui",
    "$dir_pw_display_imgui",
    "$dir_pw_framebuffer_pool",
    "$dir_pw_thread:thread",
    "$dir_pw_thread_stl:thread",
    "//applications/app_common:app_common.facade",
    "//lib/kudzu_imu_imgui",
    "//lib/pw_touchscreen_imgui",
  ]
  sources = [ "common_host_imgui.cc" ]
  remove_configs = []
  if (host_os == "linux") {
    remove_configs += [ "$dir_pw_toolchain/host_clang:linux_sysroot" ]
  }
}

pw_source_set("host_null") {
  public_configs = [ ":common_flags" ]
  deps = [
    "$dir_pw_display",
    "$dir_pw_display_driver_null",
    "$dir_pw_thread:thread",
    "$dir_pw_thread_stl:thread",
    "//applications/app_common:app_common.facade",
    "//lib/pw_touchscreen_null",
  ]
  sources = [ "common_host_null.cc" ]
}
