# 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("//build_overrides/pigweed.gni")
import("${chip_root}/src/platform/device.gni")

import("${bl702_sdk_build_root}/bl702_executable.gni")
import("${bl702_sdk_build_root}/bl702_sdk.gni")
import("${build_root}/config/defaults.gni")

import("${chip_root}/examples/common/pigweed/pigweed_rpcs.gni")

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

assert(current_os == "freertos")

bl702_project_dir = "${chip_root}/examples/lighting-app/bouffalolab/bl702"
examples_plat_dir = "${chip_root}/examples/platform/bouffalolab/bl702"

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

  config_cache_size = 8192

  # Monitor & log memory usage at runtime.
  enable_heap_monitoring = false

  board = "BL706-IoT-DVK"
  module_type = "BL706C-22"
  enable_psram = true
  baudrate = 2000000

  setupPinCode = 20202021
  setupDiscriminator = 3840
  OTA_periodic_query_timeout = 86400
}

bl702_sdk("sdk") {
  include_dirs = [
    "${chip_root}/src/platform/bouffalolab/BL702",
    "${bl702_project_dir}/include",
    "${examples_plat_dir}",
  ]

  freertos_config = "${bl702_project_dir}/include/FreeRTOSConfig.h"

  defines = [
    "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) {
    defines += [ "PW_RPC_ENABLED=1" ]
    defines += [ "DISABLE_PRINT=1" ]
  }
}

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

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

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

  if ("BL706-NIGHT-LIGHT" == board) {
    defines += [ "APP_BOARD_LED_STATUS=0" ]
    defines += [ "BL706_NIGHT_LIGHT" ]
    defines += [ "APP_BOARD_BTN=0" ]
  } else if ("BL702-IoT-DVK" == board || "BL706-IoT-DVK" == board) {
    defines += [ "APP_BOARD_LED_STATUS=1" ]
    defines += [ "APP_BOARD_BTN=1" ]
  }

  sources = [
    "${bl702_project_dir}/src/AppTask.cpp",
    "${bl702_project_dir}/src/ZclCallbacks.cpp",
    "${bl702_project_dir}/src/main.cpp",
    "${examples_plat_dir}/LEDWidget.cpp",
    "${examples_plat_dir}/demo_pwm.c",
    "${examples_plat_dir}/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 = [ "include" ]

  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/bl702/PigweedLoggerMutex.cpp",
      "${examples_plat_dir}/PigweedLogger.cpp",
      "${examples_plat_dir}/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/bl702/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_dir}/pw_sys_io:pw_sys_io_bl702",
    ]

    deps += pw_build_LINK_DEPS

    include_dirs += [
      "${chip_root}/examples/common",
      "${chip_root}/examples/common/pigweed/bouffalolab/bl702",
    ]
  } 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_dir}/MemMonitoring.cpp" ]
    defines += [ "HEAP_MONITORING=1" ]
  }

  if (chip_enable_ota_requestor) {
    defines += [ "BL702_OTA_ENABLED" ]
    sources += [ "${examples_plat_dir}/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" ]
}
