cmake_minimum_required(VERSION 3.20)

set(PICOTOOL_FETCH_FROM_GIT on)
set(PICO_SDK_FETCH_FROM_GIT on)
include(pico_sdk_import.cmake)

project(core_p05 C CXX ASM)
set(CMAKE_C_STANDARD 11)
set(BASE_APP pico)

# IMPORTANT CORRECT IMAGE FOR RP2040 IS [program_name].uf2
pico_sdk_init()

add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/../sensors sensors-build)

include_directories(
        # Project specific libraries
        ${PROJECT_SOURCE_DIR}/../sensors/lib/ultrasonic_radar
        ${PROJECT_SOURCE_DIR}/lib/vl53l1x
        # WH-290 modules
        ${PROJECT_SOURCE_DIR}/../sensors/lib/bmp180
        ${PROJECT_SOURCE_DIR}/../sensors/lib/qmc5883l
        ${PROJECT_SOURCE_DIR}/../sensors/lib/mpu6050
        # LSM303 module
        ${PROJECT_SOURCE_DIR}/../sensors/lib/lsm303
        # system specific
        ${PROJECT_SOURCE_DIR}/../sensors/lib/ncu
        # filters
        ${PROJECT_SOURCE_DIR}/../sensors/lib/filters
        # asciiDisplay
        ${PROJECT_SOURCE_DIR}/../sensors/lib/asciiDisplay
        # motors
        ${PROJECT_SOURCE_DIR}/../sensors/lib/pwm_motors
        # GNSS
        ${PROJECT_SOURCE_DIR}/../sensors/lib/gnss
        # Pico helpers library
        ${PROJECT_SOURCE_DIR}/../sensors/lib/pico_related
        ${PROJECT_SOURCE_DIR}/../sensors/lib/dnsserver
        ${PROJECT_SOURCE_DIR}/../sensors/lib/dhcpserver
        # Base project executables
        ${PROJECT_SOURCE_DIR}/config
        ${PROJECT_SOURCE_DIR}/ai
        ${PROJECT_SOURCE_DIR}/
        # Test
        #${PROJECT_SOURCE_DIR}/tests
)
#[[include_directories(
        ${PROJECT_SOURCE_DIR}/
)]]

file(GLOB SRCS
        # Project specific executables
        "${PROJECT_SOURCE_DIR}/../sensors/lib/ultrasonic_radar/*"
        "${PROJECT_SOURCE_DIR}/../sensors/lib/vl53l1x/*"
        # WH-290 modules
        "${PROJECT_SOURCE_DIR}/../sensors/lib/bmp180/*"
        "${PROJECT_SOURCE_DIR}/../sensors/lib/qmc5883l/*"
        "${PROJECT_SOURCE_DIR}/../sensors/lib/mpu6050/*"
        # LSM303 module
        "${PROJECT_SOURCE_DIR}/../sensors/lib/lsm303/*"
        # system specific
        "${PROJECT_SOURCE_DIR}/../sensors/lib/ncu/*"
        # filters
        "${PROJECT_SOURCE_DIR}/../sensors/lib/filters/*"
        # display i ascii for terminal / chars display
        "${PROJECT_SOURCE_DIR}/../sensors/lib/asciiDisplay/*"
        # motors
        "${PROJECT_SOURCE_DIR}/../sensors/lib/pwm_motors/*"
        # Pico helpers library
        "${PROJECT_SOURCE_DIR}/../sensors/lib/pico_related/*"
        "${PROJECT_SOURCE_DIR}/../sensors/lib/dnsserver/*"
        "${PROJECT_SOURCE_DIR}/../sensors/lib/dhcpserver/*"
        # gnss libs
        "${PROJECT_SOURCE_DIR}/../sensors/lib/gnss/*"
        # base project executables
        "${PROJECT_SOURCE_DIR}/config/*"
        "${PROJECT_SOURCE_DIR}/ai/*"
        "${PROJECT_SOURCE_DIR}/*"
        # Tests
        #"${PROJECT_SOURCE_DIR}/tests/*"
)

add_executable(${PROJECT_NAME} ${SRCS})

# PICO specific
if (TARGET tinyusb_device)
    # pull in common dependencies
    target_link_libraries(${PROJECT_NAME}
            pico_stdlib
            hardware_adc
            hardware_divider
            hardware_i2c
            hardware_pwm
            hardware_uart
    )

    # WIFI & BT
    if (PICO_BOARD STREQUAL "pico_w" OR PICO_BOARD STREQUAL "pico2_w")
        add_compile_definitions(HAS_WIFI_BT=1)
        if (PICO_BOARD STREQUAL "pico2_w")
            message("**** Target is Pico 2W ****")
        else ()
            message("**** Target is Pico W ****")
        endif ()
        target_link_libraries(${PROJECT_NAME}
                pico_cyw43_arch_lwip_threadsafe_background
                #pico_cyw43_arch_lwip_poll
        )
    else ()
        add_compile_definitions(HAS_WIFI_BT=0)
        if (PICO_BOARD STREQUAL "pico2")
            message("**** Target is Pico 2 ****")
        else ()
            message("**** Target is Pico ****")
        endif ()
    endif ()

    # SIO/USB enable usb output, disable uart output
    pico_enable_stdio_usb(${PROJECT_NAME} 1)    # USB SIO
    pico_enable_stdio_uart(${PROJECT_NAME} 0)   # UART SIO

    # create map/bin/hex/uf2 file etc.
    pico_add_extra_outputs(${PROJECT_NAME})

    # add url via pico_set_program_url
    #example_auto_set_url(${PROJECT_NAME})
elseif (PICO_ON_DEVICE)
    message(WARNING "not building ${PROJECT_NAME} because TinyUSB submodule is not initialized in the SDK")
endif ()
#set_target_properties(${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "-save-temps")
set_target_properties(${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "-save-temps -Ofast")


# Usage for future:
# *** [setup enviroment] ***
# This CmakeLists.txt downloads the Pico SDK and PicoTool from the official GitHub repository.
#
# For Pico RP2350 add to CMake Option:
# -DPICO_BOARD=pico2
# For Pico RP2350 W add to CMake Option:
# -DPICO_BOARD=pico2_w
# for Pico W add to CMake Option:
# -DPICO_BOARD=pico_w -DWIFI_SSID="network_name" -DWIFI_PASSWORD="password".
# and copy file lwipopts.h to root of the project.
#
# *** [SERIAL communication] ***
# use GTKTerm for serial communication
# sudo apt-get install gtkterm
# gtkterm -p /dev/ttyACM0 -s 9600
#
# TODO
# *** [Debugger]
