void PubSubKeepAllTransientReader::read(uint16_t lastvalue, const std::chrono::seconds &seconds)
{
    std::unique_lock<std::mutex> lock(mutex_);
    lastvalue_ = lastvalue;
    while(!msgs_.empty() && lastvalue_ == *msgs_.rbegin())
    {
        if(data_received_)
        {
            HelloWorld hello;
            SampleInfo_t info;

            if(subscriber_->takeNextData((void*)&hello, &info))
            {
                if(info.sampleKind == ALIVE)
                {
                    newNumber(hello.index());
                }
            }

            --data_received_;
        }
        else
        {
            if(cv_.wait_for(lock, seconds) == std::cv_status::timeout)
                break;
        }
    }
}
Number::Number(QScriptEnginePrivate *eng):
    Core(eng, QLatin1String("Number"), QScriptClassInfo::NumberType)
{
    newNumber(&publicPrototype, 0);

    eng->newConstructor(&ctor, this, publicPrototype);

    addPrototypeFunction(QLatin1String("toString"), method_toString, 0);
    addPrototypeFunction(QLatin1String("toLocaleString"), method_toLocaleString, 0);
    addPrototypeFunction(QLatin1String("valueOf"), method_valueOf, 0);
    addPrototypeFunction(QLatin1String("toFixed"), method_toFixed, 0);
    addPrototypeFunction(QLatin1String("toExponential"), method_toExponential, 0);
    addPrototypeFunction(QLatin1String("toPrecision"), method_toPrecision, 0);

    QScriptValue::PropertyFlags flags = QScriptValue::Undeletable
                                        | QScriptValue::ReadOnly
                                        | QScriptValue::SkipInEnumeration;
    ctor.setProperty(QLatin1String("NaN"),
                     QScriptValueImpl(eng, qSNaN()), flags);
    ctor.setProperty(QLatin1String("NEGATIVE_INFINITY"),
                     QScriptValueImpl(eng, -qInf()), flags);
    ctor.setProperty(QLatin1String("POSITIVE_INFINITY"),
                     QScriptValueImpl(eng, qInf()), flags);
    ctor.setProperty(QLatin1String("MAX_VALUE"),
                     QScriptValueImpl(eng, 1.7976931348623158e+308), flags);
#ifdef __INTEL_COMPILER
# pragma warning( push )
# pragma warning(disable: 239)
#endif
    ctor.setProperty(QLatin1String("MIN_VALUE"),
                     QScriptValueImpl(eng, 5e-324), flags);
#ifdef __INTEL_COMPILER
# pragma warning( pop )
#endif
}
Beispiel #3
0
void QuoteLine::setId(int pId)
{
  if (pId == _id)
    return;

  XSqlQuery quhead;
  quhead.prepare( "SELECT quhead_number, quhead_cust_id, quhead_billtoname "
                  "FROM quhead, cust "
                  "WHERE ( (quhead_cust_id=cust_id)"
                  " AND (quhead_id=:sohead_id) );" );
  quhead.bindValue(":sohead_id", pId);
  quhead.exec();
  if (quhead.first())
  {
    _id     = pId;
    _number = quhead.value("quhead_number").toInt();
    _custid = quhead.value("quhead_cust_id").toInt();
    _valid  = TRUE;

    emit newNumber(quhead.value("quhead_number").toString());
    emit newCustName(quhead.value("quhead_billtoname").toString());

    setText(quhead.value("quhead_number").toString());
  }
  else
  {
    _id     = -1;
    _number = -1;
    _custid = -1;
    _valid  = FALSE;

    emit newNumber("");
    emit newCustName("");
    setText("");
  }

  emit newId(_id);
  emit newCustId(_custid);
  emit newNumber(_number);
  emit valid(_valid);

  _parsed = TRUE;
}
Beispiel #4
0
sExpression *cloneList(sExpression *exp){
  if(isList(exp)){
    sList *temp = toList(exp);
    return cons(cloneList(car(temp)),
                cloneList(cdr(temp)));
  }
  if(isSymbol(exp)){
    return newSymbol(toSymb(exp)->name);
  }
  if(isNumber(exp)){
    return newNumber(toNum(exp)->value);
  }
  if(isString(exp)){
    return newString(toString(exp)->value);
  }
  return exp;
}
Beispiel #5
0
void TriangleMesherInterface :: simplifyPSLG(Triangle_PSLG &coarse, const Triangle_PSLG &pslg, double limit, double minlen)
{
    int segments = pslg.segment_a.giveSize();
    int nodes = pslg.nx.giveSize();

    // Calculate the inverted connection node->element
    std :: set< int > *connectivity = new std :: set< int > [ nodes ];
    for ( int i = 0; i < segments; i++ ) {
        connectivity [ pslg.segment_a[i] - 1 ].insert(i + 1);
        connectivity [ pslg.segment_b[i] - 1 ].insert(i + 1);
    }

    // Some conservative error measure
    IntArray nodeRemoval(nodes);
    IntArray edgeRemoval(segments);
    edgeRemoval.zero();
    IntArray seg_a = pslg.segment_a;
    IntArray seg_b = pslg.segment_b;

    nodeRemoval.zero();
    FloatArray error_x(nodes), error_y(nodes), ab(2), ac(2), bc(2), err_vec(2);
    error_x.zero();
    error_y.zero();

    for ( int j = 0; j < 2; ++j ) {
        double allowed = j * limit / 2;
        for ( int i = 1; i <= nodes; i++ ) {
            std :: set< int > &elems = connectivity [ i - 1 ];
#if 1
            if ( elems.size() < 2 ) {
                // Lone nodes or edges are removed. It is up for discussion whether or not this is a wanted.
                nodeRemoval.at(i) = true;
                if ( elems.size() == 1 ) {
                    int e0 = * elems.begin();
                    edgeRemoval.at(e0) = true;
                    // Find the other node and remove segment e0 from it;
                    int n1 = seg_a.at(e0) == i ? seg_b.at(e0) : seg_a.at(e0);
                    connectivity [ n1 - 1 ].erase(e0);
                    elems.clear();
                    /*printf("Removing edge %d and node = %d\n", e0, n1);
                     * while (connectivity[n1-1].size() < 2) {
                     *  nodeRemoval.at(n1) = true;
                     *  if (connectivity[n1-1].size() == 1) {
                     *      e0 = *connectivity[n1-1].begin();
                     *      edgeRemoval.at(e0) = true;
                     *      connectivity[n1-1].clear();
                     *      n1 = seg_a.at(e0) == i ? seg_b.at(e0) : seg_a.at(e0);
                     *      connectivity[n1-1].erase(e0);
                     *  } else {
                     *      OOFEM_WARNING("HAPPENS ONCE!");
                     *      break;
                     *  }
                     * }*/
                }
            } else
#endif
            if ( elems.size() == 2 ) {
                int e0 = * elems.begin();
                int e1 = * ( ++elems.begin() );
                if ( pslg.segment_marker.at(e0) == pslg.segment_marker.at(e1) ) {
                    double abac, acac;
                    int n0, n1, n2;

                    n0 = seg_a.at(e0) == i ? seg_b.at(e0) : seg_a.at(e0);
                    n1 = i;
                    n2 = seg_a.at(e1) == i ? seg_b.at(e1) : seg_a.at(e1);

                    ab[0] = pslg.nx.at(n1) - pslg.nx.at(n0);
                    ab[1] = pslg.ny.at(n1) - pslg.ny.at(n0);
                    ac[0] = pslg.nx.at(n2) - pslg.nx.at(n0);
                    ac[1] = pslg.ny.at(n2) - pslg.ny.at(n0);

                    abac = ab.dotProduct(ac);
                    acac = ac.computeSquaredNorm();

                    // Find the error (how far the point would be moved to obtain the following line without it).
                    if ( abac <= 0 || acac == 0 ) { // then -ab
                        err_vec[0] = -ab[0];
                        err_vec[1] = -ab[1];
                    } else if ( abac >= acac ) { // then bc
                        err_vec[0] = pslg.nx.at(n2) - pslg.nx.at(n1);
                        err_vec[1] = pslg.ny.at(n2) - pslg.ny.at(n1);
                    } else {
                        err_vec = ac;
                        err_vec.times(abac / acac);
                        err_vec.subtract(ab);
                    }

                    double ev_norm = err_vec.computeNorm();
                    // Max of new or old error;
                    double real_error = 0.0;
                    if ( ev_norm == 0 ) {
                        real_error = 0.0;
                    } else {
                        error_x.at(n1) += err_vec[0];
                        error_y.at(n1) += err_vec[1];
                        real_error = sqrt( error_x.at(n1) * error_x.at(n1) + error_y.at(n1) * error_y.at(n1) );
                    }

                    if ( real_error <= allowed ) {
                        // Mark node for removal, remove second edge, more first edge connection to next node;
                        nodeRemoval.at(i) = true;
                        edgeRemoval.at(e1) = true;
                        connectivity [ n2 - 1 ].erase(e1);
                        connectivity [ n2 - 1 ].insert(e0);
                        if ( seg_a.at(e0) == n1 ) { // Doing the bothersome way to preserve direction of segments.
                            seg_a.at(e0) = n2;
                        } else {
                            seg_b.at(e0) = n2;
                        }
                        elems.clear();
                        // Accumulate the error vector
                        error_x.at(n0) += error_x.at(n1);
                        error_y.at(n0) += error_y.at(n1);
                        error_x.at(n2) += error_x.at(n1);
                        error_y.at(n2) += error_y.at(n1);
                    }
                }
            }
        }
    }

    // Deleting the elements which are too short.
    bool edgeRemoved = true;
    while ( edgeRemoved ) {
        edgeRemoved = false;
        for ( int i = 1; i <= nodes; i++ ) {
            std :: set< int > &elems = connectivity [ i - 1 ];
            if ( elems.size() == 2 ) {
                int e0 = * elems.begin();
                int e1 = * ( ++elems.begin() );
                if ( pslg.segment_marker.at(e0) == pslg.segment_marker.at(e1) ) {
                    int n0, n1, n2;

                    n0 = seg_a.at(e0) == i ? seg_b.at(e0) : seg_a.at(e0);
                    n1 = i;
                    n2 = seg_a.at(e1) == i ? seg_b.at(e1) : seg_a.at(e1);

                    ab[0] = pslg.nx.at(n1) - pslg.nx.at(n0);
                    ab[1] = pslg.ny.at(n1) - pslg.ny.at(n0);
                    bc[0] = pslg.nx.at(n2) - pslg.nx.at(n1);
                    bc[1] = pslg.ny.at(n2) - pslg.ny.at(n1);

                    if ( ab.computeSquaredNorm() < minlen * minlen || bc.computeSquaredNorm() < minlen * minlen ) {
                        // Mark node for removal, remove second edge, more first edge connection to next node;
                        nodeRemoval.at(i) = true;
                        edgeRemoval.at(e1) = true;
                        connectivity [ n2 - 1 ].erase(e1);
                        connectivity [ n2 - 1 ].insert(e0);
                        if ( seg_a.at(e0) == n1 ) { // Doing the bothersome way to preserve direction of segments.
                            seg_a.at(e0) = n2;
                        } else {
                            seg_b.at(e0) = n2;
                        }
                        elems.clear();
                        edgeRemoved = true;
                    }
                }
            }
        }
    }


    // Remove simple double-connections like o<--->o
    for ( int i = 1; i <= nodes; i++ ) {
        std :: set< int > &elems = connectivity [ i - 1 ];
        if ( elems.size() == 2 ) {
            int e0 = * elems.begin();
            int e1 = * ( ++elems.begin() );
            int n0 = seg_a.at(e0) == i ? seg_b.at(e0) : seg_a.at(e0);
            int n1 = i;
            int n2 = seg_a.at(e1) == i ? seg_b.at(e1) : seg_a.at(e1);

            if ( n0 == n2 ) {
                // Then we have a simple double connection. We get rid of this node and the two edges.
                nodeRemoval.at(n1) = true;
                edgeRemoval.at(e0) = true;
                edgeRemoval.at(e1) = true;
                connectivity [ n1 - 1 ].erase(e0);
                connectivity [ n1 - 1 ].erase(e1);
                connectivity [ n2 - 1 ].erase(e0);
                connectivity [ n2 - 1 ].erase(e1);
                if ( connectivity [ n1 - 1 ].size() == 0 ) {
                    nodeRemoval.at(n2) = true;
                }
            }
        }
    }

    delete[] connectivity;

    // Cleanup
    int newNodes = 0;
    IntArray newNumber(nodes);
    newNumber.zero();
    coarse.nx.resize(nodes);
    coarse.ny.resize(nodes);
    for ( int i = 1; i <= nodes; i++ ) {
        if ( !nodeRemoval.at(i) ) {
            newNodes++;
            coarse.nx.at(newNodes) = pslg.nx.at(i);
            coarse.ny.at(newNodes) = pslg.ny.at(i);
            newNumber.at(i) = newNodes;
        }
    }
    coarse.nx.resize(newNodes);
    coarse.ny.resize(newNodes);

    int newSegments = 0;
    coarse.segment_a.resize(segments);
    coarse.segment_b.resize(segments);
    coarse.segment_marker.resize(segments);

    for ( int i = 1; i <= segments; i++ ) {
        if ( !edgeRemoval.at(i) ) {
            newSegments++;
            coarse.segment_a.at(newSegments) = newNumber.at( seg_a.at(i) );
            coarse.segment_b.at(newSegments) = newNumber.at( seg_b.at(i) );
            coarse.segment_marker.at(newSegments) = pslg.segment_marker.at(i);
        }
    }
    coarse.segment_a.resize(newSegments);
    coarse.segment_b.resize(newSegments);
    coarse.segment_marker.resize(newSegments);
}
Beispiel #6
0
void Camera_INDIClass::newProperty(INDI::Property *property)
{
    // Here we receive a list of all the properties after the connection
    // Updated values are not received here but in the newTYPE() functions above.
    // We keep the vector for each interesting property to send some data later.
    //const char* DeviName = property->getDeviceName();
    const char* PropName = property->getName();
#ifdef INDI_PRE_1_1_0
    INDI_TYPE Proptype = property->getType();
#else
    INDI_PROPERTY_TYPE Proptype = property->getType();
#endif

    //printf("Camera Property: %s\n",PropName);

    if (Proptype == INDI_BLOB) {
        //printf("Found BLOB property for %s %s\n", DeviName, PropName);
        has_blob = 1;
    }
    else if ((strcmp(PropName, INDICameraCCDCmd+"EXPOSURE") == 0) && Proptype == INDI_NUMBER) {
        //printf("Found CCD_EXPOSURE for %s %s\n", DeviName, PropName);
        expose_prop = property->getNumber();
    }
    else if ((strcmp(PropName, INDICameraCCDCmd+"FRAME") == 0) && Proptype == INDI_NUMBER) {
        //printf("Found CCD_FRAME for %s %s\n", DeviName, PropName);
        frame_prop = property->getNumber();
        frame_x = IUFindNumber(frame_prop,"X");
        frame_y = IUFindNumber(frame_prop,"Y");
        frame_width = IUFindNumber(frame_prop,"WIDTH");
        frame_height = IUFindNumber(frame_prop,"HEIGHT");
    }
    else if ((strcmp(PropName, INDICameraCCDCmd+"FRAME_TYPE") == 0) && Proptype == INDI_SWITCH) {
        //printf("Found CCD_FRAME_TYPE for %s %s\n", DeviName, PropName);
        frame_type_prop = property->getSwitch();
    }
    else if ((strcmp(PropName, INDICameraCCDCmd+"BINNING") == 0) && Proptype == INDI_NUMBER) {
        //printf("Found CCD_BINNING for %s %s\n",DeviName, PropName);
        binning_prop = property->getNumber();
        binning_x = IUFindNumber(binning_prop,"HOR_BIN");
        binning_y = IUFindNumber(binning_prop,"VER_BIN");
        newNumber(binning_prop);
    }
    else if ((strcmp(PropName, "VIDEO_STREAM") == 0) && Proptype == INDI_SWITCH) {
        //printf("Found Video %s %s\n",DeviName, PropName);
        video_prop = property->getSwitch();
    }
    else if (strcmp(PropName, "DEVICE_PORT") == 0 && Proptype == INDI_TEXT) {
        //printf("Found device port for %s \n",DeviName);
        camera_port = property->getText();
    }
    else if (strcmp(PropName, "CONNECTION") == 0 && Proptype == INDI_SWITCH) {
        //printf("Found CONNECTION for %s %s\n",DeviName, PropName);
        // Check the value here in case the device is already connected
        ISwitch *connectswitch = IUFindSwitch(property->getSwitch(),"CONNECT");
        Connected = (connectswitch->s == ISS_ON);
    }
    else if ((strcmp(PropName, "TELESCOPE_TIMED_GUIDE_NS") == 0) && Proptype == INDI_NUMBER) {
        pulseGuideNS_prop = property->getNumber();
        pulseN_prop = IUFindNumber(pulseGuideNS_prop,"TIMED_GUIDE_N");
        pulseS_prop = IUFindNumber(pulseGuideNS_prop,"TIMED_GUIDE_S");
    }
    else if ((strcmp(PropName, "TELESCOPE_TIMED_GUIDE_WE") == 0) && Proptype == INDI_NUMBER) {
        pulseGuideEW_prop = property->getNumber();
        pulseW_prop = IUFindNumber(pulseGuideEW_prop,"TIMED_GUIDE_W");
        pulseE_prop = IUFindNumber(pulseGuideEW_prop,"TIMED_GUIDE_E");
    }
    else if (strcmp(PropName, INDICameraCCDCmd+"INFO") == 0 && Proptype == INDI_NUMBER) {
        ccdinfo_prop = property->getNumber();
        newNumber(ccdinfo_prop);
    }

    CheckState();
}