#include "Header_Files/udpserver.h" //using namespace sbgtc; UdpServer::UdpServer() { m_udpSocket = new QUdpSocket(this); m_udpSocket->bind(45454, QUdpSocket::ShareAddress); connect(m_udpSocket, SIGNAL(readyRead()),this, SLOT(processPendingDatagrams())); m_RecordThread=new QThread(); m_imager=new XimeaImager(); m_imager->moveToThread(m_RecordThread); m_RecordThread->start(QThread::HighestPriority); m_RecordSbgThread=new QThread(); m_sbgRecorder=new sbgtc::SbgRecorder(); m_sbgRecorder->moveToThread(m_RecordSbgThread); m_RecordSbgThread->start(); m_CopyFileThread=new QThread(); m_copyFile=new FileOperation(); m_copyFile->moveToThread(m_CopyFileThread); m_CopyFileThread->start(); //系统采集步骤1:打开sbg串口并采集数据,打开光谱仪 connect(this, SIGNAL(systemStart()),m_sbgRecorder, SLOT(startRecordSbg())); connect(this, SIGNAL(systemStart()),m_imager, SLOT(openImger())); connect(this, SIGNAL(systemStop()),m_sbgRecorder, SLOT(closeSerialPort()));// connect(this, SIGNAL(systemStop()),m_imager, SLOT(closeImger())); //系统采集步骤2:开始采集高光谱影像 connect(this, SIGNAL(startRecordHyperspectralSignal()),m_sbgRecorder, SLOT(startRecordHyperspectral())); connect(m_sbgRecorder, SIGNAL(sbgReady(double,QString)),m_imager, SLOT(startRecord(double,QString))); connect(this, SIGNAL(recordXimeaOnlySignal(double,QString)),m_imager, SLOT(startRecord(double,QString))); //系统采集步骤3:停止采集 connect(m_imager, SIGNAL(recordFinished()),this, SLOT(onRecordFinished())); //系统采集步骤4:拷贝文件 connect(this, SIGNAL(startCopyFileSignal()),m_copyFile, SLOT(copyFile())); connect(this, SIGNAL(startDeleteFileSignal()),m_copyFile, SLOT(deleteFile())); //系统采集步骤5:进程间通讯 connect(m_sbgRecorder, SIGNAL(serialPortStatus(int)),this, SLOT(sendSerialPortStatus(int))); connect(m_sbgRecorder, SIGNAL(sbgSolutionModeSignal(int)),this, SLOT(sendSbgSolutionModeState(int))); connect(m_sbgRecorder, SIGNAL(sbgAccuracySignal(int,int)),this, SLOT(sendSbgAccuracyState(int,int))); connect(m_imager, SIGNAL(ximeaImageStatus(int)),this, SLOT(sendXimeaImageStatus(int))); connect(m_imager, SIGNAL(autoExposeMaxValueOfOneFrame(int, double)),this, SLOT(sendXimeaAutoExposeMaxValueOfOneFrame(int, double))); connect(m_imager, SIGNAL(binSignal(int, int)),this, SLOT(sendXimeaBinState(int, int))); connect(m_imager, SIGNAL(frameRateSignal(double)),this, SLOT(sendXimeaImageFrameRate(double))); connect(m_copyFile, SIGNAL(copyFileStatus(int)),this, SLOT(sendCopyFileStatus(int))); //当软件不正常关闭并且重启后,通知其他psdk程序 m_clientIpAddress=QHostAddress(QHostAddress::LocalHost); sendSerialPortStatus(0); sendXimeaImageStatus(100); sendCopyFileStatus(0); system("sudo gpio write 10 0"); std::cout<<"UdpServer::UdpServer--------:System ready!"<hasPendingDatagrams()) { QByteArray datagram; datagram.resize(m_udpSocket->pendingDatagramSize()); m_udpSocket->readDatagram(datagram.data(), datagram.size(),&m_clientIpAddress, &m_clientPort); printf("接收数据字节数: %d.\n",datagram.size()); QList datagramList=datagram.split(','); printf("有多少个list: %d.\n",datagramList.size()); QString instruction=datagramList[0].data();// QByteArray转QString方法1 switch (instruction.toInt()) { case 1://启动系统: 打开sbg串口并采集数据,打开光谱仪 { std::cout<<"1代表启动系统!"<getSbgState()>=1) { m_sbgRecorder->stopRecordSbg(); } if(m_imager->getImagerState()>=101) { m_imager->stopRecord(); } emit systemStop(); sleep(4);//睡眠4秒,等待 system("sudo gpio write 10 0"); //QCoreApplication::quit(); break; } case 3://系统开始采集高光谱影像 { if(m_imager->getImagerState()>=101 && m_imager->getImagerState()<=103) { std::cout<<"3代表系统开始采集高光谱影像!"<startRecordHyperspectral(); } break; } case 4://系统停止采集高光谱影像 { if(m_imager->getImagerState()>=101 && m_imager->getImagerState()<=104) { std::cout<<"4代表系统停止采集高光谱影像!"<stopRecord(); } break; } case 5:// { if(m_imager->getImagerState()>=101 && m_imager->getImagerState()<=103) { std::cout<<"5代表设置帧率!"<setFramerate(datagramList[1].toFloat()); } break; } case 6:// { if(m_imager->getImagerState()>=101 && m_imager->getImagerState()<=103) { std::cout<<"6代表自动曝光!"<autoExposure(); } break; } case 7: { if(m_imager->getImagerState()>=101 && m_imager->getImagerState()<=103) { float time = datagramList[1].toFloat();//ms m_imager->wrapSetExposureTime(time*1000); std::cout<<"7,手动设置曝光时间为:" << time <stopRecord(); } break; } default: std::cout<<">=9没有意义!"<(systemTime.tv_nsec)/1000000000; printf("UdpServer::getTimeDifferenceBetweenSystemAndSbg------%f\n", nanosecondSystem-secondSbg); return nanosecondSystem-secondSbg; } void UdpServer::sender(int status) { QByteArray datagram2send; datagram2send.operator =(QString::number(status).toStdString().c_str()); m_udpSocket->writeDatagram(datagram2send.data(),datagram2send.size(),m_clientIpAddress, m_clientPort+1); } void UdpServer::sendSerialPortStatus(int serialPortStatus) { // std::cout<<"UdpServer::sendSerialPortStatus---------------------:"<< serialPortStatus <writeDatagram(datagram2send.data(),datagram2send.size(),m_clientIpAddress, 45455); } void UdpServer::sendSbgSolutionModeState(int SolutionMode) { // std::cout<<"UdpServer::sendSbgSolutionModeState---------------------:"<< SolutionMode <writeDatagram(datagram2send.data(),datagram2send.size(),m_clientIpAddress, 45455); } void UdpServer::sendSbgAccuracyState(int Accuracy,int SatelliteCounter) { // std::cout<<"UdpServer::sendSbgAccuracyState---------------------:"<< Accuracy <writeDatagram(datagram2send.data(),datagram2send.size(),m_clientIpAddress, 45455); } void UdpServer::sendXimeaImageStatus(int ximeaImageStatus) { // std::cout<<"UdpServer::sendXimeaImageStatus---------------------:"<< ximeaImageStatus <writeDatagram(datagram2send.data(),datagram2send.size(),m_clientIpAddress, 45455); } void UdpServer::sendXimeaAutoExposeMaxValueOfOneFrame(int autoExposeMaxValueOfOneFrame, double exposeTime) { // std::cout<<"UdpServer::sendXimeaAutoExposeMaxValueOfOneFrame---------------------:"<< ximeaImageStatus <writeDatagram(datagram2send.data(),datagram2send.size(),m_clientIpAddress, 45455); } void UdpServer::sendXimeaBinState(int spatialBin, int spectralBin) { // std::cout<<"UdpServer::sendXimeaAutoExposeMaxValueOfOneFrame---------------------:"<< ximeaImageStatus <writeDatagram(datagram2send.data(),datagram2send.size(),m_clientIpAddress, 45455); } void UdpServer::sendXimeaImageFrameRate(double frameRate) { // std::cout<<"UdpServer::sendXimeaImageFrameRate---------------------:"<< ximeaImageStatus <writeDatagram(datagram2send.data(),datagram2send.size(),m_clientIpAddress, 45455); } void UdpServer::sendCopyFileStatus(int fileStatus) { // std::cout<<"UdpServer::sendCopyFileStatus---------------------:"<< fileStatus <writeDatagram(datagram2send.data(),datagram2send.size(),m_clientIpAddress, 45455); } void UdpServer::onRecordFinished() { std::cout<<"UdpServer::onRecordFinished----------------:影像停止采集"<