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

import("${bl602_sdk_build_root}/bl602_executable.gni")
import("${bl602_sdk_build_root}/bl602_sdk.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/bl602"
examples_plat_common_dir = "${chip_root}/examples/platform/bouffalolab/common"
examples_plat_dir = "${chip_root}/examples/platform/bouffalolab/bl602"

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

  # OTA periodic query timeout in seconds
  ota_periodic_query_timeout = 86400

  enable_heap_monitoring = false

  setupPinCode = 20202021
  setupDiscriminator = 3840

  board = "BL602-IoT-Matter-V1"
  module_type = "BL602"
  baudrate = 2000000
}

bl602_sdk("sdk") {
  include_dirs = [
    "${chip_root}/src/platform/bouffalolab/BL602",
    "${example_dir}",
    "${example_dir}/include",
  ]

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

  defines = [
    "INCLUDE_xSemaphoreGetMutexHolder=1",
    "OTA_PERIODIC_TIMEOUT=${ota_periodic_query_timeout}",
    "CHIP_DEVICE_CONFIG_USE_TEST_SETUP_PIN_CODE=${setupPinCode}",
    "OTA_PERIODIC_QUERY_TIMEOUT=${ota_periodic_query_timeout}",
    "CHIP_UART_BAUDRATE=${baudrate}",
  ]

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

bl602_executable("lighting_app") {
  output_name = "chip-bl602-lighting-example.out"

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

  sources = [
    "${examples_plat_dir}/route_hook/bl_route_hook.c",
    "${examples_plat_dir}/route_hook/bl_route_table.c",
  ]

  if ("BL602-IoT-Matter-V1" == board) {
    defines += [ "BL602_IoT_Matter_V1" ]
  } else if ("BL602-NIGHT-LIGHT" == board) {
    defines += [ "BL602_NIGHT_LIGHT" ]
  } else if ("BL602-IOT-DVK-3S" == board) {
    defines += [ "BL602_IOT_DVK_3S" ]
  }

  sources += [
    "${example_common_dir}/AppTask.cpp",
    "${example_common_dir}/ZclCallbacks.cpp",
    "${examples_plat_common_dir}/plat/LEDWidget.cpp",
    "${examples_plat_common_dir}/plat/aos_task.c",
    "${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/common/QRCode",
    "${chip_root}/examples/lighting-app/lighting-common",
    "${chip_root}/examples/providers:device_info_provider",
    "${chip_root}/src/lib",
    "${chip_root}/src/setup_payload",
  ]

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

  if (chip_enable_pw_rpc) {
    defines += [
      "PW_RPC_ENABLED",
      "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_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_kvs:crc16",
      "$dir_pw_log",
      "$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",
      "${examples_plat_common_dir}/rpc/pw_sys_io:pw_sys_io",
    ]

    public_deps = [
      "$dir_pw_checksum",
      "$dir_pw_kvs",
    ]

    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=1" ]

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

  ldscript = "${examples_plat_dir}/ldscripts/flash_rom.ld"

  ldflags = [ "-T" + rebase_path(ldscript, root_build_dir) ]

  inputs = [ ldscript ]

  if (chip_print_memory_usage) {
    ldflags += [
      "-Wl,--print-memory-usage",
      "-fstack-usage",
    ]
  }

  output_dir = root_out_dir
}

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

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