うおーるぼっとをWiiリモコンでコントロールする新しいプログラムです。 以前のものより、Wiiリモコンが早く繋がる様になりました。 It is a program which controls A with the Wii remote. ※ A Bluetooth dongle and a Wii remote control are needed.

Dependencies:   USBHost mbed FATFileSystem mbed-rtos

Committer:
jksoft
Date:
Mon Jun 10 16:01:50 2013 +0000
Revision:
0:fccb789424fc
1.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jksoft 0:fccb789424fc 1
jksoft 0:fccb789424fc 2 #include "mbed.h"
jksoft 0:fccb789424fc 3 #include <btstack/hci_cmds.h>
jksoft 0:fccb789424fc 4 #include <btstack/run_loop.h>
jksoft 0:fccb789424fc 5 #include <btstack/sdp_util.h>
jksoft 0:fccb789424fc 6 #include "hci.h"
jksoft 0:fccb789424fc 7 #include "l2cap.h"
jksoft 0:fccb789424fc 8 #include "btstack_memory.h"
jksoft 0:fccb789424fc 9 #include "remote_device_db.h"
jksoft 0:fccb789424fc 10 #include "rfcomm.h"
jksoft 0:fccb789424fc 11 extern "C" {
jksoft 0:fccb789424fc 12 #include "sdp.h"
jksoft 0:fccb789424fc 13 }
jksoft 0:fccb789424fc 14 #include "config.h"
jksoft 0:fccb789424fc 15 #include "debug.h"
jksoft 0:fccb789424fc 16 #include "bd_addr.h" // class bd_addr
jksoft 0:fccb789424fc 17
jksoft 0:fccb789424fc 18 #include "Wiimote.h"
jksoft 0:fccb789424fc 19 #include "TB6612.h"
jksoft 0:fccb789424fc 20
jksoft 0:fccb789424fc 21 // ----- Wallbot I/O Setting -----
jksoft 0:fccb789424fc 22 // Motor
jksoft 0:fccb789424fc 23 TB6612 right(p21,p12,p11);
jksoft 0:fccb789424fc 24 TB6612 left(p22,p14,p13);
jksoft 0:fccb789424fc 25
jksoft 0:fccb789424fc 26 #define WII_REMOTE_CONNECTION_SYNC 0 // 0:old Wii Remote 1:New Wii Remote
jksoft 0:fccb789424fc 27 #define REPORTMODE_TT_BIT 0x00
jksoft 0:fccb789424fc 28 #define WII_REMOTE_REPORT_MODE 0x31
jksoft 0:fccb789424fc 29 #define MAX_SPEED 100
jksoft 0:fccb789424fc 30
jksoft 0:fccb789424fc 31 #define HEARTBEAT_PERIOD_MS 1000
jksoft 0:fccb789424fc 32 #define INQUIRY_INTERVAL 15
jksoft 0:fccb789424fc 33
jksoft 0:fccb789424fc 34 Serial pc(USBTX, USBRX);
jksoft 0:fccb789424fc 35 DigitalOut ActLED(LED1);
jksoft 0:fccb789424fc 36
jksoft 0:fccb789424fc 37
jksoft 0:fccb789424fc 38
jksoft 0:fccb789424fc 39 static bd_addr_t keyboard;
jksoft 0:fccb789424fc 40 static int haveKeyboard = 0;
jksoft 0:fccb789424fc 41 static char lineBuffer[80];
jksoft 0:fccb789424fc 42 static short wii_remocon_channel_id=0;
jksoft 0:fccb789424fc 43
jksoft 0:fccb789424fc 44 int DirectMode( Wiimote* wii, int stat )
jksoft 0:fccb789424fc 45 {
jksoft 0:fccb789424fc 46
jksoft 0:fccb789424fc 47 if( wii->left )
jksoft 0:fccb789424fc 48 {
jksoft 0:fccb789424fc 49 right = -MAX_SPEED;
jksoft 0:fccb789424fc 50 left = MAX_SPEED;
jksoft 0:fccb789424fc 51 }
jksoft 0:fccb789424fc 52 else if( wii->right )
jksoft 0:fccb789424fc 53 {
jksoft 0:fccb789424fc 54 right = MAX_SPEED;
jksoft 0:fccb789424fc 55 left = -MAX_SPEED;
jksoft 0:fccb789424fc 56 }
jksoft 0:fccb789424fc 57 else if( wii->up )
jksoft 0:fccb789424fc 58 {
jksoft 0:fccb789424fc 59 right = MAX_SPEED;
jksoft 0:fccb789424fc 60 left = MAX_SPEED;
jksoft 0:fccb789424fc 61 }
jksoft 0:fccb789424fc 62 else if( wii->down )
jksoft 0:fccb789424fc 63 {
jksoft 0:fccb789424fc 64 right = -MAX_SPEED;
jksoft 0:fccb789424fc 65 left = -MAX_SPEED;
jksoft 0:fccb789424fc 66 }
jksoft 0:fccb789424fc 67 else
jksoft 0:fccb789424fc 68 {
jksoft 0:fccb789424fc 69 right = 0;
jksoft 0:fccb789424fc 70 left = 0;
jksoft 0:fccb789424fc 71 }
jksoft 0:fccb789424fc 72
jksoft 0:fccb789424fc 73 float factor = wii->wheel * 1.5f;
jksoft 0:fccb789424fc 74
jksoft 0:fccb789424fc 75 if(factor > 100.0f ) factor = 100.0f;
jksoft 0:fccb789424fc 76 if(factor < -100.0f ) factor = -100.0f;
jksoft 0:fccb789424fc 77
jksoft 0:fccb789424fc 78 printf("%f\t%f\r\n",wii->wheel,factor);
jksoft 0:fccb789424fc 79
jksoft 0:fccb789424fc 80 int left_factor = (int)((factor <= 0.0) ? 100.0 : 100.0 - factor);
jksoft 0:fccb789424fc 81 int right_factor = (int)((factor >= 0.0) ? 100.0 : 100.0 - (-factor));
jksoft 0:fccb789424fc 82
jksoft 0:fccb789424fc 83 if( wii->one )
jksoft 0:fccb789424fc 84 {
jksoft 0:fccb789424fc 85 right = right_factor;
jksoft 0:fccb789424fc 86 left = left_factor;
jksoft 0:fccb789424fc 87 }
jksoft 0:fccb789424fc 88 if( wii->two )
jksoft 0:fccb789424fc 89 {
jksoft 0:fccb789424fc 90 right = -left_factor;
jksoft 0:fccb789424fc 91 left = -right_factor;
jksoft 0:fccb789424fc 92 }
jksoft 0:fccb789424fc 93
jksoft 0:fccb789424fc 94 return(stat);
jksoft 0:fccb789424fc 95 }
jksoft 0:fccb789424fc 96
jksoft 0:fccb789424fc 97 int wall_bot_remote(char *c)
jksoft 0:fccb789424fc 98 {
jksoft 0:fccb789424fc 99 Wiimote wii;
jksoft 0:fccb789424fc 100 int ret = 0;
jksoft 0:fccb789424fc 101
jksoft 0:fccb789424fc 102 wii.decode(c);
jksoft 0:fccb789424fc 103
jksoft 0:fccb789424fc 104 ret = DirectMode( &wii ,ret );
jksoft 0:fccb789424fc 105
jksoft 0:fccb789424fc 106 return(ret);
jksoft 0:fccb789424fc 107 }
jksoft 0:fccb789424fc 108
jksoft 0:fccb789424fc 109 void wii_remote_report_mode(uint16_t channel,uint8_t tt,uint8_t mm)
jksoft 0:fccb789424fc 110 {
jksoft 0:fccb789424fc 111 lineBuffer[0]=0xa2;
jksoft 0:fccb789424fc 112 lineBuffer[1]=0x12;
jksoft 0:fccb789424fc 113 lineBuffer[2]=tt;
jksoft 0:fccb789424fc 114 lineBuffer[3]=mm;
jksoft 0:fccb789424fc 115 l2cap_send_internal(channel,(uint8_t*)lineBuffer,4);
jksoft 0:fccb789424fc 116 }
jksoft 0:fccb789424fc 117
jksoft 0:fccb789424fc 118 void wii_remote_request_status_report(uint16_t channel)
jksoft 0:fccb789424fc 119 {
jksoft 0:fccb789424fc 120 lineBuffer[0]=0xa2;
jksoft 0:fccb789424fc 121 lineBuffer[1]=0x15;
jksoft 0:fccb789424fc 122 lineBuffer[2]=0x00;
jksoft 0:fccb789424fc 123 l2cap_send_internal(channel,(uint8_t*)lineBuffer,3);
jksoft 0:fccb789424fc 124 }
jksoft 0:fccb789424fc 125
jksoft 0:fccb789424fc 126 void hid_process_packet(uint16_t channel,unsigned char *hid_report,uint16_t size)
jksoft 0:fccb789424fc 127 {
jksoft 0:fccb789424fc 128 if(hid_report[0]!=0xa1){
jksoft 0:fccb789424fc 129 return;
jksoft 0:fccb789424fc 130 }
jksoft 0:fccb789424fc 131
jksoft 0:fccb789424fc 132 if(hid_report[1]==0x30){
jksoft 0:fccb789424fc 133 wii_remote_report_mode(channel,REPORTMODE_TT_BIT,WII_REMOTE_REPORT_MODE);
jksoft 0:fccb789424fc 134 wii_remote_request_status_report(channel);
jksoft 0:fccb789424fc 135 }
jksoft 0:fccb789424fc 136
jksoft 0:fccb789424fc 137 switch(hid_report[1]){
jksoft 0:fccb789424fc 138 case 0x30: //0x30:Core Buttons
jksoft 0:fccb789424fc 139 case 0x31: //0x31:Core Buttons and Accelerometer
jksoft 0:fccb789424fc 140 case 0x35: //0x35:Core Buttons and Accelerometer with 16 Extension Bytes
jksoft 0:fccb789424fc 141 wall_bot_remote( (char*)&hid_report[2] );
jksoft 0:fccb789424fc 142 break;
jksoft 0:fccb789424fc 143 default:
jksoft 0:fccb789424fc 144 break;
jksoft 0:fccb789424fc 145 }
jksoft 0:fccb789424fc 146 return;
jksoft 0:fccb789424fc 147 }
jksoft 0:fccb789424fc 148
jksoft 0:fccb789424fc 149 static void l2cap_packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size)
jksoft 0:fccb789424fc 150 {
jksoft 0:fccb789424fc 151 if (packet_type == HCI_EVENT_PACKET){
jksoft 0:fccb789424fc 152 switch(packet[0]){
jksoft 0:fccb789424fc 153 case L2CAP_EVENT_INCOMING_CONNECTION:
jksoft 0:fccb789424fc 154 log_info("L2CAP_EVENT_INCOMING_CONNECTION\n");
jksoft 0:fccb789424fc 155 l2cap_accept_connection_internal(channel);
jksoft 0:fccb789424fc 156 break;
jksoft 0:fccb789424fc 157 case L2CAP_EVENT_CHANNEL_OPENED:
jksoft 0:fccb789424fc 158 if (packet[2]) {
jksoft 0:fccb789424fc 159 log_info("Connection failed\n");
jksoft 0:fccb789424fc 160 return;
jksoft 0:fccb789424fc 161 }
jksoft 0:fccb789424fc 162 log_info("interrupt channel connected\n");
jksoft 0:fccb789424fc 163 wii_remocon_channel_id=channel;
jksoft 0:fccb789424fc 164 break;
jksoft 0:fccb789424fc 165 case L2CAP_EVENT_CHANNEL_CLOSED:
jksoft 0:fccb789424fc 166 wii_remocon_channel_id=0;
jksoft 0:fccb789424fc 167 // use_extension=0;
jksoft 0:fccb789424fc 168 haveKeyboard = 0;
jksoft 0:fccb789424fc 169 hci_send_cmd(&hci_inquiry, HCI_INQUIRY_LAP, INQUIRY_INTERVAL, 0);
jksoft 0:fccb789424fc 170 break;
jksoft 0:fccb789424fc 171 default:
jksoft 0:fccb789424fc 172 break;
jksoft 0:fccb789424fc 173 }
jksoft 0:fccb789424fc 174 }
jksoft 0:fccb789424fc 175 if (packet_type == L2CAP_DATA_PACKET){
jksoft 0:fccb789424fc 176 hid_process_packet(channel,packet,size);
jksoft 0:fccb789424fc 177 }
jksoft 0:fccb789424fc 178 }
jksoft 0:fccb789424fc 179
jksoft 0:fccb789424fc 180 //static uint16_t control_channel=0;
jksoft 0:fccb789424fc 181 static void l2cap_control_packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size)
jksoft 0:fccb789424fc 182 {
jksoft 0:fccb789424fc 183 if (packet_type == HCI_EVENT_PACKET){
jksoft 0:fccb789424fc 184 switch(packet[0]){
jksoft 0:fccb789424fc 185 case L2CAP_EVENT_INCOMING_CONNECTION:
jksoft 0:fccb789424fc 186 log_info("L2CAP_EVENT_INCOMING_CONNECTION\n");
jksoft 0:fccb789424fc 187 l2cap_accept_connection_internal(channel);
jksoft 0:fccb789424fc 188 break;
jksoft 0:fccb789424fc 189 case L2CAP_EVENT_CHANNEL_OPENED:
jksoft 0:fccb789424fc 190 if (packet[2]) {
jksoft 0:fccb789424fc 191 // xputs("control Connection failed\n");
jksoft 0:fccb789424fc 192 return;
jksoft 0:fccb789424fc 193 }
jksoft 0:fccb789424fc 194 // xputs("control channel connected\n");
jksoft 0:fccb789424fc 195 l2cap_create_channel_internal(NULL, l2cap_packet_handler, keyboard, PSM_HID_INTERRUPT, 150);
jksoft 0:fccb789424fc 196 //control_channel=channel;
jksoft 0:fccb789424fc 197 break;
jksoft 0:fccb789424fc 198 case L2CAP_EVENT_CHANNEL_CLOSED:
jksoft 0:fccb789424fc 199 log_info("L2CAP_CHANNEL_CLOSED\n");
jksoft 0:fccb789424fc 200 //control_channel=0;
jksoft 0:fccb789424fc 201 break;
jksoft 0:fccb789424fc 202 case L2CAP_EVENT_CREDITS:
jksoft 0:fccb789424fc 203 break;
jksoft 0:fccb789424fc 204 default:
jksoft 0:fccb789424fc 205 log_info("l2cap:unknown(%02x)\n",packet[0]);
jksoft 0:fccb789424fc 206 break;
jksoft 0:fccb789424fc 207 }
jksoft 0:fccb789424fc 208 }
jksoft 0:fccb789424fc 209 }
jksoft 0:fccb789424fc 210
jksoft 0:fccb789424fc 211 // Bluetooth logic
jksoft 0:fccb789424fc 212 static void packet_handler (void * connection, uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
jksoft 0:fccb789424fc 213 bd_addr_t event_addr;
jksoft 0:fccb789424fc 214
jksoft 0:fccb789424fc 215 switch (packet_type) {
jksoft 0:fccb789424fc 216 case HCI_EVENT_PACKET:
jksoft 0:fccb789424fc 217 switch (packet[0]) {
jksoft 0:fccb789424fc 218 case BTSTACK_EVENT_STATE:
jksoft 0:fccb789424fc 219 // bt stack activated, get started - set local name
jksoft 0:fccb789424fc 220 if (packet[2] == HCI_STATE_WORKING) {
jksoft 0:fccb789424fc 221 hci_send_cmd(&hci_write_local_name, "mbed");
jksoft 0:fccb789424fc 222 }
jksoft 0:fccb789424fc 223 break;
jksoft 0:fccb789424fc 224
jksoft 0:fccb789424fc 225 case HCI_EVENT_COMMAND_COMPLETE:
jksoft 0:fccb789424fc 226 if (COMMAND_COMPLETE_EVENT(packet, hci_read_bd_addr)){
jksoft 0:fccb789424fc 227 bt_flip_addr(event_addr, &packet[6]);
jksoft 0:fccb789424fc 228 log_info("BD-ADDR: %s\n", bd_addr_to_str(event_addr));
jksoft 0:fccb789424fc 229 break;
jksoft 0:fccb789424fc 230 }
jksoft 0:fccb789424fc 231 if (COMMAND_COMPLETE_EVENT(packet, hci_write_local_name)){
jksoft 0:fccb789424fc 232 // hci_discoverable_control(1);
jksoft 0:fccb789424fc 233 // hci_send_cmd(&hci_write_authentication_enable, 1);
jksoft 0:fccb789424fc 234 hci_send_cmd(&hci_write_authentication_enable, 0);
jksoft 0:fccb789424fc 235 break;
jksoft 0:fccb789424fc 236 }
jksoft 0:fccb789424fc 237 if (COMMAND_COMPLETE_EVENT(packet, hci_write_authentication_enable)){
jksoft 0:fccb789424fc 238 inquiry:
jksoft 0:fccb789424fc 239
jksoft 0:fccb789424fc 240 log_info("Inquiry\n");
jksoft 0:fccb789424fc 241 hci_send_cmd(&hci_inquiry, HCI_INQUIRY_LAP, INQUIRY_INTERVAL, 0);
jksoft 0:fccb789424fc 242
jksoft 0:fccb789424fc 243 break;
jksoft 0:fccb789424fc 244 }
jksoft 0:fccb789424fc 245 if (COMMAND_COMPLETE_EVENT(packet, hci_inquiry_cancel) ) {
jksoft 0:fccb789424fc 246 //l2cap_create_channel_internal(NULL, l2cap_packet_handler, keyboard, PSM_HID_INTERRUPT, 150);
jksoft 0:fccb789424fc 247 l2cap_create_channel_internal(NULL, l2cap_control_packet_handler, keyboard, PSM_HID_CONTROL, 150);
jksoft 0:fccb789424fc 248 break;
jksoft 0:fccb789424fc 249 }
jksoft 0:fccb789424fc 250 break;
jksoft 0:fccb789424fc 251 case HCI_EVENT_INQUIRY_RESULT:
jksoft 0:fccb789424fc 252
jksoft 0:fccb789424fc 253 // ignore further results
jksoft 0:fccb789424fc 254 if (haveKeyboard) break;
jksoft 0:fccb789424fc 255
jksoft 0:fccb789424fc 256 // ignore none wii remocon
jksoft 0:fccb789424fc 257 if(
jksoft 0:fccb789424fc 258 !(packet[12]==0x04 && packet[13]==0x25 && packet[14]==0x00)
jksoft 0:fccb789424fc 259 && !(packet[12]==0x08 && packet[13]==0x05 && packet[14]==0x00) //RVL-CNT-01-TR
jksoft 0:fccb789424fc 260 ){
jksoft 0:fccb789424fc 261 break;
jksoft 0:fccb789424fc 262 }
jksoft 0:fccb789424fc 263
jksoft 0:fccb789424fc 264 // flip addr
jksoft 0:fccb789424fc 265 bt_flip_addr(keyboard, &packet[3]);
jksoft 0:fccb789424fc 266
jksoft 0:fccb789424fc 267 // show
jksoft 0:fccb789424fc 268 log_info("found wii remocon:%s\n",bd_addr_to_str(keyboard));
jksoft 0:fccb789424fc 269
jksoft 0:fccb789424fc 270 haveKeyboard = 1;
jksoft 0:fccb789424fc 271 hci_send_cmd(&hci_inquiry_cancel);
jksoft 0:fccb789424fc 272 break;
jksoft 0:fccb789424fc 273
jksoft 0:fccb789424fc 274 case HCI_EVENT_INQUIRY_COMPLETE:
jksoft 0:fccb789424fc 275 log_info("No wii remocon\n");
jksoft 0:fccb789424fc 276 goto inquiry;
jksoft 0:fccb789424fc 277 //break;
jksoft 0:fccb789424fc 278 case HCI_EVENT_LINK_KEY_REQUEST:
jksoft 0:fccb789424fc 279 // deny link key request
jksoft 0:fccb789424fc 280 log_info("Link key request\n");
jksoft 0:fccb789424fc 281 bt_flip_addr(event_addr, &packet[2]);
jksoft 0:fccb789424fc 282 hci_send_cmd(&hci_link_key_request_negative_reply, &event_addr);
jksoft 0:fccb789424fc 283 break;
jksoft 0:fccb789424fc 284
jksoft 0:fccb789424fc 285 case HCI_EVENT_PIN_CODE_REQUEST:
jksoft 0:fccb789424fc 286 // inform about pin code request
jksoft 0:fccb789424fc 287 bt_flip_addr(event_addr, &packet[2]);
jksoft 0:fccb789424fc 288 //wii remocon
jksoft 0:fccb789424fc 289 #if WII_REMOTE_CONNECTION_SYNC
jksoft 0:fccb789424fc 290 bt_flip_addr(packet+2, addr_global);
jksoft 0:fccb789424fc 291 #endif
jksoft 0:fccb789424fc 292 log_info("Pin code request - using %02x%02x%02x%02x%02x%02x\n",packet[2],packet[3],packet[4],packet[5],packet[6],packet[7]);
jksoft 0:fccb789424fc 293 memset(packet+2+6,0x00,10);
jksoft 0:fccb789424fc 294 hci_send_cmd(&hci_pin_code_request_reply, &event_addr, 6, &packet[2]);
jksoft 0:fccb789424fc 295 break;
jksoft 0:fccb789424fc 296 case HCI_EVENT_CONNECTION_COMPLETE:
jksoft 0:fccb789424fc 297 //log_info("connection complete: status=%d\n",packet[2]);
jksoft 0:fccb789424fc 298 if(packet[2]){
jksoft 0:fccb789424fc 299 haveKeyboard=0;
jksoft 0:fccb789424fc 300 goto inquiry;
jksoft 0:fccb789424fc 301 }
jksoft 0:fccb789424fc 302 break;
jksoft 0:fccb789424fc 303 default:
jksoft 0:fccb789424fc 304 break;
jksoft 0:fccb789424fc 305 }
jksoft 0:fccb789424fc 306 break;
jksoft 0:fccb789424fc 307 default:
jksoft 0:fccb789424fc 308 break;
jksoft 0:fccb789424fc 309 }
jksoft 0:fccb789424fc 310 }
jksoft 0:fccb789424fc 311
jksoft 0:fccb789424fc 312 static void heartbeat_handler(struct timer *ts){
jksoft 0:fccb789424fc 313 static int counter = 0;
jksoft 0:fccb789424fc 314 counter++;
jksoft 0:fccb789424fc 315
jksoft 0:fccb789424fc 316 if(wii_remocon_channel_id){
jksoft 0:fccb789424fc 317 lineBuffer[0]=0xa2;
jksoft 0:fccb789424fc 318 lineBuffer[1]=0x11;
jksoft 0:fccb789424fc 319 lineBuffer[2]=0x10<<(counter%4); //LED Player1
jksoft 0:fccb789424fc 320 if(l2cap_send_internal(wii_remocon_channel_id,(uint8_t*)lineBuffer,3)<0){
jksoft 0:fccb789424fc 321 //error control init
jksoft 0:fccb789424fc 322 }
jksoft 0:fccb789424fc 323 ActLED = !ActLED;
jksoft 0:fccb789424fc 324 }
jksoft 0:fccb789424fc 325 run_loop_set_timer(ts, HEARTBEAT_PERIOD_MS);
jksoft 0:fccb789424fc 326 run_loop_add_timer(ts);
jksoft 0:fccb789424fc 327 }
jksoft 0:fccb789424fc 328
jksoft 0:fccb789424fc 329 // main
jksoft 0:fccb789424fc 330 int main(void)
jksoft 0:fccb789424fc 331 {
jksoft 0:fccb789424fc 332 pc.baud(921600);
jksoft 0:fccb789424fc 333 log_info("%s\n", __FILE__);
jksoft 0:fccb789424fc 334
jksoft 0:fccb789424fc 335 // init LEDs
jksoft 0:fccb789424fc 336 ActLED = 0;
jksoft 0:fccb789424fc 337
jksoft 0:fccb789424fc 338 /// GET STARTED with BTstack ///
jksoft 0:fccb789424fc 339 btstack_memory_init();
jksoft 0:fccb789424fc 340 run_loop_init(RUN_LOOP_EMBEDDED);
jksoft 0:fccb789424fc 341
jksoft 0:fccb789424fc 342 // init HCI
jksoft 0:fccb789424fc 343 hci_transport_t* transport = hci_transport_usb_instance();
jksoft 0:fccb789424fc 344 remote_device_db_t * remote_db = (remote_device_db_t *) &remote_device_db_memory;
jksoft 0:fccb789424fc 345 hci_init(transport, NULL, NULL, remote_db);
jksoft 0:fccb789424fc 346
jksoft 0:fccb789424fc 347 // init L2CAP
jksoft 0:fccb789424fc 348 l2cap_init();
jksoft 0:fccb789424fc 349 l2cap_register_packet_handler(packet_handler);
jksoft 0:fccb789424fc 350
jksoft 0:fccb789424fc 351 #if 0
jksoft 0:fccb789424fc 352 // init RFCOMM
jksoft 0:fccb789424fc 353 rfcomm_init();
jksoft 0:fccb789424fc 354 rfcomm_register_packet_handler(packet_handler);
jksoft 0:fccb789424fc 355 rfcomm_register_service_internal(NULL, rfcomm_channel_nr, 100); // reserved channel, mtu=100
jksoft 0:fccb789424fc 356
jksoft 0:fccb789424fc 357
jksoft 0:fccb789424fc 358 // init SDP, create record for SPP and register with SDP
jksoft 0:fccb789424fc 359 sdp_init();
jksoft 0:fccb789424fc 360 memset(spp_service_buffer, 0, sizeof(spp_service_buffer));
jksoft 0:fccb789424fc 361 service_record_item_t * service_record_item = (service_record_item_t *) spp_service_buffer;
jksoft 0:fccb789424fc 362 sdp_create_spp_service( (uint8_t*) &service_record_item->service_record, 1, "loopback");
jksoft 0:fccb789424fc 363 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)));
jksoft 0:fccb789424fc 364 sdp_register_service_internal(NULL, service_record_item);
jksoft 0:fccb789424fc 365 #endif
jksoft 0:fccb789424fc 366
jksoft 0:fccb789424fc 367 // set one-shot timer
jksoft 0:fccb789424fc 368 timer_source_t heartbeat;
jksoft 0:fccb789424fc 369 heartbeat.process = &heartbeat_handler;
jksoft 0:fccb789424fc 370 run_loop_set_timer(&heartbeat, HEARTBEAT_PERIOD_MS);
jksoft 0:fccb789424fc 371 run_loop_add_timer(&heartbeat);
jksoft 0:fccb789424fc 372
jksoft 0:fccb789424fc 373 log_info("SPP loopback demo...\n\r");
jksoft 0:fccb789424fc 374
jksoft 0:fccb789424fc 375 // turn on!
jksoft 0:fccb789424fc 376 hci_power_control(HCI_POWER_ON);
jksoft 0:fccb789424fc 377
jksoft 0:fccb789424fc 378 // go!
jksoft 0:fccb789424fc 379 run_loop_execute();
jksoft 0:fccb789424fc 380
jksoft 0:fccb789424fc 381 return 0;
jksoft 0:fccb789424fc 382 }