epicsTimerNotify::expireStatus delayVerify::expire ( const epicsTime &currentTime )
{
    this->expireStamp = currentTime;
    if ( --expireCount == 0u ) {
        expireEvent.signal ();
    }
    return noRestart;
}
 void pvValue(class ProcessVariable &pv, const RawValue::Data *data)
 {
     {
         Guard guard(__FILE__, __LINE__, mutex);
         puts("value");
         ++values;
     }
     if (! stop_in_connect)
     {
         puts("Stop in value");
         hack.signal();
     }
     epicsThreadSleep(linger);
 }
Ejemplo n.º 3
0
void SimADC::cycle()
{
    epicsTime now = epicsTime::getCurrent();

    if(nSamples.value != prev_nSamples) {
        X.value.reset();
        data.value.reset();
        prev_nSamples = nSamples.value;
    }

    if(!X.value) {
        X.value.reset((unsigned int*)malloc(sizeof(epicsUInt32)*prev_nSamples), Freeme<unsigned int>());
        unsigned int *val = X.value.get();
        for(size_t i=0; i<prev_nSamples; i++)
            val[i] = 2*i;

        X.shape.resize(1);
        X.shape[0] = prev_nSamples;

        X.displayLow = val[0];
        X.displayHigh = val[prev_nSamples-1];
    }

    if(!data.value || !data.value.unique())
        data.value.reset((double*)malloc(sizeof(double)*prev_nSamples), Freeme<double>());

    X.timeStamp = now;

    if(!X.value) {
        X.severity = 3;
        X.message = "Alloc fails";
    }
    if(!data.value) {
        data.severity = 3;
        data.message = "Alloc fails";
        return;
    }

    double *val = data.value.get();
    for(size_t i=0; i<prev_nSamples; i++)
        val[i] = mult.value * sin((freq.value/RAD2DEG)*i + (shift.value/RAD2PCT)) + offset.value;

    data.shape.resize(1);
    data.shape[0] = prev_nSamples;

    updated.signal();
}
TEST_CASE pv_lock_test()
{
    LockApp app;
    int i, num;
    if (getenv("REPEAT"))
        num = atoi(getenv("REPEAT"));
    else
        num = 1;
    for (i = 0; i<num; ++i)
    {
        stop_in_connect = ! (i & 1);
        app.start();
        hack.wait();
        app.stop();
    }
    TEST_OK;
}       
 void pvConnected(ProcessVariable &pv, const epicsTime &when)
 {
     {
         Guard guard(__FILE__, __LINE__, mutex);
         connected = true;
         puts("\nConnected");
     }
     if (stop_in_connect)
     {
         puts("Stop in connect");
         hack.signal();
     }
     {
         Guard pv_guard(__FILE__, __LINE__, pv);
         pv.subscribe(pv_guard);
     }
     {
         Guard ctx_guard(__FILE__, __LINE__, ctx);
         ctx.flush(ctx_guard);
     }
     epicsThreadSleep(linger);
 }
//
// verify reasonable timer interval accuracy
//
void testAccuracy ()
{
    static const unsigned nTimers = 25u;
    delayVerify *pTimers[nTimers];
    unsigned i;
    unsigned timerCount = 0;

    testDiag ( "Testing timer accuracy" );

    epicsTimerQueueActive &queue = 
        epicsTimerQueueActive::allocate ( true, epicsThreadPriorityMax );

    for ( i = 0u; i < nTimers; i++ ) {
        pTimers[i] = new delayVerify ( i * 0.1 + delayVerifyOffset, queue );
        timerCount += pTimers[i] ? 1 : 0;
    }
    testOk1 ( timerCount == nTimers );

    expireCount = nTimers;
    for ( i = 0u; i < nTimers; i++ ) {
        epicsTime cur = epicsTime::getCurrent ();
        pTimers[i]->setBegin ( cur );
        pTimers[i]->start ( cur + pTimers[i]->delay () );
    }
    while ( expireCount != 0u ) {
        expireEvent.wait ();
    }
    double averageMeasuredError = 0.0;
    for ( i = 0u; i < nTimers; i++ ) {
        averageMeasuredError += pTimers[i]->checkError ();
    }
    averageMeasuredError /= nTimers;
    testDiag ("average timer delay error %f ms", 
        averageMeasuredError * 1000 );
    queue.release ();
}