static Poco::JSON::Array::Ptr getConnectedPortInfos( const Poco::JSON::Object::Ptr &topObj, const std::string &blockId, const bool enbFilter, const bool isInput) { const auto connsArray = topObj->getArray("connections"); const auto blocksObj = topObj->getObject("blocks"); const auto blockObj = blocksObj->getObject(blockId); //grab the raw ports info Poco::JSON::Array::Ptr portsInfo(new Poco::JSON::Array()); if (isInput and blockObj->has("inputs")) portsInfo = blockObj->getArray("inputs"); if (not isInput and blockObj->has("outputs")) portsInfo = blockObj->getArray("outputs"); //no filtering? return ASAP if (not enbFilter) return portsInfo; Poco::JSON::Array::Ptr filteredPortsInfo(new Poco::JSON::Array()); for (size_t i = 0; i < portsInfo->size(); i++) { const auto portInfo = portsInfo->getObject(i); for (size_t c_i = 0; c_i < connsArray->size(); c_i++) { const auto conn = connsArray->getObject(c_i); if ( (not isInput and blockId == conn->getValue<std::string>("srcId") and portInfo->getValue<std::string>("name") == conn->getValue<std::string>("srcName")) or (isInput and blockId == conn->getValue<std::string>("dstId") and portInfo->getValue<std::string>("name") == conn->getValue<std::string>("dstName")) ) { filteredPortsInfo->add(portInfo); break; } } } return filteredPortsInfo; }
void Communicator::processIncomingMessage(QString const &message) { QString const dataLabel("data:"); QString const portsLabel("ports:"); if (message.startsWith(dataLabel)) { SensorData data; for (QString const &value : message.right(message.length() - dataLabel.length()).split(";")) { if (value.startsWith("analog:")) { QStringList sensors = value.right(value.length() - QString("analog:").length()).split(","); for (QString const &sensor : sensors) { QString port = sensor.split("=")[0]; QStringList values = sensor.split("=")[1].split(":"); data.analog[port] = values[0].toInt(); data.analogRaw[port] = values[1].toInt(); } } else if (value.startsWith("digital:")) { QStringList sensors = value.right(value.length() - QString("digital:").length()).split(","); for (QString const &sensor : sensors) { QString port = sensor.split("=")[0]; QStringList values = sensor.split("=")[1].split(":"); data.digital[port] = values[0].toInt(); data.digitalRaw[port] = values[1].toInt(); } } else if (value.startsWith("special:")) { QStringList sensors = value.right(value.length() - QString("special:").length()).split(","); for (QString const &sensor : sensors) { QString port = sensor.split("=")[0]; QStringList values = sensor.split("=")[1].split(":"); data.special[port] = values[0].toInt(); data.specialRaw[port] = values[1].toInt(); } } else if (value.startsWith("encoders:")) { QStringList sensors = value.right(value.length() - QString("encoders:").length()).split(","); for (QString const &sensor : sensors) { QString port = sensor.split("=")[0]; QStringList values = sensor.split("=")[1].split(":"); data.encoders[port] = values[0].toInt(); data.encodersRaw[port] = values[1].toInt(); } } else if (value.startsWith("accelerometer:")) { int const labelLength = QString("accelerometer:").length(); QStringList values = value.mid(labelLength + 1, value.length() - labelLength - 2).split(","); data.accelerometer = QVector<int>({ values[0].toInt(), values[1].toInt(), values[2].toInt() }); } else if (value.startsWith("gyroscope:")) { int const labelLength = QString("gyroscope:").length(); QStringList values = value.mid(labelLength + 1, value.length() - labelLength - 2).split(","); data.gyroscope = QVector<int>({ values[0].toInt(), values[1].toInt(), values[2].toInt() }); } } emit newData(data); } else if (message.startsWith(portsLabel)) { QStringList types = message.right(message.length() - portsLabel.length()).split(";"); QStringList analog; QStringList digital; QStringList special; QStringList encoders; for (QString const &typeSection : types) { if (typeSection.startsWith("analog:")) { analog = typeSection.right(typeSection.length() - QString("analog:").length()) .split(",", QString::SkipEmptyParts); } else if (typeSection.startsWith("digital:")) { digital = typeSection.right(typeSection.length() - QString("digital:").length()) .split(",", QString::SkipEmptyParts); } else if (typeSection.startsWith("special:")) { special = typeSection.right(typeSection.length() - QString("special:").length()) .split(",", QString::SkipEmptyParts); } else if (typeSection.startsWith("encoders:")) { encoders = typeSection.right(typeSection.length() - QString("encoders:").length()) .split(",", QString::SkipEmptyParts); } } emit portsInfo(analog, digital, special, encoders); } }