btstack_stdin: provide console input in callback

This commit is contained in:
Matthias Ringwald 2017-05-26 21:52:29 +02:00
parent ccaa09ba3e
commit 95a8ee01a4
24 changed files with 91 additions and 158 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -41,6 +41,7 @@
#include <stdio.h>
#include <unistd.h>
#include "btstack_defines.h"
#include "btstack_run_loop.h"
#include <stdlib.h>
@ -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;
}

View File

@ -42,6 +42,7 @@
#include <unistd.h>
#include "btstack_run_loop.h"
#include "btstack_defines.h"
#include <stdlib.h>
#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;
}

View File

@ -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);

View File

@ -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);

View File

@ -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));

View File

@ -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;
}
}

View File

@ -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));

View File

@ -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':

View File

@ -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':

View File

@ -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;
}

View File

@ -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 '+':

View File

@ -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;
}

View File

@ -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);

View File

@ -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));

View File

@ -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));

View File

@ -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();

View File

@ -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));

View File

@ -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;