xref: /btstack/port/windows-winusb/main.c (revision 7ea7688a8f341f3783e40a238546a118134c6d1b)
15da69017SMatthias Ringwald /*
25da69017SMatthias Ringwald  * Copyright (C) 2014 BlueKitchen GmbH
35da69017SMatthias Ringwald  *
45da69017SMatthias Ringwald  * Redistribution and use in source and binary forms, with or without
55da69017SMatthias Ringwald  * modification, are permitted provided that the following conditions
65da69017SMatthias Ringwald  * are met:
75da69017SMatthias Ringwald  *
85da69017SMatthias Ringwald  * 1. Redistributions of source code must retain the above copyright
95da69017SMatthias Ringwald  *    notice, this list of conditions and the following disclaimer.
105da69017SMatthias Ringwald  * 2. Redistributions in binary form must reproduce the above copyright
115da69017SMatthias Ringwald  *    notice, this list of conditions and the following disclaimer in the
125da69017SMatthias Ringwald  *    documentation and/or other materials provided with the distribution.
135da69017SMatthias Ringwald  * 3. Neither the name of the copyright holders nor the names of
145da69017SMatthias Ringwald  *    contributors may be used to endorse or promote products derived
155da69017SMatthias Ringwald  *    from this software without specific prior written permission.
165da69017SMatthias Ringwald  * 4. Any redistribution, use, or modification is done solely for
175da69017SMatthias Ringwald  *    personal benefit and not for any commercial purpose or for
185da69017SMatthias Ringwald  *    monetary gain.
195da69017SMatthias Ringwald  *
205da69017SMatthias Ringwald  * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS
215da69017SMatthias Ringwald  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
225da69017SMatthias Ringwald  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
235da69017SMatthias Ringwald  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS
245da69017SMatthias Ringwald  * RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
255da69017SMatthias Ringwald  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
265da69017SMatthias Ringwald  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
275da69017SMatthias Ringwald  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
285da69017SMatthias Ringwald  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
295da69017SMatthias Ringwald  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
305da69017SMatthias Ringwald  * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
315da69017SMatthias Ringwald  * SUCH DAMAGE.
325da69017SMatthias Ringwald  *
335da69017SMatthias Ringwald  * Please inquire about commercial licensing options at
345da69017SMatthias Ringwald  * [email protected]
355da69017SMatthias Ringwald  *
365da69017SMatthias Ringwald  */
375da69017SMatthias Ringwald 
38ab2c6ae4SMatthias Ringwald #define __BTSTACK_FILE__ "main.c"
39ab2c6ae4SMatthias Ringwald 
405da69017SMatthias Ringwald // *****************************************************************************
415da69017SMatthias Ringwald //
425da69017SMatthias Ringwald // minimal setup for HCI code
435da69017SMatthias Ringwald //
445da69017SMatthias Ringwald // *****************************************************************************
455da69017SMatthias Ringwald 
465da69017SMatthias Ringwald #include <stdint.h>
475da69017SMatthias Ringwald #include <stdio.h>
485da69017SMatthias Ringwald #include <stdlib.h>
495da69017SMatthias Ringwald #include <string.h>
505da69017SMatthias Ringwald #include <signal.h>
515da69017SMatthias Ringwald 
525da69017SMatthias Ringwald #include "btstack_config.h"
535da69017SMatthias Ringwald 
545da69017SMatthias Ringwald #include "btstack_debug.h"
555da69017SMatthias Ringwald #include "btstack_event.h"
565da69017SMatthias Ringwald #include "btstack_link_key_db_fs.h"
575da69017SMatthias Ringwald #include "btstack_memory.h"
585da69017SMatthias Ringwald #include "btstack_run_loop.h"
595da69017SMatthias Ringwald #include "btstack_run_loop_windows.h"
605da69017SMatthias Ringwald #include "hal_led.h"
615da69017SMatthias Ringwald #include "hci.h"
625da69017SMatthias Ringwald #include "hci_dump.h"
63*7ea7688aSMatthias Ringwald #include "btstack_stdin.h"
645da69017SMatthias Ringwald 
655da69017SMatthias Ringwald int btstack_main(int argc, const char * argv[]);
665da69017SMatthias Ringwald 
675da69017SMatthias Ringwald static btstack_packet_callback_registration_t hci_event_callback_registration;
685da69017SMatthias Ringwald 
695da69017SMatthias Ringwald static void packet_handler (uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
705da69017SMatthias Ringwald     if (packet_type != HCI_EVENT_PACKET) return;
715da69017SMatthias Ringwald     if (hci_event_packet_get_type(packet) != BTSTACK_EVENT_STATE) return;
725da69017SMatthias Ringwald     if (btstack_event_state_get_state(packet) != HCI_STATE_WORKING) return;
73cf524f2bSMatthias Ringwald     bd_addr_t addr;
74cf524f2bSMatthias Ringwald     gap_local_bd_addr(addr);
75cf524f2bSMatthias Ringwald     printf("BTstack up and running at %s\n",  bd_addr_to_str(addr));
765da69017SMatthias Ringwald }
775da69017SMatthias Ringwald 
785da69017SMatthias Ringwald static void sigint_handler(int param){
79b96c8f44SMatthias Ringwald     UNUSED(param);
805da69017SMatthias Ringwald 
81b96c8f44SMatthias Ringwald     printf("CTRL-C - SIGINT received, shutting down..\n");
82b96c8f44SMatthias Ringwald     log_info("sigint_handler: shutting down");
83b96c8f44SMatthias Ringwald 
845da69017SMatthias Ringwald     // reset anyway
855da69017SMatthias Ringwald     btstack_stdin_reset();
865da69017SMatthias Ringwald 
87b96c8f44SMatthias Ringwald     // power down
885da69017SMatthias Ringwald     hci_power_control(HCI_POWER_OFF);
895da69017SMatthias Ringwald     hci_close();
905da69017SMatthias Ringwald     log_info("Good bye, see you.\n");
915da69017SMatthias Ringwald     exit(0);
925da69017SMatthias Ringwald }
935da69017SMatthias Ringwald 
945da69017SMatthias Ringwald static int led_state = 0;
955da69017SMatthias Ringwald void hal_led_toggle(void){
965da69017SMatthias Ringwald     led_state = 1 - led_state;
975da69017SMatthias Ringwald     printf("LED State %u\n", led_state);
985da69017SMatthias Ringwald }
995da69017SMatthias Ringwald 
1005da69017SMatthias Ringwald 
1015da69017SMatthias Ringwald #define USB_MAX_PATH_LEN 7
1025da69017SMatthias Ringwald int main(int argc, const char * argv[]){
1035da69017SMatthias Ringwald 
1045da69017SMatthias Ringwald     // Prevent stdout buffering
1055da69017SMatthias Ringwald     setvbuf(stdout, NULL, _IONBF, 0);
1065da69017SMatthias Ringwald 
1075da69017SMatthias Ringwald     printf("BTstack/windows-winusb booting up\n");
1085da69017SMatthias Ringwald 
1095da69017SMatthias Ringwald #if 0
1105da69017SMatthias Ringwald     int usb_path_len = 0;
1115da69017SMatthias Ringwald     uint8_t usb_path[USB_MAX_PATH_LEN];
1125da69017SMatthias Ringwald     if (argc >= 3 && strcmp(argv[1], "-u") == 0){
1135da69017SMatthias Ringwald         // parse command line options for "-u 11:22:33"
1145da69017SMatthias Ringwald         const char * port_str = argv[2];
1155da69017SMatthias Ringwald         printf("Specified USB Path: ");
1165da69017SMatthias Ringwald         while (1){
1175da69017SMatthias Ringwald             char * delimiter;
1185da69017SMatthias Ringwald             int port = strtol(port_str, &delimiter, 16);
1195da69017SMatthias Ringwald             usb_path[usb_path_len] = port;
1205da69017SMatthias Ringwald             usb_path_len++;
1215da69017SMatthias Ringwald             printf("%02x ", port);
1225da69017SMatthias Ringwald             if (!delimiter) break;
1235da69017SMatthias Ringwald             if (*delimiter != ':' && *delimiter != '-') break;
1245da69017SMatthias Ringwald             port_str = delimiter+1;
1255da69017SMatthias Ringwald         }
1265da69017SMatthias Ringwald         printf("\n");
1275da69017SMatthias Ringwald     }
1285da69017SMatthias Ringwald #endif
1295da69017SMatthias Ringwald 
1305da69017SMatthias Ringwald 	/// GET STARTED with BTstack ///
1315da69017SMatthias Ringwald 	btstack_memory_init();
1325da69017SMatthias Ringwald     btstack_run_loop_init(btstack_run_loop_windows_get_instance());
1335da69017SMatthias Ringwald 
1345da69017SMatthias Ringwald     // if (usb_path_len){
1355da69017SMatthias Ringwald     //     hci_transport_usb_set_path(usb_path_len, usb_path);
1365da69017SMatthias Ringwald     // }
1375da69017SMatthias Ringwald 
1385da69017SMatthias Ringwald     // use logger: format HCI_DUMP_PACKETLOGGER, HCI_DUMP_BLUEZ or HCI_DUMP_STDOUT
1395da69017SMatthias Ringwald 
1405d0321acSMatthias Ringwald #if 1
1415da69017SMatthias Ringwald     char pklg_path[100];
1425da69017SMatthias Ringwald     strcpy(pklg_path, "hci_dump");
1435da69017SMatthias Ringwald #if 0
1445da69017SMatthias Ringwald     if (usb_path_len){
1455da69017SMatthias Ringwald         strcat(pklg_path, "_");
1465da69017SMatthias Ringwald         strcat(pklg_path, argv[2]);
1475da69017SMatthias Ringwald     }
1485da69017SMatthias Ringwald #endif
1495da69017SMatthias Ringwald     strcat(pklg_path, ".pklg");
1505da69017SMatthias Ringwald     printf("Packet Log: %s\n", pklg_path);
1515da69017SMatthias Ringwald     hci_dump_open(pklg_path, HCI_DUMP_PACKETLOGGER);
1525da69017SMatthias Ringwald #else
1535da69017SMatthias Ringwald     hci_dump_open(NULL, HCI_DUMP_STDOUT);
1545da69017SMatthias Ringwald #endif
1555da69017SMatthias Ringwald 
1565da69017SMatthias Ringwald     // init HCI
1575da69017SMatthias Ringwald 	hci_init(hci_transport_usb_instance(), NULL);
1585da69017SMatthias Ringwald 
1595da69017SMatthias Ringwald #ifdef ENABLE_CLASSIC
1605da69017SMatthias Ringwald     hci_set_link_key_db(btstack_link_key_db_fs_instance());
1615da69017SMatthias Ringwald #endif
1625da69017SMatthias Ringwald 
1635da69017SMatthias Ringwald     // inform about BTstack state
1645da69017SMatthias Ringwald     hci_event_callback_registration.callback = &packet_handler;
1655da69017SMatthias Ringwald     hci_add_event_handler(&hci_event_callback_registration);
1665da69017SMatthias Ringwald 
1675da69017SMatthias Ringwald     // handle CTRL-c
1685da69017SMatthias Ringwald     signal(SIGINT, sigint_handler);
1695da69017SMatthias Ringwald 
1705da69017SMatthias Ringwald     // setup app
1715da69017SMatthias Ringwald     btstack_main(argc, argv);
1725da69017SMatthias Ringwald 
1735da69017SMatthias Ringwald     // go
1745da69017SMatthias Ringwald     btstack_run_loop_execute();
1755da69017SMatthias Ringwald 
1765da69017SMatthias Ringwald     return 0;
1775da69017SMatthias Ringwald }
178