# 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/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" ]
}
