Add Bluetooth examples
Co-authored-by: Peter Harper <77111776+peterharperuk@users.noreply.github.com>
This commit is contained in:
398
pico_w/bt/CMakeLists.txt
Normal file
398
pico_w/bt/CMakeLists.txt
Normal file
@@ -0,0 +1,398 @@
|
||||
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()
|
||||
Reference in New Issue
Block a user