::CORBA::Boolean tofObserver_i::readData ( ::CORBA::Long pos, ::SignalObserver::DataReadBuffer_out dataReadBuffer ) { std::lock_guard< std::mutex > lock( mutex_ ); if ( pos < 0 ) pos = fifo_.back(); if ( !fifo_.empty() && ( fifo_.front() <= pos && pos <= fifo_.back() ) ) { int noffs = pos - fifo_.front().pos_; if ( noffs < 0 || unsigned(noffs) >= fifo_.size() ) return false; cache_item& d = fifo_[ noffs ]; if ( d.pos_ != pos ) { // in case if some data lost std::deque< cache_item >::iterator it = std::lower_bound( fifo_.begin(), fifo_.end(), pos ); if ( it != fifo_.end() ) d = *it; else return false; } if ( d.mb_->msg_type() == constants::MB_InfiTOF_DATA ) { TAO_InputCDR cdr( d.mb_->cont() ); InfiTOF::AveragerData data; cdr >> data; SignalObserver::DataReadBuffer_var res = new SignalObserver::DataReadBuffer; res->method <<= data; res->uptime = data.uptime; res->pos = d.pos_; res->events = data.wellKnownEvents; res->array.length( data.nbrSamples ); memcpy( &res->array[0], d.mb_->rd_ptr(), data.nbrSamples * sizeof(long) ); dataReadBuffer = res._retn(); return true; }
::CORBA::Boolean traceObserver_i::readData ( ::CORBA::Long pos, ::SignalObserver::DataReadBuffer_out dataReadBuffer ) { acewrapper::scoped_mutex_t<> lock( mutex_ ); if ( pos < 0 ) pos = fifo_.back(); if ( !fifo_.empty() && ( fifo_.front() <= pos && pos <= fifo_.back() ) ) { std::deque< cache_item >::iterator it = std::lower_bound( fifo_.begin(), fifo_.end(), pos ); if ( it != fifo_.end() ) { SignalObserver::DataReadBuffer_var rb = new SignalObserver::DataReadBuffer; rb->pos = it->pos_; const TOFInstrument::TraceDescriptor& desc = it->desc_; rb->events = desc.wellKnownEvents; rb->ndata = std::distance( it, fifo_.end() ); TOFInstrument::SpectrumProcessedDataArray ar; ar.length( rb->ndata ); for ( size_t i = 0 ; it != fifo_.end(); ++it, ++i ) { const TOFInstrument::SpectrumProcessedData& d = it->data_; ar[i] = d; } rb->data <<= ar; dataReadBuffer = rb._retn(); return true; } } return false; }