#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(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); } } }