diff --git a/Header_Files/MemoryPool.h b/Header_Files/MemoryPool.h index 567c28f..c92fcf1 100644 --- a/Header_Files/MemoryPool.h +++ b/Header_Files/MemoryPool.h @@ -26,7 +26,7 @@ #include #include -template +template class MemoryPool { public: diff --git a/Header_Files/configfile.h b/Header_Files/configfile.h index 0444e98..09a9603 100644 --- a/Header_Files/configfile.h +++ b/Header_Files/configfile.h @@ -37,6 +37,9 @@ public: bool getGainOffset(float &gain, float &offset); bool getSN(QString &SN); + bool getBufferPolicy(int &bufferPolicy); + bool getAcqBufferSize(int &acqBufferSize); + bool createConfigFile(); bool updateConfigFile(); diff --git a/Header_Files/ximeaimager.h b/Header_Files/ximeaimager.h index 30db9cc..d50d4fd 100644 --- a/Header_Files/ximeaimager.h +++ b/Header_Files/ximeaimager.h @@ -25,6 +25,8 @@ #include #include #include +#include +#include #include #include @@ -62,7 +64,7 @@ public: DataBuffer(); ~DataBuffer(); - unsigned short data[425600];//304*1400=425600,为了兼容所有设置spectral bin和spatial bin + unsigned short data[41040000];//1368*300*100=41040000,为了兼容所有设置spectral bin和spatial bin private: @@ -98,12 +100,13 @@ Q_OBJECT public: WriteData2Disk(); - void setParm(queue * q, QString baseFileName, int frameSizeInByte, MemoryPool * pool, rgbImage * rgbImage); + void setParm(queue * q, QString baseFileName, int frameSizeInByte, int number_WriteDisk, MemoryPool * pool, rgbImage * rgbImage); private: queue * m_q; QString m_QbaseFileName; int m_iFrameSizeInByte; + int m_iNumber_WriteDisk; MemoryPool * m_pool; rgbImage * m_rgbImage; @@ -139,6 +142,7 @@ public: void stopRecord(); int getFrameCounter(); + void writeXiApiErrorCodes(QString filePath, int xiApiErrorCodes); int getMaxValueOfOneFrame(unsigned short * data, int numberOfPixel); diff --git a/Source_Files/configfile.cpp b/Source_Files/configfile.cpp index 3c161da..dcb873d 100644 --- a/Source_Files/configfile.cpp +++ b/Source_Files/configfile.cpp @@ -222,6 +222,50 @@ bool Configfile::getSN(QString &SN) } } +bool Configfile::getBufferPolicy(int &bufferPolicy) +{ + const Setting& root = cfg.getRoot(); + const Setting &ximeadll = root["ximeadll"]; + + try + { + if(!(ximeadll.lookupValue("buffer_policy", bufferPolicy) + )) + { + return false; + } + } + catch(const SettingNotFoundException &nfex) + { + cerr << "No 'spectralBin' setting in configuration file." << endl; + return false; + } + + return true; +} + +bool Configfile::getAcqBufferSize(int &acqBufferSize) +{ + const Setting& root = cfg.getRoot(); + const Setting &ximeadll = root["ximeadll"]; + + try + { + if(!(ximeadll.lookupValue("acq_buffer_size", acqBufferSize) + )) + { + return false; + } + } + catch(const SettingNotFoundException &nfex) + { + cerr << "No 'spectralBin' setting in configuration file." << endl; + return false; + } + + return true; +} + bool Configfile::createConfigFile() { using namespace std; @@ -279,6 +323,11 @@ bool Configfile::createConfigFile() gainOffsetSpectralBin2.add("offset", Setting::TypeFloat) = -299.46126663407176; + Setting &ximeadll = root.add("ximeadll", Setting::TypeGroup); + ximeadll.add("buffer_policy", Setting::TypeInt) = 0; + ximeadll.add("acq_buffer_size", Setting::TypeInt) = 400; + + // Write out the new configuration. QString output_file = "/media/nvme/300TC/config/ximea.cfg"; try diff --git a/Source_Files/ximeaimager.cpp b/Source_Files/ximeaimager.cpp index 24ba669..20d7b1d 100644 --- a/Source_Files/ximeaimager.cpp +++ b/Source_Files/ximeaimager.cpp @@ -89,6 +89,18 @@ void XimeaImager::openImger() // m_imager.setEffectiveWindowRoi(offsetx_roi, width_roi); // } + int bufferPolicy, acqBufferSize; + ret1 = m_configfile.getBufferPolicy(bufferPolicy); + if (ret1) + { + m_imager.setBufferPolicy(bufferPolicy); + } + ret1 = m_configfile.getAcqBufferSize(acqBufferSize); + if (ret1) + { + m_imager.setAcqBufferSize(acqBufferSize); + } + setFramerate(100); //经验证:frameSizeManual和frameSizeAuto相等 @@ -490,14 +502,20 @@ void XimeaImager::startRecord(double TimeDifferenceBetweensOSAndSbg,QString base QString timesFileName=m_baseFileName+".times"; FILE *hHimesFile=fopen(timesFileName.toStdString().c_str(),"w+"); +// ofstream timesFile(timesFileName.toStdString()); + std::cout << "曝光时间为:" << getExposureTime()/1000 << "ms" <setParm(q,m_baseFileName,m_iFrameSizeInByte, m_pool, m_rgbImage); + int number_WriteDisk = 100; + writeData2Disk->setParm(q,m_baseFileName,m_iFrameSizeInByte, number_WriteDisk, m_pool, m_rgbImage); emit startWriteDiskSignal(); + int indexofbuff; + DataBuffer * buffer; + m_imager.start(); struct timeval timeStart, timeEnd; double runTime=0; @@ -505,6 +523,7 @@ void XimeaImager::startRecord(double TimeDifferenceBetweensOSAndSbg,QString base while (m_bRecordControl) { unsigned short *x=m_imager.get_frame(m_buffer); + m_iFrameCounter+=1; //fwrite(m_buffer,2,getBandCount()*getSampleCount(),hFile); // fwrite(m_imager.m_image.bp,static_cast(m_imager.m_image.bp_size),1,hFile); @@ -512,56 +531,66 @@ void XimeaImager::startRecord(double TimeDifferenceBetweensOSAndSbg,QString base //sync();//强制系统将系统文件缓冲的内容写入磁盘 + indexofbuff = m_iFrameCounter % number_WriteDisk; - r_qtx.lock(); - DataBuffer * buffer = m_pool->newElement(); - r_qtx.unlock(); -// m_pool->construct(buffer); + if (indexofbuff == 1) + { + r_qtx.lock(); + buffer = m_pool->newElement(); + r_qtx.unlock(); + } -// memcpy(buffer->data,(unsigned short *)m_imager.m_image.bp,m_iFrameSizeInByte/2); - memcpy((void *)buffer->data,m_imager.m_image.bp,m_iFrameSizeInByte); + if (indexofbuff == 0) + { + memcpy((void *)buffer->data + (number_WriteDisk - 1) * m_iFrameSizeInByte,m_imager.m_image.bp,m_iFrameSizeInByte); + } + else + { + memcpy((void *)buffer->data + (indexofbuff - 1) * m_iFrameSizeInByte,m_imager.m_image.bp,m_iFrameSizeInByte); + } - r_qtx.lock(); - q->push(buffer); - r_qtx.unlock();// - -// std::cout<<"XimeaImager::startRecord,队列长度为:"<< q->size() <push(buffer); + r_qtx.unlock(); + } double sbgTime=getSbgTime(TimeDifferenceBetweensOSAndSbg); fprintf(hHimesFile,"%f\n",sbgTime); - //fwrite(&sbgTime,sizeof(double),1,hHimesFile); +// fwrite(&sbgTime,sizeof(double),1,hHimesFile); +// timesFile<deleteElement(buffer); + } + + double frameInTheory=runTime * getFramerate() - indexofbuff; + + double frameLossed=m_imager.m_image.acq_nframe - indexofbuff - m_iFrameCounter; + double frameLossRate=frameLossed / (m_imager.m_image.acq_nframe - indexofbuff); std::cout<<"当前采集文件为: "<front(); - memcpy(dataBuffer,buffer->data,m_iFrameSizeInByte); + memcpy(dataBuffer,buffer->data,m_iFrameSizeInByte*m_iNumber_WriteDisk); // m_pool->destroy(m_q->front()); m_pool->deleteElement(buffer); m_q->pop(); @@ -844,21 +891,22 @@ void WriteData2Disk::write2Disk() // std::cout<<"WriteData2Disk::write2Disk-----------------------正在写磁盘!" << m_pool->max_size() <m_VideoWriter.release(); fclose(hFile); std::cout<<"WriteData2Disk::write2Disk-----------------------写磁盘线程将退出,内存池可达到的最多元素数:" << m_pool->max_size() < * q, QString baseFileName, int frameSizeInByte, MemoryPool * pool, rgbImage * rgbImage) +void WriteData2Disk::setParm(queue * q, QString baseFileName, int frameSizeInByte, int number_WriteDisk, MemoryPool * pool, rgbImage * rgbImage) { m_q = q; m_QbaseFileName = baseFileName; m_iFrameSizeInByte = frameSizeInByte; + m_iNumber_WriteDisk = number_WriteDisk; m_pool = pool;