cmake_minimum_required(VERSION 3.22)
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS ON)

# Define the build type
if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE "Debug")
endif()

# Set the project name
set(CMAKE_PROJECT_NAME blinky)

# Enable compile command to ease indexing with e.g. clangd
set(CMAKE_EXPORT_COMPILE_COMMANDS TRUE)

# Core project settings
project(${CMAKE_PROJECT_NAME})
message("Build type: " ${CMAKE_BUILD_TYPE})

# Enable CMake support for ASM and C languages
enable_language(C ASM)

# Create an executable object type
add_executable(${CMAKE_PROJECT_NAME})

target_sources(${CMAKE_PROJECT_NAME} PRIVATE
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../src/common/cpu_endian.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../src/common/os_port_none.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../src/common/date_time.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../src/common/str.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../src/common/path.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../src/common/resource_manager.c

        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../src/cyclone_boot/core/mailbox.c

        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/boards2/stm32h750b_discovery/stm32h750b_discovery.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/boards2/stm32h750b_discovery/stm32h750b_discovery_bus.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/boards2/stm32h750b_discovery/stm32h750b_discovery_lcd.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/boards2/stm32h750b_discovery/stm32h750b_discovery_sdram.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/boards2/Utilities/lcd/stm32_lcd.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/boards2/Components/ft5336/ft5336.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/boards2/Components/ft5336/ft5336_reg.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/boards2/Components/mt48lc4m32b2/mt48lc4m32b2.c

        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_dma2d.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_ltdc.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_sdram.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_ll_fmc.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_qspi.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_cortex.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_rcc.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_rcc_ex.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_flash.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_flash_ex.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_gpio.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_hsem.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_dma.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_dma_ex.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_mdma.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_pwr.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_pwr_ex.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_i2c.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_i2c_ex.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_exti.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_tim.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_tim_ex.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_uart.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/src/stm32h7xx_hal_uart_ex.c

        ${CMAKE_CURRENT_SOURCE_DIR}/startup_stm32h750xbhx.s
        ${CMAKE_CURRENT_SOURCE_DIR}/syscalls.c
        ${CMAKE_CURRENT_SOURCE_DIR}/sysmem.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../src/system_stm32h7xx.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../src/stm32h7xx_hal_msp.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../src/stm32h7xx_it.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../src/main.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../src/debug.c
)

target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE
        ${CMAKE_CURRENT_SOURCE_DIR}/../src
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/cmsis/include
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/devices/stm32h7xx
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/inc
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/drivers/stm32h7xx_hal_driver/inc/legacy
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/boards2/stm32h750b_discovery
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/boards2/utilities/
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/boards2/utilities/lcd
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/boards2/utilities/Fonts
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/boards2/components
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/boards2/components/Common
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/boards2/components/ft5336
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/boards2/components/mt48lc4m32b2
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party/st/boards2/components/rk043fn48h
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../src/common
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../src/cyclone_boot
)

target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE
    STM32H750xx
    APPLICATION_ADDRESS=0x90000000U
    USE_HAL_DRIVER
    USE_STM32H750B_DISCO
    USE_PWR_LDO_SUPPLY
    __USE_C99_MATH

    $<$<CONFIG:Debug>:DEBUG>
)


# Add the map file to the list of files to be removed with 'clean' target
set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES ADDITIONAL_CLEAN_FILES ${CMAKE_PROJECT_NAME}.map)

# Convert .elf to .bin
add_custom_command(TARGET ${CMAKE_PROJECT_NAME} POST_BUILD
        COMMAND ${CMAKE_OBJCOPY} -O binary
        ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}.elf
        ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}.bin
        COMMENT "Generating binary file from ELF"
)


# Copy the generated .bin file to ../
add_custom_command(TARGET ${CMAKE_PROJECT_NAME} POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy
            ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}.bin
            ${CMAKE_CURRENT_SOURCE_DIR}/../
    COMMENT "Copying ${CMAKE_PROJECT_NAME}.bin to parent directory"
)

add_custom_command(TARGET ${CMAKE_PROJECT_NAME} POST_BUILD
        COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../tools/ImageBuilder/bin/image_builder_windows
        --input ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}.bin
        --output ${CMAKE_CURRENT_SOURCE_DIR}/../${CMAKE_PROJECT_NAME}.img.bin
        --vtor-align

        COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../tools/ImageBuilder/bin/image_builder_windows
        --input ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}.bin
        --output ${CMAKE_CURRENT_SOURCE_DIR}/../${CMAKE_PROJECT_NAME}_update.img
        --enc-algo aes-cbc
        --enc-key aa3ff7d43cc015682c7dfd00de9379e7
        --sign-algo rsa-sha256
        --sign-key ${CMAKE_SOURCE_DIR}/../resources/keys/rsa_private_key.pem
        --vtor-align

        COMMENT "Generating ${CMAKE_PROJECT_NAME} images using ImageBuilder"
)
