# Copyright 2020 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/bind/bind.gni")
import("//build/cipd.gni")
import("//build/config/fuchsia/rules.gni")
import("//build/dist/resource.gni")
import("//src/sys/build/components.gni")

template("ot_radio_driver") {
  forward_variables_from(invoker,
                         [
                           "board",
                           "firmware_type",
                           "firmware_config",
                         ])
  firmware_name =
      "ot-" + firmware_config + "-app-" + firmware_type + "-" + board + ".bin"
  if (!internal_access) {
    # Unused variable
    not_needed([ "firmware_name" ])
  }

  driver_suffix = target_name
  driver_module("ot-radio-${driver_suffix}") {
    output_name = "ot-radio-driver-${driver_suffix}"

    sources = [
      "ot_radio.cc",
      "ot_radio_tests.cc",
    ]

    deps = [
      "//sdk/banjo/fuchsia.hardware.gpio:fuchsia.hardware.gpio_banjo_cpp",
      "//sdk/banjo/fuchsia.hardware.spi:fuchsia.hardware.spi_banjo_cpp",
      "//sdk/fidl/fuchsia.lowpan.spinel:fuchsia.lowpan.spinel_llcpp",
      "//src/connectivity/openthread/drivers/ot-radio:ot_radio_bind",
      "//src/connectivity/openthread/third_party/openthread:spinel-framer",
      "//src/devices/lib/driver",
      "//src/lib/ddk",
      "//src/lib/ddktl",
      "//zircon/public/lib/async-cpp",
      "//zircon/public/lib/fbl",
      "//zircon/public/lib/sync",
      "//zircon/public/lib/zircon-internal",
      "//zircon/public/lib/zx",
      "//zircon/public/lib/zxtest",
      "//zircon/system/ulib/async-loop:async-loop-cpp",
      "//zircon/system/ulib/async-loop:async-loop-default",
      "//zircon/system/ulib/driver-unit-test",
      "//zircon/system/ulib/fidl-async:fidl-async-cpp",
    ]

    include_dirs =
        [ "//src/connectivity/openthread/third_party/openthread/spinel-framer" ]

    if (internal_access) {
      sources += [ "ot_radio_bootloader.cc" ]
      defines = [
        "INTERNAL_ACCESS",
        "OT_NCP_FIRMWARE_BIN=\"" + firmware_name + "\"",
      ]

      deps += [ ":version-string-${driver_suffix}" ]
    }
  }

  if (internal_access) {
    source_set("version-string-${driver_suffix}") {
      sources = [
        "$target_gen_dir/ot_radio_firmware_version_string-${driver_suffix}.cc",
      ]

      deps = [ ":gen-version-string-${driver_suffix}" ]
    }

    resource("ot-radio-firmware-${driver_suffix}") {
      sources = [ "//prebuilt/connectivity/openthread/radio-firmware/" +
                  firmware_name ]
      outputs = [ "lib/firmware/${firmware_name}" ]
    }

    action("gen-version-string-${driver_suffix}") {
      visibility = [ ":version-string-${driver_suffix}" ]
      outputs = [
        "$target_gen_dir/ot_radio_firmware_version_string-${driver_suffix}.cc",
      ]
      sources = [ "//prebuilt/connectivity/openthread/radio-firmware/" +
                  firmware_name ]
      script = "gen-version-string.sh"
      args = rebase_path(outputs, root_build_dir) +
             rebase_path(sources, root_build_dir)
    }
  }

  fuchsia_system_package("openthread-${driver_suffix}") {
    # Fuchsia does not yet support loading drivers out of packages.

    deps = [ ":ot-radio-${driver_suffix}" ]
    if (internal_access) {
      deps += [ ":ot-radio-firmware-${driver_suffix}" ]
    }

    allowed_in_extra_deps = true
  }
}
