# 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/bouffalolab_iot_sdk.gni")
import("//build_overrides/build.gni")
import("//build_overrides/chip.gni")

import("${bouffalolab_iot_sdk_build_root}/bl702/bl_iot_sdk.gni")
import("${bouffalolab_iot_sdk_build_root}/common/bouffalolab_executable.gni")
import("${build_root}/config/defaults.gni")
import("${chip_root}/examples/common/pigweed/pigweed_rpcs.gni")
import("${chip_root}/src/platform/device.gni")

if (chip_enable_pw_rpc) {
  import("//build_overrides/pigweed.gni")
  import("$dir_pw_build/target_types.gni")
}

assert(current_os == "freertos")

example_common_dir = "${chip_root}/examples/lighting-app/bouffalolab/common"
example_dir = "${chip_root}/examples/lighting-app/bouffalolab/bl702"
examples_plat_common_dir = "${chip_root}/examples/platform/bouffalolab/common"
examples_plat_dir = "${chip_root}/examples/platform/bouffalolab/bl702"

declare_args() {
  # Dump memory usage at link time.
  chip_print_memory_usage = true

  # OTA periodic query timeout in seconds
  ota_periodic_query_timeout = 86400

  config_cache_size = 8192

  enable_heap_monitoring = false

  setupPinCode = 20202021
  setupDiscriminator = 3840

  board = "XT-ZB6-DevKit"
  module_type = "BL706C-22"
  enable_psram = true
  baudrate = 2000000
}

bl_iot_sdk("sdk") {
  include_dirs = [
    "${example_dir}",
    "${example_common_dir}",
  ]

  freertos_config = "${examples_plat_dir}/FreeRTOSConfig.h"

  defines = [
    "INCLUDE_xSemaphoreGetMutexHolder=1",
    "CHIP_DEVICE_CONFIG_USE_TEST_SETUP_PIN_CODE=${setupPinCode}",
    "CHIP_DEVICE_CONFIG_USE_TEST_SETUP_DISCRIMINATOR=${setupDiscriminator}",
    "OTA_PERIODIC_TIMEOUT=${ota_periodic_query_timeout}",
    "OPENTHREAD_CONFIG_PLATFORM_XTAL_ACCURACY=40",
    "PRINT_DEBUG=0",
  ]

  if ("BL706C-22" == module_type) {
    defines += [ "CFG_PSRAM_DUAL_BANK=1" ]
  }

  if (enable_psram) {
    defines += [ "CFG_USE_PSRAM=1" ]
  }

  if (chip_enable_pw_rpc) {
    include_dirs += [ "${examples_plat_common_dir}/rpc" ]
    defines += [ "PW_RPC_ENABLED=1" ]
    defines += [ "DISABLE_PRINT=1" ]
  } else if (chip_build_libshell) {
    include_dirs += [ "${examples_plat_common_dir}/plat" ]
  }
}

bouffalolab_executable("lighting_app") {
  output_name = "chip-bl702-lighting-example.out"
  bl_plat_name = "bl702"

  defines = [
    "APP_TASK_STACK_SIZE=2044",
    "CHIP_UART_BAUDRATE=${baudrate}",
    "BL702_ENABLE",
    "START_ENTRY=bl702_main",
  ]

  if (enable_psram) {
    defines += [ "CFG_USE_PSRAM=1" ]
  }

  if ("BL706C-22" == module_type) {
    defines += [ "BOARD_BTN_BOOT_PIN" ]
  }

  if ("XT-ZB6-DevKit" == board) {
    defines += [ "XT_ZB6_DevKit" ]
  } else if ("BL706-NIGHT-LIGHT" == board) {
    defines += [ "BL706_NIGHT_LIGHT" ]
  } else if ("BL702-IoT-DVK" == board || "BL706-IoT-DVK" == board) {
    defines += [ "BL706_IOT_DVK" ]
  }

  sources = [
    "${example_common_dir}/AppTask.cpp",
    "${example_common_dir}/ZclCallbacks.cpp",
    "${examples_plat_common_dir}/plat/LEDWidget.cpp",
    "${examples_plat_common_dir}/plat/demo_pwm.c",
    "${examples_plat_common_dir}/plat/main.cpp",
    "${examples_plat_common_dir}/plat/uart.c",
  ]

  deps = [
    ":sdk",
    "${chip_root}/examples/lighting-app/lighting-common",
    "${chip_root}/src/lib",
    "${chip_root}/src/setup_payload",
    "${chip_root}/third_party/openthread/platforms:libopenthread-platform",
    "${chip_root}/third_party/openthread/platforms:libopenthread-platform-utils",
  ]

  if (chip_openthread_ftd) {
    defines += [ "CHIP_DEVICE_CONFIG_THREAD_FTD=1" ]
    deps += [
      "${chip_root}/third_party/openthread/repo:libopenthread-cli-ftd",
      "${chip_root}/third_party/openthread/repo:libopenthread-ftd",
    ]
  } else {
    defines += [ "CHIP_DEVICE_CONFIG_THREAD_FTD=0" ]
    deps += [
      "${chip_root}/third_party/openthread/repo:libopenthread-cli-mtd",
      "${chip_root}/third_party/openthread/repo:libopenthread-mtd",
    ]
  }

  include_dirs = [
    "${chip_root}/src/platform/bouffalolab/BL702",
    "${example_common_dir}",
    "${examples_plat_common_dir}/plat",
  ]

  if (chip_enable_pw_rpc) {
    defines += [
      "PW_RPC_ENABLED=1",
      "PW_RPC_ATTRIBUTE_SERVICE=1",
      "PW_RPC_BUTTON_SERVICE=1",
      "PW_RPC_DESCRIPTOR_SERVICE=1",
      "PW_RPC_DEVICE_SERVICE=1",
      "PW_RPC_LIGHTING_SERVICE=1",

      "PW_RPC_OTCLI_SERVICE=1",
      "PW_RPC_THREAD_SERVICE=1",

      #"PW_RPC_TRACING_SERVICE=1",
    ]

    sources += [
      "${chip_root}/examples/common/pigweed/RpcService.cpp",
      "${chip_root}/examples/common/pigweed/bouffalolab/PigweedLoggerMutex.cpp",
      "${examples_plat_common_dir}/rpc/PigweedLogger.cpp",
      "${examples_plat_common_dir}/rpc/Rpc.cpp",
    ]

    deps += [
      "$dir_pw_hdlc:rpc_channel_output",
      "$dir_pw_stream:sys_io_stream",

      #"$dir_pw_trace",
      #"$dir_pw_trace_tokenized",
      #"$dir_pw_trace_tokenized:trace_rpc_service",
      "${chip_root}/config/bouffalolab/common/lib/pw_rpc:pw_rpc",
      "${chip_root}/examples/common/pigweed:attributes_service.nanopb_rpc",
      "${chip_root}/examples/common/pigweed:button_service.nanopb_rpc",
      "${chip_root}/examples/common/pigweed:descriptor_service.nanopb_rpc",
      "${chip_root}/examples/common/pigweed:device_service.nanopb_rpc",
      "${chip_root}/examples/common/pigweed:lighting_service.nanopb_rpc",
      "${chip_root}/examples/common/pigweed:ot_cli_service.nanopb_rpc",
      "${chip_root}/examples/common/pigweed:thread_service.nanopb_rpc",
      "${examples_plat_common_dir}/rpc/pw_sys_io:pw_sys_io",
    ]

    deps += pw_build_LINK_DEPS

    include_dirs += [
      "${chip_root}/examples/common",
      "${chip_root}/examples/common/pigweed/bouffalolab",
    ]
  } else if (chip_build_libshell) {
    defines += [ "CONFIG_ENABLE_CHIP_SHELL=${chip_build_libshell}" ]

    deps += [ "${chip_root}/examples/shell/shell_common:shell_common" ]

    include_dirs += [
      "${chip_root}/src/lib/shell",
      "${chip_root}/examples/shell/shell_common/include",
    ]
  }

  if (enable_heap_monitoring) {
    sources += [ "${examples_plat_common_dir}/plat/MemMonitoring.cpp" ]
    defines += [ "HEAP_MONITORING=1" ]
  }

  if (chip_enable_ota_requestor) {
    defines += [ "OTA_ENABLED" ]
    sources += [ "${examples_plat_common_dir}/plat/OTAConfig.cpp" ]
  }

  if (enable_psram) {
    ldscript = "${examples_plat_dir}/ldscripts/psram_flash.ld"
  } else {
    ldscript = "${examples_plat_dir}/ldscripts/flash.ld"
  }

  inputs = [ ldscript ]

  ldflags = [ "-T" + rebase_path(ldscript, root_build_dir) ]
  cflags_c = [
    "-Wno-unused-variable",
    "-Wno-old-style-declaration",
  ]
  cflags = [ "-Wno-unused-variable" ]
  if (chip_print_memory_usage) {
    ldflags += [
      "-Wl,--print-memory-usage",
      "-Wl,--defsym=__CACHE_SIZE=${config_cache_size}",
      "-fstack-usage",
    ]
  }

  output_dir = root_out_dir
}

group("bl702") {
  deps = [ ":lighting_app" ]
}

group("default") {
  deps = [ ":bl702" ]
}
