Files
pico-examples/pico_w/bt/CMakeLists.txt
graham sanderson 1c5d9aa567 Add Bluetooth examples
Co-authored-by: Peter Harper <77111776+peterharperuk@users.noreply.github.com>
2023-02-10 18:26:53 -06:00

399 lines
15 KiB
CMake

add_subdirectory(standalone)
set(BTSTACK_ROOT ${PICO_SDK_PATH}/lib/btstack)
set(BTSTACK_EXAMPLE_PATH ${BTSTACK_ROOT}/example)
set(BTSTACK_3RD_PARTY_PATH ${BTSTACK_ROOT}/3rd-party)
set(BT_EXAMPLE_COMMON_DIR "${CMAKE_CURRENT_LIST_DIR}")
if (NOT PICO_EXTRAS_PATH)
message("Skipping some Pico W BTstack examples that require pico-extras")
else()
add_library(pico_btstack_audio_example INTERFACE)
target_sources(pico_btstack_audio_example INTERFACE
${PICO_BTSTACK_PATH}/src/btstack_audio.c
${CMAKE_CURRENT_LIST_DIR}/btstack_audio_pico.c
)
target_link_libraries(pico_btstack_audio_example INTERFACE
pico_audio_i2s
)
endif()
# mod player used by a2dp_source_demo and mod_player and demo song
add_library(pico_btstack_hxcmod_player INTERFACE)
target_sources(pico_btstack_hxcmod_player INTERFACE
${BTSTACK_3RD_PARTY_PATH}/hxcmod-player/hxcmod.c
${BTSTACK_3RD_PARTY_PATH}/hxcmod-player/mods/nao-deceased_by_disease.c
)
target_include_directories(pico_btstack_hxcmod_player INTERFACE
${BTSTACK_3RD_PARTY_PATH}/hxcmod-player
${BTSTACK_3RD_PARTY_PATH}/hxcmod-player/mods
)
add_library(pico_btstack_sco_demo_util INTERFACE)
target_sources(pico_btstack_sco_demo_util INTERFACE
# sco demo utils
${BTSTACK_EXAMPLE_PATH}/sco_demo_util.c
)
# Adds common stuff for all the examples
add_library(picow_bt_example_common INTERFACE)
target_sources(picow_bt_example_common INTERFACE
${CMAKE_CURRENT_LIST_DIR}/picow_bt_example_common.c
)
target_link_libraries(picow_bt_example_common INTERFACE
pico_stdlib
pico_btstack_ble
pico_btstack_classic
pico_btstack_cyw43
)
target_include_directories(picow_bt_example_common INTERFACE
${BT_EXAMPLE_COMMON_DIR}/config # Use our own config
${BTSTACK_EXAMPLE_PATH}/
)
target_compile_definitions(picow_bt_example_common INTERFACE
PICO_STDIO_USB_CONNECT_WAIT_TIMEOUT_MS=3000
#WANT_HCI_DUMP=1 # This enables btstack debug
#ENABLE_SEGGER_RTT=1
)
if (TARGET pico_btstack_audio_example)
target_link_libraries(picow_bt_example_common INTERFACE
pico_btstack_audio_example
)
target_compile_definitions(picow_bt_example_common INTERFACE
TEST_AUDIO=1
)
endif()
# Adds stuff needed for cyw43 lwip
add_library(picow_bt_example_cyw43_lwip INTERFACE)
target_link_libraries(picow_bt_example_cyw43_lwip INTERFACE
picow_bt_example_common
)
target_compile_definitions(picow_bt_example_cyw43_lwip INTERFACE
WIFI_SSID=\"${WIFI_SSID}\"
WIFI_PASSWORD=\"${WIFI_PASSWORD}\"
CYW43_LWIP=1
)
target_link_libraries(picow_bt_example_cyw43_lwip INTERFACE
pico_lwip_iperf
)
target_include_directories(picow_bt_example_cyw43_lwip INTERFACE
${CMAKE_CURRENT_LIST_DIR}/../wifi # for our common lwipopts
)
# disables cyw43 lwip
add_library(picow_bt_example_no_cyw43_lwip INTERFACE)
target_link_libraries(picow_bt_example_no_cyw43_lwip INTERFACE
picow_bt_example_common
)
target_compile_definitions(picow_bt_example_no_cyw43_lwip INTERFACE
CYW43_LWIP=0
)
# variant: no cyw43 lwip | poll
add_library(picow_bt_example_no_cyw43_lwip_poll INTERFACE)
target_sources(picow_bt_example_no_cyw43_lwip_poll INTERFACE
${BT_EXAMPLE_COMMON_DIR}/picow_bt_example_poll.c
)
target_link_libraries(picow_bt_example_no_cyw43_lwip_poll INTERFACE
picow_bt_example_no_cyw43_lwip
pico_cyw43_arch_poll
)
# variant: cyw43 lwip | poll
add_library(picow_bt_example_cyw43_lwip_poll INTERFACE)
target_sources(picow_bt_example_cyw43_lwip_poll INTERFACE
${BT_EXAMPLE_COMMON_DIR}/picow_bt_example_poll.c
)
target_link_libraries(picow_bt_example_cyw43_lwip_poll INTERFACE
picow_bt_example_cyw43_lwip
pico_cyw43_arch_lwip_poll
)
# variant: btstack lwip | poll
add_library(picow_bt_example_btstack_lwip_poll INTERFACE)
target_sources(picow_bt_example_btstack_lwip_poll INTERFACE
${BT_EXAMPLE_COMMON_DIR}/picow_bt_example_poll.c
)
target_link_libraries(picow_bt_example_btstack_lwip_poll INTERFACE
picow_bt_example_no_cyw43_lwip
pico_cyw43_arch_poll
pico_lwip_nosys
pico_btstack_bnep_lwip
)
target_include_directories(picow_bt_example_btstack_lwip_poll INTERFACE
${CMAKE_CURRENT_LIST_DIR}/../wifi # for our common lwipopts
)
# variant: no cyw43 lwip | background
add_library(picow_bt_example_no_cyw43_lwip_background INTERFACE)
target_sources(picow_bt_example_no_cyw43_lwip_background INTERFACE
${BT_EXAMPLE_COMMON_DIR}/picow_bt_example_background.c
)
target_link_libraries(picow_bt_example_no_cyw43_lwip_background INTERFACE
picow_bt_example_no_cyw43_lwip
pico_cyw43_arch_threadsafe_background
)
# variant: cyw43 lwip | background
add_library(picow_bt_example_cyw43_lwip_background INTERFACE)
target_sources(picow_bt_example_cyw43_lwip_background INTERFACE
${BT_EXAMPLE_COMMON_DIR}/picow_bt_example_background.c
)
target_link_libraries(picow_bt_example_cyw43_lwip_background INTERFACE
picow_bt_example_cyw43_lwip
pico_cyw43_arch_lwip_threadsafe_background
)
# variant: btstack lwip | background
add_library(picow_bt_example_btstack_lwip_background INTERFACE)
target_sources(picow_bt_example_btstack_lwip_background INTERFACE
${BT_EXAMPLE_COMMON_DIR}/picow_bt_example_background.c
)
target_link_libraries(picow_bt_example_btstack_lwip_background INTERFACE
picow_bt_example_no_cyw43_lwip
pico_cyw43_arch_threadsafe_background
pico_lwip_nosys
pico_btstack_bnep_lwip
)
target_include_directories(picow_bt_example_btstack_lwip_background INTERFACE
${CMAKE_CURRENT_LIST_DIR}/../wifi # for our common lwipopts
)
if (FREERTOS_KERNEL_PATH OR DEFINED ENV{FREERTOS_KERNEL_PATH})
include(FreeRTOS_Kernel_import.cmake)
endif()
if (TARGET FreeRTOS-Kernel)
# common freertos stuff
add_library(picow_bt_example_common_freertos INTERFACE)
target_sources(picow_bt_example_common_freertos INTERFACE
${BT_EXAMPLE_COMMON_DIR}/picow_bt_example_freertos.c
)
target_link_libraries(picow_bt_example_common_freertos INTERFACE
picow_bt_example_common
FreeRTOS-Kernel-Heap4 # FreeRTOS kernel and dynamic heap
)
target_compile_definitions(picow_bt_example_common_freertos INTERFACE
CYW43_TASK_STACK_SIZE=1024
NO_SYS=0
)
target_include_directories(picow_bt_example_common_freertos INTERFACE
${FREERTOS_KERNEL_PATH}/include
${FREERTOS_KERNEL_PATH}/portable/ThirdParty/GCC/RP2040/include
)
# variant: no cyw43 lwip | freertos
add_library(picow_bt_example_no_cyw43_lwip_freertos INTERFACE)
target_link_libraries(picow_bt_example_no_cyw43_lwip_freertos INTERFACE
picow_bt_example_common_freertos
picow_bt_example_no_cyw43_lwip
pico_cyw43_arch_sys_freertos
)
# variant: cyw43 lwip | freertos
add_library(picow_bt_example_cyw43_lwip_freertos INTERFACE)
target_link_libraries(picow_bt_example_cyw43_lwip_freertos INTERFACE
picow_bt_example_common_freertos
picow_bt_example_cyw43_lwip
pico_cyw43_arch_lwip_sys_freertos
)
target_compile_definitions(picow_bt_example_cyw43_lwip_freertos INTERFACE
HAVE_LWIP=1 # stops btstack calling lwip_init
)
# variant: btstack lwip | freertos
add_library(picow_bt_example_btstack_lwip_freertos INTERFACE)
target_link_libraries(picow_bt_example_btstack_lwip_freertos INTERFACE
picow_bt_example_common_freertos
picow_bt_example_no_cyw43_lwip
pico_cyw43_arch_sys_freertos
pico_btstack_bnep_lwip_sys_freertos
pico_lwip_freertos
)
target_include_directories(picow_bt_example_btstack_lwip_freertos INTERFACE
${CMAKE_CURRENT_LIST_DIR}/../wifi # for our common lwipopts
)
target_compile_definitions(picow_bt_example_btstack_lwip_freertos INTERFACE
HAVE_LWIP=1 # stops btstack calling lwip_init
)
endif()
# Common stuff for all examples. Pass the example name
function(picow_bt_example_common NAME)
if (NOT TARGET picow_bt_example_common_${NAME})
add_library(picow_bt_example_common_${NAME} INTERFACE)
target_sources(picow_bt_example_common_${NAME} INTERFACE
# actual example
${BTSTACK_EXAMPLE_PATH}/${NAME}.c
)
if (EXISTS "${BTSTACK_EXAMPLE_PATH}/${NAME}.gatt")
pico_btstack_make_gatt_header(picow_bt_example_common_${NAME} INTERFACE ${BTSTACK_EXAMPLE_PATH}/${NAME}.gatt)
endif()
endif()
endfunction()
# The type of example to build
if(NOT DEFINED BTSTACK_EXAMPLE_TYPE)
set(BTSTACK_EXAMPLE_TYPE "background")
endif()
if ((NOT BTSTACK_EXAMPLE_TYPE STREQUAL "poll") AND
(NOT BTSTACK_EXAMPLE_TYPE STREQUAL "background") AND
(NOT BTSTACK_EXAMPLE_TYPE STREQUAL "freertos") AND
(NOT BTSTACK_EXAMPLE_TYPE STREQUAL "all"))
message(FATAL_ERROR "Unknown BTSTACK_EXAMPLE_TYPE '${BTSTACK_EXAMPLE_TYPE}'; valid options are 'poll', 'background', 'freertos' or 'all'")
endif()
set(BTSTACK_EXAMPLE_TYPE "${BTSTACK_EXAMPLE_TYPE}" CACHE INTERNAL "BT stack example type (poll|background|freertos|all)")
# Add an poll example, pass btstack example name, target name, variant lib and extra libs
function(picow_bt_example_poll NAME TARGET_NAME VARIANT_LIB)
if ("${BTSTACK_EXAMPLE_TYPE}" STREQUAL "poll" OR "${BTSTACK_EXAMPLE_TYPE}" STREQUAL "all")
picow_bt_example_common(${NAME})
add_executable(${TARGET_NAME}_poll)
target_link_libraries(${TARGET_NAME}_poll PRIVATE
picow_bt_example_common_${NAME}
${VARIANT_LIB}
${ARGN} # extra libs
)
pico_add_extra_outputs(${TARGET_NAME}_poll)
example_auto_set_url(${TARGET_NAME}_poll)
endif()
endfunction()
# Add an background example, pass btstack example name, target name, variant lib and extra libs
function(picow_bt_example_background NAME TARGET_NAME VARIANT_LIB)
if ("${BTSTACK_EXAMPLE_TYPE}" STREQUAL "background" OR "${BTSTACK_EXAMPLE_TYPE}" STREQUAL "all")
picow_bt_example_common(${NAME})
add_executable(${TARGET_NAME}_background)
target_link_libraries(${TARGET_NAME}_background PRIVATE
picow_bt_example_common_${NAME}
${VARIANT_LIB}
${ARGN} # extra libs
)
pico_add_extra_outputs(${TARGET_NAME}_background)
example_auto_set_url(${TARGET_NAME}_background)
endif()
endfunction()
# Add a freertos example, pass btstack example name, target name, variant lib and extra libs
function(picow_bt_example_freertos NAME TARGET_NAME VARIANT_LIB)
if ("${BTSTACK_EXAMPLE_TYPE}" STREQUAL "freertos" OR "${BTSTACK_EXAMPLE_TYPE}" STREQUAL "all")
if (TARGET FreeRTOS-Kernel)
picow_bt_example_common(${NAME})
add_executable(${TARGET_NAME}_freertos)
target_link_libraries(${TARGET_NAME}_freertos PRIVATE
picow_bt_example_common_${NAME}
${VARIANT_LIB}
${ARGN} # extra libs
)
pico_add_extra_outputs(${TARGET_NAME}_freertos)
example_auto_set_url(${TARGET_NAME}_freertos)
endif()
endif()
endfunction()
# The default name of the bt example target
function(picow_bt_example_target_name NAME RET)
SET(${RET} "picow_bt_example_${NAME}" PARENT_SCOPE)
endfunction()
# Make a btstack example, NAME should match source file in lib/btstack/example
# Extra parameters indicate extra libraries to link to
function(picow_bt_example NAME)
picow_bt_example_target_name(${NAME} TARGET_NAME)
picow_bt_example_poll(${NAME} ${TARGET_NAME} picow_bt_example_no_cyw43_lwip_poll ${ARGN})
picow_bt_example_background(${NAME} ${TARGET_NAME} picow_bt_example_no_cyw43_lwip_background ${ARGN})
picow_bt_example_freertos(${NAME} ${TARGET_NAME} picow_bt_example_no_cyw43_lwip_freertos ${ARGN})
endfunction()
# List of examples from btstack
include(${BTSTACK_ROOT}/example/CMakeLists.txt)
# Full list of bluetooth examples
set(BTSTACK_EXAMPLES
${EXAMPLES_GENERAL}
${EXAMPLES_CLASSIC_ONLY}
${EXAMPLES_LE_ONLY}
${EXAMPLES_DUAL_MODE}
pan_lwip_http_server
)
# These examples run wifi and bt at the same time
if (WIFI_SSID AND WIFI_PASSWORD)
list(APPEND BTSTACK_EXAMPLES
gatt_counter_with_wifi
gatt_streamer_server_with_wifi
#spp_streamer_with_wifi
)
endif()
# Extra examples that are not that interesting or a bit tricky to run
# They are not built unless BTSTACK_EXAMPLES_ALL=1
set(BTSTACK_EXAMPLES_ADDITIONAL
ancs_client_demo
att_delayed_response
avrcp_browsing_client
dut_mode_classic
gap_dedicated_bonding
gap_link_keys
le_credit_based_flow_control_mode_client
le_credit_based_flow_control_mode_server
le_mitm
led_counter
sdp_bnep_query
sdp_general_query
spp_flowcontrol
sdp_rfcomm_query
spp_and_gatt_counter
spp_and_gatt_streamer
hfp_ag_demo
hsp_ag_demo
hfp_hf_demo
hsp_hs_demo
mod_player
sine_player
ublox_spp_le_counter
nordic_spp_le_streamer
nordic_spp_le_counter
hog_boot_host_demo
gatt_battery_query
gatt_browser
gatt_device_information_query
le_streamer_client
)
# These examples will only be built if pico-extras exists
set(BTSTACK_EXAMPLES_NEED_EXTRAS
a2dp_sink_demo
hfp_hf_demo
hfp_ag_demo
hsp_ag_demo
hsp_hs_demo
mod_player
sine_player
)
# Add examples
set(BTSTACK_EXAMPLE_COUNT 0)
list(REMOVE_DUPLICATES BTSTACK_EXAMPLES)
foreach(NAME ${BTSTACK_EXAMPLES})
# Ignore if sub folder not found
if (NOT IS_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/${NAME})
continue()
endif()
# Ignore example if it needs pico-extras and pico-extras could not be found
if (NOT PICO_EXTRAS_PATH AND ${NAME} IN_LIST BTSTACK_EXAMPLES_NEED_EXTRAS)
continue()
endif()
# Ignore less interesting examples if BTSTACK_EXAMPLES_ALL=1 is not set
if (NOT BTSTACK_EXAMPLES_ALL AND ${NAME} IN_LIST BTSTACK_EXAMPLES_ADDITIONAL)
continue()
endif()
# add example
add_subdirectory(${NAME})
MATH(EXPR BTSTACK_EXAMPLE_COUNT "${BTSTACK_EXAMPLE_COUNT}+1")
endforeach()
message("Adding ${BTSTACK_EXAMPLE_COUNT} BTstack examples of type '${BTSTACK_EXAMPLE_TYPE}'")
suppress_btstack_warnings()