/*
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
#include
#include "floatswap.h"
#include "framedreader.h"
FramedReader::FramedReader(QIODevice* device, ChannelManager* channelMan, QObject *parent) :
AbstractReader(device, channelMan, parent)
{
paused = false;
// initial settings
settingsInvalid = 0;
_numOfChannels = _settingsWidget.numOfChannels();
hasSizeByte = _settingsWidget.frameSize() == 0;
frameSize = _settingsWidget.frameSize();
syncWord = _settingsWidget.syncWord();
checksumEnabled = _settingsWidget.isChecksumEnabled();
onNumberFormatChanged(_settingsWidget.numberFormat());
checkSettings();
connect(&_settingsWidget, &FramedReaderSettings::numberFormatChanged,
this, &FramedReader::onNumberFormatChanged);
connect(&_settingsWidget, &FramedReaderSettings::numOfChannelsChanged,
this, &FramedReader::onNumOfChannelsChanged);
connect(&_settingsWidget, &FramedReaderSettings::syncWordChanged,
this, &FramedReader::onSyncWordChanged);
connect(&_settingsWidget, &FramedReaderSettings::frameSizeChanged,
this, &FramedReader::onFrameSizeChanged);
connect(&_settingsWidget, &FramedReaderSettings::checksumChanged,
[this](bool enabled){checksumEnabled = enabled;});
}
void FramedReader::enable(bool enabled)
{
if (enabled)
{
// TODO
// QObject::connect(_device, &QIODevice::readyRead,
// this, &BinaryStreamReader::onDataReady);
}
else
{
QObject::disconnect(_device, 0, this, 0);
}
}
QWidget* FramedReader::settingsWidget()
{
return &_settingsWidget;
}
unsigned FramedReader::numOfChannels()
{
return _numOfChannels;
}
void FramedReader::pause(bool enabled)
{
paused = enabled;
}
void FramedReader::onNumberFormatChanged(NumberFormat numberFormat)
{
switch(numberFormat)
{
case NumberFormat_uint8:
sampleSize = 1;
readSample = &FramedReader::readSampleAs;
break;
case NumberFormat_int8:
sampleSize = 1;
readSample = &FramedReader::readSampleAs;
break;
case NumberFormat_uint16:
sampleSize = 2;
readSample = &FramedReader::readSampleAs;
break;
case NumberFormat_int16:
sampleSize = 2;
readSample = &FramedReader::readSampleAs;
break;
case NumberFormat_uint32:
sampleSize = 4;
readSample = &FramedReader::readSampleAs;
break;
case NumberFormat_int32:
sampleSize = 4;
readSample = &FramedReader::readSampleAs;
break;
case NumberFormat_float:
sampleSize = 4;
readSample = &FramedReader::readSampleAs;
break;
}
checkSettings();
}
template double FramedReader::readSampleAs()
{
T data;
_device->read((char*) &data, sizeof(data));
// TODO: checksum
if (_settingsWidget.endianness() == LittleEndian)
{
data = qFromLittleEndian(data);
}
else
{
data = qFromBigEndian(data);
}
return double(data);
}
void FramedReader::checkSettings()
{
// sync word is invalid (empty or missing a nibble at the end)
if (!syncWord.size())
{
settingsInvalid |= SYNCWORD_INVALID;
}
else // sync word is valid
{
settingsInvalid &= ~SYNCWORD_INVALID;
}
// check if fixed frame size is multiple of a sample set size
if (!hasSizeByte && frameSize % (_numOfChannels * sampleSize) != 0)
{
settingsInvalid |= FRAMESIZE_INVALID;
}
else
{
settingsInvalid &= ~FRAMESIZE_INVALID;
}
// show an error message
if (settingsInvalid & SYNCWORD_INVALID)
{
_settingsWidget.showMessage("Sync word is invalid!", true);
}
else if (settingsInvalid & FRAMESIZE_INVALID)
{
QString errorMessage =
QString("Frame size must be multiple of %1 (#channels * sample size)!")\
.arg(_numOfChannels * sampleSize);
_settingsWidget.showMessage(errorMessage, true);
}
else
{
_settingsWidget.showMessage("All is well!");
}
}
void FramedReader::onNumOfChannelsChanged(unsigned value)
{
_numOfChannels = value;
checkSettings();
}
void FramedReader::onSyncWordChanged(QByteArray word)
{
syncWord = word;
checkSettings();
}
void FramedReader::onFrameSizeChanged(unsigned value)
{
if (value == 0)
{
hasSizeByte = true;
}
else
{
hasSizeByte = false;
frameSize = value;
}
checkSettings();
}