# Copyright (c) 2021 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("${chip_root}/src/platform/device.gni")

import("${chip_root}/build/chip/buildconfig_header.gni")
import("${chip_root}/src/crypto/crypto.gni")
import("${chip_root}/third_party/silabs/silabs_board.gni")

silabs_platform_dir = "${chip_root}/src/platform/silabs"

assert(chip_device_platform == "SiWx917")
if (chip_crypto == "platform") {
  import("//build_overrides/mbedtls.gni")
}

config("siwx917-platform-wifi-config") {
  include_dirs = [ "wifi" ]
  defines = []
}
static_library("SiWx917") {
  sources = [
    "${silabs_platform_dir}/BLEManagerImpl.h",
    "${silabs_platform_dir}/BlePlatformConfig.h",
    "${silabs_platform_dir}/CHIPDevicePlatformConfig.h",
    "${silabs_platform_dir}/CHIPDevicePlatformEvent.h",
    "${silabs_platform_dir}/CHIPMem-Platform.cpp",
    "${silabs_platform_dir}/CHIPPlatformConfig.h",
    "${silabs_platform_dir}/ConfigurationManagerImpl.cpp",
    "${silabs_platform_dir}/ConfigurationManagerImpl.h",
    "${silabs_platform_dir}/ConnectivityManagerImpl.h",
    "${silabs_platform_dir}/DiagnosticDataProviderImpl.cpp",
    "${silabs_platform_dir}/DiagnosticDataProviderImpl.h",
    "${silabs_platform_dir}/InetPlatformConfig.h",
    "${silabs_platform_dir}/KeyValueStoreManagerImpl.cpp",
    "${silabs_platform_dir}/KeyValueStoreManagerImpl.h",
    "${silabs_platform_dir}/Logging.cpp",
    "${silabs_platform_dir}/MigrationManager.cpp",
    "${silabs_platform_dir}/MigrationManager.h",
    "${silabs_platform_dir}/PlatformManagerImpl.h",
    "${silabs_platform_dir}/SilabsConfig.cpp",
    "${silabs_platform_dir}/SilabsConfig.h",
    "${silabs_platform_dir}/SystemPlatformConfig.h",
    "${silabs_platform_dir}/platformAbstraction/SilabsPlatform.h",
    "${silabs_platform_dir}/platformAbstraction/SilabsPlatformBase.h",
    "${silabs_platform_dir}/platformAbstraction/WiseMcuSpam.cpp",
    "../../FreeRTOS/SystemTimeSupport.cpp",
    "../../SingletonConfigurationManager.cpp",
    "../rs911x/BLEManagerImpl.cpp",
    "../rs911x/rsi_ble_config.h",
    "../rs911x/wfx_sl_ble_init.c",
    "../rs911x/wfx_sl_ble_init.h",
    "PlatformManagerImpl.cpp",
  ]

  if (chip_enable_ota_requestor) {
    sources += [
      "${silabs_platform_dir}/OTAImageProcessorImpl.h",
      "OTAImageProcessorImpl.cpp",
    ]
  }

  public_deps = [
    "${chip_root}/src/app/icd/server:icd-server-config",
    "${chip_root}/src/platform:platform_base",
  ]
  deps = [ "${chip_root}/src/platform/logging:headers" ]

  # Add platform crypto implementation
  if (chip_crypto == "platform") {
    sources += [ "CHIPCryptoPALTinyCrypt.cpp" ]
    public_deps += [
      "${chip_root}/src/crypto",
      "${mbedtls_root}:mbedtls",
    ]
  }

  sources += [
    "${silabs_platform_dir}/ConnectivityManagerImpl_WIFI.cpp",
    "${silabs_platform_dir}/NetworkCommissioningWiFiDriver.cpp",
    "${silabs_platform_dir}/NetworkCommissioningWiFiDriver.h",
    "wifi/wfx_host_events.h",
    "wifi/wfx_msgs.h",
    "wifi/wifi_config.h",
  ]
  public_configs = [ ":siwx917-platform-wifi-config" ]
}
