/* Copyright © 2016 Hasan Yavuz Özderya This file is part of serialplot. serialplot is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. serialplot is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with serialplot. If not, see . */ #include "dataformatpanel.h" #include "ui_dataformatpanel.h" #include #include #include #include "utils.h" #include "floatswap.h" DataFormatPanel::DataFormatPanel(QSerialPort* port, ChannelManager* channelMan, QWidget *parent) : QWidget(parent), ui(new Ui::DataFormatPanel), bsReader(port, channelMan), asciiReader(port, channelMan) { ui->setupUi(this); serialPort = port; _channelMan = channelMan; paused = false; // initalize default reader currentReader = &bsReader; bsReader.enable(); ui->rbBinary->setChecked(true); ui->horizontalLayout->addWidget(bsReader.settingsWidget(), 1); connect(&bsReader, SIGNAL(dataAdded()), this, SIGNAL(dataAdded())); connect(&bsReader, SIGNAL(numOfChannelsChanged(unsigned)), this, SIGNAL(numOfChannelsChanged(unsigned))); connect(&bsReader, SIGNAL(samplesPerSecondChanged(unsigned)), this, SIGNAL(samplesPerSecondChanged(unsigned))); // initalize reader selection buttons connect(ui->rbBinary, &QRadioButton::toggled, [this](bool checked) { if (checked) selectReader(&bsReader); }); connect(ui->rbAscii, &QRadioButton::toggled, [this](bool checked) { if (checked) selectReader(&asciiReader); }); // Init demo mode demoCount = 0; demoTimer.setInterval(100); QObject::connect(&demoTimer, &QTimer::timeout, this, &DataFormatPanel::demoTimerTimeout); } DataFormatPanel::~DataFormatPanel() { delete ui; } unsigned DataFormatPanel::numOfChannels() { return currentReader->numOfChannels(); } void DataFormatPanel::pause(bool enabled) { currentReader->pause(enabled); } void DataFormatPanel::enableDemo(bool enabled) { if (enabled) { demoTimer.start(); } else { demoTimer.stop(); } } void DataFormatPanel::demoTimerTimeout() { const double period = 100; demoCount++; if (demoCount >= 100) demoCount = 0; if (!paused) { for (unsigned ci = 0; ci < currentReader->numOfChannels(); ci++) { // we are calculating the fourier components of square wave double value = 4*sin(2*M_PI*double((ci+1)*demoCount)/period)/((2*(ci+1))*M_PI); addChannelData(ci, &value, 1); } emit dataAdded(); } } void DataFormatPanel::addChannelData(unsigned int channel, double* data, unsigned size) { _channelMan->addChannelData(channel, data, size); } void DataFormatPanel::selectReader(AbstractReader* reader) { currentReader->enable(false); reader->enable(); // re-connect signals disconnect(currentReader, 0, this, 0); connect(reader, SIGNAL(dataAdded()), this, SIGNAL(dataAdded())); connect(reader, SIGNAL(numOfChannelsChanged(unsigned)), this, SIGNAL(numOfChannelsChanged(unsigned))); connect(reader, SIGNAL(samplesPerSecondChanged(unsigned)), this, SIGNAL(samplesPerSecondChanged(unsigned))); // switch the settings widget ui->horizontalLayout->removeWidget(currentReader->settingsWidget()); currentReader->settingsWidget()->hide(); ui->horizontalLayout->addWidget(reader->settingsWidget(), 1); reader->settingsWidget()->show(); // notify if number of channels is different if (currentReader->numOfChannels() != reader->numOfChannels()) { emit numOfChannelsChanged(reader->numOfChannels()); } currentReader = reader; }