mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-03-22 07:21:06 +00:00
check BlueTool for error codes, emit HCI_EVENT_POWERON_FAILED event
This commit is contained in:
parent
ba000abd41
commit
038bc64c95
6
TODO.txt
6
TODO.txt
@ -3,8 +3,6 @@
|
|||||||
Last milestone reached: BTdaemon automatically started by launchd on Mac and iPhone
|
Last milestone reached: BTdaemon automatically started by launchd on Mac and iPhone
|
||||||
|
|
||||||
NEXT:
|
NEXT:
|
||||||
- deal with Apple stack
|
|
||||||
- detect if it is running and return appropriate error events
|
|
||||||
- create a SpringBoardAccess MobileSubstrate Extension
|
- create a SpringBoardAccess MobileSubstrate Extension
|
||||||
- put MobileSubstrate header and lib into 3rdparty folder
|
- put MobileSubstrate header and lib into 3rdparty folder
|
||||||
- in SpringBoard hook, start datagram Unix domain or mach port server
|
- in SpringBoard hook, start datagram Unix domain or mach port server
|
||||||
@ -15,6 +13,10 @@ NEXT:
|
|||||||
- create script to build APT package
|
- create script to build APT package
|
||||||
- create pgp key and sign APT package
|
- create pgp key and sign APT package
|
||||||
- provide test version at http://btstack.ringwald.ch
|
- provide test version at http://btstack.ringwald.ch
|
||||||
|
- decide on error reporting
|
||||||
|
- command_status_event with custom errors
|
||||||
|
- hci open failed
|
||||||
|
- btstack error
|
||||||
== Release Version 0.1
|
== Release Version 0.1
|
||||||
- implement rest of L2CAP state machine
|
- implement rest of L2CAP state machine
|
||||||
- incoming connections
|
- incoming connections
|
||||||
|
@ -36,6 +36,12 @@ void data_handler(uint8_t *packet, uint16_t size){
|
|||||||
}
|
}
|
||||||
|
|
||||||
void event_handler(uint8_t *packet, uint16_t size){
|
void event_handler(uint8_t *packet, uint16_t size){
|
||||||
|
// handle HCI init failure
|
||||||
|
if (packet[0] == HCI_EVENT_POWERON_FAILED){
|
||||||
|
printf("HCI Init failed - make sure you have turned off Bluetooth in the System Settings\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
// bt stack activated, get started - set local name
|
// bt stack activated, get started - set local name
|
||||||
if (packet[0] == HCI_EVENT_BTSTACK_WORKING ||
|
if (packet[0] == HCI_EVENT_BTSTACK_WORKING ||
|
||||||
(packet[0] == HCI_EVENT_BTSTACK_STATE && packet[2] == HCI_STATE_WORKING)) {
|
(packet[0] == HCI_EVENT_BTSTACK_STATE && packet[2] == HCI_STATE_WORKING)) {
|
||||||
|
@ -63,7 +63,7 @@ static int iphone_valid(void *config){
|
|||||||
char * machine = get_machine_name();
|
char * machine = get_machine_name();
|
||||||
if (!strncmp("iPhone", machine, strlen("iPhone" ))) return 1;
|
if (!strncmp("iPhone", machine, strlen("iPhone" ))) return 1;
|
||||||
if (!strncmp("iPod2,1", machine, strlen("iPod2,1"))) return 1;
|
if (!strncmp("iPod2,1", machine, strlen("iPod2,1"))) return 1;
|
||||||
if (!strncmp("iPod3,1", machine, strlen("iPod2,1"))) return 1;
|
if (!strncmp("iPod3,1", machine, strlen("iPod3,1"))) return 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -249,12 +249,13 @@ static int iphone_write_initscript (void *config, int output){
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int iphone_on (void *config){
|
static int iphone_on (void *config){
|
||||||
|
int err = 0;
|
||||||
#if 0
|
#if 0
|
||||||
// use tmp file for testing
|
// use tmp file for testing
|
||||||
int output = open("/tmp/bt.init", O_WRONLY | O_CREAT | O_TRUNC);
|
int output = open("/tmp/bt.init", O_WRONLY | O_CREAT | O_TRUNC);
|
||||||
iphone_write_initscript(config, output);
|
iphone_write_initscript(config, output);
|
||||||
close(output);
|
close(output);
|
||||||
system ("BlueTool < /tmp/bt.init");
|
err = system ("BlueTool < /tmp/bt.init");
|
||||||
#else
|
#else
|
||||||
// modify original script on the fly
|
// modify original script on the fly
|
||||||
FILE * outputFile = popen("BlueTool", "r+");
|
FILE * outputFile = popen("BlueTool", "r+");
|
||||||
@ -270,12 +271,12 @@ static int iphone_on (void *config){
|
|||||||
if (singlechar == EOF) break;
|
if (singlechar == EOF) break;
|
||||||
printf("%c", singlechar);
|
printf("%c", singlechar);
|
||||||
};
|
};
|
||||||
pclose(outputFile);
|
err = pclose(outputFile);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
// if we sleep for about 3 seconds, we miss a strage packet... but we don't care
|
// if we sleep for about 3 seconds, we miss a strage packet... but we don't care
|
||||||
// sleep(3);
|
// sleep(3);
|
||||||
return 0;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int iphone_off (void *config){
|
static int iphone_off (void *config){
|
||||||
|
34
src/hci.c
34
src/hci.c
@ -265,19 +265,28 @@ void hci_init(hci_transport_t *transport, void *config, bt_control_t *control){
|
|||||||
int hci_power_control(HCI_POWER_MODE power_mode){
|
int hci_power_control(HCI_POWER_MODE power_mode){
|
||||||
if (power_mode == HCI_POWER_ON && hci_stack.state == HCI_STATE_OFF) {
|
if (power_mode == HCI_POWER_ON && hci_stack.state == HCI_STATE_OFF) {
|
||||||
|
|
||||||
|
// power on
|
||||||
|
int err = hci_stack.control->on(hci_stack.config);
|
||||||
|
if (err){
|
||||||
|
fprintf(stderr, "POWER_ON failed");
|
||||||
|
hci_emit_hci_open_failed();
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
// open low-level device
|
||||||
|
err = hci_stack.hci_transport->open(hci_stack.config);
|
||||||
|
if (err){
|
||||||
|
fprintf(stderr, "HCI_INIT failed, turning Bluetooth off again");
|
||||||
|
hci_stack.control->off(hci_stack.config);
|
||||||
|
hci_emit_hci_open_failed();
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
// set up state machine
|
// set up state machine
|
||||||
hci_stack.num_cmd_packets = 1; // assume that one cmd can be sent
|
hci_stack.num_cmd_packets = 1; // assume that one cmd can be sent
|
||||||
hci_stack.state = HCI_STATE_INITIALIZING;
|
hci_stack.state = HCI_STATE_INITIALIZING;
|
||||||
hci_stack.substate = 0;
|
hci_stack.substate = 0;
|
||||||
|
|
||||||
// power on
|
|
||||||
hci_stack.control->on(hci_stack.config);
|
|
||||||
|
|
||||||
// open low-level device
|
|
||||||
hci_stack.hci_transport->open(hci_stack.config);
|
|
||||||
|
|
||||||
// create internal event
|
|
||||||
|
|
||||||
} else if (power_mode == HCI_POWER_OFF && hci_stack.state == HCI_STATE_WORKING){
|
} else if (power_mode == HCI_POWER_OFF && hci_stack.state == HCI_STATE_WORKING){
|
||||||
|
|
||||||
// close low-level device
|
// close low-level device
|
||||||
@ -290,6 +299,7 @@ int hci_power_control(HCI_POWER_MODE power_mode){
|
|||||||
hci_stack.state = HCI_STATE_OFF;
|
hci_stack.state = HCI_STATE_OFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// create internal event
|
||||||
hci_emit_state();
|
hci_emit_state();
|
||||||
|
|
||||||
// trigger next/first action
|
// trigger next/first action
|
||||||
@ -436,3 +446,11 @@ void hci_emit_nr_connections_changed(){
|
|||||||
hci_dump_packet( HCI_EVENT_PACKET, 0, event, len);
|
hci_dump_packet( HCI_EVENT_PACKET, 0, event, len);
|
||||||
hci_stack.event_packet_handler(event, len);
|
hci_stack.event_packet_handler(event, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void hci_emit_hci_open_failed(){
|
||||||
|
uint8_t len = 1;
|
||||||
|
uint8_t event[len];
|
||||||
|
event[0] = HCI_EVENT_POWERON_FAILED;
|
||||||
|
hci_dump_packet( HCI_EVENT_PACKET, 0, event, len);
|
||||||
|
hci_stack.event_packet_handler(event, len);
|
||||||
|
}
|
||||||
|
@ -122,3 +122,4 @@ void hci_emit_state();
|
|||||||
void hci_emit_connection_complete(hci_connection_t *conn);
|
void hci_emit_connection_complete(hci_connection_t *conn);
|
||||||
void hci_emit_l2cap_check_timeout(hci_connection_t *conn);
|
void hci_emit_l2cap_check_timeout(hci_connection_t *conn);
|
||||||
void hci_emit_nr_connections_changed();
|
void hci_emit_nr_connections_changed();
|
||||||
|
void hci_emit_hci_open_failed();
|
||||||
|
@ -96,6 +96,9 @@
|
|||||||
// data: event(8), len(8), nr hci connections
|
// data: event(8), len(8), nr hci connections
|
||||||
#define HCI_EVENT_NR_CONNECTIONS_CHANGED 0x85
|
#define HCI_EVENT_NR_CONNECTIONS_CHANGED 0x85
|
||||||
|
|
||||||
|
// data: none
|
||||||
|
#define HCI_EVENT_POWERON_FAILED 0x86
|
||||||
|
|
||||||
// data: event(8)
|
// data: event(8)
|
||||||
#define DAEMON_CONNECTION_CLOSED 0xc0
|
#define DAEMON_CONNECTION_CLOSED 0xc0
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user