Test version of BlueUSB stack. Includes SDP and RFCOMM. As Client it allows to connect to my fischertechnik TX Controller. As Server it echo\\\\\\\'s characters to Putty. PIN=1234

Dependencies:   mbed myUSBHost AvailableMemory

Dependents:   mbed_TANK_Kinect myBlueUSB_ros ftusbClass

Committer:
networker
Date:
Fri Jul 01 09:16:00 2011 +0000
Revision:
13:327622e38551
made some improvements to get massstorage functioning

Who changed what in which revision?

UserRevisionLine numberNew contents of line
networker 13:327622e38551 1 #include "mbed.h"
networker 13:327622e38551 2 #include "sdp_data.h"
networker 13:327622e38551 3 #include "Utils.h"
networker 13:327622e38551 4
networker 13:327622e38551 5 char sdp_data::ret[12];
networker 13:327622e38551 6
networker 13:327622e38551 7 unsigned sdp_data::asUnsigned() {
networker 13:327622e38551 8 switch (type) {
networker 13:327622e38551 9 case NULL_:
networker 13:327622e38551 10 return 0;
networker 13:327622e38551 11 case UNSIGNED:
networker 13:327622e38551 12 case SIGNED:
networker 13:327622e38551 13 case BOOL:
networker 13:327622e38551 14 return data;
networker 13:327622e38551 15 case UUID:
networker 13:327622e38551 16 #ifdef LONGUUID
networker 13:327622e38551 17 return uuid[6] + uuid[7]<<16;
networker 13:327622e38551 18 #else
networker 13:327622e38551 19 return data;
networker 13:327622e38551 20 #endif
networker 13:327622e38551 21 default:
networker 13:327622e38551 22 return 0;
networker 13:327622e38551 23 }
networker 13:327622e38551 24 }
networker 13:327622e38551 25
networker 13:327622e38551 26 const char* sdp_data::asString(bool alt) {
networker 13:327622e38551 27 char sep = ',';
networker 13:327622e38551 28 switch (type) {
networker 13:327622e38551 29 case NULL_:
networker 13:327622e38551 30 return "NULL";
networker 13:327622e38551 31 case UNSIGNED:
networker 13:327622e38551 32 if (alt) sprintf(ret, "0x%0*X", size*2, data);
networker 13:327622e38551 33 else sprintf(ret, "%u", data);
networker 13:327622e38551 34 return ret;
networker 13:327622e38551 35 case SIGNED:
networker 13:327622e38551 36 sprintf(ret, "%d", data);
networker 13:327622e38551 37 return ret;
networker 13:327622e38551 38 case BOOL:
networker 13:327622e38551 39 return data ? "TRUE" : "FALSE";
networker 13:327622e38551 40 case STRING:
networker 13:327622e38551 41 case URL:
networker 13:327622e38551 42 return str;
networker 13:327622e38551 43 case ALTERNATIVE:
networker 13:327622e38551 44 sep = '|';
networker 13:327622e38551 45 case SEQUENCE: {
networker 13:327622e38551 46 if (longstr) delete[] longstr;
networker 13:327622e38551 47 int n = sprintf(ret, "SEQ %d { ", size) + 1;
networker 13:327622e38551 48 longstr = new char[n];
networker 13:327622e38551 49 strcpy(longstr, ret);
networker 13:327622e38551 50 for (int i = 0; i < sequence.size(); i++) {
networker 13:327622e38551 51 const char *s = sequence[i]->asString(alt);
networker 13:327622e38551 52 n = strlen(longstr) + strlen(s) + 2;
networker 13:327622e38551 53 char *t = new char[n];
networker 13:327622e38551 54 strcpy(t, longstr);
networker 13:327622e38551 55 strcat(t, s);
networker 13:327622e38551 56 t[n-2] = sep;
networker 13:327622e38551 57 t[n-1]='\0';
networker 13:327622e38551 58 //printf("[%s]+[%s]+%c=[%s]\n", longstr, s, sep, t);
networker 13:327622e38551 59 delete[] longstr;
networker 13:327622e38551 60 longstr = t;
networker 13:327622e38551 61 }
networker 13:327622e38551 62 longstr[n-2] = '}';
networker 13:327622e38551 63 }
networker 13:327622e38551 64 return longstr;
networker 13:327622e38551 65 case UUID:
networker 13:327622e38551 66 #ifdef LONGUUID
networker 13:327622e38551 67 switch (size) {
networker 13:327622e38551 68 case 2:
networker 13:327622e38551 69 sprintf(ret, "0x%04X", uuid[6]);
networker 13:327622e38551 70 return ret;
networker 13:327622e38551 71 case 4:
networker 13:327622e38551 72 sprintf(ret, "0x%04X%04X", uuid[7],uuid[6]);
networker 13:327622e38551 73 return ret;
networker 13:327622e38551 74 case 16:
networker 13:327622e38551 75 longstr = new char[35];
networker 13:327622e38551 76 sprintf(longstr, "%04X%04X-%04X-%04X-%04X-%04X%04X%04X", uuid[7],uuid[6],uuid[5],uuid[4],uuid[3],uuid[2],uuid[1],uuid[0]);
networker 13:327622e38551 77 return longstr;
networker 13:327622e38551 78 }
networker 13:327622e38551 79 #else
networker 13:327622e38551 80 switch (size) {
networker 13:327622e38551 81 case 2:
networker 13:327622e38551 82 sprintf(ret, "0x%04X", data & 0xffff);
networker 13:327622e38551 83 return ret;
networker 13:327622e38551 84 case 4:
networker 13:327622e38551 85 sprintf(ret, "0x%08X", data);
networker 13:327622e38551 86 return ret;
networker 13:327622e38551 87 case 16:
networker 13:327622e38551 88 longstr = new char[35];
networker 13:327622e38551 89 sprintf(longstr, "%08X-%04X-%04X-%04X-%04X%04X%04X", data,base_uuid[5],base_uuid[4],base_uuid[3],base_uuid[2],base_uuid[1],base_uuid[0]);
networker 13:327622e38551 90 return longstr;
networker 13:327622e38551 91 }
networker 13:327622e38551 92 #endif
networker 13:327622e38551 93 }
networker 13:327622e38551 94 return "Unsupported";
networker 13:327622e38551 95 }
networker 13:327622e38551 96
networker 13:327622e38551 97 unsigned sdp_data::Size() {
networker 13:327622e38551 98 if (size==0 && type==SEQUENCE)
networker 13:327622e38551 99 return 2;
networker 13:327622e38551 100 if (size<3 || size==4 || size==8 || size==16)
networker 13:327622e38551 101 return size+1;//include descriptor
networker 13:327622e38551 102 if (size < 256) return size+2; //1 extra byte
networker 13:327622e38551 103 if (size < 65536) return size+3; //2 extra bytes
networker 13:327622e38551 104 return size+5; //4 extra bytes
networker 13:327622e38551 105 }
networker 13:327622e38551 106
networker 13:327622e38551 107 unsigned sdp_data::sizedesc(unsigned char *buf) {
networker 13:327622e38551 108 int desc, extra=0;
networker 13:327622e38551 109 switch (size) {
networker 13:327622e38551 110 case 0:
networker 13:327622e38551 111 /* should be:
networker 13:327622e38551 112 if (type != NULL_) {
networker 13:327622e38551 113 desc = 5;
networker 13:327622e38551 114 extra = 1;
networker 13:327622e38551 115 buf[1] = 0;
networker 13:327622e38551 116 }
networker 13:327622e38551 117 */
networker 13:327622e38551 118 case 1:
networker 13:327622e38551 119 desc = 0;
networker 13:327622e38551 120 break;
networker 13:327622e38551 121 case 2:
networker 13:327622e38551 122 desc = 1;
networker 13:327622e38551 123 break;
networker 13:327622e38551 124 case 4:
networker 13:327622e38551 125 desc = 2;
networker 13:327622e38551 126 break;
networker 13:327622e38551 127 case 8:
networker 13:327622e38551 128 desc = 3;
networker 13:327622e38551 129 break;
networker 13:327622e38551 130 case 16:
networker 13:327622e38551 131 desc = 4;
networker 13:327622e38551 132 break;
networker 13:327622e38551 133 default:
networker 13:327622e38551 134 if (size < 256) {
networker 13:327622e38551 135 desc = 5;
networker 13:327622e38551 136 extra = 1;
networker 13:327622e38551 137 buf[1] = size;
networker 13:327622e38551 138 } else if (size < 65536) {
networker 13:327622e38551 139 desc = 6;
networker 13:327622e38551 140 extra = 2;
networker 13:327622e38551 141 *(unsigned short*)&buf[1] = size;
networker 13:327622e38551 142 } else {
networker 13:327622e38551 143 desc = 7;
networker 13:327622e38551 144 extra = 4;
networker 13:327622e38551 145 *(unsigned*)&buf[1] = size;
networker 13:327622e38551 146 }
networker 13:327622e38551 147 }
networker 13:327622e38551 148 buf[0] |= desc;
networker 13:327622e38551 149 return extra+1;
networker 13:327622e38551 150 }
networker 13:327622e38551 151
networker 13:327622e38551 152 void sdp_data::revcpy(unsigned char*d, const unsigned char*s, int n) {
networker 13:327622e38551 153 for (int i = 0; i < n; i++)
networker 13:327622e38551 154 d[i] = s[n-i-1];
networker 13:327622e38551 155 }
networker 13:327622e38551 156
networker 13:327622e38551 157 unsigned sdp_data::build(unsigned char *buf, unsigned max) {//max is ignored
networker 13:327622e38551 158 int p = 0;
networker 13:327622e38551 159 buf[p] = type<<3;
networker 13:327622e38551 160 switch (type) {
networker 13:327622e38551 161 case NULL_:
networker 13:327622e38551 162 p++;
networker 13:327622e38551 163 break;
networker 13:327622e38551 164 case UNSIGNED:
networker 13:327622e38551 165 case SIGNED:
networker 13:327622e38551 166 case BOOL:
networker 13:327622e38551 167 p += sizedesc(buf+p);
networker 13:327622e38551 168 revcpy(buf+p, (unsigned char*)&data, size);
networker 13:327622e38551 169 break;
networker 13:327622e38551 170 case UUID:
networker 13:327622e38551 171 p += sizedesc(buf+p);
networker 13:327622e38551 172 #ifdef LONGUUID
networker 13:327622e38551 173 switch (size) {
networker 13:327622e38551 174 case 2:
networker 13:327622e38551 175 case 4:
networker 13:327622e38551 176 revcpy(buf+p, (unsigned char*)&uuid[6], size);
networker 13:327622e38551 177 break;
networker 13:327622e38551 178 case 16:
networker 13:327622e38551 179 revcpy(buf+p, (unsigned char*)uuid, size);
networker 13:327622e38551 180 break;
networker 13:327622e38551 181 }
networker 13:327622e38551 182 #else
networker 13:327622e38551 183 switch (size) {
networker 13:327622e38551 184 case 2:
networker 13:327622e38551 185 case 4:
networker 13:327622e38551 186 revcpy(buf+p, (unsigned char*)&data, size);
networker 13:327622e38551 187 break;
networker 13:327622e38551 188 case 16:
networker 13:327622e38551 189 revcpy(buf+p, (unsigned char*)&data, 4);
networker 13:327622e38551 190 revcpy(buf+p+4, base_uuid, 12);
networker 13:327622e38551 191 break;
networker 13:327622e38551 192 }
networker 13:327622e38551 193 #endif
networker 13:327622e38551 194 break;
networker 13:327622e38551 195 case STRING:
networker 13:327622e38551 196 case URL:
networker 13:327622e38551 197 p += sizedesc(buf+p);
networker 13:327622e38551 198 memcpy(buf+p, str, size);
networker 13:327622e38551 199 break;
networker 13:327622e38551 200 case SEQUENCE:
networker 13:327622e38551 201 case ALTERNATIVE: {
networker 13:327622e38551 202 if (sequence.size()==0) {//hack: should be solved in sizedesc
networker 13:327622e38551 203 buf[p++] |= 5;
networker 13:327622e38551 204 buf[p++] = 0;
networker 13:327622e38551 205 break;
networker 13:327622e38551 206 }
networker 13:327622e38551 207 int n = 0;
networker 13:327622e38551 208 p += sizedesc(buf+p);
networker 13:327622e38551 209 for (int i = 0; i < sequence.size(); i++)
networker 13:327622e38551 210 n += sequence.at(i)->build(buf+p+n, max-p);
networker 13:327622e38551 211 }
networker 13:327622e38551 212 break;
networker 13:327622e38551 213 }
networker 13:327622e38551 214 p += size;
networker 13:327622e38551 215 // printfBytes("Build:", buf, p);
networker 13:327622e38551 216 return p;
networker 13:327622e38551 217 }
networker 13:327622e38551 218
networker 13:327622e38551 219 bool sdp_data::findUUID(unsigned uuid) {
networker 13:327622e38551 220 if (type == UUID)
networker 13:327622e38551 221 return asUnsigned()==uuid;
networker 13:327622e38551 222 if (type==SEQUENCE || type==ALTERNATIVE) {
networker 13:327622e38551 223 for (int i = 0; i < sequence.size(); i++) {
networker 13:327622e38551 224 if (sequence[i]->findUUID(uuid))
networker 13:327622e38551 225 return true;
networker 13:327622e38551 226 }
networker 13:327622e38551 227 }
networker 13:327622e38551 228 return false;
networker 13:327622e38551 229 }