# Set variables.
set(lpc54018_dir "${AFR_VENDORS_DIR}/nxp/LPC54018")
set(lpc54018iotmodule_dir "${AFR_VENDORS_DIR}/nxp/boards/lpc54018iotmodule")

set(lpc54018_ports_dir "${lpc54018iotmodule_dir}/ports")

if(AFR_IS_TESTING)
    set(lpc54018_aws_dir "${lpc54018iotmodule_dir}/aws_tests")
else()
    set(lpc54018_aws_dir "${lpc54018iotmodule_dir}/aws_demos")
endif()

# Include IDE specific cmake file.
if(${AFR_TOOLCHAIN} STREQUAL "arm-gcc")
    include("${CMAKE_CURRENT_LIST_DIR}/mcuxpresso.cmake")
elseif(${AFR_TOOLCHAIN} STREQUAL "arm-iar")
    include("${CMAKE_CURRENT_LIST_DIR}/iar.cmake")
elseif(NOT AFR_METADATA_MODE)
    message( FATAL_ERROR "The toolchain is not supported." )
endif()

# -------------------------------------------------------------------------------------------------
# FreeRTOS Console metadata
# -------------------------------------------------------------------------------------------------

afr_set_board_metadata(ID "NXP-LPC54018-IoT-Module")
afr_set_board_metadata(DISPLAY_NAME "LPC54018 IoT Module")
afr_set_board_metadata(DESCRIPTION "Development kit for ARM® Cortex®-M4 based LPC54018 MCU")
afr_set_board_metadata(VENDOR_NAME "NXP")
afr_set_board_metadata(FAMILY_NAME "LPC5401x_54S0xx")
afr_set_board_metadata(CODE_SIGNER "null")
afr_set_board_metadata(DATA_RAM_MEMORY "360KB")
afr_set_board_metadata(PROGRAM_MEMORY "128MB")
afr_set_board_metadata(SUPPORTED_IDE "IAREmbeddedWorkbench;MCUXpresso")
afr_set_board_metadata(RECOMMENDED_IDE "IAREmbeddedWorkbench")
afr_set_board_metadata(IDE_IAREmbeddedWorkbench_NAME "IAR Embedded Workbench")
afr_set_board_metadata(IDE_IAREmbeddedWorkbench_COMPILER "IAR")
afr_set_board_metadata(IDE_MCUXpresso_NAME "MCUXpresso")
afr_set_board_metadata(IDE_MCUXpresso_COMPILER "GCC")
afr_set_board_metadata(KEY_IMPORT_PROVISIONING "TRUE")
afr_set_board_metadata(IS_ACTIVE "TRUE")
afr_set_board_metadata(IDE_IAREmbeddedWorkbench_PROJECT_LOCATION "${AFR_ROOT_DIR}/projects/nxp/lpc54018iotmodule/iar/aws_demos")
afr_set_board_metadata(IDE_MCUXpresso_PROJECT_LOCATION "${AFR_ROOT_DIR}/projects/nxp/lpc54018iotmodule/mcuxpresso/aws_demos")
afr_set_board_metadata(AWS_DEMOS_CONFIG_FILES_LOCATION "${AFR_ROOT_DIR}/vendors/nxp/boards/lpc54018iotmodule/aws_demos/config_files")

# -------------------------------------------------------------------------------------------------
# Compiler settings
# -------------------------------------------------------------------------------------------------
afr_mcu_port(compiler)

# Compiler defined symbols.
target_compile_definitions(
    AFR::compiler::mcu_port
    INTERFACE $<$<NOT:$<COMPILE_LANGUAGE:ASM>>:${compiler_defined_symbols}>
)

# Compiler flags.
target_compile_options(
    AFR::compiler::mcu_port
    INTERFACE
        $<$<COMPILE_LANGUAGE:C>:${compiler_flags}>
)

# Assembler flags
target_compile_options(
    AFR::compiler::mcu_port
    INTERFACE
        $<$<COMPILE_LANGUAGE:ASM>:${assembler_flags}>
)

# Linker flags
target_link_options(
    AFR::compiler::mcu_port
    INTERFACE
        ${linker_flags}
)

target_link_directories(
    AFR::compiler::mcu_port
    INTERFACE
         "${link_directories}"
)

target_link_libraries(
    AFR::compiler::mcu_port
    INTERFACE
        "${link_dependent_libs}"
)

target_include_directories(
    AFR::compiler::mcu_port
    INTERFACE
        "${lpc54018_aws_dir}/config_files"
)

# -------------------------------------------------------------------------------------------------
# FreeRTOS portable layers
# -------------------------------------------------------------------------------------------------


afr_glob_src(lpc54018_src DIRECTORY "${lpc54018_dir}")

afr_glob_src(usb_device_src DIRECTORY "${lpc54018_dir}/middleware/usb/device")

# All sources files under wifi_qca are needed
afr_glob_src(wifi_qca_src DIRECTORY "${lpc54018_dir}/middleware/wifi_qca" RECURSE)

set(usb_osa_src
    ${lpc54018_dir}/middleware/usb/osa/usb_osa_freertos.c
)

set(utilities_src
    ${lpc54018_dir}/utilities/str/fsl_str.c
    ${lpc54018_dir}/utilities/log/fsl_log.c
    ${lpc54018_dir}/utilities/io/swo/fsl_swo.c
    ${lpc54018_dir}/utilities/io/fsl_io.c
    ${lpc54018_dir}/utilities/fsl_assert.c
    ${lpc54018_dir}/utilities/fsl_debug_console.c
    ${lpc54018_dir}/utilities/usb_device_cdc_acm.c
    ${lpc54018_dir}/utilities/usb_device_ch9.c
    ${lpc54018_dir}/utilities/usb_device_descriptor.c
    ${lpc54018_dir}/utilities/virtual_com.c
)

set(drivers_src
    ${lpc54018_dir}/drivers/fsl_clock.c
    ${lpc54018_dir}/drivers/fsl_common.c
    ${lpc54018_dir}/drivers/fsl_dma.c
    ${lpc54018_dir}/drivers/fsl_emc.c
    ${lpc54018_dir}/drivers/fsl_flexcomm.c
    ${lpc54018_dir}/drivers/fsl_gpio.c
    ${lpc54018_dir}/drivers/fsl_inputmux.c
    ${lpc54018_dir}/drivers/fsl_pint.c
    ${lpc54018_dir}/drivers/fsl_power.c
    ${lpc54018_dir}/drivers/fsl_reset.c
    ${lpc54018_dir}/drivers/fsl_sha.c
    ${lpc54018_dir}/drivers/fsl_spi.c
    ${lpc54018_dir}/drivers/fsl_spi_dma.c
    ${lpc54018_dir}/drivers/fsl_spifi.c
    ${lpc54018_dir}/drivers/fsl_spifi_dma.c
    ${lpc54018_dir}/drivers/fsl_usart.c
    ${lpc54018_dir}/drivers/mflash_drv.c
    ${lpc54018_dir}/drivers/mflash_file.c
)

set(lpc54018_includes
    "${lpc54018_dir}"
    "${lpc54018_dir}/drivers"
    "${lpc54018_dir}/cmsis_drivers"
    "${lpc54018_dir}/middleware/wifi_qca"
    "${lpc54018_dir}/middleware/wifi_qca/common_src/hcd"
    "${lpc54018_dir}/middleware/wifi_qca/common_src/include"
    "${lpc54018_dir}/middleware/wifi_qca/common_src/stack_common"
    "${lpc54018_dir}/middleware/wifi_qca/common_src/wmi"
    "${lpc54018_dir}/middleware/wifi_qca/custom_src/include"
    "${lpc54018_dir}/middleware/wifi_qca/custom_src/stack_custom"
    "${lpc54018_dir}/middleware/wifi_qca/include"
    "${lpc54018_dir}/middleware/wifi_qca/include/AR6002"
    "${lpc54018_dir}/middleware/wifi_qca/include/AR6002/hw2.0/hw"
    "${lpc54018_dir}/middleware/wifi_qca/port"
    "${lpc54018_dir}/middleware/wifi_qca/port/boards/lpc54018iotmodule/freertos"
    "${lpc54018_dir}/middleware/wifi_qca/port/boards/lpc54018iotmodule/freertos/gt202"
    "${lpc54018_dir}/middleware/wifi_qca/port/drivers/flexcomm_freertos"
    "${lpc54018_dir}/middleware/wifi_qca/port/env/freertos"
    "${lpc54018_dir}/middleware/usb/device"
    "${lpc54018_dir}/middleware/usb/include"
    "${lpc54018_dir}/middleware/usb/osa"
    "${lpc54018_dir}/utilities"
    "${lpc54018_dir}/utilities/io"
    "${lpc54018_dir}/utilities/log"
    "${lpc54018_dir}/utilities/str"
    "${lpc54018_dir}/CMSIS/Include"
)

# Kernel
afr_mcu_port(kernel)

target_sources(
    AFR::kernel::mcu_port
    INTERFACE
        ${lpc54018_src}
        ${drivers_src}
        ${usb_device_src}
        ${usb_osa_src}
        ${wifi_qca_src}
        ${utilities_src}
        "${AFR_KERNEL_DIR}/portable/MemMang/heap_4.c"
        # Compiler specific source files.
        ${compiler_specific_src}
)

set(kernel_inc_dirs
    ${lpc54018_includes}
    "${AFR_KERNEL_DIR}/include"
    "${lpc54018_aws_dir}/config_files"
    "${lpc54018_aws_dir}/application_code/nxp_code"
    "$<IF:${AFR_IS_TESTING},${AFR_TESTS_DIR},${AFR_DEMOS_DIR}>/include"
    # Compiler specific includes.
    ${compiler_specific_include}
)

target_include_directories(
    AFR::kernel::mcu_port
    INTERFACE $<$<NOT:$<COMPILE_LANGUAGE:ASM>>:${kernel_inc_dirs}>
)

# POSIX

afr_mcu_port(posix)

target_sources(
    AFR::posix::mcu_port
    INTERFACE "${lpc54018_ports_dir}/posix/FreeRTOS_POSIX_portable.h"
)

target_include_directories(
    AFR::posix::mcu_port
    INTERFACE "${lpc54018_ports_dir}/posix"
)

target_link_libraries(
    AFR::posix::mcu_port
    INTERFACE AFR::freertos_plus_posix
)

# WiFi
afr_mcu_port(wifi)
target_sources(
    AFR::wifi::mcu_port
    INTERFACE "${lpc54018_ports_dir}/wifi/iot_wifi.c"
)

# PKCS11
afr_mcu_port(pkcs11_implementation)
target_sources(
    AFR::pkcs11_implementation::mcu_port
    INTERFACE
        "${lpc54018_ports_dir}/pkcs11/core_pkcs11_pal.c"
        "${lpc54018_ports_dir}/pkcs11/hw_poll.c"
)

target_link_libraries(
    AFR::pkcs11_implementation::mcu_port
    INTERFACE
        3rdparty::mbedtls
        AFR::pkcs11_mbedtls
        AFR::crypto
)

# Secure sockets
afr_mcu_port(secure_sockets)
target_link_libraries(
    AFR::secure_sockets::mcu_port
    INTERFACE
        AFR::tls
        AFR::wifi
)

target_sources(
    AFR::secure_sockets::mcu_port
    INTERFACE "${lpc54018_ports_dir}/secure_sockets/iot_secure_sockets.c"
)

# -------------------------------------------------------------------------------------------------
# FreeRTOS demos and tests
# -------------------------------------------------------------------------------------------------
set(CMAKE_EXECUTABLE_SUFFIX ${executable_suffix})

if(AFR_IS_TESTING)
    set(exe_target aws_tests)
else()
    set(exe_target aws_demos)
endif()

afr_glob_src(board_code_src DIRECTORY "${lpc54018_aws_dir}/application_code/nxp_code")
afr_glob_src(config_files_src DIRECTORY "${lpc54018_aws_dir}/config_files")

# Do not add demos or tests if they're turned off.
if(AFR_ENABLE_DEMOS OR AFR_ENABLE_TESTS)
    add_executable(${exe_target}
        ${board_code_src}
        ${config_files_src}
        "${lpc54018_aws_dir}/application_code/main.c"
        # TODO, It is unknown why hw_poll.c has to be included here
        "${lpc54018_ports_dir}/pkcs11/hw_poll.c"
    )
    target_link_libraries(
        ${exe_target}
        PRIVATE
            AFR::wifi
            AFR::utils
    )
endif()

if(NOT AFR_METADATA_MODE)
    message(FATAL_ERROR "CMake support for nxp is not complete yet.")
endif()