うおーるぼっとを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 * Copyright (C) 2009-2012 by Matthias Ringwald
jksoft 0:fccb789424fc 3 *
jksoft 0:fccb789424fc 4 * Redistribution and use in source and binary forms, with or without
jksoft 0:fccb789424fc 5 * modification, are permitted provided that the following conditions
jksoft 0:fccb789424fc 6 * are met:
jksoft 0:fccb789424fc 7 *
jksoft 0:fccb789424fc 8 * 1. Redistributions of source code must retain the above copyright
jksoft 0:fccb789424fc 9 * notice, this list of conditions and the following disclaimer.
jksoft 0:fccb789424fc 10 * 2. Redistributions in binary form must reproduce the above copyright
jksoft 0:fccb789424fc 11 * notice, this list of conditions and the following disclaimer in the
jksoft 0:fccb789424fc 12 * documentation and/or other materials provided with the distribution.
jksoft 0:fccb789424fc 13 * 3. Neither the name of the copyright holders nor the names of
jksoft 0:fccb789424fc 14 * contributors may be used to endorse or promote products derived
jksoft 0:fccb789424fc 15 * from this software without specific prior written permission.
jksoft 0:fccb789424fc 16 * 4. Any redistribution, use, or modification is done solely for
jksoft 0:fccb789424fc 17 * personal benefit and not for any commercial purpose or for
jksoft 0:fccb789424fc 18 * monetary gain.
jksoft 0:fccb789424fc 19 *
jksoft 0:fccb789424fc 20 * THIS SOFTWARE IS PROVIDED BY MATTHIAS RINGWALD AND CONTRIBUTORS
jksoft 0:fccb789424fc 21 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
jksoft 0:fccb789424fc 22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
jksoft 0:fccb789424fc 23 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS
jksoft 0:fccb789424fc 24 * RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
jksoft 0:fccb789424fc 25 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
jksoft 0:fccb789424fc 26 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
jksoft 0:fccb789424fc 27 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
jksoft 0:fccb789424fc 28 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
jksoft 0:fccb789424fc 29 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
jksoft 0:fccb789424fc 30 * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
jksoft 0:fccb789424fc 31 * SUCH DAMAGE.
jksoft 0:fccb789424fc 32 *
jksoft 0:fccb789424fc 33 * Please inquire about commercial licensing options at btstack@ringwald.ch
jksoft 0:fccb789424fc 34 *
jksoft 0:fccb789424fc 35 */
jksoft 0:fccb789424fc 36
jksoft 0:fccb789424fc 37 /*
jksoft 0:fccb789424fc 38 * hci_dump.c
jksoft 0:fccb789424fc 39 *
jksoft 0:fccb789424fc 40 * Dump HCI trace in various formats:
jksoft 0:fccb789424fc 41 *
jksoft 0:fccb789424fc 42 * - BlueZ's hcidump format
jksoft 0:fccb789424fc 43 * - Apple's PacketLogger
jksoft 0:fccb789424fc 44 * - stdout hexdump
jksoft 0:fccb789424fc 45 *
jksoft 0:fccb789424fc 46 * Created by Matthias Ringwald on 5/26/09.
jksoft 0:fccb789424fc 47 */
jksoft 0:fccb789424fc 48
jksoft 0:fccb789424fc 49 #include "config.h"
jksoft 0:fccb789424fc 50
jksoft 0:fccb789424fc 51 #include "hci_dump.h"
jksoft 0:fccb789424fc 52 #include "hci.h"
jksoft 0:fccb789424fc 53 #include "hci_transport.h"
jksoft 0:fccb789424fc 54 #include <btstack/hci_cmds.h>
jksoft 0:fccb789424fc 55
jksoft 0:fccb789424fc 56 #ifndef EMBEDDED
jksoft 0:fccb789424fc 57 #include <fcntl.h> // open
jksoft 0:fccb789424fc 58 #include <arpa/inet.h> // hton..
jksoft 0:fccb789424fc 59 #include <unistd.h> // write
jksoft 0:fccb789424fc 60 #include <stdio.h>
jksoft 0:fccb789424fc 61 #include <time.h>
jksoft 0:fccb789424fc 62 #include <sys/time.h> // for timestamps
jksoft 0:fccb789424fc 63 #include <sys/stat.h> // for mode flags
jksoft 0:fccb789424fc 64 #include <stdarg.h> // for va_list
jksoft 0:fccb789424fc 65 #endif
jksoft 0:fccb789424fc 66
jksoft 0:fccb789424fc 67 // BLUEZ hcidump
jksoft 0:fccb789424fc 68 typedef struct {
jksoft 0:fccb789424fc 69 uint16_t len;
jksoft 0:fccb789424fc 70 uint8_t in;
jksoft 0:fccb789424fc 71 uint8_t pad;
jksoft 0:fccb789424fc 72 uint32_t ts_sec;
jksoft 0:fccb789424fc 73 uint32_t ts_usec;
jksoft 0:fccb789424fc 74 uint8_t packet_type;
jksoft 0:fccb789424fc 75 }
jksoft 0:fccb789424fc 76 #ifdef __GNUC__
jksoft 0:fccb789424fc 77 __attribute__ ((packed))
jksoft 0:fccb789424fc 78 #endif
jksoft 0:fccb789424fc 79 hcidump_hdr;
jksoft 0:fccb789424fc 80
jksoft 0:fccb789424fc 81 // APPLE PacketLogger
jksoft 0:fccb789424fc 82 typedef struct {
jksoft 0:fccb789424fc 83 uint32_t len;
jksoft 0:fccb789424fc 84 uint32_t ts_sec;
jksoft 0:fccb789424fc 85 uint32_t ts_usec;
jksoft 0:fccb789424fc 86 uint8_t type; // 0xfc for note
jksoft 0:fccb789424fc 87 }
jksoft 0:fccb789424fc 88 #ifdef __GNUC__
jksoft 0:fccb789424fc 89 __attribute__ ((packed))
jksoft 0:fccb789424fc 90 #endif
jksoft 0:fccb789424fc 91 pktlog_hdr;
jksoft 0:fccb789424fc 92
jksoft 0:fccb789424fc 93 #ifndef EMBEDDED
jksoft 0:fccb789424fc 94 static int dump_file = -1;
jksoft 0:fccb789424fc 95 static int dump_format;
jksoft 0:fccb789424fc 96 static hcidump_hdr header_bluez;
jksoft 0:fccb789424fc 97 static pktlog_hdr header_packetlogger;
jksoft 0:fccb789424fc 98 static char time_string[40];
jksoft 0:fccb789424fc 99 static int max_nr_packets = -1;
jksoft 0:fccb789424fc 100 static int nr_packets = 0;
jksoft 0:fccb789424fc 101 static char log_message_buffer[256];
jksoft 0:fccb789424fc 102 #endif
jksoft 0:fccb789424fc 103
jksoft 0:fccb789424fc 104 void hci_dump_open(char *filename, hci_dump_format_t format){
jksoft 0:fccb789424fc 105 #ifndef EMBEDDED
jksoft 0:fccb789424fc 106 dump_format = format;
jksoft 0:fccb789424fc 107 if (dump_format == HCI_DUMP_STDOUT) {
jksoft 0:fccb789424fc 108 dump_file = fileno(stdout);
jksoft 0:fccb789424fc 109 } else {
jksoft 0:fccb789424fc 110 dump_file = open(filename, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
jksoft 0:fccb789424fc 111 }
jksoft 0:fccb789424fc 112 #endif
jksoft 0:fccb789424fc 113 }
jksoft 0:fccb789424fc 114
jksoft 0:fccb789424fc 115 #ifndef EMBEDDED
jksoft 0:fccb789424fc 116 void hci_dump_set_max_packets(int packets){
jksoft 0:fccb789424fc 117 max_nr_packets = packets;
jksoft 0:fccb789424fc 118 }
jksoft 0:fccb789424fc 119 #endif
jksoft 0:fccb789424fc 120
jksoft 0:fccb789424fc 121 void hci_dump_packet(uint8_t packet_type, uint8_t in, uint8_t *packet, uint16_t len) {
jksoft 0:fccb789424fc 122 #ifndef EMBEDDED
jksoft 0:fccb789424fc 123
jksoft 0:fccb789424fc 124 if (dump_file < 0) return; // not activated yet
jksoft 0:fccb789424fc 125
jksoft 0:fccb789424fc 126 // don't grow bigger than max_nr_packets
jksoft 0:fccb789424fc 127 if (dump_format != HCI_DUMP_STDOUT && max_nr_packets > 0){
jksoft 0:fccb789424fc 128 if (nr_packets >= max_nr_packets){
jksoft 0:fccb789424fc 129 lseek(dump_file, 0, SEEK_SET);
jksoft 0:fccb789424fc 130 ftruncate(dump_file, 0);
jksoft 0:fccb789424fc 131 nr_packets = 0;
jksoft 0:fccb789424fc 132 }
jksoft 0:fccb789424fc 133 nr_packets++;
jksoft 0:fccb789424fc 134 }
jksoft 0:fccb789424fc 135
jksoft 0:fccb789424fc 136 // get time
jksoft 0:fccb789424fc 137 struct timeval curr_time;
jksoft 0:fccb789424fc 138 struct tm* ptm;
jksoft 0:fccb789424fc 139 gettimeofday(&curr_time, NULL);
jksoft 0:fccb789424fc 140
jksoft 0:fccb789424fc 141 switch (dump_format){
jksoft 0:fccb789424fc 142 case HCI_DUMP_STDOUT: {
jksoft 0:fccb789424fc 143 /* Obtain the time of day, and convert it to a tm struct. */
jksoft 0:fccb789424fc 144 ptm = localtime (&curr_time.tv_sec);
jksoft 0:fccb789424fc 145 /* Format the date and time, down to a single second. */
jksoft 0:fccb789424fc 146 strftime (time_string, sizeof (time_string), "[%Y-%m-%d %H:%M:%S", ptm);
jksoft 0:fccb789424fc 147 /* Compute milliseconds from microseconds. */
jksoft 0:fccb789424fc 148 uint16_t milliseconds = curr_time.tv_usec / 1000;
jksoft 0:fccb789424fc 149 /* Print the formatted time, in seconds, followed by a decimal point
jksoft 0:fccb789424fc 150 and the milliseconds. */
jksoft 0:fccb789424fc 151 printf ("%s.%03u] ", time_string, milliseconds);
jksoft 0:fccb789424fc 152 switch (packet_type){
jksoft 0:fccb789424fc 153 case HCI_COMMAND_DATA_PACKET:
jksoft 0:fccb789424fc 154 printf("CMD => ");
jksoft 0:fccb789424fc 155 break;
jksoft 0:fccb789424fc 156 case HCI_EVENT_PACKET:
jksoft 0:fccb789424fc 157 printf("EVT <= ");
jksoft 0:fccb789424fc 158 break;
jksoft 0:fccb789424fc 159 case HCI_ACL_DATA_PACKET:
jksoft 0:fccb789424fc 160 if (in) {
jksoft 0:fccb789424fc 161 printf("ACL <= ");
jksoft 0:fccb789424fc 162 } else {
jksoft 0:fccb789424fc 163 printf("ACL => ");
jksoft 0:fccb789424fc 164 }
jksoft 0:fccb789424fc 165 break;
jksoft 0:fccb789424fc 166 case LOG_MESSAGE_PACKET:
jksoft 0:fccb789424fc 167 // assume buffer is big enough
jksoft 0:fccb789424fc 168 packet[len] = 0;
jksoft 0:fccb789424fc 169 printf("LOG -- %s\n", (char*) packet);
jksoft 0:fccb789424fc 170 return;
jksoft 0:fccb789424fc 171 default:
jksoft 0:fccb789424fc 172 return;
jksoft 0:fccb789424fc 173 }
jksoft 0:fccb789424fc 174 hexdump(packet, len);
jksoft 0:fccb789424fc 175 break;
jksoft 0:fccb789424fc 176 }
jksoft 0:fccb789424fc 177
jksoft 0:fccb789424fc 178 case HCI_DUMP_BLUEZ:
jksoft 0:fccb789424fc 179 bt_store_16( (uint8_t *) &header_bluez.len, 0, 1 + len);
jksoft 0:fccb789424fc 180 header_bluez.in = in;
jksoft 0:fccb789424fc 181 header_bluez.pad = 0;
jksoft 0:fccb789424fc 182 bt_store_32( (uint8_t *) &header_bluez.ts_sec, 0, curr_time.tv_sec);
jksoft 0:fccb789424fc 183 bt_store_32( (uint8_t *) &header_bluez.ts_usec, 0, curr_time.tv_usec);
jksoft 0:fccb789424fc 184 header_bluez.packet_type = packet_type;
jksoft 0:fccb789424fc 185 write (dump_file, &header_bluez, sizeof(hcidump_hdr) );
jksoft 0:fccb789424fc 186 write (dump_file, packet, len );
jksoft 0:fccb789424fc 187 break;
jksoft 0:fccb789424fc 188
jksoft 0:fccb789424fc 189 case HCI_DUMP_PACKETLOGGER:
jksoft 0:fccb789424fc 190 header_packetlogger.len = htonl( sizeof(pktlog_hdr) - 4 + len);
jksoft 0:fccb789424fc 191 header_packetlogger.ts_sec = htonl(curr_time.tv_sec);
jksoft 0:fccb789424fc 192 header_packetlogger.ts_usec = htonl(curr_time.tv_usec);
jksoft 0:fccb789424fc 193 switch (packet_type){
jksoft 0:fccb789424fc 194 case HCI_COMMAND_DATA_PACKET:
jksoft 0:fccb789424fc 195 header_packetlogger.type = 0x00;
jksoft 0:fccb789424fc 196 break;
jksoft 0:fccb789424fc 197 case HCI_ACL_DATA_PACKET:
jksoft 0:fccb789424fc 198 if (in) {
jksoft 0:fccb789424fc 199 header_packetlogger.type = 0x03;
jksoft 0:fccb789424fc 200 } else {
jksoft 0:fccb789424fc 201 header_packetlogger.type = 0x02;
jksoft 0:fccb789424fc 202 }
jksoft 0:fccb789424fc 203 break;
jksoft 0:fccb789424fc 204 case HCI_EVENT_PACKET:
jksoft 0:fccb789424fc 205 header_packetlogger.type = 0x01;
jksoft 0:fccb789424fc 206 break;
jksoft 0:fccb789424fc 207 case LOG_MESSAGE_PACKET:
jksoft 0:fccb789424fc 208 header_packetlogger.type = 0xfc;
jksoft 0:fccb789424fc 209 break;
jksoft 0:fccb789424fc 210 default:
jksoft 0:fccb789424fc 211 return;
jksoft 0:fccb789424fc 212 }
jksoft 0:fccb789424fc 213 write (dump_file, &header_packetlogger, sizeof(pktlog_hdr) );
jksoft 0:fccb789424fc 214 write (dump_file, packet, len );
jksoft 0:fccb789424fc 215 break;
jksoft 0:fccb789424fc 216
jksoft 0:fccb789424fc 217 default:
jksoft 0:fccb789424fc 218 break;
jksoft 0:fccb789424fc 219 }
jksoft 0:fccb789424fc 220 #endif
jksoft 0:fccb789424fc 221 }
jksoft 0:fccb789424fc 222
jksoft 0:fccb789424fc 223 void hci_dump_log(const char * format, ...){
jksoft 0:fccb789424fc 224 #ifndef EMBEDDED
jksoft 0:fccb789424fc 225 va_list argptr;
jksoft 0:fccb789424fc 226 va_start(argptr, format);
jksoft 0:fccb789424fc 227 int len = vsnprintf(log_message_buffer, sizeof(log_message_buffer), format, argptr);
jksoft 0:fccb789424fc 228 hci_dump_packet(LOG_MESSAGE_PACKET, 0, (uint8_t*) log_message_buffer, len);
jksoft 0:fccb789424fc 229 va_end(argptr);
jksoft 0:fccb789424fc 230 #endif
jksoft 0:fccb789424fc 231 }
jksoft 0:fccb789424fc 232
jksoft 0:fccb789424fc 233 void hci_dump_close(){
jksoft 0:fccb789424fc 234 #ifndef EMBEDDED
jksoft 0:fccb789424fc 235 close(dump_file);
jksoft 0:fccb789424fc 236 dump_file = -1;
jksoft 0:fccb789424fc 237 #endif
jksoft 0:fccb789424fc 238 }
jksoft 0:fccb789424fc 239