diff --git a/example/hfp_ag_demo.c b/example/hfp_ag_demo.c index 189539235..a51b1d8d8 100644 --- a/example/hfp_ag_demo.c +++ b/example/hfp_ag_demo.c @@ -176,11 +176,7 @@ static void show_usage(void){ printf("---\n"); } -static void stdin_process(btstack_data_source_t *ds, btstack_data_source_callback_type_t callback_type){ - UNUSED(ds); - UNUSED(callback_type); - - char cmd = btstack_stdin_read(); +static void stdin_process(char cmd){ switch (cmd){ case 'a': log_info("USER:\'%c\'", cmd); diff --git a/example/hfp_hf_demo.c b/example/hfp_hf_demo.c index 11e86b249..fbf74b07d 100644 --- a/example/hfp_hf_demo.c +++ b/example/hfp_hf_demo.c @@ -156,11 +156,8 @@ static void show_usage(void){ printf("---\n"); } -static void stdin_process(btstack_data_source_t *ds, btstack_data_source_callback_type_t callback_type){ - UNUSED(ds); - UNUSED(callback_type); - - cmd = btstack_stdin_read(); +static void stdin_process(char c){ + cmd = c; // used in packet handler if (cmd >= '0' && cmd <= '9'){ printf("DTMF Code: %c\n", cmd); diff --git a/example/hid_keyboard_demo.c b/example/hid_keyboard_demo.c index 0f585933a..e1c4cc53f 100644 --- a/example/hid_keyboard_demo.c +++ b/example/hid_keyboard_demo.c @@ -217,12 +217,7 @@ static void send_report(int modifier, int keycode){ // On systems with STDIN, we can directly type on the console -static void stdin_process(btstack_data_source_t *ds, btstack_data_source_callback_type_t callback_type){ - UNUSED(ds); - UNUSED(callback_type); - - char character = btstack_stdin_read(); - +static void stdin_process(char character){ uint8_t modifier; uint8_t keycode; int found = keycode_and_modifer_us_for_character(character, &keycode, &modifier); diff --git a/example/hsp_ag_demo.c b/example/hsp_ag_demo.c index cea0cced1..0572c629b 100644 --- a/example/hsp_ag_demo.c +++ b/example/hsp_ag_demo.c @@ -121,13 +121,8 @@ static void show_usage(void){ } #ifdef HAVE_BTSTACK_STDIN -static void stdin_process(btstack_data_source_t *ds, btstack_data_source_callback_type_t callback_type){ - UNUSED(ds); - UNUSED(callback_type); - - char buffer = btstack_stdin_read(); - - switch (buffer){ +static void stdin_process(char c){ + switch (c){ case 'c': printf("Connect to %s\n", bd_addr_to_str(device_addr)); hsp_ag_connect(device_addr); diff --git a/example/hsp_hs_demo.c b/example/hsp_hs_demo.c index 998328c06..6603c7284 100644 --- a/example/hsp_hs_demo.c +++ b/example/hsp_hs_demo.c @@ -121,13 +121,8 @@ static void show_usage(void){ } #ifdef HAVE_BTSTACK_STDIN -static void stdin_process(btstack_data_source_t *ds, btstack_data_source_callback_type_t callback_type){ - UNUSED(ds); - UNUSED(callback_type); - - char buffer = btstack_stdin_read(); - - switch (buffer){ +static void stdin_process(char c){ + switch (c){ case 'c': printf("Connect to %s\n", bd_addr_to_str(device_addr)); hsp_hs_connect(device_addr); diff --git a/example/pbap_client_demo.c b/example/pbap_client_demo.c index d2aa7ec8f..0857e70e0 100644 --- a/example/pbap_client_demo.c +++ b/example/pbap_client_demo.c @@ -88,13 +88,8 @@ static void show_usage(void){ printf("---\n"); } -static void stdin_process(btstack_data_source_t *ds, btstack_data_source_callback_type_t callback_type){ - UNUSED(ds); - UNUSED(callback_type); - - char cmd = btstack_stdin_read(); - - switch (cmd){ +static void stdin_process(char c){ + switch (c){ case 'a': printf("[+] Connecting to %s...\n", bd_addr_to_str(remote_addr)); pbap_connect(&packet_handler, remote_addr, &pbap_cid); diff --git a/platform/posix/btstack_stdin_posix.c b/platform/posix/btstack_stdin_posix.c index 052bcebed..26d937f63 100644 --- a/platform/posix/btstack_stdin_posix.c +++ b/platform/posix/btstack_stdin_posix.c @@ -41,6 +41,7 @@ #include #include +#include "btstack_defines.h" #include "btstack_run_loop.h" #include @@ -49,8 +50,21 @@ static btstack_data_source_t stdin_source; static int activated = 0; +static void (*stdin_handler)(char c); -void btstack_stdin_setup(void (*stdin_process)(btstack_data_source_t *_ds, btstack_data_source_callback_type_t callback_type)){ +// read single byte after data source callback was triggered +static void stdin_process(btstack_data_source_t *ds, btstack_data_source_callback_type_t callback_type){ + UNUSED(ds); + UNUSED(callback_type); + + char data; + read(stdin_source.fd, &data, 1); + if (stdin_handler){ + (*stdin_handler)(data); + } +} + +void btstack_stdin_setup(void (*handler)(char c)){ if (activated) return; @@ -64,6 +78,8 @@ void btstack_stdin_setup(void (*stdin_process)(btstack_data_source_t *_ds, btsta perror("tcsetattr ICANON"); } + stdin_handler = handler; + btstack_run_loop_set_data_source_fd(&stdin_source, 0); // stdin btstack_run_loop_enable_data_source_callbacks(&stdin_source, DATA_SOURCE_CALLBACK_READ); @@ -76,7 +92,8 @@ void btstack_stdin_setup(void (*stdin_process)(btstack_data_source_t *_ds, btsta void btstack_stdin_reset(void){ if (!activated) return; activated = 0; - + stdin_handler = NULL; + btstack_run_loop_remove_data_source(&stdin_source); struct termios term = {0}; @@ -90,9 +107,3 @@ void btstack_stdin_reset(void){ } } -// read single byte after data source callback was triggered -char btstack_stdin_read(void){ - char data; - read(stdin_source.fd, &data, 1); - return data; -} diff --git a/platform/windows/btstack_stdin_windows.c b/platform/windows/btstack_stdin_windows.c index d91b4a82f..ed5fea16d 100644 --- a/platform/windows/btstack_stdin_windows.c +++ b/platform/windows/btstack_stdin_windows.c @@ -42,6 +42,7 @@ #include #include "btstack_run_loop.h" +#include "btstack_defines.h" #include #include "btstack_stdin.h" @@ -60,19 +61,38 @@ static int activated = 0; static HANDLE stdin_reader_thread_handle; static char key_read_buffer; static HANDLE key_processed_handle; +static void (*stdin_handler)(char c); static WINAPI DWORD stdin_reader_thread_process(void * p){ while (1){ key_read_buffer = getch(); - SignalObjectAndWait(stdin_source.handle , key_processed_handle, INFINITE, FALSE); + SignalObjectAndWait(stdin_source.handle, key_processed_handle, INFINITE, FALSE); } return 0; } -void btstack_stdin_setup(void (*stdin_process)(btstack_data_source_t *_ds, btstack_data_source_callback_type_t callback_type)){ +static void stdin_process(btstack_data_source_t *ds, btstack_data_source_callback_type_t callback_type){ + + // raise SIGINT for CTRL-c on main thread + if (key_read_buffer == 0x03){ + raise(SIGINT); + return; + } + + SetEvent(key_processed_handle); + + if (stdin_handler){ + (*stdin_handler)(key_read_buffer); + } +} + +void btstack_stdin_setup(void (*handler)(char c)){ if (activated) return; + + stdin_handler = handler; + // asynchronous io on stdin via OVERLAPPED seems to be problematic. // Use separate thread and event objects instead @@ -91,6 +111,7 @@ void btstack_stdin_setup(void (*stdin_process)(btstack_data_source_t *_ds, btsta void btstack_stdin_reset(void){ if (!activated) return; activated = 0; + stdin_handler = NULL; btstack_run_loop_remove_data_source(&stdin_source); @@ -104,18 +125,3 @@ void btstack_stdin_reset(void){ CloseHandle(key_processed_handle); } -// read single byte after data source callback was triggered -char btstack_stdin_read(void){ - - // raise SIGINT for CTRL-c on main thread - if (key_read_buffer == 0x03){ - raise(SIGINT); - return 0; - } - - char data = key_read_buffer; - SetEvent(key_processed_handle); - - return data; -} - diff --git a/src/btstack_stdin.h b/src/btstack_stdin.h index 487d0aa1b..425972833 100644 --- a/src/btstack_stdin.h +++ b/src/btstack_stdin.h @@ -35,8 +35,8 @@ * */ -#ifndef __STDIN_SUPPORT_H -#define __STDIN_SUPPORT_H +#ifndef __BTSTACK_STDIN_H +#define __BTSTACK_STDIN_H #include "btstack_run_loop.h" @@ -45,10 +45,7 @@ extern "C" { #endif // setup handler for command line interface -void btstack_stdin_setup(void (*stdin_handler)(btstack_data_source_t *_ds, btstack_data_source_callback_type_t callback_type)); - -// read single byte after data source callback was triggered -char btstack_stdin_read(void); +void btstack_stdin_setup(void (*stdin_handler)(char c)); // gets called by main.c void btstack_stdin_reset(void); diff --git a/test/avdtp/avdtp_sink_demo.c b/test/avdtp/avdtp_sink_demo.c index 5897dcafe..96663c82e 100644 --- a/test/avdtp/avdtp_sink_demo.c +++ b/test/avdtp/avdtp_sink_demo.c @@ -545,14 +545,9 @@ static uint8_t media_sbc_codec_reconfiguration[] = { 2, 53 }; -static void stdin_process(btstack_data_source_t *ds, btstack_data_source_callback_type_t callback_type){ - UNUSED(ds); - UNUSED(callback_type); - - int cmd = btstack_stdin_read(); - +static void stdin_process(char c){ sep.seid = 1; - switch (cmd){ + switch (c){ case 'c': printf("Creating L2CAP Connection to %s, BLUETOOTH_PROTOCOL_AVDTP\n", bd_addr_to_str(remote)); avdtp_sink_connect(remote); diff --git a/test/avdtp/avdtp_source_demo.c b/test/avdtp/avdtp_source_demo.c index d541aebda..70fc40d67 100644 --- a/test/avdtp/avdtp_source_demo.c +++ b/test/avdtp/avdtp_source_demo.c @@ -344,12 +344,7 @@ static void a2dp_fill_audio_buffer_timer_pause(a2dp_media_sending_context_t * co btstack_run_loop_remove_timer(&context->fill_audio_buffer_timer); } -static void stdin_process(btstack_data_source_t *ds, btstack_data_source_callback_type_t callback_type){ - UNUSED(ds); - UNUSED(callback_type); - - int cmd = btstack_stdin_read(); - +static void stdin_process(char cmd){ switch (cmd){ case 'c': printf("Creating L2CAP Connection to %s, PSM_AVDTP\n", bd_addr_to_str(remote)); diff --git a/test/avdtp/sine_encode_decode_ring_buffer_test.c b/test/avdtp/sine_encode_decode_ring_buffer_test.c index ae5f910e7..b3ab508ab 100644 --- a/test/avdtp/sine_encode_decode_ring_buffer_test.c +++ b/test/avdtp/sine_encode_decode_ring_buffer_test.c @@ -199,12 +199,7 @@ static void show_usage(void){ printf("---\n"); } -static void stdin_process(btstack_data_source_t *ds, btstack_data_source_callback_type_t callback_type){ - UNUSED(ds); - UNUSED(callback_type); - - int cmd = btstack_stdin_read(); - +static void stdin_process(char cmd){ switch (cmd){ case 'x': printf("start streaming sine\n"); @@ -221,7 +216,6 @@ static void stdin_process(btstack_data_source_t *ds, btstack_data_source_callbac default: show_usage(); break; - } } diff --git a/test/avrcp/avrcp_test.c b/test/avrcp/avrcp_test.c index 508e5956a..e70987dac 100644 --- a/test/avrcp/avrcp_test.c +++ b/test/avrcp/avrcp_test.c @@ -239,12 +239,7 @@ static void show_usage(void){ printf("---\n"); } -static void stdin_process(btstack_data_source_t *ds, btstack_data_source_callback_type_t callback_type){ - UNUSED(ds); - UNUSED(callback_type); - - int cmd = btstack_stdin_read(); - +static void stdin_process(char cmd){ switch (cmd){ case 'c': printf(" - Create AVRCP connection to addr %s.\n", bd_addr_to_str(device_addr)); diff --git a/test/pts/avdtp_sink_test.c b/test/pts/avdtp_sink_test.c index e8e6df9c6..e0be32a95 100644 --- a/test/pts/avdtp_sink_test.c +++ b/test/pts/avdtp_sink_test.c @@ -552,12 +552,7 @@ static uint8_t media_sbc_codec_reconfiguration[] = { 2, 53 }; -static void stdin_process(btstack_data_source_t *ds, btstack_data_source_callback_type_t callback_type){ - UNUSED(ds); - UNUSED(callback_type); - - int cmd = btstack_stdin_read(); - +static void stdin_process(char cmd){ sep.seid = 1; switch (cmd){ case 'c': diff --git a/test/pts/avdtp_source_test.c b/test/pts/avdtp_source_test.c index 0b8400f83..de63efe5d 100644 --- a/test/pts/avdtp_source_test.c +++ b/test/pts/avdtp_source_test.c @@ -340,12 +340,7 @@ static const uint8_t media_sbc_codec_reconfiguration[] = { 2, 53 }; -static void stdin_process(btstack_data_source_t *ds, btstack_data_source_callback_type_t callback_type){ - UNUSED(ds); - UNUSED(callback_type); - - int cmd = btstack_stdin_read(); - +static void stdin_process(char cmd){ sep.seid = 1; switch (cmd){ case 'c': diff --git a/test/pts/ble_central_test.c b/test/pts/ble_central_test.c index b8a6732a4..2e360ca91 100644 --- a/test/pts/ble_central_test.c +++ b/test/pts/ble_central_test.c @@ -1597,31 +1597,28 @@ static void ui_process_command(char buffer){ } } -static void stdin_process(btstack_data_source_t *ds, btstack_data_source_callback_type_t callback_type){ - char buffer; - read(ds->fd, &buffer, 1); - +static void stdin_process(char c){ if (ui_digits_for_passkey){ - ui_process_digits_for_passkey(buffer); + ui_process_digits_for_passkey(c); return; } if (ui_uint16_request){ - ui_process_uint16_request(buffer); + ui_process_uint16_request(c); return; } if (ui_uuid128_request){ - ui_process_uuid128_request(buffer); + ui_process_uuid128_request(c); return; } if (ui_value_request){ - ui_process_data_request(buffer); + ui_process_data_request(c); return; } - ui_process_command(buffer); + ui_process_command(c); return; } diff --git a/test/pts/ble_peripheral_test.c b/test/pts/ble_peripheral_test.c index 08b18a8e3..fb6f19180 100644 --- a/test/pts/ble_peripheral_test.c +++ b/test/pts/ble_peripheral_test.c @@ -710,16 +710,14 @@ static void update_auth_req(void){ sm_set_authentication_requirements(auth_req); } -static void stdin_process(btstack_data_source_t *ds, btstack_data_source_callback_type_t callback_type){ - char buffer; - read(ds->fd, &buffer, 1); +static void stdin_process(char c){ // passkey input if (ui_digits_for_passkey){ - if (buffer < '0' || buffer > '9') return; - printf("%c", buffer); + if (c < '0' || c > '9') return; + printf("%c", c); fflush(stdout); - ui_passkey = ui_passkey * 10 + buffer - '0'; + ui_passkey = ui_passkey * 10 + c - '0'; ui_digits_for_passkey--; if (ui_digits_for_passkey == 0){ printf("\nSending Passkey '%06x'\n", ui_passkey); @@ -728,7 +726,7 @@ static void stdin_process(btstack_data_source_t *ds, btstack_data_source_callbac return; } - switch (buffer){ + switch (c){ case 'a': gap_advertisements = 0; update_advertisements(); @@ -799,7 +797,7 @@ static void stdin_process(btstack_data_source_t *ds, btstack_data_source_callbac case '8': case '9': case '0': - advertisement_index = buffer - '0'; + advertisement_index = c - '0'; update_advertisements(); break; case '+': diff --git a/test/pts/bnep_test.c b/test/pts/bnep_test.c index 2772f0d51..edff3dbab 100644 --- a/test/pts/bnep_test.c +++ b/test/pts/bnep_test.c @@ -596,11 +596,8 @@ static void show_usage(void){ printf("---\n"); } -static void stdin_process(btstack_data_source_t *ds, btstack_data_source_callback_type_t callback_type){ - char buffer; - read(ds->fd, &buffer, 1); - - switch (buffer){ +static void stdin_process(char c){ + switch (c){ case 'p': printf("Connecting to PTS at %s...\n", bd_addr_to_str(pts_addr)); bnep_connect(&packet_handler, pts_addr, bnep_l2cap_psm, bnep_src_uuid, bnep_dest_uuid); @@ -727,7 +724,7 @@ static void packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packe case BNEP_EVENT_CAN_SEND_NOW: /* Check for parked network packets and send it out now */ - if (network_buffer_len > 0) { + if (network_c_len > 0) { bnep_send(bnep_cid, network_buffer, network_buffer_len); network_buffer_len = 0; } diff --git a/test/pts/classic_test.c b/test/pts/classic_test.c index 13006fae5..5641e3fd0 100644 --- a/test/pts/classic_test.c +++ b/test/pts/classic_test.c @@ -473,15 +473,12 @@ static void show_usage(void){ printf("---\n"); } -static void stdin_process(btstack_data_source_t *ds, btstack_data_source_callback_type_t callback_type){ - char buffer; - read(ds->fd, &buffer, 1); - +static void stdin_process(char c){ // passkey input if (ui_digits_for_passkey){ - printf("%c", buffer); + printf("%c", c); fflush(stdout); - ui_passkey = ui_passkey * 10 + buffer - '0'; + ui_passkey = ui_passkey * 10 + c - '0'; ui_digits_for_passkey--; if (ui_digits_for_passkey == 0){ printf("\nSending Passkey '%06u'\n", ui_passkey); @@ -489,18 +486,18 @@ static void stdin_process(btstack_data_source_t *ds, btstack_data_source_callbac } } if (ui_chars_for_pin){ - printf("%c", buffer); + printf("%c", c); fflush(stdout); - if (buffer == '\n'){ + if (c == '\n'){ printf("\nSending Pin '%s'\n", ui_pin); ui_pin[ui_pin_offset] = 0; gap_pin_code_response(event_addr, ui_pin); } else { - ui_pin[ui_pin_offset++] = buffer; + ui_pin[ui_pin_offset++] = c; } } - switch (buffer){ + switch (c){ case 'c': gap_connectable = 0; gap_connectable_control(0); diff --git a/test/pts/hsp_ag_test.c b/test/pts/hsp_ag_test.c index 879159b7f..f80b8bb59 100644 --- a/test/pts/hsp_ag_test.c +++ b/test/pts/hsp_ag_test.c @@ -97,10 +97,7 @@ static void show_usage(void){ printf("---\n"); } -static void stdin_process(btstack_data_source_t *ds, btstack_data_source_callback_type_t callback_type){ - char buffer; - read(ds->fd, &buffer, 1); - +static void stdin_process(char buffer){ switch (buffer){ case 'p': printf("Establishing service level connection to PTS module %s...\n", bd_addr_to_str(pts_addr)); diff --git a/test/pts/hsp_hs_test.c b/test/pts/hsp_hs_test.c index 2723f1d62..c6ef0bfa9 100644 --- a/test/pts/hsp_hs_test.c +++ b/test/pts/hsp_hs_test.c @@ -105,10 +105,7 @@ static void show_usage(void){ printf("---\n"); } -static void stdin_process(btstack_data_source_t *ds, btstack_data_source_callback_type_t callback_type){ - char buffer; - read(ds->fd, &buffer, 1); - +static void stdin_process(char buffer){ switch (buffer){ case 'p': printf("Establishing audio connection to PTS module %s...\n", bd_addr_to_str(pts_addr)); diff --git a/test/pts/iopt.c b/test/pts/iopt.c index 9fe922620..dc8860ac3 100644 --- a/test/pts/iopt.c +++ b/test/pts/iopt.c @@ -65,9 +65,7 @@ static void show_usage(void){ printf("---\n"); } -static void stdin_process(btstack_data_source_t *ds, btstack_data_source_callback_type_t callback_type){ - char buffer; - read(ds->fd, &buffer, 1); +static void stdin_process(char buffer){ switch (buffer){ default: show_usage(); @@ -85,6 +83,8 @@ static uint8_t hfp_hf_service_buffer[200]; // rfcomm 5 int btstack_main(int argc, const char * argv[]); int btstack_main(int argc, const char * argv[]){ + (void)argv; + (void)argc; l2cap_init(); diff --git a/test/pts/l2cap_test.c b/test/pts/l2cap_test.c index b5eb987a0..515b05ff9 100644 --- a/test/pts/l2cap_test.c +++ b/test/pts/l2cap_test.c @@ -120,9 +120,7 @@ static void show_usage(void){ printf("---\n"); } -static void stdin_process(btstack_data_source_t *ds, btstack_data_source_callback_type_t callback_type){ - char buffer; - read(ds->fd, &buffer, 1); +static void stdin_process(char buffer){ switch (buffer){ case 'c': printf("Creating L2CAP Connection to %s, PSM SDP\n", bd_addr_to_str(remote)); diff --git a/test/pts/le_data_channel.c b/test/pts/le_data_channel.c index 0403721bc..aff9d68ab 100644 --- a/test/pts/le_data_channel.c +++ b/test/pts/le_data_channel.c @@ -293,11 +293,7 @@ void show_usage(void){ printf("---\n"); } -static void stdin_process(btstack_data_source_t *ds, btstack_data_source_callback_type_t callback_type){ - UNUSED(callback_type); - char buffer; - read(ds->fd, &buffer, 1); - +static void stdin_process(char buffer){ // passkey input if (ui_digits_for_passkey){ if (buffer < '0' || buffer > '9') return;