うおーるぼっとを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
main.cpp@0:fccb789424fc, 2013-06-10 (annotated)
- Committer:
- jksoft
- Date:
- Mon Jun 10 16:01:50 2013 +0000
- Revision:
- 0:fccb789424fc
1.0
Who changed what in which revision?
User | Revision | Line number | New 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 | } |