# Copyright 2021 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/pigweed.gni")

import("$dir_pw_rpc/system_server/backend.gni")
import("$dir_pw_sys_io/backend.gni")
import("$dir_pw_third_party/stm32cube/stm32cube.gni")
import("$dir_pw_toolchain/arm_gcc/toolchains.gni")

_target_config = {
  # Use the logging main.
  pw_unit_test_MAIN = "$dir_pw_unit_test:logging_main"

  # Configuration options for Pigweed executable targets.
  pw_build_EXECUTABLE_TARGET_TYPE = "stm32f207zg_executable"

  pw_build_EXECUTABLE_TARGET_TYPE_FILE =
      get_path_info("stm32f207zg_executable.gni", "abspath")

  # Path to the bloaty config file for the output binaries.
  # pw_bloat_BLOATY_CONFIG = "$dir_pw_boot_armv7m/bloaty_config.bloaty"

  #TODO: Fix test server: likely have to fork stm32cube-disc1 implementation
  # if (pw_use_test_server) {
  #   _test_runner_script = "py/stm32cube_disc1_utils/unit_test_client.py"
  #   pw_unit_test_AUTOMATIC_RUNNER =
  #       get_path_info(_test_runner_script, "abspath")
  # }

  # Facade backends
  pw_assert_BACKEND = dir_pw_assert_basic

  # pw_boot_BACKEND = dir_pw_boot_armv7m

  pw_build_LINK_DEPS = [
    "$dir_pw_assert:impl",
    "$dir_pw_log:impl",
  ]

  ### pw_cpu_exception not yet used
  # pw_cpu_exception_ENTRY_BACKEND =
  #     "$dir_pw_cpu_exception_cortex_m:cpu_exception_armv7m"
  # pw_cpu_exception_HANDLER_BACKEND = "$dir_pw_cpu_exception:basic_handler"
  # pw_cpu_exception_SUPPORT_BACKEND =
  #     "$dir_pw_cpu_exception_cortex_m:support_armv7m"
  pw_sync_INTERRUPT_SPIN_LOCK_BACKEND =
      "$dir_pw_sync_baremetal:interrupt_spin_lock"
  pw_log_BACKEND = dir_pw_log_basic
  pw_sys_io_BACKEND = dir_pw_sys_io_stm32cube
  pw_sys_io_stm32cube_usart_num = "3"
  pw_sys_io_stm32cube_gpio_port = "D"
  pw_sys_io_stm32cube_gpio_tx_pin = "8"
  pw_sys_io_stm32cube_gpio_rx_pin = "9"

  #TODO: remove dependency on stm32f429i-disc1 rpc server.
  pw_rpc_system_server_BACKEND =
      "$dir_pigweed/targets/stm32f429i-disc1:system_rpc_server"

  # pw_malloc_BACKEND = dir_pw_malloc_freelist

  current_cpu = "arm"
  current_os = ""

  pw_board_led_BACKEND = dir_pw_board_led_stm32cube
  pw_board_led_stm32cube_gpio_port = "B"
  pw_board_led_stm32cube_gpio_pin = "0"

  pw_spin_delay_BACKEND = dir_pw_spin_delay_stm32cube

  dir_pw_third_party_stm32cube = dir_pw_third_party_stm32cube_f2
  pw_third_party_stm32cube_PRODUCT = "STM32F207xx"
}

_toolchain_properties = {
  final_binary_extension = ".elf"
}

_target_default_configs = [
  "$dir_pw_build:extra_strict_warnings",
  "$dir_pw_toolchain/arm_gcc:enable_float_printf",
]

pw_target_toolchain_stm32f207zg_nucleo = {
  _excluded_members = [
    "defaults",
    "name",
  ]

  debug = {
    name = "stm32f207zg_nucleo_debug"
    _toolchain_base = pw_toolchain_arm_gcc.cortex_m3_debug
    forward_variables_from(_toolchain_base, "*", _excluded_members)
    forward_variables_from(_toolchain_properties, "*")
    defaults = {
      forward_variables_from(_toolchain_base.defaults, "*")
      forward_variables_from(_target_config, "*")
      default_configs += _target_default_configs
    }
  }

  speed_optimized = {
    name = "stm32f207zg_nucleo_speed_optimized"
    _toolchain_base = pw_toolchain_arm_gcc.cortex_m3_speed_optimized
    forward_variables_from(_toolchain_base, "*", _excluded_members)
    forward_variables_from(_toolchain_properties, "*")
    defaults = {
      forward_variables_from(_toolchain_base.defaults, "*")
      forward_variables_from(_target_config, "*")
      default_configs += _target_default_configs
    }
  }

  size_optimized = {
    name = "stm32f207zg_nucleo_size_optimized"
    _toolchain_base = pw_toolchain_arm_gcc.cortex_m3_size_optimized
    forward_variables_from(_toolchain_base, "*", _excluded_members)
    forward_variables_from(_toolchain_properties, "*")
    defaults = {
      forward_variables_from(_toolchain_base.defaults, "*")
      forward_variables_from(_target_config, "*")
      default_configs += _target_default_configs
    }
  }
}

# This list just contains the members of the above scope for convenience to make
# it trivial to generate all the toolchains in this file via a
# `generate_toolchains` target.
pw_target_toolchain_stm32f207zg_nucleo_list = [
  pw_target_toolchain_stm32f207zg_nucleo.debug,
  pw_target_toolchain_stm32f207zg_nucleo.speed_optimized,
  pw_target_toolchain_stm32f207zg_nucleo.size_optimized,
]
