mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-04-10 06:44:32 +00:00
btstack_stdin: provide console input in callback
This commit is contained in:
parent
ccaa09ba3e
commit
95a8ee01a4
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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));
|
||||
|
@ -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;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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));
|
||||
|
@ -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':
|
||||
|
@ -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':
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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 '+':
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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));
|
||||
|
@ -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));
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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));
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user