Cubic Hand project for EECS 249A course.
Dependencies: MMA8451Q TSI cc3000_hostdriver_mbedsocket NVIC_set_all_priorities mbed Multi_WS2811
DataGlove.cpp@18:6737bf53ccd1, 2014-12-08 (annotated)
- Committer:
- kalbers
- Date:
- Mon Dec 08 18:56:42 2014 +0000
- Revision:
- 18:6737bf53ccd1
- Parent:
- 15:b48ac00af0b8
- Child:
- 19:e751d075e2e6
Split Glove Data Extraction into Members Functions;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kalbers | 3:5f5d75cba8e1 | 1 | #include "DataGlove.h" |
kalbers | 3:5f5d75cba8e1 | 2 | |
naren | 14:0c4a26dc6873 | 3 | #define STREAM_FINGERS_QUATERNION 1 |
naren | 14:0c4a26dc6873 | 4 | #define STREAM_QUATERNION 2 |
naren | 14:0c4a26dc6873 | 5 | #define STREAM_FINGERS_RAW 3 |
naren | 14:0c4a26dc6873 | 6 | #define STREAM_RAW 4 |
naren | 14:0c4a26dc6873 | 7 | #define STREAM_FINGERS 5 |
naren | 14:0c4a26dc6873 | 8 | |
kalbers | 13:c701f1122797 | 9 | DataGlove::DataGlove() |
kalbers | 3:5f5d75cba8e1 | 10 | { |
kalbers | 13:c701f1122797 | 11 | notConnectedCount = 0; |
naren | 14:0c4a26dc6873 | 12 | gl = new Glove; |
kalbers | 18:6737bf53ccd1 | 13 | ReceiveCount = 0; |
kalbers | 3:5f5d75cba8e1 | 14 | } |
kalbers | 3:5f5d75cba8e1 | 15 | |
kalbers | 3:5f5d75cba8e1 | 16 | DataGlove::~DataGlove() |
kalbers | 3:5f5d75cba8e1 | 17 | { |
naren | 14:0c4a26dc6873 | 18 | delete(gl); |
kalbers | 3:5f5d75cba8e1 | 19 | } |
kalbers | 3:5f5d75cba8e1 | 20 | |
kalbers | 3:5f5d75cba8e1 | 21 | void DataGlove::Init() |
kalbers | 3:5f5d75cba8e1 | 22 | { |
naren | 14:0c4a26dc6873 | 23 | GloveSocket.Init(); |
kalbers | 3:5f5d75cba8e1 | 24 | GloveSocket.Connect(); |
kalbers | 18:6737bf53ccd1 | 25 | StreamData(STREAM_QUATERNION); |
kalbers | 15:b48ac00af0b8 | 26 | } |
kalbers | 15:b48ac00af0b8 | 27 | |
kalbers | 18:6737bf53ccd1 | 28 | void DataGlove::StreamData(uint8_t DataType) |
kalbers | 15:b48ac00af0b8 | 29 | { |
kalbers | 3:5f5d75cba8e1 | 30 | SendBuf[0] = '$'; |
kalbers | 3:5f5d75cba8e1 | 31 | SendBuf[1] = 0x0A; |
kalbers | 3:5f5d75cba8e1 | 32 | SendBuf[2] = 0x03; |
naren | 14:0c4a26dc6873 | 33 | // Streaming quaternion data |
kalbers | 18:6737bf53ccd1 | 34 | SendBuf[3] = DataType; |
kalbers | 3:5f5d75cba8e1 | 35 | SendBuf[4] = (SendBuf[0]+SendBuf[1]+SendBuf[2]+SendBuf[3])%256; |
kalbers | 3:5f5d75cba8e1 | 36 | SendBuf[5] = '#'; |
kalbers | 3:5f5d75cba8e1 | 37 | GloveSocket.SendDataToGlove(SendBuf, 6); |
kalbers | 3:5f5d75cba8e1 | 38 | } |
kalbers | 3:5f5d75cba8e1 | 39 | |
kalbers | 3:5f5d75cba8e1 | 40 | void DataGlove::Receive() |
kalbers | 3:5f5d75cba8e1 | 41 | { |
kalbers | 15:b48ac00af0b8 | 42 | raw = false; |
naren | 14:0c4a26dc6873 | 43 | numReceived = GloveSocket.GetDataFromBuffer(Buf, 1); |
naren | 14:0c4a26dc6873 | 44 | if (Buf[0] == '$') { |
naren | 14:0c4a26dc6873 | 45 | bcc = '$'; |
naren | 14:0c4a26dc6873 | 46 | numReceived = GloveSocket.GetDataFromBuffer(Buf, 2); |
naren | 14:0c4a26dc6873 | 47 | if ((numReceived == 2) && (Buf[0] == 0x0a)) { |
naren | 14:0c4a26dc6873 | 48 | pkglen = Buf[1]; |
naren | 14:0c4a26dc6873 | 49 | bcc += Buf[0]; |
naren | 14:0c4a26dc6873 | 50 | bcc += Buf[1]; |
naren | 14:0c4a26dc6873 | 51 | numReceived = GloveSocket.GetDataFromBuffer(Buf, pkglen); |
naren | 14:0c4a26dc6873 | 52 | if (numReceived < pkglen) { |
naren | 14:0c4a26dc6873 | 53 | notConnectedCount++; |
naren | 14:0c4a26dc6873 | 54 | } |
naren | 14:0c4a26dc6873 | 55 | for (u = 0; u < pkglen - 2; u++) { |
naren | 14:0c4a26dc6873 | 56 | bcc += Buf[u]; |
naren | 14:0c4a26dc6873 | 57 | } |
naren | 14:0c4a26dc6873 | 58 | if ((numReceived == pkglen) && (bcc == Buf[pkglen-2])) { |
naren | 14:0c4a26dc6873 | 59 | memcpy(buffer, Buf, numReceived); |
naren | 14:0c4a26dc6873 | 60 | timeOfArrival = (buffer[3] << 24) + (buffer[4] << 16) + (buffer[5] << 8) + buffer[6]; |
naren | 14:0c4a26dc6873 | 61 | id = (buffer[1] << 8) + buffer[2]; |
naren | 14:0c4a26dc6873 | 62 | pkgtype = buffer[0]; |
naren | 14:0c4a26dc6873 | 63 | switch (pkgtype){ |
naren | 14:0c4a26dc6873 | 64 | case STREAM_FINGERS_QUATERNION: |
naren | 14:0c4a26dc6873 | 65 | { |
kalbers | 18:6737bf53ccd1 | 66 | ExtractFingersQuat(); |
naren | 14:0c4a26dc6873 | 67 | } |
naren | 14:0c4a26dc6873 | 68 | break; |
naren | 14:0c4a26dc6873 | 69 | case STREAM_QUATERNION: |
naren | 14:0c4a26dc6873 | 70 | { |
kalbers | 18:6737bf53ccd1 | 71 | ExtractQuat(); |
kalbers | 18:6737bf53ccd1 | 72 | printf("%d\r\n", ReceiveCount++); |
kalbers | 18:6737bf53ccd1 | 73 | //printf("roll: %f\tpitch: %f\tyaw: %f\r\n", gl->roll, gl->pitch, gl->yaw); |
naren | 14:0c4a26dc6873 | 74 | } |
naren | 14:0c4a26dc6873 | 75 | break; |
naren | 14:0c4a26dc6873 | 76 | case STREAM_FINGERS_RAW: |
naren | 14:0c4a26dc6873 | 77 | { |
kalbers | 18:6737bf53ccd1 | 78 | ExtractFingersRaw(); |
naren | 14:0c4a26dc6873 | 79 | } |
naren | 14:0c4a26dc6873 | 80 | break; |
naren | 14:0c4a26dc6873 | 81 | case STREAM_RAW: |
naren | 14:0c4a26dc6873 | 82 | { |
kalbers | 18:6737bf53ccd1 | 83 | ExtractRaw(); |
naren | 14:0c4a26dc6873 | 84 | printf("%f %f %f %f %f %f\r\n", gl->gyro[0], gl->gyro[1], gl->gyro[2], gl->accel[0], gl->accel[1], gl->accel[2]); |
naren | 14:0c4a26dc6873 | 85 | } |
naren | 14:0c4a26dc6873 | 86 | break; |
naren | 14:0c4a26dc6873 | 87 | |
naren | 14:0c4a26dc6873 | 88 | case STREAM_FINGERS: |
naren | 14:0c4a26dc6873 | 89 | { |
kalbers | 18:6737bf53ccd1 | 90 | ExtractFingers(); |
naren | 14:0c4a26dc6873 | 91 | } |
naren | 14:0c4a26dc6873 | 92 | break; |
naren | 14:0c4a26dc6873 | 93 | } |
naren | 14:0c4a26dc6873 | 94 | notConnectedCount = 0; |
naren | 14:0c4a26dc6873 | 95 | } |
naren | 14:0c4a26dc6873 | 96 | else{ |
naren | 14:0c4a26dc6873 | 97 | if (bcc!=Buf[pkglen-2]) |
naren | 14:0c4a26dc6873 | 98 | notConnectedCount++; |
naren | 14:0c4a26dc6873 | 99 | } |
naren | 14:0c4a26dc6873 | 100 | } |
kalbers | 3:5f5d75cba8e1 | 101 | } |
kalbers | 3:5f5d75cba8e1 | 102 | else { |
kalbers | 15:b48ac00af0b8 | 103 | //printf("couldn't get data %d\r\n", notConnectedCount); |
naren | 14:0c4a26dc6873 | 104 | notConnectedCount++; |
kalbers | 3:5f5d75cba8e1 | 105 | } |
kalbers | 3:5f5d75cba8e1 | 106 | // Re-establishing communication in case no data is received for 1s (20 frames per second*1 = 20) |
kalbers | 3:5f5d75cba8e1 | 107 | if (notConnectedCount > 20) { |
kalbers | 3:5f5d75cba8e1 | 108 | printf("Connection broke! Trying to re-establish...\r\n"); |
kalbers | 15:b48ac00af0b8 | 109 | GloveSocket.Reconnect(); |
kalbers | 18:6737bf53ccd1 | 110 | StreamData(STREAM_QUATERNION); |
kalbers | 3:5f5d75cba8e1 | 111 | notConnectedCount = 0; |
kalbers | 3:5f5d75cba8e1 | 112 | } |
kalbers | 3:5f5d75cba8e1 | 113 | } |
kalbers | 3:5f5d75cba8e1 | 114 | |
kalbers | 18:6737bf53ccd1 | 115 | void DataGlove::ExtractFingersQuat() |
kalbers | 18:6737bf53ccd1 | 116 | { |
kalbers | 18:6737bf53ccd1 | 117 | k = 7; |
kalbers | 18:6737bf53ccd1 | 118 | q0 = (buffer[k] << 24) + (buffer[k+1] << 16) + (buffer[k+2] << 8) + buffer[k+3]; |
kalbers | 18:6737bf53ccd1 | 119 | k += 4; |
kalbers | 18:6737bf53ccd1 | 120 | q1 = (buffer[k] << 24) + (buffer[k+1] << 16) + (buffer[k+2] << 8) + buffer[k+3]; |
kalbers | 18:6737bf53ccd1 | 121 | k += 4; |
kalbers | 18:6737bf53ccd1 | 122 | q2 = (buffer[k] << 24) + (buffer[k+1] << 16) + (buffer[k+2] << 8) + buffer[k+3]; |
kalbers | 18:6737bf53ccd1 | 123 | k += 4; |
kalbers | 18:6737bf53ccd1 | 124 | q3 = (buffer[k] << 24) + (buffer[k+1] << 16) + (buffer[k+2] << 8) + buffer[k+3]; |
kalbers | 18:6737bf53ccd1 | 125 | k += 4; |
kalbers | 18:6737bf53ccd1 | 126 | for (y = 0; y < 5; y++) |
kalbers | 18:6737bf53ccd1 | 127 | { |
kalbers | 18:6737bf53ccd1 | 128 | gl->fingers[y] = 0.1 * ((buffer[k] << 8) + buffer[k + 1]); |
kalbers | 18:6737bf53ccd1 | 129 | k += 2; |
kalbers | 18:6737bf53ccd1 | 130 | } |
kalbers | 18:6737bf53ccd1 | 131 | q00 = q0 / 32768.0; |
kalbers | 18:6737bf53ccd1 | 132 | q11 = q1 / 32768.0; |
kalbers | 18:6737bf53ccd1 | 133 | q22 = q2 / 32768.0; |
kalbers | 18:6737bf53ccd1 | 134 | q33 = q3 / 32768.0; |
kalbers | 18:6737bf53ccd1 | 135 | |
kalbers | 18:6737bf53ccd1 | 136 | norm = sqrt(q00 * q00 + q11 * q11 + q22 * q22 + q33 * q33); |
kalbers | 18:6737bf53ccd1 | 137 | test = q00 * q11 + q22 * q33; |
kalbers | 18:6737bf53ccd1 | 138 | |
kalbers | 18:6737bf53ccd1 | 139 | roll = 180.0 * atan2(2 * (q00 * q11 + q22 * q33), 1 - 2 * (q11 * q11 + q22 * q22)) / 3.1415; |
kalbers | 18:6737bf53ccd1 | 140 | pitch = 180.0 * asin(2 * (q00 * q22 - q33 * q11)) / 3.1415; |
kalbers | 18:6737bf53ccd1 | 141 | yaw = 180.0 * atan2(2 * (q00 * q33 + q11 * q22), 1 - 2 * (q22 * q22 + q33 * q33)) / 3.1415; |
kalbers | 18:6737bf53ccd1 | 142 | |
kalbers | 18:6737bf53ccd1 | 143 | gl->roll = roll; |
kalbers | 18:6737bf53ccd1 | 144 | gl->pitch = pitch; |
kalbers | 18:6737bf53ccd1 | 145 | gl->yaw = yaw; |
kalbers | 18:6737bf53ccd1 | 146 | gl->lastPkgTime = timeOfArrival; |
kalbers | 18:6737bf53ccd1 | 147 | |
kalbers | 18:6737bf53ccd1 | 148 | } |
kalbers | 18:6737bf53ccd1 | 149 | void DataGlove::ExtractQuat() |
kalbers | 18:6737bf53ccd1 | 150 | { |
kalbers | 18:6737bf53ccd1 | 151 | k = 7; |
kalbers | 18:6737bf53ccd1 | 152 | q0 = (buffer[k] << 24) + (buffer[k+1] << 16) + (buffer[k+2] << 8) + buffer[k+3]; |
kalbers | 18:6737bf53ccd1 | 153 | k += 4; |
kalbers | 18:6737bf53ccd1 | 154 | q1 = (buffer[k] << 24) + (buffer[k+1] << 16) + (buffer[k+2] << 8) + buffer[k+3]; |
kalbers | 18:6737bf53ccd1 | 155 | k += 4; |
kalbers | 18:6737bf53ccd1 | 156 | q2 = (buffer[k] << 24) + (buffer[k+1] << 16) + (buffer[k+2] << 8) + buffer[k+3]; |
kalbers | 18:6737bf53ccd1 | 157 | k += 4; |
kalbers | 18:6737bf53ccd1 | 158 | q3 = (buffer[k] << 24) + (buffer[k+1] << 16) + (buffer[k+2] << 8) + buffer[k+3]; |
kalbers | 18:6737bf53ccd1 | 159 | k += 4; |
kalbers | 18:6737bf53ccd1 | 160 | for (y = 0; y < 5; y++) |
kalbers | 18:6737bf53ccd1 | 161 | { |
kalbers | 18:6737bf53ccd1 | 162 | gl->fingers[y] = 0.0; |
kalbers | 18:6737bf53ccd1 | 163 | } |
kalbers | 18:6737bf53ccd1 | 164 | q00 = q0 / 32768.0; |
kalbers | 18:6737bf53ccd1 | 165 | q11 = q1 / 32768.0; |
kalbers | 18:6737bf53ccd1 | 166 | q22 = q2 / 32768.0; |
kalbers | 18:6737bf53ccd1 | 167 | q33 = q3 / 32768.0; |
kalbers | 18:6737bf53ccd1 | 168 | |
kalbers | 18:6737bf53ccd1 | 169 | norm = sqrt(q00 * q00 + q11 * q11 + q22 * q22 + q33 * q33); |
kalbers | 18:6737bf53ccd1 | 170 | test = q00 * q11 + q22 * q33; |
kalbers | 18:6737bf53ccd1 | 171 | roll = 180.0 * atan2(2 * (q00 * q11 + q22 * q33), 1 - 2 * (q11 * q11 + q22 * q22)) / 3.1415; |
kalbers | 18:6737bf53ccd1 | 172 | pitch = 180.0 * asin(2 * (q00 * q22 - q33 * q11)) / 3.1415; |
kalbers | 18:6737bf53ccd1 | 173 | yaw = 180.0 * atan2(2 * (q00 * q33 + q11 * q22), 1 - 2 * (q22 * q22 + q33 * q33)) / 3.1415; |
kalbers | 18:6737bf53ccd1 | 174 | |
kalbers | 18:6737bf53ccd1 | 175 | gl->roll = roll; |
kalbers | 18:6737bf53ccd1 | 176 | gl->pitch = pitch; |
kalbers | 18:6737bf53ccd1 | 177 | gl->yaw = yaw; |
kalbers | 18:6737bf53ccd1 | 178 | gl->lastPkgTime = timeOfArrival; |
kalbers | 18:6737bf53ccd1 | 179 | |
kalbers | 18:6737bf53ccd1 | 180 | } |
kalbers | 18:6737bf53ccd1 | 181 | |
kalbers | 18:6737bf53ccd1 | 182 | void DataGlove::ExtractFingersRaw() |
kalbers | 3:5f5d75cba8e1 | 183 | { |
kalbers | 18:6737bf53ccd1 | 184 | k = 7; |
kalbers | 18:6737bf53ccd1 | 185 | for (j = 0; j < 3; j++) |
kalbers | 18:6737bf53ccd1 | 186 | { |
kalbers | 18:6737bf53ccd1 | 187 | gl->gyro[j] = (buffer[k] << 8) + (buffer[k+1]); |
kalbers | 18:6737bf53ccd1 | 188 | if (gl->gyro[j] > 0x7fff) |
kalbers | 18:6737bf53ccd1 | 189 | gl->gyro[j] -= 0x10000; |
kalbers | 18:6737bf53ccd1 | 190 | k += 2; |
kalbers | 18:6737bf53ccd1 | 191 | } |
kalbers | 18:6737bf53ccd1 | 192 | for (j = 0; j < 3; j++) |
kalbers | 18:6737bf53ccd1 | 193 | { |
kalbers | 18:6737bf53ccd1 | 194 | gl->magn[j] = (buffer[k] << 8) + (buffer[k+1]); |
kalbers | 18:6737bf53ccd1 | 195 | if (gl->magn[j] > 0x7fff) |
kalbers | 18:6737bf53ccd1 | 196 | gl->magn[j] -= 0x10000; |
kalbers | 18:6737bf53ccd1 | 197 | k += 2; |
kalbers | 18:6737bf53ccd1 | 198 | } |
kalbers | 18:6737bf53ccd1 | 199 | for (j = 0; j < 3; j++) |
kalbers | 18:6737bf53ccd1 | 200 | { |
kalbers | 18:6737bf53ccd1 | 201 | gl->accel[j] = (buffer[k] << 8) + (buffer[k+1]); |
kalbers | 18:6737bf53ccd1 | 202 | if (gl->accel[j]>0x7fff) |
kalbers | 18:6737bf53ccd1 | 203 | gl->accel[j] -= 0x10000; |
kalbers | 18:6737bf53ccd1 | 204 | k += 2; |
kalbers | 18:6737bf53ccd1 | 205 | } |
kalbers | 18:6737bf53ccd1 | 206 | for (y = 0; y < 5; y++) |
kalbers | 18:6737bf53ccd1 | 207 | { |
kalbers | 18:6737bf53ccd1 | 208 | gl->fingers[y] = 0.1 * ((buffer[k] << 8) + buffer[k+1]); |
kalbers | 18:6737bf53ccd1 | 209 | k += 2; |
kalbers | 18:6737bf53ccd1 | 210 | } |
kalbers | 18:6737bf53ccd1 | 211 | |
kalbers | 18:6737bf53ccd1 | 212 | gl->roll = 0.0; |
kalbers | 18:6737bf53ccd1 | 213 | gl->pitch = 0.0; |
kalbers | 18:6737bf53ccd1 | 214 | gl->yaw = 0.0; |
kalbers | 18:6737bf53ccd1 | 215 | gl->lastPkgTime = timeOfArrival; |
kalbers | 18:6737bf53ccd1 | 216 | } |
kalbers | 18:6737bf53ccd1 | 217 | |
kalbers | 18:6737bf53ccd1 | 218 | void DataGlove::ExtractRaw() |
kalbers | 18:6737bf53ccd1 | 219 | { |
kalbers | 18:6737bf53ccd1 | 220 | k = 7; |
kalbers | 18:6737bf53ccd1 | 221 | for (j = 0; j < 3; j++){ |
kalbers | 18:6737bf53ccd1 | 222 | gl->gyro[j] = (buffer[k] << 8) + (buffer[k+1]); |
kalbers | 18:6737bf53ccd1 | 223 | if (gl->gyro[j] > 0x7fff) |
kalbers | 18:6737bf53ccd1 | 224 | gl->gyro[j] -= 0x10000; |
kalbers | 18:6737bf53ccd1 | 225 | k += 2; |
kalbers | 18:6737bf53ccd1 | 226 | } |
kalbers | 18:6737bf53ccd1 | 227 | for (j = 0; j < 3; j++){ |
kalbers | 18:6737bf53ccd1 | 228 | gl->magn[j] = (buffer[k] << 8) + (buffer[k+1]); |
kalbers | 18:6737bf53ccd1 | 229 | if (gl->magn[j] > 0x7fff) |
kalbers | 18:6737bf53ccd1 | 230 | gl->magn[j] -= 0x10000; |
kalbers | 18:6737bf53ccd1 | 231 | k += 2; |
kalbers | 18:6737bf53ccd1 | 232 | } |
kalbers | 18:6737bf53ccd1 | 233 | for (j = 0; j < 3; j++){ |
kalbers | 18:6737bf53ccd1 | 234 | gl->accel[j] = (buffer[k] << 8) + (buffer[k+1]); |
kalbers | 18:6737bf53ccd1 | 235 | if (gl->accel[j] > 0x7fff) |
kalbers | 18:6737bf53ccd1 | 236 | gl->accel[j] -= 0x10000; |
kalbers | 18:6737bf53ccd1 | 237 | k += 2; |
kalbers | 18:6737bf53ccd1 | 238 | } |
kalbers | 18:6737bf53ccd1 | 239 | int y = 0; |
kalbers | 18:6737bf53ccd1 | 240 | for (y = 0; y < 5; y++){ |
kalbers | 18:6737bf53ccd1 | 241 | gl->fingers[y] = 0.0; |
kalbers | 18:6737bf53ccd1 | 242 | } |
kalbers | 18:6737bf53ccd1 | 243 | |
kalbers | 18:6737bf53ccd1 | 244 | gl->roll = 0.0; |
kalbers | 18:6737bf53ccd1 | 245 | gl->pitch = 0.0; |
kalbers | 18:6737bf53ccd1 | 246 | gl->yaw = 0.0; |
kalbers | 18:6737bf53ccd1 | 247 | gl->lastPkgTime = timeOfArrival; |
kalbers | 18:6737bf53ccd1 | 248 | } |
kalbers | 18:6737bf53ccd1 | 249 | |
kalbers | 18:6737bf53ccd1 | 250 | void DataGlove::ExtractFingers() |
kalbers | 18:6737bf53ccd1 | 251 | { |
kalbers | 18:6737bf53ccd1 | 252 | k = 7; |
kalbers | 18:6737bf53ccd1 | 253 | for (y = 0; y < 5; y++){ |
kalbers | 18:6737bf53ccd1 | 254 | gl->fingers[y] = 0.1 * ((buffer[k] << 8) + buffer[k+1]); |
kalbers | 18:6737bf53ccd1 | 255 | k += 2; |
kalbers | 18:6737bf53ccd1 | 256 | } |
kalbers | 18:6737bf53ccd1 | 257 | |
kalbers | 18:6737bf53ccd1 | 258 | gl->roll = 0.0; |
kalbers | 18:6737bf53ccd1 | 259 | gl->pitch = 0.0; |
kalbers | 18:6737bf53ccd1 | 260 | gl->yaw = 0.0; |
kalbers | 18:6737bf53ccd1 | 261 | gl->lastPkgTime = timeOfArrival; |
kalbers | 3:5f5d75cba8e1 | 262 | } |