test_sdk/hw/gtl_hw_generator.cpp

104 lines
2.3 KiB
C++

#include "gtl_hw_generator.h"
namespace gtl
{
namespace hw
{
generator::generator(QObject *parent)
: device{parent}
{
_count_ai = 4;
set_ai();
}
generator::~generator()
{
_is_continue = false;
wait();
}
QString generator::type() const
{
return "generator";
}
bool generator::start(QString id, qreal rate)
{
_rate = rate;
_id = id;
set_ai();
_device->set_name(tr("generator") + "[" + id + "]");
_device->set_id(_id);
_device->set_rate(rate);
_is_continue = true;
QThread::start(QThread::HighestPriority);
emit status_changed(OK);
return true;
}
bool generator::stop()
{
_is_continue = false;
wait();
return true;
}
void generator::run()
{
qreal t = 0;
qreal dt = 1.0/rate();
int cnt = 0;
qint64 time_last = QDateTime::currentMSecsSinceEpoch();
while(_is_continue)
{
qint64 time = QDateTime::currentMSecsSinceEpoch() - time_last;
if (time >= 100)
{
time_last = QDateTime::currentMSecsSinceEpoch();
int samples = time / dt / 1000 + 0.5;
_buffer.clear();
for (int i = 0; i < samples; i++)
{
for(int j = 0; j < _count_ai; j++)
{
_buffer.push_back(static_cast<generator_analog_input*>(ai(j))->get_value(t));
}
cnt++;
t = cnt*dt;
}
if(!_buffer.empty())
set_ai_data(&_buffer[0], (int)_buffer.size());
emit received_data();
}
else
{
QThread::msleep(10);
}
}
}
analog_input *generator::create_ai(int idx)
{
return new generator_analog_input(_rate, tr("intput") + " " + QString::number(idx), _device);
}
}
}