Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <iostream>
00025 #include <iomanip>
00026 #include <sstream>
00027 #include <string>
00028 #include <vector>
00029 #include <list>
00030 #include <cctype>
00031 #include <stdint.h>
00032 #include "i18n.h"
00033
00034 using namespace std;
00035
00036 string trim_right(const string& source , const string& t = " ");
00037 string trim_data_line(const string& line);
00038 void dump(const list<string>& event);
00039 void parse_hex(const string& source, vector<uint16_t>& data);
00040 void print_hex(const vector<uint16_t>& data);
00041
00042 int main(int argc, char* argv[])
00043 {
00044 list<string>* event = NULL;
00045 string line;
00046
00047 INIT_I18N(PACKAGE);
00048
00049 while( !getline(cin, line).eof() ) {
00050 size_t pos = line.find_first_of(':');
00051
00052
00053 if( pos == string::npos )
00054 continue;
00055
00056 line = trim_right(line.substr(pos + 2), "\n\r ");
00057
00058
00059 if( line == "BbUsbDevice: WriteToDevice" ) {
00060 if( event != NULL ) {
00061 dump(*event);
00062 delete event;
00063 }
00064
00065 event = new list<string>;
00066 }
00067 else if( line.substr(0, 3) == "<-:" ) {
00068 event->push_front(trim_data_line(line.erase(0, 3)));
00069 }
00070 else if( line.substr(0, 3) == "->:" ) {
00071 event->push_back(trim_data_line(line.erase(0, 3)));
00072 }
00073 }
00074
00075 if( event != NULL ) {
00076 dump(*event);
00077 delete event;
00078 }
00079
00080 return 0;
00081 }
00082
00083 string trim_right(const string& source , const string& t)
00084 {
00085 string str = source;
00086 return str.erase(str.find_last_not_of(t) + 1);
00087 }
00088
00089 string trim_data_line(const string& line)
00090 {
00091 size_t pos = line.find_first_of(':');
00092 return line.substr(pos + 2);
00093 }
00094
00095 void dump(const list<string>& event)
00096 {
00097 vector<uint16_t> data;
00098 list<string>::const_iterator i, begin = event.begin(), end = event.end();
00099 for( i=begin; i != end; ++i ) {
00100 data.clear();
00101 parse_hex(*i, data);
00102 cout << (i == begin? "Send" : "Receive") << endl;
00103 print_hex(data);
00104 }
00105 cout << endl;
00106 }
00107
00108 void parse_hex(const string& source, vector<uint16_t>& data)
00109 {
00110 istringstream ss(source);
00111 uint16_t byte;
00112
00113 while( !ss.eof() ) {
00114 ss >> hex >> byte;
00115 data.push_back(byte);
00116 }
00117 }
00118
00119 void print_hex(const vector<uint16_t>& data)
00120 {
00121 int remaining = data.size(), offset = 0;
00122 do {
00123 cout << " " << hex << setfill('0') << setw(8) << offset;
00124 int margin = 13;
00125
00126 for( int i=0, stop=min(16, remaining); i<stop; i++ ) {
00127 cout << ' ' << hex << setfill('0') << setw(2) << data[offset + i];
00128 margin += 3;
00129 }
00130
00131 cout << string(62-margin, ' ');
00132
00133 for( int i=0, stop=min(16, remaining); i<stop; i++) {
00134 char c = data[offset + i];
00135 cout << (isprint(c)? c : '.');
00136 }
00137
00138 offset += 16;
00139 remaining -= 16;
00140
00141 cout << endl;
00142 } while( remaining > 0 );
00143 }