うおーるぼっとをiPhoneでコントロールするプログラムです。 iPhoneとはBTLEで接続しています。

Dependencies:   FatFileSystem HighSpeedAnalogIn TB6612FNG2 mbed

Committer:
jksoft
Date:
Fri May 10 11:48:07 2013 +0000
Revision:
0:373bcb197dc8
?????????

Who changed what in which revision?

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