# 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

  # PIN code for PASE session establishment.
  setupPinCode = 20202021

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

  # OTA periodic query timeout in seconds
  ota_periodic_query_timeout = 86400

  board = "BL602-IoT-Matter-V1"

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

  print(defines)
  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" ]
}
