# Copyright (c) 2020 Project CHIP 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
#
# http://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/chip.gni")
import("//build_overrides/efr32_sdk.gni")
import("${chip_root}/examples/common/pigweed/pigweed_rpcs.gni")
import("${chip_root}/src/lib/lib.gni")
import("${chip_root}/src/platform/device.gni")
import("${efr32_sdk_build_root}/efr32_sdk.gni")
import("${efr32_sdk_build_root}/silabs_board.gni")

declare_args() {
  enable_heap_monitoring = false

  # OTA timeout in seconds
  ota_periodic_query_timeout_sec = 86400

  # Wifi related stuff - they are overridden by gn -args="use_wf200=true"
  sl_wfx_config_softap = false
  sl_wfx_config_scan = true

  # Argument to force enable WPA3 security on rs91x
  rs91x_wpa3_only = false

  #default WiFi SSID
  chip_default_wifi_ssid = ""

  #default Wifi Password
  chip_default_wifi_psk = ""

  # Use default handler to negotiate subscription max interval
  chip_config_use_icd_subscription_callbacks = enable_sleepy_device
}

# Use persitent subscriptions for IC devices
chip_persist_subscriptions = enable_sleepy_device

silabs_common_plat_dir = "${chip_root}/examples/platform/silabs"

import("${silabs_common_plat_dir}/args.gni")

# Sanity check
assert(!(chip_enable_wifi && chip_enable_openthread))
assert(!(use_rs9116 && chip_enable_openthread))
assert(!(use_SiWx917 && chip_enable_openthread))
assert(!(use_wf200 && chip_enable_openthread))

if (chip_enable_wifi) {
  assert(use_rs9116 || use_wf200 || use_SiWx917)
  import("${chip_root}/src/platform/silabs/wifi_args.gni")

  if (use_rs9116) {
    wiseconnect_sdk_root =
        "${chip_root}/third_party/silabs/wiseconnect-wifi-bt-sdk"
    import("rs911x/rs911x.gni")
  } else if (use_SiWx917) {
    wisemcu_sdk_root = "${chip_root}/third_party/silabs/wisemcu-wifi-bt-sdk"
    import("rs911x/rs9117.gni")
  }
  if (use_wf200) {
    import("wf200/wf200.gni")
  }
}

config("chip_examples_project_config") {
  include_dirs = [ "project_include" ]

  # Link options that provide a replacement for dynamic memory operations in standard
  # library with the FreeRTOS malloc in platform code.
  ldflags = [
    # memory allocation -- these must be re-entrant and do locking
    "-Wl,--wrap=malloc",
    "-Wl,--wrap=free",
    "-Wl,--wrap=realloc",
    "-Wl,--wrap=calloc",
    "-Wl,--wrap=MemoryAlloc",

    # Wrap these in case internal newlib call them (e.g. strdup will)
    # directly call _malloc_r)
    "-Wl,--wrap=_malloc_r",
    "-Wl,--wrap=_realloc_r",
    "-Wl,--wrap=_free_r",
    "-Wl,--wrap=_calloc_r",
  ]
}

if (enable_dic) {
  config("efr32_dic_config") {
    include_dirs = [
      "${chip_root}/third_party/silabs/mqtt/stack",
      "${chip_root}/third_party/silabs/mqtt/mqtt_transport_interface/include",
      "${chip_root}/examples/platform/silabs/DIC/matter_abs_interface/include",
    ]
  }

  source_set("efr32-dic") {
    sources = [
      "${chip_root}/examples/platform/silabs/DIC/matter_abs_interface/src/dic.c",
      "${chip_root}/third_party/silabs/mqtt/mqtt_transport_interface/src/MQTT_transport.c",
      "${chip_root}/third_party/silabs/mqtt/mqtt_transport_interface/src/altcp.c",
      "${chip_root}/third_party/silabs/mqtt/mqtt_transport_interface/src/altcp_alloc.c",
      "${chip_root}/third_party/silabs/mqtt/mqtt_transport_interface/src/altcp_tcp.c",
      "${chip_root}/third_party/silabs/mqtt/mqtt_transport_interface/src/altcp_tls_mbedtls.c",
      "${chip_root}/third_party/silabs/mqtt/mqtt_transport_interface/src/altcp_tls_mbedtls_mem.c",
    ]
    public_deps = [
      "${chip_root}/src/inet",
      "${chip_root}/src/lwip",
    ]
    public_configs = [ ":efr32_dic_config" ]
  }
}

source_set("openthread_core_config_efr32_chip_examples") {
  if (chip_enable_openthread) {
    sources = [ "project_include/OpenThreadConfig.h" ]

    public_deps = [ "${efr32_sdk_build_root}:efr32_sdk" ]

    if (use_silabs_thread_lib) {
      public_deps += [ "${efr32_sdk_build_root}:openthread_core_config_efr32" ]
    } else {
      public_deps += [ "${chip_root}/third_party/openthread/platforms/efr32:openthread_core_config_efr32" ]
    }

    public_configs = [ ":chip_examples_project_config" ]
  }
}

source_set("efr-matter-shell") {
  if (chip_build_libshell) {
    defines = [ "ENABLE_CHIP_SHELL" ]

    sources = [ "${silabs_common_plat_dir}/matter_shell.cpp" ]
    include_dirs = [
      ".",
      "${silabs_common_plat_dir}",
    ]

    public_deps = [
      "${chip_root}/examples/shell/shell_common:shell_common",
      "${chip_root}/src/lib/shell:shell",
      "${chip_root}/src/lib/shell:shell_core",
    ]
  }
}

config("attestation-credentials-config") {
  include_dirs = [ "${chip_root}" ]

  defines = [
    # Set to 1 to enable EFR32 attestation credentials
    "SILABS_ATTESTATION_CREDENTIALS",
  ]
}

source_set("efr32-attestation-credentials") {
  sources = [
    "${silabs_common_plat_dir}/SilabsDeviceAttestationCreds.cpp",
    "${silabs_common_plat_dir}/SilabsDeviceAttestationCreds.h",
  ]

  public_deps = [
    "${chip_root}/src/credentials",
    "${chip_root}/src/platform:platform_base",
  ]

  public_configs = [ ":attestation-credentials-config" ]
}

source_set("silabs-factory-data-provider") {
  sources = [
    "${silabs_common_plat_dir}/SilabsDeviceDataProvider.cpp",
    "${silabs_common_plat_dir}/SilabsDeviceDataProvider.h",
  ]

  public_deps = [
    "${chip_root}/src/credentials",
    "${chip_root}/src/platform:platform_base",
    "${chip_root}/src/setup_payload",
  ]
}

config("ICD-subscription-callback-config") {
  defines = [ "CHIP_CONFIG_USE_ICD_SUBSCRIPTION_CALLBACKS=1" ]
}

source_set("efr32-ICD-subscription-callback") {
  sources = [
    "${silabs_common_plat_dir}/ICDSubscriptionCallback.cpp",
    "${silabs_common_plat_dir}/ICDSubscriptionCallback.h",
  ]

  public_deps = [ "${chip_root}/src/app:app" ]

  public_configs = [ ":ICD-subscription-callback-config" ]
}

config("efr32-common-config") {
  defines = [ "OTA_PERIODIC_TIMEOUT=${ota_periodic_query_timeout_sec}" ]

  if (!disable_lcd) {
    include_dirs = [ "${silabs_common_plat_dir}/display" ]

    defines += [ "DISPLAY_ENABLED" ]
  }

  if (show_qr_code) {
    defines += [ "QR_CODE_ENABLED" ]
  }

  if (chip_enable_ota_requestor) {
    defines += [ "SILABS_OTA_ENABLED" ]
  }

  if (enable_heap_monitoring) {
    defines += [ "HEAP_MONITORING" ]
  }

  ldflags = [ "-Wl,--no-warn-rwx-segment" ]
}

config("silabs-wifi-config") {
  defines = []
  include_dirs = []

  if (chip_default_wifi_ssid != "") {
    defines += [
      "SL_ONNETWORK_PAIRING=1",
      "SL_WIFI_SSID=\"${chip_default_wifi_ssid}\"",
    ]
  }
  if (chip_default_wifi_psk != "") {
    assert(chip_default_wifi_ssid != "",
           "ssid can't be null if psk is provided")
    defines += [ "SL_WIFI_PSK=\"${chip_default_wifi_psk}\"" ]
  }

  if (sl_wfx_config_softap) {
    defines += [ "SL_WFX_CONFIG_SOFTAP" ]
  }
  if (sl_wfx_config_scan) {
    defines += [ "SL_WFX_CONFIG_SCAN" ]
  }

  if (chip_enable_wifi_ipv4) {
    defines += [ "CHIP_DEVICE_CONFIG_ENABLE_IPV4" ]
  }

  if (rs91x_wpa3_only) {
    # TODO: Change this macro once WF200 support is provided
    defines += [ "WIFI_ENABLE_SECURITY_WPA3=1" ]
  }
}

source_set("efr32-common") {
  deps = []
  public_deps = []
  public_configs = [
    ":efr32-common-config",
    "${efr32_sdk_build_root}:silabs_config",
  ]

  # MQTT
  if (enable_dic) {
    deps += [ "${examples_plat_dir}:efr32-dic" ]
  }

  include_dirs = [ "." ]

  sources = [
    "${silabs_common_plat_dir}/LEDWidget.cpp",
    "${silabs_common_plat_dir}/heap_4_silabs.c",
    "${silabs_common_plat_dir}/silabs_utils.cpp",
    "${silabs_common_plat_dir}/syscalls_stubs.cpp",
    "init_efrPlatform.cpp",
    "matter_config.cpp",
  ]

  if (use_base_app) {
    sources += [ "BaseApplication.cpp" ]
  }

  if (chip_enable_pw_rpc || chip_build_libshell || enable_openthread_cli) {
    sources += [ "uart.cpp" ]
  }

  if (chip_enable_ota_requestor) {
    sources += [ "${silabs_common_plat_dir}/OTAConfig.cpp" ]
  }

  if (!disable_lcd) {
    sources += [
      "${silabs_common_plat_dir}/display/demo-ui.c",
      "${silabs_common_plat_dir}/display/lcd.cpp",
    ]

    include_dirs += [ "${silabs_common_plat_dir}/display" ]
    public_deps += [ "${chip_root}/examples/common/QRCode" ]
  }

  if (enable_heap_monitoring) {
    sources += [ "${silabs_common_plat_dir}/MemMonitoring.cpp" ]
  }

  # OpenThread Settings
  if (chip_enable_openthread) {
    deps += [
      "${chip_root}/third_party/openthread:openthread",
      "${chip_root}/third_party/openthread:openthread-platform",
    ]
  }

  if (chip_enable_wifi) {
    if (use_rs9116 || use_SiWx917) {
      sources += rs911x_src_plat

      # All the stuff from wiseconnect
      sources += rs911x_src_sapi
      include_dirs += rs911x_inc_plat

      #add compilation flags for rs991x build. This will be addressed directly in wiseconnect sdk in the next version release of that sdk
      cflags = rs911x_cflags
    } else if (use_wf200) {
      sources += wf200_plat_src
      include_dirs += wf200_plat_incs
    }

    public_configs += [ ":silabs-wifi-config" ]
  }

  if (chip_build_libshell) {
    deps += [ ":efr-matter-shell" ]
  }

  # Attestation Credentials
  if (chip_build_platform_attestation_credentials_provider) {
    public_deps += [ ":efr32-attestation-credentials" ]
  }

  # Factory Data Provider
  if (use_efr32_factory_data_provider) {
    public_deps += [ ":silabs-factory-data-provider" ]
  }

  if (chip_config_use_icd_subscription_callbacks) {
    public_deps += [ ":efr32-ICD-subscription-callback" ]
  }

  public_deps += [
    "${chip_root}/examples/providers:device_info_provider",
    "${chip_root}/src/lib",
    "${chip_root}/src/setup_payload",
  ]

  if (app_data_model != "") {
    public_deps += [ app_data_model ]
  }
}
