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

import("${build_root}/config/defaults.gni")
import("${chip_root}/src/platform/device.gni")
import("${p6_sdk_build_root}/p6_executable.gni")
import("${p6_sdk_build_root}/p6_sdk.gni")

assert(current_os == "freertos")

p6_project_dir = "${chip_root}/examples/lighting-app/p6"
examples_plat_dir = "${chip_root}/examples/platform/p6"

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

  # PIN code for PASE session establishment.
  setup_pin_code = 20202021

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

  # Build update app
  build_update_image = false
}

config("p6_ota_config") {
  linker_script = "${p6_sdk_root}/ota/cy8c6xxa_cm4_dual_ota_int.ld"

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

  ldflags += [ "-Wl,--defsym,MCUBOOT_HEADER_SIZE=0x400,--defsym,MCUBOOT_BOOTLOADER_SIZE=0x18000,--defsym,CY_BOOT_PRIMARY_1_SIZE=0x1C0000" ]

  defines = [
    "P6_OTA",
    "OTA_SUPPORT ",
    "OTA_USE_EXTERNAL_FLASH",
    "CY_BOOT_USE_EXTERNAL_FLASH",
    "MCUBOOT_HEADER_SIZE=0x400",
    "MCUBOOT_MAX_IMG_SECTORS=3584",
    "CY_BOOT_SCRATCH_SIZE=0x00004000",
    "MCUBOOT_BOOTLOADER_SIZE=0x00018000",
    "CY_BOOT_BOOTLOADER_SIZE=0x00018000",
    "CY_BOOT_PRIMARY_1_START=0x00018000",
    "CY_BOOT_PRIMARY_1_SIZE=0x1C0000",
    "CY_BOOT_SECONDARY_1_START=0x00000000",
    "CY_BOOT_SECONDARY_1_SIZE=0x001C0000",
    "CY_FLASH_ERASE_VALUE=0xFF",
    "MCUBOOT_IMAGE_NUMBER=1",
    "MCUBOOT_SLOT_SIZE=0x1C0000",
    "MCUBOOT_SCRATCH_SIZE=0x4000",
    "MCUBOOT_SECTOR_SIZE = 512",
    "APP_VERSION_MAJOR=1",
    "APP_VERSION_MINOR=0",
    "APP_VERSION_BUILD=0",
    "MCUBOOT_OVERWRITE_ONLY",
    "CY_ENABLE_XIP_PROGRAM",
  ]

  if (build_update_image) {
    defines += [ "CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION=2" ]
  } else {
    defines += [ "CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION=1" ]
  }
}

p6_sdk_sources("lighting_app_sdk_sources") {
  include_dirs = [
    "${chip_root}/src/platform/P6",
    "${p6_project_dir}/include",
    "${examples_plat_dir}",
  ]

  defines = [
    "BOARD_ID=${p6_board}",
    "P6_LOG_ENABLED=1",
    "CHIP_DEVICE_CONFIG_USE_TEST_SETUP_PIN_CODE=${setup_pin_code}",
  ]

  sources = [ "${p6_project_dir}/include/CHIPProjectConfig.h" ]
  public_configs = [ "${chip_root}/third_party/p6:p6_sdk_config" ]

  if (chip_enable_ota_requestor) {
    sources += [
      "${p6_sdk_root}/libs/anycloud-ota/source/mcuboot/bootutil/src/bootutil_misc.c",
      "${p6_sdk_root}/libs/anycloud-ota/source/mcuboot/cy_flash_pal/cy_flash_map.c",
      "${p6_sdk_root}/libs/anycloud-ota/source/mcuboot/cy_flash_pal/cy_flash_psoc6.c",
      "${p6_sdk_root}/libs/anycloud-ota/source/mcuboot/cy_flash_pal/cy_smif_psoc6.c",
      "${p6_sdk_root}/libs/anycloud-ota/source/mcuboot/cy_flash_pal/mem_config/mem_config_sfdp.c",
    ]
    include_dirs += [
      "${p6_sdk_root}/ota/config",
      "${p6_sdk_root}/libs/anycloud-ota/source/mcuboot/cy_flash_pal/",
      "${p6_sdk_root}/libs/anycloud-ota/source/mcuboot/cy_flash_pal/mem_config/",
      "${p6_sdk_root}/libs/anycloud-ota/source/mcuboot/cy_flash_pal/include/",
      "${p6_sdk_root}/libs/anycloud-ota/source/mcuboot/cy_flash_pal/include/flash_map_backend/",
      "${p6_sdk_root}/libs/anycloud-ota/source/mcuboot/",
      "${p6_sdk_root}/libs/anycloud-ota/source/mcuboot/sysflash/",
      "${p6_sdk_root}/libs/anycloud-ota/source/mcuboot/bootutil/include",
    ]
    public_configs += [ ":p6_ota_config" ]
  }
}

p6_executable("lighting_app") {
  include_dirs = []
  defines = []
  output_name = "chip-p6-lighting-example.out"

  sources = [
    "${examples_plat_dir}/LEDWidget.cpp",
    "${examples_plat_dir}/init_p6Platform.cpp",
    "src/AppTask.cpp",
    "src/ButtonHandler.cpp",
    "src/LightingManager.cpp",
    "src/ZclCallbacks.cpp",
    "src/main.cpp",
  ]

  deps = [
    ":lighting_app_sdk_sources",
    "${chip_root}/examples/common/QRCode",
    "${chip_root}/examples/lighting-app/lighting-common",
    "${chip_root}/src/lib",
    "${chip_root}/src/setup_payload",
  ]

  include_dirs += [
    "include",
    "${examples_plat_dir}",
    "${p6_project_dir}/include",
  ]

  defines = []

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

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

  output_dir = root_out_dir
}

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

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