# 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_pw_build/target_types.gni")
import("$dir_pw_docgen/docs.gni")
import("$dir_pw_toolchain/arm_gcc/toolchains.gni")
import("$dir_pw_toolchain/generate_toolchain.gni")
import("board_configs.gni")

if (current_toolchain != default_toolchain) {
  config("config_includes") {
    include_dirs = [ "config" ]
  }

  pw_source_set("freertos_config") {
    public_configs = [ ":config_includes" ]
    public_deps = [ "$dir_pw_third_party/freertos:config_assert" ]
    public = [ "config/FreeRTOSConfig.h" ]
  }

  pw_source_set("pre_init") {
    configs = [ ":pw_malloc_active" ]
    public_deps = [ "$dir_pw_boot" ]
    deps = [
      "$dir_pw_malloc",
      "$dir_pw_preprocessor",
      "$dir_pw_string",
      "$dir_pw_third_party/freertos",
    ]
    sources = [ "boot.cc" ]
  }
}

generate_toolchain("rp2040") {
  _excluded_members = [
    "defaults",
    "name",
  ]
  _toolchain_base = pw_toolchain_arm_gcc.cortex_m0plus_size_optimized
  forward_variables_from(_toolchain_base, "*", _excluded_members)

  # For now, no Pigweed configurations set up.
  defaults = {
    forward_variables_from(_toolchain_base.defaults, "*")

    # Merge in the app_common_BACKEND and various application settings
    # which are defined in board_configs.gni.

    forward_variables_from(board_config_kudzu, "*")

    # forward_variables_from(board_config_st7735, "*")
    # forward_variables_from(board_config_ili9341, "*")

    pw_build_EXECUTABLE_TARGET_TYPE = "pico_executable"
    pw_build_EXECUTABLE_TARGET_TYPE_FILE =
        get_path_info("$dir_pigweed/targets/rp2040/pico_executable.gni",
                      "abspath")
    pw_unit_test_MAIN = "$dir_pigweed/targets/rp2040:pico_logging_test_main"
    pw_assert_BACKEND = dir_pw_assert_basic
    pw_log_BACKEND = dir_pw_log_basic
    pw_sys_io_BACKEND = dir_pw_sys_io_rp2040

    pw_chrono_SYSTEM_CLOCK_BACKEND = "$dir_pw_chrono_freertos:system_clock"
    pw_interrupt_CONTEXT_BACKEND = "$dir_pw_interrupt_cortex_m:context_armv7m"
    pw_sync_INTERRUPT_SPIN_LOCK_BACKEND =
        "$dir_pw_sync_freertos:interrupt_spin_lock"
    pw_sync_BINARY_SEMAPHORE_BACKEND = "$dir_pw_sync_freertos:binary_semaphore"
    pw_sync_MUTEX_BACKEND = "$dir_pw_sync_baremetal:mutex"
    pw_sync_COUNTING_SEMAPHORE_BACKEND =
        "$dir_pw_sync_freertos:counting_semaphore"
    pw_sync_THREAD_NOTIFICATION_BACKEND =
        "$dir_pw_sync_freertos:thread_notification"
    pw_sync_TIMED_THREAD_NOTIFICATION_BACKEND =
        "$dir_pw_sync_freertos:timed_thread_notification"

    pw_rpc_CONFIG = "$dir_pw_rpc:disable_global_mutex"

    pw_third_party_freertos_CONFIG =
        "$dir_pigweed_experimental/targets/rp2040:freertos_config"
    pw_third_party_freertos_PORT =
        "$dir_pigweed_experimental/third_party/freertos:arm_cm0_freertos_port"
    pw_display_DISPLAY_RESIZE = 1

    # Silence GN variable overwrite warning.
    pw_build_LINK_DEPS = []

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

    # Configure backend for pw_board_led
    pw_board_led_BACKEND = "$dir_pw_board_led_pico"

    # Configure backend for pw_spin_delay
    pw_spin_delay_BACKEND = "$dir_pw_spin_delay_rp2040"

    current_cpu = "arm"
    current_os = ""
  }
}
