104 lines
3.2 KiB
C
104 lines
3.2 KiB
C
/**
|
|
* Copyright (c) 2022 Raspberry Pi (Trading) Ltd.
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*/
|
|
|
|
#if TEST_AUDIO
|
|
#include "btstack_audio.h"
|
|
#endif
|
|
#include "btstack_event.h"
|
|
#include "hal_led.h"
|
|
#include "pico/cyw43_arch.h"
|
|
#include "pico/stdlib.h"
|
|
#include "btstack.h"
|
|
|
|
#if defined(WIFI_SSID) && defined(WIFI_PASSWORD)
|
|
#define TEST_BTWIFI 1
|
|
#endif
|
|
|
|
#if TEST_BTWIFI
|
|
#include "lwip/ip4_addr.h"
|
|
#include "lwip/apps/lwiperf.h"
|
|
#endif
|
|
|
|
// Start the btstack example
|
|
int btstack_main(int argc, const char * argv[]);
|
|
|
|
#if TEST_AUDIO
|
|
const btstack_audio_sink_t * btstack_audio_pico_sink_get_instance(void);
|
|
#endif
|
|
|
|
static btstack_packet_callback_registration_t hci_event_callback_registration;
|
|
static int led_state = 0;
|
|
|
|
void hal_led_toggle(void){
|
|
led_state = 1 - led_state;
|
|
cyw43_arch_gpio_put(CYW43_WL_GPIO_LED_PIN, led_state);
|
|
}
|
|
|
|
static void packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
|
|
UNUSED(size);
|
|
UNUSED(channel);
|
|
bd_addr_t local_addr;
|
|
if (packet_type != HCI_EVENT_PACKET) return;
|
|
switch(hci_event_packet_get_type(packet)){
|
|
case BTSTACK_EVENT_STATE:
|
|
if (btstack_event_state_get_state(packet) != HCI_STATE_WORKING) return;
|
|
gap_local_bd_addr(local_addr);
|
|
printf("BTstack up and running on %s.\n", bd_addr_to_str(local_addr));
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
#if TEST_BTWIFI
|
|
static void iperf_report(void *arg, enum lwiperf_report_type report_type,
|
|
const ip_addr_t *local_addr, u16_t local_port, const ip_addr_t *remote_addr, u16_t remote_port,
|
|
u32_t bytes_transferred, u32_t ms_duration, u32_t bandwidth_kbitpsec) {
|
|
static uint32_t total_iperf_megabytes = 0;
|
|
uint32_t mbytes = bytes_transferred / 1024 / 1024;
|
|
float mbits = bandwidth_kbitpsec / 1000.0;
|
|
total_iperf_megabytes += mbytes;
|
|
printf("Completed iperf transfer of %u MBytes @ %.1f Mbits/sec\n", mbytes, mbits);
|
|
printf("Total iperf megabytes since start %u Mbytes\n", total_iperf_megabytes);
|
|
}
|
|
#endif
|
|
|
|
int picow_bt_example_init(void) {
|
|
// initialize CYW43 driver architecture (will enable BT if/because CYW43_ENABLE_BLUETOOTH == 1)
|
|
if (cyw43_arch_init()) {
|
|
printf("failed to initialise cyw43_arch\n");
|
|
return -1;
|
|
}
|
|
|
|
// inform about BTstack state
|
|
hci_event_callback_registration.callback = &packet_handler;
|
|
hci_add_event_handler(&hci_event_callback_registration);
|
|
|
|
// setup i2s audio for sink
|
|
#if TEST_AUDIO
|
|
btstack_audio_sink_set_instance(btstack_audio_pico_sink_get_instance());
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
void picow_bt_example_main(void) {
|
|
|
|
btstack_main(0, NULL);
|
|
|
|
#if TEST_BTWIFI
|
|
uint32_t start_ms = to_ms_since_boot(get_absolute_time());
|
|
cyw43_arch_enable_sta_mode();
|
|
printf("Connecting to WiFi \"%s\"...\n", WIFI_SSID);
|
|
if (cyw43_arch_wifi_connect_timeout_ms(WIFI_SSID, WIFI_PASSWORD, CYW43_AUTH_WPA2_AES_PSK, 30000)) {
|
|
panic("failed to connect");
|
|
} else {
|
|
printf("Connected in %lus.\n", (to_ms_since_boot(get_absolute_time()) - start_ms) / 1000);
|
|
}
|
|
printf("\nReady, running iperf server at %s\n", ip4addr_ntoa(netif_ip4_addr(netif_list)));
|
|
lwiperf_start_tcp_server_default(&iperf_report, NULL);
|
|
#endif
|
|
}
|