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

declare_args() {
  # Location of the Pigweed repository.
  dir_pigweed = "//third_party/pigweed/"
  dir_pigweed_experimental = "//"
}

# Upstream Pigweed modules.
import("$dir_pigweed/modules.gni")

# Experimental modules.
declare_args() {
  dir_app_common =
      get_path_info("$dir_pigweed_experimental/applications/app_common",
                    "abspath")
  dir_pw_board_led =
      get_path_info("$dir_pigweed_experimental/pw_board_led", "abspath")
  dir_pw_board_led_arduino =
      get_path_info("$dir_pigweed_experimental/pw_board_led_arduino", "abspath")
  dir_pw_board_led_host =
      get_path_info("$dir_pigweed_experimental/pw_board_led_host", "abspath")
  dir_pw_board_led_mimxrt595_evk =
      get_path_info("$dir_pigweed_experimental/pw_board_led_mimxrt595_evk",
                    "abspath")
  dir_pw_board_led_pico =
      get_path_info("$dir_pigweed_experimental/pw_board_led_pico", "abspath")
  dir_pw_board_led_stm32f429i_disc1 =
      get_path_info("$dir_pigweed_experimental/pw_board_led_stm32f429i_disc1",
                    "abspath")
  dir_pw_board_led_stm32f769i_disc0 =
      get_path_info("$dir_pigweed_experimental/pw_board_led_stm32f769i_disc0",
                    "abspath")
  dir_pw_board_led_stm32cube =
      get_path_info("$dir_pigweed_experimental/pw_board_led_stm32cube",
                    "abspath")
  dir_pw_color =
      get_path_info("$dir_pigweed_experimental/pw_graphics/pw_color", "abspath")
  dir_pw_coordinates =
      get_path_info("$dir_pigweed_experimental/pw_graphics/pw_coordinates",
                    "abspath")
  dir_pw_digital_io_arduino =
      get_path_info("$dir_pigweed_experimental/pw_digital_io_arduino",
                    "abspath")
  dir_pw_digital_io_pico =
      get_path_info("$dir_pigweed_experimental/pw_digital_io_pico", "abspath")
  dir_pw_digital_io_stm32cube =
      get_path_info("$dir_pigweed_experimental/pw_digital_io_stm32cube",
                    "abspath")
  dir_pw_display =
      get_path_info("$dir_pigweed_experimental/pw_graphics/pw_display",
                    "abspath")
  dir_pw_display_driver =
      get_path_info("$dir_pigweed_experimental/pw_display_driver", "abspath")
  dir_pw_display_driver_ili9341 =
      get_path_info("$dir_pigweed_experimental/pw_display_driver_ili9341",
                    "abspath")
  dir_pw_display_driver_imgui =
      get_path_info("$dir_pigweed_experimental/pw_display_driver_imgui",
                    "abspath")
  dir_pw_display_driver_mipi_dsi =
      get_path_info("$dir_pigweed_experimental/pw_display_driver_mipi",
                    "abspath")
  dir_pw_display_driver_null =
      get_path_info("$dir_pigweed_experimental/pw_display_driver_null",
                    "abspath")
  dir_pw_display_driver_st7735 =
      get_path_info("$dir_pigweed_experimental/pw_display_driver_st7735",
                    "abspath")
  dir_pw_display_driver_st7789 =
      get_path_info("$dir_pigweed_experimental/pw_display_driver_st7789",
                    "abspath")
  dir_pw_display_imgui =
      get_path_info("$dir_pigweed_experimental/pw_graphics/pw_display_imgui",
                    "abspath")
  dir_pw_draw =
      get_path_info("$dir_pigweed_experimental/pw_graphics/pw_draw", "abspath")
  dir_pw_framebuffer =
      get_path_info("$dir_pigweed_experimental/pw_graphics/pw_framebuffer",
                    "abspath")
  dir_pw_framebuffer_pool =
      get_path_info("$dir_pigweed_experimental/pw_graphics/pw_framebuffer_pool",
                    "abspath")
  dir_pw_mipi_dsi =
      get_path_info("$dir_pigweed_experimental/pw_mipi_dsi", "abspath")
  dir_pw_mipi_dsi_mcuxpresso =
      get_path_info("$dir_pigweed_experimental/pw_mipi_dsi_mcuxpresso",
                    "abspath")
  dir_pw_spi_arduino =
      get_path_info("$dir_pigweed_experimental/pw_spi_arduino", "abspath")
  dir_pw_spi_pico =
      get_path_info("$dir_pigweed_experimental/pw_spi_pico", "abspath")
  dir_pw_spi_stm32cube =
      get_path_info("$dir_pigweed_experimental/pw_spi_stm32cube", "abspath")
  dir_pw_spin_delay =
      get_path_info("$dir_pigweed_experimental/pw_spin_delay", "abspath")
  dir_pw_spin_delay_arduino =
      get_path_info("$dir_pigweed_experimental/pw_spin_delay_arduino",
                    "abspath")
  dir_pw_spin_delay_host =
      get_path_info("$dir_pigweed_experimental/pw_spin_delay_host", "abspath")
  dir_pw_spin_delay_mcuxpresso =
      get_path_info("$dir_pigweed_experimental/pw_spin_delay_mcuxpresso",
                    "abspath")
  dir_pw_spin_delay_pico =
      get_path_info("$dir_pigweed_experimental/pw_spin_delay_pico", "abspath")
  dir_pw_spin_delay_stm32f429i_disc1 =
      get_path_info("$dir_pigweed_experimental/pw_spin_delay_stm32f429i_disc1",
                    "abspath")
  dir_pw_spin_delay_stm32cube =
      get_path_info("$dir_pigweed_experimental/pw_spin_delay_stm32cube",
                    "abspath")
  dir_pw_spin_delay_stm32f769i_disc0 =
      get_path_info("$dir_pigweed_experimental/pw_spin_delay_stm32f769i_disc0",
                    "abspath")
  dir_pw_sys_io_baremetal_stm32f769 =
      get_path_info("$dir_pigweed_experimental/pw_sys_io_baremetal_stm32f769",
                    "abspath")
  dir_pw_touchscreen =
      get_path_info("$dir_pigweed_experimental/pw_graphics/pw_touchscreen",
                    "abspath")
  dir_pw_touchscreen_null =
      get_path_info("$dir_pigweed_experimental/pw_graphics/pw_touchscreen_null",
                    "abspath")
  dir_pw_touchscreen_teensy_stmpe610 = get_path_info(
          "$dir_pigweed_experimental/pw_graphics/pw_touchscreen_teensy_stmpe610",
          "abspath")
  dir_pw_touchscreen_teensy_xpt2046 =
      get_path_info(
          "$dir_pigweed_experimental/pw_graphics/pw_touchscreen_teensy_xpt2046",
          "abspath")
}
