mirror of
				https://github.com/f4exb/sdrangel.git
				synced 2025-10-31 13:00:26 -04:00 
			
		
		
		
	SDRdaemon plugin. Debug core dump
This commit is contained in:
		
							parent
							
								
									9213cee156
								
							
						
					
					
						commit
						31ef841a99
					
				| @ -240,14 +240,14 @@ uint8_t *SDRdaemonBuffer::readData(uint32_t length) | ||||
| 
 | ||||
| 	if (m_readCount + length < m_rawSize) | ||||
| 	{ | ||||
| 		m_readCount += length; | ||||
| 		return &m_rawBuffer[readCount]; | ||||
| 		m_readCount += length; | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		std::memcpy((void *) m_frameBuffer, (const void *) &m_rawBuffer[readCount], m_rawSize - m_rawCount); | ||||
| 		m_readCount = length - (m_rawSize - m_rawCount); | ||||
| 		std::memcpy((void *) m_frameBuffer, (const void *) &m_frameBuffer[m_rawSize - m_rawCount], m_readCount); | ||||
| 		std::memcpy((void *) m_frameBuffer, (const void *) &m_rawBuffer[readCount], m_rawSize - m_readCount); // read last bit from raw buffer
 | ||||
| 		m_readCount = length - (m_rawSize - m_readCount); | ||||
| 		std::memcpy((void *) &m_frameBuffer[m_rawSize - m_readCount], (const void *) m_frameBuffer, m_readCount); // read the rest at start of raw buffer
 | ||||
| 		return m_frameBuffer; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @ -29,6 +29,42 @@ | ||||
| 
 | ||||
| MESSAGE_CLASS_DEFINITION(SDRdaemonInput::MsgConfigureSDRdaemonUDPLink, Message) | ||||
| MESSAGE_CLASS_DEFINITION(SDRdaemonInput::MsgConfigureSDRdaemonWork, Message) | ||||
| void SDRdaemonInput::updateLink(const QString& address, quint16 port) | ||||
| { | ||||
| 	QMutexLocker mutexLocker(&m_mutex); | ||||
| 	bool wasRunning = false; | ||||
| 
 | ||||
| 	if ((m_address != address) || (m_port != port)) | ||||
| 	{ | ||||
| 		if (m_SDRdaemonThread != 0) | ||||
| 		{ | ||||
| 			wasRunning = m_SDRdaemonThread->isRunning(); | ||||
| 
 | ||||
| 			if (wasRunning) | ||||
| 			{ | ||||
| 				m_SDRdaemonThread->stopWork(); | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		if (m_SDRdaemonThread != 0) | ||||
| 		{ | ||||
| 			m_SDRdaemonThread->updateLink(address, port); | ||||
| 
 | ||||
| 			if (wasRunning) | ||||
| 			{ | ||||
| 				m_SDRdaemonThread->startWork(); | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		m_address = address; | ||||
| 		m_port = port; | ||||
| 
 | ||||
| 		qDebug() << "SDRdaemonInput::updateLink:" | ||||
| 				<< " address: " << m_address.toStdString().c_str() | ||||
| 				<< "port: " << m_port; | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| MESSAGE_CLASS_DEFINITION(SDRdaemonInput::MsgConfigureSDRdaemonStreamTiming, Message) | ||||
| MESSAGE_CLASS_DEFINITION(SDRdaemonInput::MsgReportSDRdaemonAcquisition, Message) | ||||
| MESSAGE_CLASS_DEFINITION(SDRdaemonInput::MsgReportSDRdaemonStreamData, Message) | ||||
| @ -72,7 +108,6 @@ bool SDRdaemonInput::start(int device) | ||||
| 		return false; | ||||
| 	} | ||||
| 
 | ||||
| 	m_SDRdaemonThread->setSamplerate(m_sampleRate); | ||||
| 	m_SDRdaemonThread->connectTimer(m_masterTimer); | ||||
| 	m_SDRdaemonThread->startWork(); | ||||
| 	m_deviceDescription = "SDRdaemon"; | ||||
| @ -173,75 +208,3 @@ bool SDRdaemonInput::handleMessage(const Message& message) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void SDRdaemonInput::updateLink(const QString& address, quint16 port) | ||||
| { | ||||
| 	QMutexLocker mutexLocker(&m_mutex); | ||||
| 	bool wasRunning = false; | ||||
| 
 | ||||
| 	if ((m_address != address) || (m_port != port)) | ||||
| 	{ | ||||
| 		if (m_SDRdaemonThread != 0) | ||||
| 		{ | ||||
| 			wasRunning = m_SDRdaemonThread->isRunning(); | ||||
| 
 | ||||
| 			if (wasRunning) | ||||
| 			{ | ||||
| 				m_SDRdaemonThread->stopWork(); | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		if (m_SDRdaemonThread != 0) | ||||
| 		{ | ||||
| 			m_SDRdaemonThread->updateLink(address, port); | ||||
| 
 | ||||
| 			if (wasRunning) | ||||
| 			{ | ||||
| 				m_SDRdaemonThread->startWork(); | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		m_address = address; | ||||
| 		m_port = port; | ||||
| 
 | ||||
| 		qDebug() << "SDRdaemonInput::updateLink:" | ||||
| 				<< " address: " << m_address.toStdString().c_str() | ||||
| 				<< "port: " << m_port; | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void SDRdaemonInput:: updateSampleRate(int sampleRate) | ||||
| { | ||||
| 	QMutexLocker mutexLocker(&m_mutex); | ||||
| 	bool wasRunning = false; | ||||
| 
 | ||||
| 	if (m_sampleRate != sampleRate) | ||||
| 	{ | ||||
| 		m_sampleRate = sampleRate; | ||||
| 
 | ||||
| 		if (m_SDRdaemonThread != 0) | ||||
| 		{ | ||||
| 			wasRunning = m_SDRdaemonThread->isRunning(); | ||||
| 
 | ||||
| 			if (wasRunning) | ||||
| 			{ | ||||
| 				m_SDRdaemonThread->stopWork(); | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		if (m_SDRdaemonThread != 0) | ||||
| 		{ | ||||
| 			m_SDRdaemonThread->setSamplerate(m_sampleRate); | ||||
| 
 | ||||
| 			if (wasRunning) | ||||
| 			{ | ||||
| 				m_SDRdaemonThread->startWork(); | ||||
| 			} | ||||
| 		} | ||||
|          | ||||
| 		DSPSignalNotification *notif = new DSPSignalNotification(m_sampleRate, m_centerFrequency); | ||||
| 		DSPEngine::instance()->getInputMessageQueue()->push(notif); | ||||
| 
 | ||||
| 		qDebug() << "SDRdaemonInput::updateSampleRate:" | ||||
| 				<< " sample rate: " << m_sampleRate; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @ -179,7 +179,6 @@ private: | ||||
| 	const QTimer& m_masterTimer; | ||||
| 
 | ||||
| 	void updateLink(const QString& address, quint16 port); | ||||
| 	void updateSampleRate(int sampleRate); | ||||
| }; | ||||
| 
 | ||||
| #endif // INCLUDE_SDRDAEMONINPUT_H
 | ||||
|  | ||||
| @ -43,6 +43,19 @@ SDRdaemonThread::SDRdaemonThread(SampleFifo* sampleFifo, QObject* parent) : | ||||
| 	m_samplerate(0) | ||||
| { | ||||
|     m_udpBuf = new char[m_udpPayloadSize]; | ||||
|     m_dataSocket = new QUdpSocket(this); | ||||
| 
 | ||||
| 	if (m_dataSocket->bind(m_dataAddress, m_dataPort)) | ||||
| 	{ | ||||
| 		qDebug("SDRdaemonThread::SDRdaemonThread: bind data socket to port %d", m_dataPort); | ||||
| 		connect(m_dataSocket, SIGNAL(readyRead()), this, SLOT(dataReadyRead())); | ||||
| 		m_dataConnected = true; | ||||
| 	} | ||||
|     else | ||||
|     { | ||||
|     	qWarning("SDRdaemonThread::SDRdaemonThread: cannot bind data port %d", m_dataPort); | ||||
|     	m_dataConnected = false; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| SDRdaemonThread::~SDRdaemonThread() | ||||
| @ -64,27 +77,17 @@ void SDRdaemonThread::startWork() | ||||
| { | ||||
| 	qDebug() << "SDRdaemonThread::startWork: "; | ||||
| 
 | ||||
| 	if (!m_dataSocket) { | ||||
| 		m_dataSocket = new QUdpSocket(this); | ||||
| 	} | ||||
|      | ||||
| 	if (m_dataSocket->bind(m_dataAddress, m_dataPort)) | ||||
| 	if (!m_dataConnected) | ||||
| 	{ | ||||
| 		qDebug("SDRdaemonThread::startWork: bind data socket to port %d", m_dataPort); | ||||
| 		connect(m_dataSocket, SIGNAL(readyRead()), this, SLOT(dataReadyRead())); | ||||
| 
 | ||||
| 		m_startWaitMutex.lock(); | ||||
| 		start(); | ||||
| 		while(!m_running) | ||||
| 			m_startWaiter.wait(&m_startWaitMutex, 100); | ||||
| 		m_startWaitMutex.unlock(); | ||||
| 		m_dataConnected = true; | ||||
| 	} | ||||
|     else | ||||
|     { | ||||
|     	qWarning("SDRdaemonThread::startWork: cannot bind data port %d", m_dataPort); | ||||
|     	m_dataConnected = false; | ||||
|     } | ||||
| 
 | ||||
| 	m_startWaitMutex.lock(); | ||||
| 	start(); | ||||
| 	while(!m_running) | ||||
| 		m_startWaiter.wait(&m_startWaitMutex, 100); | ||||
| 	m_startWaitMutex.unlock(); | ||||
| } | ||||
| 
 | ||||
| void SDRdaemonThread::stopWork() | ||||
| @ -93,11 +96,7 @@ void SDRdaemonThread::stopWork() | ||||
| 
 | ||||
| 	if (m_dataConnected) { | ||||
| 		disconnect(m_dataSocket, SIGNAL(readyRead()), this, SLOT(dataReadyRead())); | ||||
| 	} | ||||
| 
 | ||||
| 	if (m_dataSocket) { | ||||
| 		delete m_dataSocket; | ||||
| 		m_dataSocket = 0; | ||||
| 		m_dataConnected = false; | ||||
| 	} | ||||
| 
 | ||||
| 	m_running = false; | ||||
| @ -106,33 +105,69 @@ void SDRdaemonThread::stopWork() | ||||
| 
 | ||||
| void SDRdaemonThread::setSamplerate(uint32_t samplerate) | ||||
| { | ||||
| 	bool wasRunning = m_running; | ||||
| 
 | ||||
| 	qDebug() << "SDRdaemonThread::setSamplerate:" | ||||
| 			<< " new:" << samplerate | ||||
| 			<< " old:" << m_samplerate; | ||||
| 
 | ||||
| 	if (samplerate != m_samplerate) | ||||
| 	if (m_running) | ||||
| 	{ | ||||
| 		if (m_running) { | ||||
| 			stopWork(); | ||||
| 		} | ||||
| 
 | ||||
| 		m_samplerate = samplerate; | ||||
| 		m_chunksize = (m_samplerate / m_rateDivider)*4; // TODO: implement FF and slow motion here. 4 corresponds to live. 2 is half speed, 8 is doulbe speed
 | ||||
| 		m_bufsize = m_chunksize; | ||||
| 
 | ||||
| 		if (m_buf == 0)	{ | ||||
| 			qDebug() << "  - Allocate buffer"; | ||||
| 			m_buf = (quint8*) malloc(m_bufsize); | ||||
| 		} else { | ||||
| 			qDebug() << "  - Re-allocate buffer"; | ||||
| 			m_buf = (quint8*) realloc((void*) m_buf, m_bufsize); | ||||
| 		} | ||||
| 
 | ||||
| 		qDebug() << "  - size: " << m_bufsize | ||||
| 				<< " #samples: " << (m_bufsize/4); | ||||
| 		stopWork(); | ||||
| 		m_running = false; | ||||
| 	} | ||||
| 
 | ||||
| 	//m_samplerate = samplerate;
 | ||||
| 	m_samplerate = samplerate; | ||||
| 	m_chunksize = (m_samplerate / m_rateDivider)*4; // TODO: implement FF and slow motion here. 4 corresponds to live. 2 is half speed, 8 is doulbe speed
 | ||||
| 	m_bufsize = m_chunksize; | ||||
| 
 | ||||
| 	if (m_buf == 0)	{ | ||||
| 		qDebug() << "  - Allocate buffer"; | ||||
| 		m_buf = (quint8*) malloc(m_bufsize); | ||||
| 	} else { | ||||
| 		qDebug() << "  - Re-allocate buffer"; | ||||
| 		m_buf = (quint8*) realloc((void*) m_buf, m_bufsize); | ||||
| 	} | ||||
| 
 | ||||
| 	qDebug() << "  - size: " << m_bufsize | ||||
| 			<< " #samples: " << (m_bufsize/4); | ||||
| 
 | ||||
| 	if (wasRunning) | ||||
| 	{ | ||||
| 		startWork(); | ||||
| 		m_running = true; | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void SDRdaemonThread::updateLink(const QString& address, quint16 port) | ||||
| { | ||||
| 	if (m_dataSocket) { | ||||
| 		delete m_dataSocket; | ||||
| 		m_dataSocket = 0; | ||||
| 	} | ||||
| 
 | ||||
| 	m_dataSocket = new QUdpSocket(this); | ||||
| 	m_dataPort = port; | ||||
| 
 | ||||
| 	if (m_dataAddress.setAddress(address)) | ||||
| 	{ | ||||
| 		if (m_dataSocket->bind(m_dataAddress, m_dataPort)) | ||||
| 		{ | ||||
| 			qDebug("SDRdaemonThread::startWork: bind data socket to port %d", m_dataPort); | ||||
| 			connect(m_dataSocket, SIGNAL(readyRead()), this, SLOT(dataReadyRead())); | ||||
| 			m_dataConnected = true; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			qWarning("SDRdaemonThread::updateLink: cannot bind data port %d", m_dataPort); | ||||
| 			m_dataConnected = false; | ||||
| 		} | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		qWarning("SDRdaemonThread::updateLink: cannot set data address: %s", qPrintable(address)); | ||||
| 		m_dataConnected = false; | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void SDRdaemonThread::run() | ||||
| @ -183,7 +218,13 @@ void SDRdaemonThread::dataReadyRead() | ||||
| 
 | ||||
| 			if (m_sdrDaemonBuffer.readMeta(m_udpBuf, readBytes)) | ||||
| 			{ | ||||
| 				setSamplerate(m_sdrDaemonBuffer.getCurrentMeta().m_sampleRate); | ||||
| 				uint32_t sampleRate = m_sdrDaemonBuffer.getCurrentMeta().m_sampleRate; | ||||
| 
 | ||||
| 				if (m_samplerate != sampleRate) | ||||
| 				{ | ||||
| 					setSamplerate(sampleRate); | ||||
| 					m_samplerate = sampleRate; | ||||
| 				} | ||||
| 			} | ||||
| 			else if (m_sdrDaemonBuffer.isSync()) | ||||
| 			{ | ||||
|  | ||||
| @ -42,7 +42,6 @@ public: | ||||
| 
 | ||||
| 	void startWork(); | ||||
| 	void stopWork(); | ||||
| 	void setSamplerate(uint32_t samplerate); | ||||
| 	void updateLink(const QString& address, quint16 port); | ||||
| 	bool isRunning() const { return m_running; } | ||||
| 	std::size_t getSamplesCount() const { return m_samplesCount; } | ||||
| @ -59,7 +58,7 @@ private: | ||||
| 
 | ||||
| 	QUdpSocket *m_dataSocket; | ||||
| 	QHostAddress m_dataAddress; | ||||
| 	int m_dataPort; | ||||
| 	quint16 m_dataPort; | ||||
| 	bool m_dataConnected; | ||||
| 	quint8 *m_buf; | ||||
| 	char *m_udpBuf; | ||||
| @ -74,6 +73,7 @@ private: | ||||
| 	static const int m_rateDivider; | ||||
| 	static const int m_udpPayloadSize; | ||||
| 
 | ||||
| 	void setSamplerate(uint32_t samplerate); | ||||
| 	void run(); | ||||
| private slots: | ||||
| 	void tick(); | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user