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