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