00001 #include "pparser.h"
00002 using namespace VRUT;
00003
00004 const char PacketParser::separators[] =
00005 {
00006 '[',
00007 ']',
00008 ' '
00009 };
00010 const char * PacketParser::tags[] =
00011 {
00012 "fr",
00013 "ts",
00014 "6d",
00015 "6df",
00016 "6df2",
00017 "6dmt",
00018 "gl",
00019 "3d",
00020 "6dcal",
00021 ""
00022 };
00023 PacketParser::PacketParser(const char * input)
00024 {
00025 bQueue = NULL;
00026 frameCounter = 0;
00027 timeStamp = -1.0;
00028 textparser = NULL;
00029 }
00030 PacketParser::~PacketParser()
00031 {
00032 if (textparser != NULL)
00033 {
00034 delete textparser;
00035 }
00036 }
00037 void PacketParser::SetPacket(char *packet)
00038 {
00039 if (textparser != NULL) delete textparser;
00040 textparser = new TextParser(packet);
00041 }
00042 float PacketParser::TimeStamp()
00043 {
00044 return timeStamp;
00045 }
00046 int PacketParser::FrameCounter()
00047 {
00048 return frameCounter;
00049 }
00050 int PacketParser::CalibratedDevices()
00051 {
00052 return calibDevs;
00053 }
00054 int PacketParser::ParsedDevices()
00055 {
00056 return devicesCount;
00057 }
00058 bool PacketParser::Parse()
00059 {
00060 if (NULL == bQueue)
00061 {
00062 LOGERROR(wxT("<Tracking> No Queue is set, where to save devices. Parsing unsuccesful!"));
00063 return false;
00064 }
00065 calibDevs = 0;
00066 devicesCount = 0;
00067 while(!textparser->IsEmpty())
00068 {
00069 switch (textparser->KeywordsSwitch(tags, separators))
00070 {
00071 case 0:
00072 {
00073 int fCounter;
00074 if (!textparser->ParseInt(&fCounter, separators))
00075 {
00076 LOGERROR(wxT("<Tracking>Unexpected chunks while parsing fr"));
00077
00078 return false;
00079 }
00080 if (fCounter <= frameCounter) LOGWARNING(wxT("<Tracking>Packet order varied"));
00081 frameCounter = fCounter;
00082 break;
00083 }
00084 case 1:
00085 {
00086 if(!textparser->ParseFloat(&timeStamp,separators))
00087 {
00088 LOGERROR(wxT("<Tracking>Unexpected chunks while parsing ts"));
00089
00090 return false;
00091 }
00092 break;
00093 }
00094 case 2:
00095 {
00096 if (!parse6D())
00097 {
00098 LOGERROR(wxT("<tracking>Unexpected chunks while parsing 6d"));
00099 return false;
00100 }
00101 break;
00102 }
00103 case 3:
00104 {
00105 if (!parse6DF())
00106 {
00107 LOGERROR(wxT("<tracking>Unexpected chunks while parsing 6df"));
00108 return false;
00109 }
00110 break;
00111 }
00112 case 4:
00113 {
00114 if (!parse6DF2())
00115 {
00116 LOGERROR(wxT("<tracking>Unexpected chunks while parsing 6df2"));
00117 return false;
00118 }
00119 break;
00120 }
00121 case 5:
00122 {
00123 if (!parse6DMT())
00124 {
00125 LOGERROR(wxT("<tracking>Unexpected chunks while parsing 6dmt"));
00126 return false;
00127 }
00128 break;
00129 }
00130 case 6:
00131 {
00132 if (!parseGL())
00133 {
00134 LOGERROR(wxT("<tracking>Unexpected chunks while parsing gl"));
00135 return false;
00136 }
00137 break;
00138 }
00139 case 7:
00140 {
00141 if (!parse3D())
00142 {
00143 LOGERROR(wxT("<tracking>Unexpected chunks while parsing 3d"));
00144 return false;
00145 }
00146 break;
00147 }
00148 case 8:
00149 {
00150 if(!textparser->ParseInt(&calibDevs,separators))
00151 {
00152 LOGERROR(wxT("<Tracking>Unexpected chunks while parsing 6dcal"));
00153 return false;
00154 }
00155 break;
00156 }
00157 default:
00158 {
00159 wxString aaa = wxT("<Tracking> Unexpected token while parsing tag: ") + textparser->GetWxLine();
00160 LOGERROR(aaa);
00161
00162
00163 return false;
00164 break;
00165 }
00166 }
00167 }
00168 return true;
00169 }
00170
00171 bool PacketParser::parseInt(int *target)
00172 {
00173 if (!textparser->ParseInt(target, separators)) return false;
00174 textparser->SkipCharsAndComments(separators);
00175 return true;
00176 }
00177 bool PacketParser::parseFloat(float *target)
00178 {
00179 if (!textparser->ParseFloat(target, separators)) return false;
00180 textparser->SkipCharsAndComments(separators);
00181 return true;
00182 }
00183 size_t PacketParser::parseVector(float *target, size_t dimension)
00184 {
00185 size_t read = textparser->ParseVector(target, dimension, true, separators);
00186 textparser->SkipCharsAndComments(separators);
00187 return read;
00188 }
00189 bool PacketParser::parse3D()
00190 {
00191 int devs;
00192 if(!parseInt(&devs)) return false;
00193 devicesCount += devs;
00194 for (int i = 0 ; i < devs; i++)
00195 {
00196 int id;
00197 float qu;
00198 float s[3];
00199 if (!parseInt(&id)) return false;
00200 if (!parseFloat(&qu)) return false;
00201 if (3 != parseVector(s,3)) return false;
00202 Body * b3d = new Body(id,qu,Body::B3D,s);
00203 bQueue->push(b3d);
00204 }
00205 return true;
00206 }
00207 bool PacketParser::parse6D()
00208 {
00209 int devs;
00210 if(!parseInt(&devs)) return false;
00211 devicesCount += devs;
00212 for (int i = 0 ; i < devs; i++)
00213 {
00214 int id;
00215 float qu;
00216 float s[6];
00217 float b[9];
00218 if (!parseInt(&id)) return false;
00219 if (!parseFloat(&qu)) return false;
00220 if (6 != parseVector(s,6)) return false;
00221 if (9 != parseVector(b,9)) return false;
00222 Body * b6d = new Body(id,qu,Body::B6D,s,b);
00223 bQueue->push(b6d);
00224 }
00225 return true;
00226 }
00227 bool PacketParser::parse6DF()
00228 {
00229 int devs;
00230 if(!parseInt(&devs)) return false;
00231 devicesCount += devs;
00232 for (int i = 0 ; i < devs; i++)
00233 {
00234 int id;
00235 float qu;
00236 int bt;
00237 float s[6];
00238 float b[9];
00239 if (!parseInt(&id)) return false;
00240 if (!parseFloat(&qu)) return false;
00241 if (!parseInt(&bt)) return false;
00242 if (6 != parseVector(s,6)) return false;
00243 if (9 != parseVector(b,9)) return false;
00244 FlyStick1 * fs1;
00245 if (qu != -1) fs1 = new FlyStick1(id, qu, bt, s, b);
00246 else fs1 = new FlyStick1(id,qu, bt);
00247 bQueue->push(fs1);
00248 }
00249 return true;
00250 }
00251 bool PacketParser::parse6DF2()
00252 {
00253 int dev_s;
00254 int devs;
00255 if(!parseInt(&dev_s)) return false;
00256 if(!parseInt(&devs)) return false;
00257 devicesCount += devs;
00258 for (int i = 0 ; i < devs; i++)
00259 {
00260 int id;
00261 float qu;
00262 int nbt;
00263 int nct;
00264 float s[3];
00265 float b[9];
00266 if (!parseInt(&id)) return false;
00267 if (!parseFloat(&qu)) return false;
00268 if (!parseInt(&nbt)) return false;
00269 if (!parseInt(&nct)) return false;
00270 if (3 != parseVector(s,3)) return false;
00271 if (9 != parseVector(b,9)) return false;
00272 FlyStick2 * fs2 = NULL;
00273 if (qu != -1) fs2 = new FlyStick2(id, qu, nbt, nct, s, b);
00274 else FlyStick2(id, qu, nbt, nct);
00275 int intNum = nbt /32;
00276 if ((nbt%32) != 0) intNum += 1;
00277 int butt;
00278 float control;
00279 for (int j = 0; j < intNum; j++)
00280 {
00281 if (!parseInt(&butt))
00282 {
00283 delete fs2;
00284 return false;
00285 }
00286 else
00287 {
00288 fs2->addButtons(j, butt);
00289 }
00290 }
00291 for (int j = 0; j < nct; j++)
00292 {
00293 if(!parseFloat(&control))
00294 {
00295 delete fs2;
00296 return false;
00297 }
00298 else
00299 {
00300 fs2->addControls(j,control);
00301 }
00302 }
00303 bQueue->push(fs2);
00304 }
00305 return true;
00306 }
00307 bool PacketParser::parse6DMT()
00308 {
00309 int devs;
00310 if(!parseInt(&devs)) return false;
00311 devicesCount += devs;
00312 for (int i = 0 ; i < devs; i++)
00313 {
00314 int id;
00315 float qu;
00316 int bt;
00317 float s[3];
00318 float b[9];
00319 if (!parseInt(&id)) return false;
00320 if (!parseFloat(&qu)) return false;
00321 if (!parseInt(&bt)) return false;
00322 if (3 != parseVector(s,3)) return false;
00323 if (9 != parseVector(b,9)) return false;
00324 Measurer * dmt;
00325 if (qu != -1)dmt = new Measurer(id, qu, bt, s, b);
00326 else dmt = new Measurer(id, qu, bt);
00327 bQueue->push(dmt);
00328 }
00329 return true;
00330 }
00331 bool PacketParser::parseGL()
00332 {
00333 int devs;
00334 if(!textparser->ParseInt(&devs, separators)) return false;
00335 devicesCount += devs;
00336 for (int i = 0 ; i < devs; i++)
00337 {
00338 int id;
00339 float qu;
00340 int hand;
00341 int nf;
00342 float s[3];
00343 float b[9];
00344 if (!parseInt(&id)) return false;
00345 if (!parseFloat(&qu)) return false;
00346 if (!parseInt(&hand)) return false;
00347 if (!parseInt(&nf)) return false;
00348 if (3 != parseVector(s,3)) return false;
00349 if (9 != parseVector(b,9)) return false;
00350 bool leftH;
00351 if (nf == 0) leftH = true; else leftH = false;
00352 BodyGlove * gl = new BodyGlove(id,qu, nf,leftH,s,b);
00353 Finger fgrs;
00354 for (int j = 0 ; j < nf; j++)
00355 {
00356 if(!parseFinger(&fgrs))
00357 {
00358 delete gl;
00359 return false;
00360 }
00361 else gl->addFinger(j, fgrs);
00362 }
00363 bQueue->push(gl);
00364 }
00365 return true;
00366 }
00367 bool PacketParser::parseFinger(Finger *finger)
00368 {
00369 if (3 != parseVector(finger->Position, 3)) return false;
00370 if (9 != parseVector(finger->Matrix, 9)) return false;
00371 if (!parseFloat(&finger->Radius)) return false;
00372 if (!parseFloat(&(finger->Length[0]))) return false;
00373 if (!parseFloat(&(finger->Angle[0]))) return false;
00374 if (!parseFloat(&(finger->Length[1]))) return false;
00375 if (!parseFloat(&(finger->Angle[1]))) return false;
00376 if (!parseFloat(&(finger->Length[2]))) return false;
00377 return true;
00378 }
00379
00380 void PacketParser::SetQueue(VRUT::bodyqueue *queue)
00381 {
00382 this->bQueue = queue;
00383 }