bool VC1TaskStore::Reset() { uint32_t i = 0; //close m_bIsLastFramesMode = false; ResetDSQueue(); if (vm_mutex_is_valid(&m_mDSGuard)) vm_mutex_destroy(&m_mDSGuard); for (i = 0; i < m_iNumFramesProcessing; i++) { vm_mutex_destroy(m_pGuardGet[i]); m_pGuardGet[i] = 0; } if(m_pMemoryAllocator) { if (m_pDescriptorQueue) { for (i = 0; i < m_iNumFramesProcessing; i++) m_pDescriptorQueue[i]->Release(); } if (static_cast<int>(m_iTSHeapID) != -1) { m_pMemoryAllocator->Unlock(m_iTSHeapID); m_pMemoryAllocator->Free(m_iTSHeapID); m_iTSHeapID = (MemID)-1; } m_iNumDSActiveinQueue = 0; delete m_pSHeap; // Heap Allocation { uint32_t heapSize = CalculateHeapSize(); if (m_pMemoryAllocator->Alloc(&m_iTSHeapID, heapSize, UMC_ALLOC_PERSISTENT, 16) != UMC_OK) return false; m_pSHeap = new VC1TSHeap((uint8_t*)m_pMemoryAllocator->Lock(m_iTSHeapID), heapSize); } { m_pSHeap->s_new(&m_pGuardGet,m_iNumFramesProcessing); for (i = 0; i < m_iNumFramesProcessing; i++) { m_pSHeap->s_new(&m_pGuardGet[i]); vm_mutex_set_invalid(m_pGuardGet[i]); if (VM_OK != vm_mutex_init(m_pGuardGet[i])) return false; } } } if (0 == vm_mutex_is_valid(&m_mDSGuard)) { if (VM_OK != vm_mutex_init(&m_mDSGuard)) return false; } SetBFrameIndex(-1); SetCurrIndex(-1); SetRangeMapIndex(-1); SetPrevIndex(-1); SetNextIndex(-1); return true; }
// TODO: we might want to use multiple buffers at the same time // returns the length of data // TODO: the first part only needs to be called once; so we should move the code at the end of RunBlock // unless we want to alternate between allocated memory (to enable parallel readouts) unsigned long Measurement::GetNextData() { FILE_LOG(logDEBUG3) << "Measurement::GetNextData"; int i; short overflow=0; uint32_t length_of_trace_askedfor, length_of_trace_fetched; Timing t; // it makes no sense to read any further: we are already at the end if(GetNextIndex() >= GetLength()) { std::cerr << "Stop fetching data from osciloscope." << std::endl; return 0UL; } length_of_trace_askedfor = GetMaxTraceLengthToFetch(); if(GetNextIndex() + length_of_trace_askedfor > GetLength()) { length_of_trace_askedfor = GetLength() - GetNextIndex(); } // allocate buffers for(i=0; i<GetNumberOfChannels(); i++) { if(GetChannel(i)->IsEnabled()) { if(data_allocated[i] == false) { throw "Unable to get data. Memory is not allocated."; } if(GetSeries() == PICO_4000) { FILE_LOG(logDEBUG2) << "ps4000SetDataBuffer(handle=" << GetHandle() << ", channel=" << i << ", *buffer=<data[i]>, bufferLength=" << GetMaxTraceLengthToFetch() << ")"; GetPicoscope()->SetStatus(ps4000SetDataBuffer( GetHandle(), // handle (PS4000_CHANNEL)i, // channel data[i], // *buffer GetMaxTraceLengthToFetch())); // bufferLength } else { FILE_LOG(logDEBUG2) << "ps6000SetDataBuffer(handle=" << GetHandle() << ", channel=" << i << ", *buffer=<data[i]>, bufferLength=" << GetMaxTraceLengthToFetch() << ", downSampleRatioMode=PS6000_RATIO_MODE_NONE)"; GetPicoscope()->SetStatus(ps6000SetDataBuffer( GetHandle(), // handle (PS6000_CHANNEL)i, // channel data[i], // *buffer GetMaxTraceLengthToFetch(), // bufferLength PS6000_RATIO_MODE_NONE)); // downSampleRatioMode } if(GetPicoscope()->GetStatus() != PICO_OK) { std::cerr << "Unable to set memory for channel." << std::endl; throw Picoscope::PicoscopeException(GetPicoscope()->GetStatus()); } } } // fetch data length_of_trace_fetched = length_of_trace_askedfor; std::cerr << "Get data for points " << GetNextIndex() << "-" << GetNextIndex()+length_of_trace_askedfor << " (" << 100.0*(GetNextIndex()+length_of_trace_askedfor)/GetLength() << "%) ... "; t.Start(); // std::cerr << "length of buffer: " << data_length[0] << ", length of requested trace: " << length_of_trace_askedfor << " ... "; if(GetSeries() == PICO_4000) { FILE_LOG(logDEBUG2) << "ps4000GetValues(handle=" << GetHandle() << ", startIndex=" << GetNextIndex() << ", *noOfSamples=" << length_of_trace_fetched << ", downSampleRatio=1, downSampleRatioMode=PS4000_RATIO_MODE_NONE, segmentIndex=0, *overflow)"; GetPicoscope()->SetStatus(ps4000GetValues( GetHandle(), // handle // TODO: start index GetNextIndex(), // startIndex // this could also be min(GetMaxTraceLengthToFetch(),wholeLength-startindex) &length_of_trace_fetched, // *noOfSamples 1, // downSampleRatio PS4000_RATIO_MODE_NONE, // downSampleRatioMode 0, // segmentIndex &overflow)); // *overflow FILE_LOG(logDEBUG2) << "-> length_of_trace_fetched=" << length_of_trace_fetched << "\n"; } else { FILE_LOG(logDEBUG2) << "ps6000GetValues(handle=" << GetHandle() << ", startIndex=" << GetNextIndex() << ", *noOfSamples=" << length_of_trace_fetched << ", downSampleRatio=1, downSampleRatioMode=PS6000_RATIO_MODE_NONE, segmentIndex=0, *overflow)"; GetPicoscope()->SetStatus(ps6000GetValues( GetHandle(), // handle // TODO: start index GetNextIndex(), // startIndex // this could also be min(GetMaxTraceLengthToFetch(),wholeLength-startindex) &length_of_trace_fetched, // *noOfSamples 1, // downSampleRatio PS6000_RATIO_MODE_NONE, // downSampleRatioMode 0, // segmentIndex &overflow)); // *overflow FILE_LOG(logDEBUG2) << "-> length_of_trace_fetched=" << length_of_trace_fetched << "\n"; } t.Stop(); if(GetPicoscope()->GetStatus() != PICO_OK) { std::cerr << "Unable to set memory for channel." << std::endl; throw Picoscope::PicoscopeException(GetPicoscope()->GetStatus()); } if(overflow) { for(i=0; i<GetNumberOfChannels(); i++) { if(overflow & (1<<i)) { std::cerr << "Warning: Overflow on channel " << (char)('A'+i) << ".\n"; } } } if(length_of_trace_fetched != length_of_trace_askedfor) { std::cerr << "Warning: The number of read samples was smaller than requested.\n"; } std::cerr << "OK ("<< t.GetSecondsDouble() <<"s)\n"; SetLengthFetched(length_of_trace_fetched); SetNextIndex(GetNextIndex()+length_of_trace_fetched); return length_of_trace_fetched; }
unsigned long Measurement::GetNextDataBulk() { FILE_LOG(logDEBUG3) << "Measurement::GetNextDataBulk"; unsigned long i, j, index; short *overflow; uint32_t traces_asked_for, length_of_trace_fetched; // unsigned long length_of_trace_askedfor, length_of_trace_fetched; Timing t; // std::cerr << "(GetNextDataBulk: " << GetNextIndex() << ", " << GetMaxTracesToFetch() << ")\n"; // it makes no sense to read any further: we are already at the end if(GetNextIndex() >= GetNTraces()) { std::cerr << "Stop fetching data from ociloscope." << std::endl; return 0UL; } /* try { for(i=0; i<GetNumberOfChannels(); i++) { if(GetChannel(i)->IsEnabled()) { delete [] data[i]; data[i] = new short[GetMaxTracesToFetch()*GetLength()]; } } } catch(...) { std::cerr << "Unable to allocate memory in Measurement::AllocateMemoryBlock." << std::endl; throw; } /**/ traces_asked_for = GetMaxTracesToFetch(); if(GetNextIndex() + traces_asked_for > GetNTraces()) { traces_asked_for = GetNTraces() - GetNextIndex(); } // allocate buffers for(i=0; i<GetNumberOfChannels(); i++) { if(GetChannel(i)->IsEnabled()) { FILE_LOG(logDEBUG4) << "Measurement::GetNextDataBulk - memset data[i]" << GetLength()*traces_asked_for*sizeof(short); memset(data[i], 0, GetLength()*traces_asked_for*sizeof(short)); FILE_LOG(logDEBUG4) << "done"; } for(j=0; j<traces_asked_for; j++) { index = j+GetNextIndex(); if(GetChannel(i)->IsEnabled()) { if(data_allocated[i] == false) { throw "Unable to get data. Memory is not allocated."; } if(GetSeries() == PICO_4000) { // GetPicoscope()->SetStatus(ps4000SetDataBufferBulk( // GetHandle(), // handle // (PS4000_CHANNEL)i, // channel // data[i], // *buffer // GetMaxTraceLengthToFetch())); // bufferLength GetPicoscope()->SetStatus(ps4000SetDataBufferBulk( GetHandle(), // handle (PS4000_CHANNEL)i, // channel &data[i][j*GetLength()], // *buffer GetLength(), // bufferLength index)); // waveform } else { // unsigned long dj = (j+GetNextIndex()/GetMaxTracesToFetch())%traces_asked_for; // std::cerr << "-- (set data buffer bulk: [" << i << "][" << dj // << "], len:" << GetLength() << ", index:" << index // << ", from:" << GetNextIndex() // << ", to:" << GetNextIndex()+traces_asked_for-1 << "\n"; GetPicoscope()->SetStatus(ps6000SetDataBufferBulk( GetHandle(), // handle (PS6000_CHANNEL)i, // channel &data[i][j*GetLength()], // *buffer GetLength(), // bufferLength index, // waveform PS6000_RATIO_MODE_NONE)); // downSampleRatioMode } if(GetPicoscope()->GetStatus() != PICO_OK) { std::cerr << "Unable to set memory for channel." << std::endl; throw Picoscope::PicoscopeException(GetPicoscope()->GetStatus()); } } } } // fetch data // length_of_trace_fetched = length_of_trace_askedfor; std::cerr << "Get data for traces " << GetNextIndex() << "-" << GetNextIndex()+traces_asked_for << " (" << 100.0*(GetNextIndex()+traces_asked_for)/GetNTraces() << "%) ... "; overflow = new short[traces_asked_for]; memset(overflow, 0, traces_asked_for*sizeof(short)); // std::cerr << "-- x1\n"; t.Start(); // std::cerr << "length of buffer: " << data_length[0] << ", length of requested trace: " << length_of_trace_askedfor << " ... "; if(GetSeries() == PICO_4000) { length_of_trace_fetched = GetLength(); GetPicoscope()->SetStatus(ps4000GetValuesBulk( GetHandle(), // handle &length_of_trace_fetched, // *noOfSamples // TODO: start index GetNextIndex(), // fromSegmentIndex GetNextIndex()+traces_asked_for-1, // toSegmentIndex // this could also be min(GetMaxTraceLengthToFetch(),wholeLength-startindex) overflow)); // *overflow } else { // TODO: not sure about this ... length_of_trace_fetched = GetLength(); GetPicoscope()->SetStatus(ps6000GetValuesBulk( GetHandle(), // handle &length_of_trace_fetched, // *noOfSamples // TODO: start index GetNextIndex(), // fromSegmentIndex GetNextIndex()+traces_asked_for-1, // toSegmentIndex // this could also be min(GetMaxTraceLengthToFetch(),wholeLength-startindex) 1, // downSampleRatio PS6000_RATIO_MODE_NONE, // downSampleRatioMode overflow)); // *overflow } t.Stop(); // std::cerr << "-- x2\n"; if(GetPicoscope()->GetStatus() != PICO_OK) { std::cerr << "Unable to set memory for channel." << std::endl; throw Picoscope::PicoscopeException(GetPicoscope()->GetStatus()); } for(i=0; i<traces_asked_for; i++) { for(j=0; i<GetNumberOfChannels(); i++) { if(overflow[i] & (1<<j)) { FILE_LOG(logWARNING) << "Warning: Overflow on channel " << (char)('A'+j) << " of trace " << i+GetNextIndex() << ".\n"; } } } delete [] overflow; // if(length_of_trace_fetched != length_of_trace_askedfor) { // std::cerr << "Warning: The number of read samples was smaller than requested.\n"; // } // getting timestamps int64_t *timestamps; PS6000_TIME_UNITS *timeunits; timestamps = new int64_t[traces_asked_for]; timeunits = new PS6000_TIME_UNITS[traces_asked_for]; if(GetSeries() == PICO_4000) { // NOT YET IMPLEMENTED } else { FILE_LOG(logDEBUG2) << "ps6000GetValuesTriggerTimeOffsetBulk64(handle=" << GetHandle() << ", *timestamps, *timeunits, fromSegmentIndex=" << GetNextIndex() << ", toSegmentIndex=" << GetNextIndex()+traces_asked_for-1 << ")"; GetPicoscope()->SetStatus(ps6000GetValuesTriggerTimeOffsetBulk64( GetHandle(), // handle timestamps, // *times timeunits, // *timeUnits GetNextIndex(), // fromSegmentIndex GetNextIndex()+traces_asked_for-1)); // toSegmentIndex } if(GetPicoscope()->GetStatus() != PICO_OK) { std::cerr << "Unable to get timestamps." << std::endl; throw Picoscope::PicoscopeException(GetPicoscope()->GetStatus()); } // for(i=0; i<traces_asked_for; i++) { // std::cerr << "time " << i << ": " << timestamps[i] << "\n"; // } SetRate(traces_asked_for, timestamps[0], timeunits[0], timestamps[traces_asked_for-1], timeunits[traces_asked_for-1]); // if(timeunits[0] != timeunits[traces_asked_for-1]) { // FILE_LOG(logWARNING) << "time unit of the first and last sample differ; rate is not reliable; TIMING seems to be broken anyway"; // } delete [] timestamps; delete [] timeunits; std::cerr << "OK ("<< t.GetSecondsDouble() <<"s)\n"; // std::cerr << "length of trace fetched: " << length_of_trace_fetched << "\n"; // std::cerr << "total length: " << traces_asked_for*length_of_trace_fetched << "\n"; SetLengthFetched(traces_asked_for*length_of_trace_fetched); // std::cerr << "-- next index is now " << GetNextIndex() << ", will be set to " << GetNextIndex() + traces_asked_for << "\n"; SetNextIndex(GetNextIndex()+traces_asked_for); // std::cerr << "-- next index is now " << GetNextIndex() << "\n"; // std::cerr << "-- return value " << traces_asked_for << "\n"; return traces_asked_for; }
void Measurement::RunBlock() { FILE_LOG(logDEBUG3) << "Measurement::RunBlock"; int i; Timing t; uint32_t max_length=0; // we will have to start reading our data from beginning again SetNextIndex(0); // test if channel settings have already been passed to picoscope // and only pass them again if that isn't the case FILE_LOG(logDEBUG4) << "Measurement::RunBlock - we have " << GetNumberOfChannels() << " channels"; for(i=0; i<GetNumberOfChannels(); i++) { FILE_LOG(logDEBUG4) << "Measurement::RunBlock - setting channel " << (char)('A'+i) << " (which holds index " << GetChannel(i)->GetIndex() << ")"; GetChannel(i)->SetChannelInPicoscope(); } // this fixes the timebase if more than a single channel is selected FixTimebase(); // timebase SetTimebaseInPicoscope(); // trigger if(IsTriggered()) { GetTrigger()->SetTriggerInPicoscope(); } // for rapid block mode if(GetNTraces() > 1) { // TODO - check that GetLength()*GetNumberOfEnabledChannels()*GetNTraces() doesn't exceed the limit if(GetSeries() == PICO_4000) { FILE_LOG(logDEBUG2) << "ps4000SetNoOfCaptures(handle=" << GetHandle() << ", nCaptures=" << GetNTraces() << ")"; GetPicoscope()->SetStatus(ps4000SetNoOfCaptures( GetHandle(), // handle GetNTraces())); // nCaptures } else { FILE_LOG(logDEBUG2) << "ps6000SetNoOfCaptures(handle=" << GetHandle() << ", nCaptures=" << GetNTraces() << ")"; GetPicoscope()->SetStatus(ps6000SetNoOfCaptures( GetHandle(), // handle GetNTraces())); // nCaptures } if(GetPicoscope()->GetStatus() != PICO_OK) { std::cerr << "Unable to set number of captures to " << GetNTraces() << std::endl; throw Picoscope::PicoscopeException(GetPicoscope()->GetStatus()); } if(GetSeries() == PICO_4000) { FILE_LOG(logDEBUG2) << "ps4000MemorySegments(handle=" << GetHandle() << ", nSegments=" << GetNTraces() << ", &max_length=" << max_length << ")"; GetPicoscope()->SetStatus(ps4000MemorySegments( GetHandle(), // handle GetNTraces(), // nSegments &max_length)); FILE_LOG(logDEBUG2) << "->ps4000MemorySegments(... max_length=" << max_length << ")"; } else { FILE_LOG(logDEBUG2) << "ps6000MemorySegments(handle=" << GetHandle() << ", nSegments=" << GetNTraces() << ", &max_length=" << max_length << ")"; GetPicoscope()->SetStatus(ps6000MemorySegments( GetHandle(), // handle GetNTraces(), // nSegments &max_length)); FILE_LOG(logDEBUG2) << "->ps6000MemorySegments(... max_length=" << max_length << ")"; } if(GetPicoscope()->GetStatus() != PICO_OK) { std::cerr << "Unable to set number of segments to " << GetNTraces() << std::endl; throw Picoscope::PicoscopeException(GetPicoscope()->GetStatus()); } if(max_length < GetLength()) { // TODO: times number of enabled channels std::cerr << "The maximum length of trace you can get with " << GetNTraces() << " traces is " << max_length << ", but you requested " << GetLength() << "\n"; throw; } if(GetSeries() == PICO_4000) { FILE_LOG(logDEBUG2) << "ps4000SetNoOfCaptures(handle=" << GetHandle() << ", nCaptures=" << GetNTraces() << ")"; GetPicoscope()->SetStatus(ps4000SetNoOfCaptures( GetHandle(), // handle GetNTraces())); // nCaptures } else { FILE_LOG(logDEBUG2) << "ps6000SetNoOfCaptures(handle=" << GetHandle() << ", nCaptures=" << GetNTraces() << ")"; GetPicoscope()->SetStatus(ps6000SetNoOfCaptures( GetHandle(), // handle GetNTraces())); // nCaptures } if(GetPicoscope()->GetStatus() != PICO_OK) { std::cerr << "Unable to set number of captures to " << GetNTraces() << std::endl; throw Picoscope::PicoscopeException(GetPicoscope()->GetStatus()); } } //std::cerr << "\nPress a key to start fetching the data ...\n"; //_getch(); t.Start(); GetPicoscope()->SetReady(false); if(GetSeries() == PICO_4000) { FILE_LOG(logDEBUG2) << "ps4000RunBlock(handle=" << GetHandle() << ", noOfPreTriggerSamples=" << GetLengthBeforeTrigger() << ", noOfPostTriggerSamples=" << GetLengthAfterTrigger() << ", timebase=" << timebase << ", oversample=1, *timeIndisposedMs=NULL, segmentIndex=0, lpReady=CallBackBlock, *pParameter=NULL)"; GetPicoscope()->SetStatus(ps4000RunBlock( GetHandle(), // handle GetLengthBeforeTrigger(), // noOfPreTriggerSamples GetLengthAfterTrigger(), // noOfPostTriggerSamples timebase, // timebase 1, // ovesample NULL, // *timeIndisposedMs 0, // segmentIndex CallBackBlock, // lpReady NULL)); // *pParameter } else { FILE_LOG(logDEBUG2) << "ps6000RunBlock(handle=" << GetHandle() << ", noOfPreTriggerSamples=" << GetLengthBeforeTrigger() << ", noOfPostTriggerSamples=" << GetLengthAfterTrigger() << ", timebase=" << timebase << ", oversample=1, *timeIndisposedMs=NULL, segmentIndex=0, lpReady=CallBackBlock, *pParameter=NULL)"; GetPicoscope()->SetStatus(ps6000RunBlock( GetHandle(), // handle GetLengthBeforeTrigger(), // noOfPreTriggerSamples GetLengthAfterTrigger(), // noOfPostTriggerSamples timebase, // timebase 1, // ovesample NULL, // *timeIndisposedMs 0, // segmentIndex CallBackBlock, // lpReady NULL)); // *pParameter } if(GetPicoscope()->GetStatus() != PICO_OK) { std::cerr << "Unable to start collecting samples" << std::endl; throw Picoscope::PicoscopeException(GetPicoscope()->GetStatus()); } else { std::cerr << "Start collecting samples in " << ((GetNTraces() > 1) ? "rapid " : "") << "block mode ... "; } // TODO: maybe we want it to be asynchronous // TODO: catch the _kbhit event!!! // while (!Picoscope::IsReady() && !_kbhit()) { while (!Picoscope::IsReady()) { Sleep(200); } t.Stop(); std::cerr << "OK (" << t.GetSecondsDouble() << "s)\n"; // sets the index from where we want to start reading data to zero SetNextIndex(0UL); }