The MGC3130 is the world’s first electrical-field (E-field) based three-dimensional (3D) tracking and gesture controller

Dependencies:   BufferedArray

Dependents:   NucleoMGC3130 i2c_master

Committer:
yangcq88517
Date:
Sat Nov 14 15:44:44 2015 +0000
Revision:
8:de7934ec7ea2
Parent:
7:eacd776fce29
change to unsigned char array

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yangcq88517 0:92f17b057d6b 1 #include "SensorData.h"
yangcq88517 0:92f17b057d6b 2
yangcq88517 0:92f17b057d6b 3 SensorData::SensorData()
yangcq88517 1:621c4e9238ef 4 :GestICMsg(), touch(), gesture()
yangcq88517 0:92f17b057d6b 5 {}
yangcq88517 0:92f17b057d6b 6
yangcq88517 0:92f17b057d6b 7 SensorData::SensorData(GestICMsg * msg)
yangcq88517 1:621c4e9238ef 8 :GestICMsg(), touch(), gesture()
yangcq88517 0:92f17b057d6b 9 {
yangcq88517 7:eacd776fce29 10 data = msg->gets();
yangcq88517 0:92f17b057d6b 11 process();
yangcq88517 0:92f17b057d6b 12 }
yangcq88517 0:92f17b057d6b 13
yangcq88517 0:92f17b057d6b 14 bool SensorData::convert(GestICMsg * msg)
yangcq88517 0:92f17b057d6b 15 {
yangcq88517 0:92f17b057d6b 16 if (msg == NULL)
yangcq88517 0:92f17b057d6b 17 return false;
yangcq88517 0:92f17b057d6b 18
yangcq88517 0:92f17b057d6b 19 if (msg->getID() != Sensor_Data_Output)
yangcq88517 0:92f17b057d6b 20 return false;
yangcq88517 0:92f17b057d6b 21
yangcq88517 7:eacd776fce29 22 data = msg->gets();
yangcq88517 0:92f17b057d6b 23 process();
yangcq88517 0:92f17b057d6b 24 return true;
yangcq88517 0:92f17b057d6b 25 }
yangcq88517 0:92f17b057d6b 26
yangcq88517 0:92f17b057d6b 27 void SensorData::process()
yangcq88517 0:92f17b057d6b 28 {
yangcq88517 2:c7d984193741 29 int temp = 8;
yangcq88517 2:c7d984193741 30 if ((data[4] & 0x01) == 0x01) {
yangcq88517 2:c7d984193741 31 _DSPStatus = temp;
yangcq88517 2:c7d984193741 32 temp += 2;
yangcq88517 2:c7d984193741 33 } else _DSPStatus =-1;
yangcq88517 0:92f17b057d6b 34
yangcq88517 2:c7d984193741 35 if ((data[4] & 0x02) == 0x02) {
yangcq88517 2:c7d984193741 36 _GestureInfo = temp;
yangcq88517 2:c7d984193741 37 temp += 4;
yangcq88517 2:c7d984193741 38 } else _GestureInfo =-1;
yangcq88517 0:92f17b057d6b 39
yangcq88517 2:c7d984193741 40 if ((data[4] & 0x04) == 0x04) {
yangcq88517 2:c7d984193741 41 _TouchInfo = temp;
yangcq88517 2:c7d984193741 42 temp += 4;
yangcq88517 2:c7d984193741 43 } else _TouchInfo =-1;
yangcq88517 0:92f17b057d6b 44
yangcq88517 2:c7d984193741 45 if ((data[4] & 0x08) == 0x08) {
yangcq88517 2:c7d984193741 46 _AirWheelInfo = temp;
yangcq88517 2:c7d984193741 47 temp += 2;
yangcq88517 2:c7d984193741 48 } else _AirWheelInfo =-1;
yangcq88517 0:92f17b057d6b 49
yangcq88517 2:c7d984193741 50 if ((data[4] & 0x10) == 0x10) {
yangcq88517 2:c7d984193741 51 _xyzPosition = temp;
yangcq88517 2:c7d984193741 52 temp += 6;
yangcq88517 2:c7d984193741 53 } else _xyzPosition =-1;
yangcq88517 0:92f17b057d6b 54
yangcq88517 2:c7d984193741 55 if ((data[4] & 0x20) == 0x20) {
yangcq88517 2:c7d984193741 56 _NoisePower = temp;
yangcq88517 2:c7d984193741 57 temp += 4;
yangcq88517 2:c7d984193741 58 } else _NoisePower =-1;
yangcq88517 0:92f17b057d6b 59
yangcq88517 2:c7d984193741 60 if ((data[5] & 0x08) == 0x08) {
yangcq88517 2:c7d984193741 61 _CICData = temp;
yangcq88517 2:c7d984193741 62 temp += 20;
yangcq88517 2:c7d984193741 63 } else _CICData =-1;
yangcq88517 2:c7d984193741 64
yangcq88517 2:c7d984193741 65 if ((data[5] & 0x10) == 0x10) {
yangcq88517 2:c7d984193741 66 _SDData = temp;
yangcq88517 2:c7d984193741 67 temp += 20;
yangcq88517 2:c7d984193741 68 } else _SDData =-1;
yangcq88517 0:92f17b057d6b 69
yangcq88517 0:92f17b057d6b 70 }
yangcq88517 0:92f17b057d6b 71 ////////////////////////////////////////////////////////////////////////////////////
yangcq88517 0:92f17b057d6b 72 bool SensorData::isDSPStatus()
yangcq88517 0:92f17b057d6b 73 {
yangcq88517 0:92f17b057d6b 74 if (_DSPStatus < 0)
yangcq88517 0:92f17b057d6b 75 return false;
yangcq88517 0:92f17b057d6b 76 else return true;
yangcq88517 0:92f17b057d6b 77 }
yangcq88517 0:92f17b057d6b 78
yangcq88517 0:92f17b057d6b 79 bool SensorData::isGestureInfo()
yangcq88517 0:92f17b057d6b 80 {
yangcq88517 0:92f17b057d6b 81 if (_GestureInfo < 0)
yangcq88517 0:92f17b057d6b 82 return false;
yangcq88517 0:92f17b057d6b 83 else return true;
yangcq88517 0:92f17b057d6b 84 }
yangcq88517 0:92f17b057d6b 85
yangcq88517 0:92f17b057d6b 86 bool SensorData::isTouchInfo()
yangcq88517 0:92f17b057d6b 87 {
yangcq88517 0:92f17b057d6b 88 if (_TouchInfo < 0)
yangcq88517 0:92f17b057d6b 89 return false;
yangcq88517 0:92f17b057d6b 90 else return true;
yangcq88517 0:92f17b057d6b 91 }
yangcq88517 0:92f17b057d6b 92
yangcq88517 0:92f17b057d6b 93 bool SensorData::isAirWheelInfo()
yangcq88517 0:92f17b057d6b 94 {
yangcq88517 0:92f17b057d6b 95 if (_AirWheelInfo < 0)
yangcq88517 0:92f17b057d6b 96 return false;
yangcq88517 0:92f17b057d6b 97 else return true;
yangcq88517 0:92f17b057d6b 98 }
yangcq88517 0:92f17b057d6b 99
yangcq88517 0:92f17b057d6b 100 bool SensorData::isxyzPosition()
yangcq88517 0:92f17b057d6b 101 {
yangcq88517 0:92f17b057d6b 102 if (_xyzPosition < 0)
yangcq88517 0:92f17b057d6b 103 return false;
yangcq88517 0:92f17b057d6b 104 else return true;
yangcq88517 0:92f17b057d6b 105 }
yangcq88517 0:92f17b057d6b 106
yangcq88517 0:92f17b057d6b 107 bool SensorData::isNoisePower()
yangcq88517 0:92f17b057d6b 108 {
yangcq88517 0:92f17b057d6b 109 if (_NoisePower < 0)
yangcq88517 0:92f17b057d6b 110 return false;
yangcq88517 0:92f17b057d6b 111 else return true;
yangcq88517 0:92f17b057d6b 112 }
yangcq88517 0:92f17b057d6b 113
yangcq88517 0:92f17b057d6b 114 bool SensorData::isCICData()
yangcq88517 0:92f17b057d6b 115 {
yangcq88517 0:92f17b057d6b 116 if (_CICData < 0)
yangcq88517 0:92f17b057d6b 117 return false;
yangcq88517 0:92f17b057d6b 118 else return true;
yangcq88517 0:92f17b057d6b 119 }
yangcq88517 0:92f17b057d6b 120
yangcq88517 0:92f17b057d6b 121 bool SensorData::isSDData()
yangcq88517 0:92f17b057d6b 122 {
yangcq88517 0:92f17b057d6b 123 if (_SDData < 0)
yangcq88517 0:92f17b057d6b 124 return false;
yangcq88517 0:92f17b057d6b 125 else return true;
yangcq88517 0:92f17b057d6b 126 }
yangcq88517 0:92f17b057d6b 127
yangcq88517 0:92f17b057d6b 128 ///////////////////////////////////////////////////////////////////////////
yangcq88517 0:92f17b057d6b 129 int SensorData::getTimeStamp()
yangcq88517 0:92f17b057d6b 130 {
yangcq88517 0:92f17b057d6b 131 return data[6];
yangcq88517 0:92f17b057d6b 132 }
yangcq88517 0:92f17b057d6b 133
yangcq88517 0:92f17b057d6b 134 ////////////////////////////////////////////////////////////////////////
yangcq88517 0:92f17b057d6b 135 bool SensorData::isPositionValid()
yangcq88517 0:92f17b057d6b 136 {
yangcq88517 1:621c4e9238ef 137 if ((data[7] & 0x01) == 0x01)
yangcq88517 0:92f17b057d6b 138 return true;
yangcq88517 0:92f17b057d6b 139 else return false;
yangcq88517 0:92f17b057d6b 140 }
yangcq88517 0:92f17b057d6b 141
yangcq88517 0:92f17b057d6b 142 bool SensorData::isAirWheelValid()
yangcq88517 0:92f17b057d6b 143 {
yangcq88517 1:621c4e9238ef 144 if ((data[7] & 0x02) == 0x02)
yangcq88517 0:92f17b057d6b 145 return true;
yangcq88517 0:92f17b057d6b 146 else return false;
yangcq88517 0:92f17b057d6b 147 }
yangcq88517 0:92f17b057d6b 148
yangcq88517 0:92f17b057d6b 149 bool SensorData::isRawDataValid()
yangcq88517 0:92f17b057d6b 150 {
yangcq88517 1:621c4e9238ef 151 if ((data[7] & 0x04) == 0x04)
yangcq88517 0:92f17b057d6b 152 return true;
yangcq88517 0:92f17b057d6b 153 else return false;
yangcq88517 0:92f17b057d6b 154 }
yangcq88517 0:92f17b057d6b 155
yangcq88517 0:92f17b057d6b 156 bool SensorData::isNoisePowerValid()
yangcq88517 0:92f17b057d6b 157 {
yangcq88517 1:621c4e9238ef 158 if ((data[7] & 0x08) == 0x08)
yangcq88517 0:92f17b057d6b 159 return true;
yangcq88517 0:92f17b057d6b 160 else return false;
yangcq88517 0:92f17b057d6b 161 }
yangcq88517 0:92f17b057d6b 162
yangcq88517 0:92f17b057d6b 163 bool SensorData::isEnvironmentalNoise()
yangcq88517 0:92f17b057d6b 164 {
yangcq88517 1:621c4e9238ef 165 if ((data[7] & 0x10) == 0x10)
yangcq88517 0:92f17b057d6b 166 return true;
yangcq88517 0:92f17b057d6b 167 else return false;
yangcq88517 0:92f17b057d6b 168 }
yangcq88517 0:92f17b057d6b 169
yangcq88517 0:92f17b057d6b 170 bool SensorData::isClipping()
yangcq88517 0:92f17b057d6b 171 {
yangcq88517 1:621c4e9238ef 172 if ((data[7] & 0x20) == 0x20)
yangcq88517 0:92f17b057d6b 173 return true;
yangcq88517 0:92f17b057d6b 174 else return false;
yangcq88517 0:92f17b057d6b 175 }
yangcq88517 0:92f17b057d6b 176
yangcq88517 0:92f17b057d6b 177 bool SensorData::isDSPRunning()
yangcq88517 0:92f17b057d6b 178 {
yangcq88517 1:621c4e9238ef 179 if ((data[7] & 0x80) == 0x80)
yangcq88517 0:92f17b057d6b 180 return true;
yangcq88517 0:92f17b057d6b 181 else return false;
yangcq88517 0:92f17b057d6b 182 }
yangcq88517 0:92f17b057d6b 183
yangcq88517 0:92f17b057d6b 184
yangcq88517 0:92f17b057d6b 185 int * SensorData::getxyzPosition()
yangcq88517 0:92f17b057d6b 186 {
yangcq88517 0:92f17b057d6b 187 if (_xyzPosition < 0)
yangcq88517 0:92f17b057d6b 188 return NULL;
yangcq88517 0:92f17b057d6b 189
yangcq88517 0:92f17b057d6b 190 if (!isPositionValid())
yangcq88517 0:92f17b057d6b 191 return NULL;
yangcq88517 0:92f17b057d6b 192
yangcq88517 0:92f17b057d6b 193 xyz[0] = (data[_xyzPosition + 1]<< 8) | data[_xyzPosition];
yangcq88517 0:92f17b057d6b 194 xyz[1] = (data[_xyzPosition + 3]<< 8) | data[_xyzPosition + 2];
yangcq88517 0:92f17b057d6b 195 xyz[2] = (data[_xyzPosition + 5]<< 8) | data[_xyzPosition + 4];
yangcq88517 0:92f17b057d6b 196
yangcq88517 0:92f17b057d6b 197 return xyz;
yangcq88517 0:92f17b057d6b 198 }
yangcq88517 1:621c4e9238ef 199
yangcq88517 1:621c4e9238ef 200 TouchInfo * SensorData::getTouchInfo()
yangcq88517 1:621c4e9238ef 201 {
yangcq88517 1:621c4e9238ef 202 if (_TouchInfo < 0)
yangcq88517 1:621c4e9238ef 203 return NULL;
yangcq88517 1:621c4e9238ef 204
yangcq88517 1:621c4e9238ef 205 touch.set((data[_TouchInfo] << 8) | data[_TouchInfo + 1], data[_TouchInfo + 2]);
yangcq88517 1:621c4e9238ef 206
yangcq88517 1:621c4e9238ef 207 return &touch;
yangcq88517 1:621c4e9238ef 208 }
yangcq88517 1:621c4e9238ef 209
yangcq88517 1:621c4e9238ef 210 int * SensorData::getAirWheelInfo()
yangcq88517 1:621c4e9238ef 211 {
yangcq88517 1:621c4e9238ef 212 if (_AirWheelInfo < 0)
yangcq88517 1:621c4e9238ef 213 return NULL;
yangcq88517 1:621c4e9238ef 214
yangcq88517 1:621c4e9238ef 215 if (!isAirWheelValid())
yangcq88517 1:621c4e9238ef 216 return NULL;
yangcq88517 1:621c4e9238ef 217
yangcq88517 1:621c4e9238ef 218 xyz[0] = data[_AirWheelInfo] >> 3;
yangcq88517 1:621c4e9238ef 219 xyz[1] = data[_AirWheelInfo] & 0x07;
yangcq88517 1:621c4e9238ef 220
yangcq88517 1:621c4e9238ef 221 return xyz;
yangcq88517 1:621c4e9238ef 222 }
yangcq88517 1:621c4e9238ef 223
yangcq88517 1:621c4e9238ef 224 float SensorData::getNoisePower()
yangcq88517 1:621c4e9238ef 225 {
yangcq88517 1:621c4e9238ef 226 if (_NoisePower < 0)
yangcq88517 1:621c4e9238ef 227 return 0;
yangcq88517 1:621c4e9238ef 228
yangcq88517 1:621c4e9238ef 229 if (!isNoisePowerValid())
yangcq88517 1:621c4e9238ef 230 return 0;
yangcq88517 1:621c4e9238ef 231
yangcq88517 1:621c4e9238ef 232 float noise = -3;
yangcq88517 1:621c4e9238ef 233 memcpy(&noise, data + _NoisePower, 4);
yangcq88517 1:621c4e9238ef 234 return noise;
yangcq88517 1:621c4e9238ef 235 }
yangcq88517 1:621c4e9238ef 236
yangcq88517 1:621c4e9238ef 237 float * SensorData::getUncalibratedData()
yangcq88517 1:621c4e9238ef 238 {
yangcq88517 1:621c4e9238ef 239 if (_CICData < 0)
yangcq88517 1:621c4e9238ef 240 return NULL;
yangcq88517 1:621c4e9238ef 241
yangcq88517 2:c7d984193741 242 if (!isRawDataValid())
yangcq88517 2:c7d984193741 243 return NULL;
yangcq88517 2:c7d984193741 244
yangcq88517 1:621c4e9238ef 245 memcpy(raw, data +_CICData , 20);
yangcq88517 1:621c4e9238ef 246
yangcq88517 1:621c4e9238ef 247 return raw;
yangcq88517 1:621c4e9238ef 248 }
yangcq88517 1:621c4e9238ef 249
yangcq88517 1:621c4e9238ef 250 float * SensorData::getSignalDeviation()
yangcq88517 1:621c4e9238ef 251 {
yangcq88517 1:621c4e9238ef 252 if (_SDData < 0)
yangcq88517 1:621c4e9238ef 253 return NULL;
yangcq88517 1:621c4e9238ef 254
yangcq88517 1:621c4e9238ef 255 if (!isRawDataValid())
yangcq88517 1:621c4e9238ef 256 return NULL;
yangcq88517 1:621c4e9238ef 257
yangcq88517 1:621c4e9238ef 258 memcpy(raw, data +_SDData , 20);
yangcq88517 1:621c4e9238ef 259
yangcq88517 1:621c4e9238ef 260 return raw;
yangcq88517 1:621c4e9238ef 261 }
yangcq88517 1:621c4e9238ef 262
yangcq88517 1:621c4e9238ef 263 GestureInfo * SensorData::getGestureInfo()
yangcq88517 1:621c4e9238ef 264 {
yangcq88517 1:621c4e9238ef 265 if (_GestureInfo < 0)
yangcq88517 1:621c4e9238ef 266 return NULL;
yangcq88517 2:c7d984193741 267
yangcq88517 1:621c4e9238ef 268 gesture.set(data + _GestureInfo);
yangcq88517 1:621c4e9238ef 269
yangcq88517 1:621c4e9238ef 270 return &gesture;
yangcq88517 1:621c4e9238ef 271 }