diff --git a/Header_Files/ximeaimager.h b/Header_Files/ximeaimager.h index c4ca537..11ad2f9 100644 --- a/Header_Files/ximeaimager.h +++ b/Header_Files/ximeaimager.h @@ -100,10 +100,11 @@ Q_OBJECT public: WriteData2Disk(); - void setParm(queue * q, QString baseFileName, int frameSizeInByte, int number_WriteDisk, MemoryPool * pool, rgbImage * rgbImage); + void setParm(queue * q, queue * qFrameCounter, QString baseFileName, int frameSizeInByte, int number_WriteDisk, MemoryPool * pool, rgbImage * rgbImage); private: queue * m_q; + queue * m_qFrameCounter; QString m_QbaseFileName; int m_iFrameSizeInByte; int m_iNumber_WriteDisk; @@ -163,6 +164,7 @@ private: QThread * writeData2DiskThread; WriteData2Disk * writeData2Disk; queue * q; + queue * m_qFrameCounter; MemoryPool * m_pool; QString m_baseFileName; @@ -179,23 +181,10 @@ private: void processXiApiErrorCodes(int xiApiErrorCodes); - inline double getSbgTime(double TimeDifferenceBetweensOSAndSbg) + inline double getSbgTime(XI_IMG * image, double timeDifferenceBetweenSbgAndXimea) { - struct timespec systemTime; - clock_gettime(CLOCK_REALTIME,&systemTime); - tm systemTime_rili; - localtime_r(&systemTime.tv_sec, &systemTime_rili); - - double secondSystem=(systemTime_rili.tm_mday-1)*24*60*60+systemTime_rili.tm_hour*60*60+systemTime_rili.tm_min*60+systemTime_rili.tm_sec; - double nanosecondSystem=secondSystem+static_cast(systemTime.tv_nsec)/1000000000; - - -// printf("\n"); -// printf("XimeaImager::getSbgTime------系统时间纳秒%d\n", systemTime.tv_nsec); -// printf("XimeaImager::getSbgTime------系统时间(未偏移)%f\n", nanosecondSystem); -// printf("XimeaImager::getSbgTime------系统时间(偏移)%f\n", nanosecondSystem-TimeDifferenceBetweensOSAndSbg); - - return nanosecondSystem-TimeDifferenceBetweensOSAndSbg; + double ximeaTime = (double)image->tsSec + (double)image->tsUSec/1000000; + return ximeaTime + timeDifferenceBetweenSbgAndXimea; } Configfile m_configfile; @@ -206,6 +195,7 @@ public slots: void openImger(); void closeImger(); + double calculateTimeDifferenceBetweenSbgAndximea(XI_IMG * m_image, double timeDifferenceBetweenSbgAndOS); void startRecord(double TimeDifferenceBetweensOSAndSbg,QString baseFileName); signals: diff --git a/Source_Files/udpserver.cpp b/Source_Files/udpserver.cpp index 414f73e..121a645 100644 --- a/Source_Files/udpserver.cpp +++ b/Source_Files/udpserver.cpp @@ -60,9 +60,11 @@ UdpServer::UdpServer() //当软件不正常关闭并且重启后,通知其他psdk程序 m_clientIpAddress=QHostAddress(QHostAddress::LocalHost); sendSerialPortStatus(0); - sendXimeaImageStatus(0); + sendXimeaImageStatus(100); sendCopyFileStatus(0); + system("sudo gpio write 10 0"); + std::cout<<"UdpServer::UdpServer--------:System ready!"<; q = new queue; + m_qFrameCounter = new queue; m_rgbImage = new rgbImage(); } @@ -79,6 +80,8 @@ void XimeaImager::openImger() bool haha2 = m_imager.setSpatialBin(spatialBin); emit binSignal(spatialBin, spectralBin); + std::cout<<"spectralBin:"<< spectralBin <SetRgbImageWidthAndHeight(height, width, 20); std::cout<<"height:"<< height <tsSec + image->tsUSec/1000000; + + printf("XimeaImager::calculateTimeDifferenceBetweenSystemAndximea--ximeaTime: %f s\n", ximeaTime); + + //获取系统时间(纳秒) + struct timespec systemTime; + clock_gettime(CLOCK_REALTIME,&systemTime); + tm systemTime_rili; + localtime_r(&systemTime.tv_sec, &systemTime_rili); + + double secondSystem=(systemTime_rili.tm_mday-1)*24*60*60+systemTime_rili.tm_hour*60*60+systemTime_rili.tm_min*60+systemTime_rili.tm_sec; + double timeOS=secondSystem+static_cast(systemTime.tv_nsec)/1000000000; + + printf("XimeaImager::calculateTimeDifferenceBetweenSystemAndximea--osTime: %f s\n", timeOS); + + + //计算系统时间和gps时间之间的差距 + double timeDifferenceBetweenSbgAndximea = timeOS - timeDifferenceBetweenSbgAndOS - ximeaTime; + + printf("XimeaImager::calculateTimeDifferenceBetweenSystemAndximea--timeDifferenceBetweenSbgAndximea: %f s\n", timeDifferenceBetweenSbgAndximea); + + return timeDifferenceBetweenSbgAndximea; +} + void XimeaImager::startRecord(double TimeDifferenceBetweensOSAndSbg,QString baseFileName) { m_ximeaTemperature->stopRecordTemperature();//开始采集影像前,停止获取相机的温度,以免降低帧率; @@ -515,23 +547,24 @@ void XimeaImager::startRecord(double TimeDifferenceBetweensOSAndSbg,QString base m_baseFileName=baseFileName; - - 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, number_WriteDisk, m_pool, m_rgbImage); + writeData2Disk->setParm(q, m_qFrameCounter,m_baseFileName,m_iFrameSizeInByte, number_WriteDisk, m_pool, m_rgbImage); emit startWriteDiskSignal(); int indexofbuff; DataBuffer * buffer; + QString timesFileName=m_baseFileName+".times"; + FILE *hHimesFile=fopen(timesFileName.toStdString().c_str(),"w+"); +// ofstream timesFile(timesFileName.toStdString()); + double timeDifferenceBetweenSbgAndXimea; + double * sbgTimeBuffer = new double[number_WriteDisk]; + m_imager.start(); struct timeval timeStart, timeEnd; double runTime=0; @@ -541,11 +574,10 @@ void XimeaImager::startRecord(double TimeDifferenceBetweensOSAndSbg,QString base 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); - //fflush(hFile);//只保证了将IO缓冲写入系统缓冲中,使IO读操作能成功,但系统什么时候写入磁盘,由系统决定,一般是达到一定量时系统他就写入磁盘。 - //sync();//强制系统将系统文件缓冲的内容写入磁盘 - + if (m_iFrameCounter == 1) + { + timeDifferenceBetweenSbgAndXimea = calculateTimeDifferenceBetweenSbgAndximea(&m_imager.m_image, TimeDifferenceBetweensOSAndSbg); + } indexofbuff = m_iFrameCounter % number_WriteDisk; @@ -559,48 +591,59 @@ void XimeaImager::startRecord(double TimeDifferenceBetweensOSAndSbg,QString base if (indexofbuff == 0) { memcpy((void *)buffer->data + (number_WriteDisk - 1) * m_iFrameSizeInByte,m_imager.m_image.bp,m_iFrameSizeInByte); + sbgTimeBuffer[number_WriteDisk - 1] = getSbgTime(&m_imager.m_image, timeDifferenceBetweenSbgAndXimea); } else { memcpy((void *)buffer->data + (indexofbuff - 1) * m_iFrameSizeInByte,m_imager.m_image.bp,m_iFrameSizeInByte); + sbgTimeBuffer[indexofbuff - 1] = getSbgTime(&m_imager.m_image, timeDifferenceBetweenSbgAndXimea); } if (indexofbuff == 0) { r_qtx.lock(); q->push(buffer); + m_qFrameCounter->push(number_WriteDisk); r_qtx.unlock(); + + for (int i = 0; i < number_WriteDisk; ++i) + { + fprintf(hHimesFile,"%f\n",sbgTimeBuffer[i]); + } + } + } + if (indexofbuff != 0) + { + r_qtx.lock(); + q->push(buffer); + m_qFrameCounter->push(indexofbuff); + r_qtx.unlock(); + + for (int i = 0; i < indexofbuff; ++i) + { + fprintf(hHimesFile,"%f\n",sbgTimeBuffer[i]); } - double sbgTime=getSbgTime(TimeDifferenceBetweensOSAndSbg); - - fprintf(hHimesFile,"%f\n",sbgTime); -// fwrite(&sbgTime,sizeof(double),1,hHimesFile); -// timesFile<exitWriteData2Disk(); + writeHdr(); - m_iFrameCounter = m_iFrameCounter - indexofbuff; - if (indexofbuff != 0) - { - m_pool->deleteElement(buffer); - } + delete[] sbgTimeBuffer; - double frameInTheory=runTime * getFramerate() - indexofbuff; + double frameInTheory=runTime * getFramerate(); - double frameLossed=m_imager.m_image.acq_nframe - indexofbuff - m_iFrameCounter; - double frameLossRate=frameLossed / (m_imager.m_image.acq_nframe - indexofbuff); + double frameLossed = m_imager.m_image.acq_nframe - m_iFrameCounter; + double frameLossRate = frameLossed / m_imager.m_image.acq_nframe; - std::cout<<"当前采集文件为: "<front(); - memcpy(dataBuffer,buffer->data,m_iFrameSizeInByte*m_iNumber_WriteDisk); + int frameNumber = m_qFrameCounter->front(); + memcpy(dataBuffer,buffer->data,m_iFrameSizeInByte*frameNumber); // m_pool->destroy(m_q->front()); m_pool->deleteElement(buffer); m_q->pop(); + m_qFrameCounter->pop(); r_qtx.unlock(); //构造rgb图像,用于推流到m300遥控器 @@ -931,14 +975,15 @@ void WriteData2Disk::write2Disk() // std::cout<<"WriteData2Disk::write2Disk-----------------------正在写磁盘!" << m_pool->max_size() <m_VideoWriter.release(); fclose(hFile); + delete[] dataBuffer; std::cout<<"WriteData2Disk::write2Disk-----------------------写磁盘线程将退出,内存池可达到的最多元素数:" << m_pool->max_size() < * q, QString baseFileName, int frameSizeInByte, int number_WriteDisk, MemoryPool * pool, rgbImage * rgbImage) +void WriteData2Disk::setParm(queue * q, queue * qFrameCounter, QString baseFileName, int frameSizeInByte, int number_WriteDisk, MemoryPool * pool, rgbImage * rgbImage) { m_q = q; + m_qFrameCounter = qFrameCounter; m_QbaseFileName = baseFileName; m_iFrameSizeInByte = frameSizeInByte; m_iNumber_WriteDisk = number_WriteDisk;