Norimasa Okamoto
/
BTstack
BTstack Bluetooth stack
Embed:
(wiki syntax)
Show/hide line numbers
spp_flowcontrol.cpp
00001 #if 0 00002 //***************************************************************************** 00003 // 00004 // spp_counter demo - it provides a SPP and sends a counter every second 00005 // 00006 // it doesn't use the LCD to get down to a minimal memory footpring 00007 // 00008 //***************************************************************************** 00009 #include "mbed.h" 00010 #include <btstack/hci_cmds.h> 00011 #include <btstack/run_loop.h> 00012 #include <btstack/sdp_util.h> 00013 #include "hci.h" 00014 #include "l2cap.h" 00015 #include "btstack_memory.h" 00016 #include "remote_device_db.h" 00017 #include "rfcomm.h" 00018 #include "sdp.h" 00019 #include "config.h" 00020 #include "debug.h" 00021 #include "bd_addr.h" // class bd_addr 00022 00023 Serial pc(USBTX, USBRX); 00024 DigitalOut led1(LED1), led2(LED2); 00025 00026 #define HEARTBEAT_PERIOD_MS 500 00027 00028 static uint8_t rfcomm_channel_nr = 1; 00029 static uint16_t rfcomm_channel_id = 0; 00030 static uint8_t rfcomm_send_credit = 0; 00031 static uint8_t spp_service_buffer[128]; 00032 00033 // Bluetooth logic 00034 static void packet_handler (void * connection, uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){ 00035 bd_addr_t event_addr; 00036 uint8_t rfcomm_channel_nr; 00037 uint16_t mtu; 00038 00039 switch (packet_type) { 00040 case HCI_EVENT_PACKET: 00041 switch (packet[0]) { 00042 00043 case BTSTACK_EVENT_STATE: 00044 // bt stack activated, get started - set local name 00045 if (packet[2] == HCI_STATE_WORKING) { 00046 hci_send_cmd(&hci_write_local_name, "mbed-Demo"); 00047 } 00048 break; 00049 00050 case HCI_EVENT_COMMAND_COMPLETE: 00051 if (COMMAND_COMPLETE_EVENT(packet, hci_read_bd_addr)){ 00052 bt_flip_addr(event_addr, &packet[6]); 00053 log_info("BD-ADDR: %s\n\r", bd_addr_to_str(event_addr)); 00054 break; 00055 } 00056 if (COMMAND_COMPLETE_EVENT(packet, hci_write_local_name)){ 00057 hci_discoverable_control(1); 00058 break; 00059 } 00060 break; 00061 00062 case HCI_EVENT_LINK_KEY_REQUEST: 00063 // deny link key request 00064 log_info("Link key request\n\r"); 00065 bt_flip_addr(event_addr, &packet[2]); 00066 hci_send_cmd(&hci_link_key_request_negative_reply, &event_addr); 00067 break; 00068 00069 case HCI_EVENT_PIN_CODE_REQUEST: 00070 // inform about pin code request 00071 log_info("Pin code request - using '0000'\n\r"); 00072 bt_flip_addr(event_addr, &packet[2]); 00073 hci_send_cmd(&hci_pin_code_request_reply, &event_addr, 4, "0000"); 00074 break; 00075 00076 case RFCOMM_EVENT_INCOMING_CONNECTION: 00077 // data: event (8), len(8), address(48), channel (8), rfcomm_cid (16) 00078 bt_flip_addr(event_addr, &packet[2]); 00079 rfcomm_channel_nr = packet[8]; 00080 rfcomm_channel_id = READ_BT_16(packet, 9); 00081 log_info("RFCOMM channel %u requested for %s\n\r", rfcomm_channel_nr, bd_addr_to_str(event_addr)); 00082 rfcomm_accept_connection_internal(rfcomm_channel_id); 00083 break; 00084 00085 case RFCOMM_EVENT_OPEN_CHANNEL_COMPLETE: 00086 // data: event(8), len(8), status (8), address (48), server channel(8), rfcomm_cid(16), max frame size(16) 00087 if (packet[2]) { 00088 log_info("RFCOMM channel open failed, status %u\n\r", packet[2]); 00089 } else { 00090 rfcomm_channel_id = READ_BT_16(packet, 12); 00091 mtu = READ_BT_16(packet, 14); 00092 log_info("\n\rRFCOMM channel open succeeded. New RFCOMM Channel ID %u, max frame size %u\n\r", rfcomm_channel_id, mtu); 00093 } 00094 break; 00095 00096 case RFCOMM_EVENT_CHANNEL_CLOSED: 00097 rfcomm_channel_id = 0; 00098 break; 00099 00100 default: 00101 break; 00102 } 00103 break; 00104 00105 case RFCOMM_DATA_PACKET: 00106 // hack: truncate data (we know that the packet is at least on byte bigger 00107 packet[size] = 0; 00108 puts( (const char *) packet); 00109 rfcomm_send_credit = 1; 00110 default: 00111 break; 00112 } 00113 } 00114 00115 static void heartbeat_handler(struct timer *ts){ 00116 if (rfcomm_send_credit){ 00117 rfcomm_grant_credits(rfcomm_channel_id, 1); 00118 rfcomm_send_credit = 0; 00119 } 00120 run_loop_set_timer(ts, HEARTBEAT_PERIOD_MS); 00121 run_loop_add_timer(ts); 00122 led2 = !led2; 00123 } 00124 00125 // main 00126 int main(void) 00127 { 00128 pc.baud(921600); 00129 log_info("%s\n", __FILE__); 00130 00131 // init LEDs 00132 led1 = led2 = 1; 00133 00134 /// GET STARTED with BTstack /// 00135 btstack_memory_init(); 00136 run_loop_init(RUN_LOOP_EMBEDDED); 00137 00138 // init HCI 00139 hci_transport_t* transport = hci_transport_usb_instance(); 00140 remote_device_db_t * remote_db = (remote_device_db_t *) &remote_device_db_memory; 00141 hci_init(transport, NULL, NULL, remote_db); 00142 00143 // init L2CAP 00144 l2cap_init(); 00145 l2cap_register_packet_handler(packet_handler); 00146 00147 // init RFCOMM 00148 rfcomm_init(); 00149 rfcomm_register_packet_handler(packet_handler); 00150 rfcomm_register_service_with_initial_credits_internal(NULL, rfcomm_channel_nr, 100, 1); // reserved channel, mtu=100, 1 credit 00151 00152 // init SDP, create record for SPP and register with SDP 00153 sdp_init(); 00154 memset(spp_service_buffer, 0, sizeof(spp_service_buffer)); 00155 service_record_item_t * service_record_item = (service_record_item_t *) spp_service_buffer; 00156 sdp_create_spp_service( (uint8_t*) &service_record_item->service_record, 1, "SPP Counter"); 00157 log_info("SDP service buffer size: %u\n\r", (uint16_t) (sizeof(service_record_item_t) + de_get_len((uint8_t*) &service_record_item->service_record))); 00158 sdp_register_service_internal(NULL, service_record_item); 00159 00160 // set one-shot timer 00161 timer_source_t heartbeat; 00162 heartbeat.process = &heartbeat_handler; 00163 run_loop_set_timer(&heartbeat, HEARTBEAT_PERIOD_MS); 00164 run_loop_add_timer(&heartbeat); 00165 00166 00167 log_info("SPP FlowControl Demo: simulates processing on received data...\n\r"); 00168 00169 // turn on! 00170 hci_power_control(HCI_POWER_ON); 00171 00172 // go! 00173 run_loop_execute(); 00174 00175 // happy compiler! 00176 return 0; 00177 } 00178 #endif
Generated on Tue Jul 12 2022 15:55:29 by 1.7.2