116 lines
2.3 KiB
C++
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();
|
|
}
|