cmake_minimum_required(VERSION 3.13)

# Portable parser tests can run on a development machine without the Pico SDK.
option(HB_NATIVE_TESTS "Build native HB1 protocol tests only" OFF)
if(HB_NATIVE_TESTS)
    project(hardware_box_protocol_tests C)
    set(CMAKE_C_STANDARD 11)
    enable_testing()
    add_executable(protocol_test protocol.c tests/protocol_test.c)
    target_include_directories(protocol_test PRIVATE ${CMAKE_CURRENT_LIST_DIR})
    target_compile_options(protocol_test PRIVATE -Wall -Wextra -Werror)
    add_test(NAME protocol COMMAND protocol_test)
    add_executable(firmware_test protocol.c tests/firmware_test.c)
    target_include_directories(firmware_test PRIVATE ${CMAKE_CURRENT_LIST_DIR}/tests/fake_pico ${CMAKE_CURRENT_LIST_DIR})
    target_compile_options(firmware_test PRIVATE -Wall -Wextra -Werror)
    add_test(NAME simulated_firmware_safety COMMAND firmware_test)
    return()
endif()

set(PICO_BOARD pico2 CACHE STRING "Pico board (default: Raspberry Pi Pico 2)")
if(NOT PICO_SDK_PATH AND DEFINED ENV{PICO_SDK_PATH})
    set(PICO_SDK_PATH "$ENV{PICO_SDK_PATH}")
endif()
if(NOT EXISTS "${PICO_SDK_PATH}/external/pico_sdk_import.cmake")
    message(FATAL_ERROR "Set PICO_SDK_PATH to a Pico SDK 2.1+ checkout with its TinyUSB submodule initialized.")
endif()
include("${PICO_SDK_PATH}/external/pico_sdk_import.cmake")
project(hardware_box_pico C CXX ASM)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)
pico_sdk_init()
if(NOT TARGET tinyusb_device)
    message(FATAL_ERROR "TinyUSB unavailable. Initialize the SDK's lib/tinyusb submodule.")
endif()

add_executable(hardware_box_pico main.c protocol.c usb_descriptors.c)
target_include_directories(hardware_box_pico PRIVATE ${CMAKE_CURRENT_LIST_DIR})
target_link_libraries(hardware_box_pico PRIVATE pico_stdlib pico_unique_id hardware_uart hardware_watchdog tinyusb_device tinyusb_board)
target_compile_options(hardware_box_pico PRIVATE -Wall -Wextra -Werror)
pico_enable_stdio_usb(hardware_box_pico 0)
pico_enable_stdio_uart(hardware_box_pico 0)
pico_set_program_name(hardware_box_pico "Hardware Box HID")
pico_set_program_version(hardware_box_pico "1.0.0")
pico_add_extra_outputs(hardware_box_pico)
