Example #1
0
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;
}
Example #2
0
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);
    }
}