static void parseAVar(bool diamond){ // it's a valid type char buf[256]; bool autoRange=false; float mn=0,mx=0; int size; RawDataBuffer *b; tok.getnextident(buf); // get name // if diamond, get topic and datum index char tname[256]; int idx; #if DIAMOND if(diamond){ tok.getnextcheck(T_TOPIC); tok.getnextident(tname); tok.getnextcheck(T_COMMA); idx = tok.getnextint(); diamondMap[DiamondTopicKey(tname,idx)]=QString(buf); diamondapparatus::subscribe(tname); if(!diamondSet.contains(tname)) diamondSet.insert(tname); } #endif size = tok.getnextint(); // and size // now get the range tok.getnextcheck(T_RANGE); switch(tok.getnext()){ case T_INT: case T_FLOAT: mn = tok.getfloat(); tok.getnextcheck(T_TO); mx = tok.getnextfloat(); break; case T_AUTO: autoRange=true; break; default: throw UnexpException(&tok,"number or 'auto'"); break; } b=createVar(T_NAMEFLOAT,buf,size,mn,mx); if(autoRange) ((DataBuffer<float>*)b)->setAutoRange(); }
DataBuffer<float> *ConfigManager::parseFloatSource(){ DataBuffer<float> *b; char buf[256]; switch(tok.getnext()){ case T_VAR: tok.getnextident(buf); b = DataManager::findFloatBuffer(buf); if(!b) throw ParseException(&tok).set("undefined variable '%s'",buf); break; case T_EXPR: tok.getnextstring(buf); // OK, we're going to lose a reference to this, but such is life. // In this version we never delete expressions anyway. try { b = (new Expression(buf))->buffer; } catch(Exception& e){ throw Exception(e,tok.getline()); } // now parse the extra bits tok.getnextcheck(T_RANGE); float mn,mx; switch(tok.getnext()){ case T_INT: case T_FLOAT: mn = tok.getfloat(); tok.getnextcheck(T_TO); mx = tok.getnextfloat(); b->setMinMax(mn,mx); break; case T_AUTO: b->setAutoRange(); break; default: throw UnexpException(&tok,"expected number or 'auto'"); } break; default: throw UnexpException(&tok,"'var' or 'expr'"); } return b; }
static void parseWaypoint(){ tok.getnextcheck(T_OCURLY); wpResetDefinitions(); for(;;){ char buf[256]; tok.getnextcheck(T_IDENT); strcpy(buf,tok.getstring()); wpAddField(buf,tok.getnextfloat()); int t = tok.getnext(); if(t==T_CCURLY) break; else if(t!=T_COMMA) throw UnexpException(&tok,"comma or '}'"); } }
void ConfigManager::parseFile(QString fname){ tok.init(); tok.seterrorhandler(&tokerrorhandler); tok.settokens(tokens); tok.setcommentlinesequence("#"); // read the entire file! QFile file(fname); if(!file.open(QIODevice::ReadOnly)) throw Exception().set("could not open config file"); QByteArray b = file.readAll(); if(b.isNull() || b.isEmpty()) throw Exception().set("could not read config file"); b.append((char)0); file.close(); const char *data = b.constData(); tok.reset(data); bool done = false; while(!done){ // at the top level we parse frames and // variables int t = tok.getnext(); switch(t){ case T_VAR: parseVars(); break; case T_WINDOW: parseWindow(); break; case T_END: done=true; break; case T_PORT: port = tok.getnextint(); break; case T_SENDPORT: udpSendPort = tok.getnextint(); break; // the UDP client now sets its address from the first packet received // but this will override it case T_SENDADDR: tok.getnextstring(udpSendAddr); UDPClient::getInstance()->setAddress(udpSendAddr); break; case T_VALIDTIME: DataManager::dataValidInterval = tok.getnextfloat(); break; case T_SENDINTERVAL: sendInterval = tok.getnextfloat(); break; case T_UPDATEINTERVAL: graphicalUpdateInterval = tok.getnextfloat()*1000; break; case T_AUDIO: parseAudio(); break; case T_WAYPOINT: parseWaypoint(); break; default: throw UnexpException(&tok,"'var', 'frame', config data or end of file"); } } }
void parseLinkedVars(bool diamond){ char buf[256]; int size,type; RawDataBuffer *linkvar,*b; if(tok.getnext()!=T_OPREN) throw UnexpException(&tok,"( after linked"); linkedVars.clear(); for(;;){ double mn,mx; char buf[256]; // get type type = tok.getnext(); // get name tok.getnextident(buf); // if diamond, get topic and datum index char tname[256]; int idx; #if DIAMOND if(diamond){ tok.getnextcheck(T_TOPIC); tok.getnextident(tname); tok.getnextcheck(T_COMMA); idx = tok.getnextint(); diamondMap[DiamondTopicKey(tname,idx)]=QString(buf); if(!diamondSet.contains(tname)) diamondSet.insert(tname); diamondapparatus::subscribe(tname); } #endif // now the range tok.getnextcheck(T_RANGE); mn = tok.getnextfloat(); tok.getnextcheck(T_TO); mx = tok.getnextfloat(); // add to a list! linkedVars.append(LinkedVarEntry(buf,type,mn,mx)); if(tok.getnext()!=T_COMMA){ tok.rewind(); break; } } if(tok.getnext()!=T_CPREN) throw UnexpException(&tok,") after linked var list"); if(tok.getnext()!=T_INT) throw UnexpException(&tok,"buffer size after linked var list"); size = tok.getint(); linkvar = NULL; for(int i=0;i<linkedVars.size();i++){ b = createVar(linkedVars[i].type, linkedVars[i].name, size, linkedVars[i].minVal, linkedVars[i].maxVal); if(linkvar) linkvar->link(b); else linkvar = b; } }