# 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("${bouffalolab_iot_sdk_build_root}/bl602/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/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
}

bl_iot_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}",
    "SYS_AOS_LOOP_ENABLE",
  ]

  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-bl602-lighting-example.out"

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

  bl_plat_name = "bl602"
  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/platform.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" ]
  }

  cflags_c = [ "-Wno-sign-compare" ]
  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" ]
}
