DataRef* XPlanePlugin::subscribeRef(QString name) { DEBUG << name; // Search in list of already subscribed datarefs - if found return that foreach(DataRef *ref, refs) { if(ref->name()==name) { DEBUG << "Already subscribed to " << name; ref->setSubscribers(ref->subscribers() + 1); return ref; } } // Not yet subscribed - create a new dataref XPLMDataRef ref = XPLMFindDataRef(name.toLatin1()); if(ref) { XPLMDataTypeID refType = XPLMGetDataRefTypes(ref); DataRef *dr = 0; if(refType & xplmType_Double) { dr = new DoubleDataRef(this, name, ref); } else if(refType & xplmType_Float) { dr = new FloatDataRef(this, name, ref); } else if(refType & xplmType_Int) { dr = new IntDataRef(this, name, ref); } else if (refType & xplmType_FloatArray) { dr = new FloatArrayDataRef(this, name, ref); } else if (refType & xplmType_IntArray) { dr = new IntArrayDataRef(this, name, ref); } else if (refType & xplmType_Data) { dr = new DataDataRef(this, name, ref); } if(dr) { dr->setSubscribers(1); dr->setWritable(XPLMCanWriteDataRef(ref) != 0); DEBUG << "Subscribed to ref " << dr->name() << ", type: " << dr->typeString() << ", writable:" << dr->isWritable(); refs.append(dr); return dr; } else { INFO << "Dataref type " << refType << "not supported"; } } else { INFO << "Can't find dataref " << name; } return 0; }
void TcpClient::readClient() { while(_socket->canReadLine()) { QByteArray lineBA = _socket->readLine(); QString line = QString(lineBA).trimmed(); DEBUG << "Client says: " << line; // Split the command in strings QStringList subLine = line.split(" ", QString::SkipEmptyParts); QString command = subLine.value(0); if(command == "disconnect") { DEBUG << "killing this client connection"; deleteLater(); } else if(command == "sub") { // Subscribe command if(subLine.length() >= 2) { QString refName = subLine[1].trimmed(); double accuracy = 0; if(subLine.length() >=3) accuracy = subLine[2].toDouble(); DataRef *ref = getSubscribedRef(refName); if(!ref) { // Ref not subscribed yet, try to subscribe ref = _refProvider->subscribeRef(refName); if(ref) { // Succesfully subscribed connect(ref, SIGNAL(changed(DataRef*)), this, SLOT(refChanged(DataRef*))); _subscribedRefs.insert(ref); ref->setAccuracy(accuracy); //TODO: why is ref->updateValue() not sufficient here? if(ref->type() == xplmType_Float) { _refValueF[ref] = qobject_cast<FloatDataRef*>(ref)->value(); } else if(ref->type() == xplmType_Int) { _refValueI[ref] = qobject_cast<IntDataRef*>(ref)->value(); } else if(ref->type() == xplmType_Double) { _refValueD[ref] = qobject_cast<DoubleDataRef*>(ref)->value(); } else if(ref->type() == xplmType_FloatArray) { _refValueFA[ref] = qobject_cast<FloatArrayDataRef*>(ref)->value(); } else if(ref->type() == xplmType_IntArray) { _refValueIA[ref] = qobject_cast<IntArrayDataRef*>(ref)->value(); } else if(ref->type() == xplmType_Data) { _refValueB[ref] = qobject_cast<DataDataRef*>(ref)->value(); } INFO << "Subscribed to " << ref->name() << ", accuracy " << accuracy << ", type " << ref->typeString(); } else { INFO << "Ref not found" << refName; } } else { // Ref already subscribed - update accuracy