gnss-sim/workThread.cpp

116 lines
2.3 KiB
C++

#include "workThread.h"
#include "uhd_device.h"
#include "gpssim.h"
#include <uhd/utils/thread.hpp>
#include <QtConcurrent/QtConcurrent>
#include <QMessageBox>
#include <QDebug>
WorkThread::WorkThread()
{
read_buff_pos = 0;
write_buff_pos = 0;
iq_buff_size = 260000;
for (int i=0; i<BUFFER_COUNT; i++) {
sample_buffers[i].buff_ptr = (short*)calloc(2 * iq_buff_size, 2);
if (sample_buffers[i].buff_ptr==NULL)
{
fprintf(stderr, "ERROR: Faild to allocate 16-bit I/Q buffer.\n");
exit(1);
}else{
sample_buffers[i].full = 0;
}
}
}
WorkThread::~WorkThread()
{
for (int i=0; i<BUFFER_COUNT; i++) {
if (sample_buffers[i].buff_ptr!=NULL)
{
free(sample_buffers[i].buff_ptr);
}
}
}
void WorkThread::transmit()
{
uhd::set_thread_priority_safe();
while(1)
{
if(bstop){
break;
}
if(sample_buffers[read_buff_pos].full)
{
int size = device_transmit(sample_buffers[read_buff_pos].buff_ptr, iq_buff_size);
qDebug()<<"tx size:"<<size;
sample_buffers[read_buff_pos].full=0;
read_buff_pos=(read_buff_pos+1) % BUFFER_COUNT;
wait_buffer_empty.wakeAll();
}
}
}
void WorkThread::stop()
{
bstop = true;
wait_buffer_empty.wakeAll();
}
void WorkThread::setGain(int g)
{
gain = g;
}
void WorkThread::setNavFilePath(QString path)
{
navfile = path;
}
void WorkThread::setUmfile(QString path)
{
umfile = path;
}
void WorkThread::useNmeaGGA(int use)
{
nmeaGGA = use;
}
void WorkThread::useCurrentTime(int use)
{
useCurTime = use;
}
void WorkThread::run()
{
if(!init_device(2.6e6, 1575420000, gain))
{
QMessageBox::warning(NULL, tr("警告"), tr("设备初始化失败!"), QMessageBox::Ok, QMessageBox::Ok);
bstop = true;
return;
}
bstop = false;
read_buff_pos=0;
write_buff_pos=0;
for (int i=0; i<BUFFER_COUNT; i++) {
sample_buffers[i].full = 0;
}
QFuture<void> future = QtConcurrent::run(this,&WorkThread::transmit);
/*while(!bstop){
m_lock.lock();
wait_buffer_empty.wait(&m_lock);
read_buff_pos++;
m_lock.unlock();
}*/
future.waitForFinished();
close_device();
}