Whitespace cleanup (#192)

* Fix whitespace at EOL and EOF; replace tabs

* Normalize line endings
This commit is contained in:
turboencabulator 2021-11-07 17:44:12 -06:00 committed by GitHub
parent 2cb3d45867
commit 1b45b0d112
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
44 changed files with 1173 additions and 1190 deletions

View File

@ -159,7 +159,7 @@ unix:!android:!macx{
unix:!android:!macx:LIBS += -L$$PWD/build_linux/libdfuprog/lib/x64 -ldfuprog-0.9 unix:!android:!macx:LIBS += -L$$PWD/build_linux/libdfuprog/lib/x64 -ldfuprog-0.9
unix:!android:!macx:INCLUDEPATH += $$PWD/build_linux/libdfuprog/include unix:!android:!macx:INCLUDEPATH += $$PWD/build_linux/libdfuprog/include
unix:!android:!macx:DEPENDPATH += $$PWD/build_linux/libdfuprog/include unix:!android:!macx:DEPENDPATH += $$PWD/build_linux/libdfuprog/include
lib_deploy.files = $$PWD/build_linux/libdfuprog/lib/x64/libdfuprog-0.9.so lib_deploy.files = $$PWD/build_linux/libdfuprog/lib/x64/libdfuprog-0.9.so
lib_deploy.path = /usr/lib lib_deploy.path = /usr/lib
} }
} }

View File

@ -295,4 +295,3 @@ int androidUsbDriver::flashFirmware(void){
mainActivity.callMethod<void>("closeDevice"); mainActivity.callMethod<void>("closeDevice");
return 0; return 0;
} }

0
Desktop_Interface/bin/firmware/labrafirm_0005_02.hex Executable file → Normal file
View File

View File

@ -81,4 +81,3 @@ void daqForm::updateValues(){
void daqForm::trigger_saveButtonPressed(){ void daqForm::trigger_saveButtonPressed(){
saveButtonPressed(); saveButtonPressed();
} }

View File

@ -25,4 +25,3 @@ unsigned char expected_variant;
#ifndef PLATFORM_WINDOWS #ifndef PLATFORM_WINDOWS
struct timeval tv; struct timeval tv;
#endif #endif

View File

@ -47,4 +47,3 @@ extern unsigned char expected_variant;
#define NUM_BYTES_STORED_PER_DAQ_SAMPLE 9 #define NUM_BYTES_STORED_PER_DAQ_SAMPLE 9
#endif // DESKTOP_SETTINGS_H #endif // DESKTOP_SETTINGS_H

View File

@ -4,7 +4,7 @@
namespace functionGen { namespace functionGen {
ChannelData const& SingleChannelController::getData() const { ChannelData const& SingleChannelController::getData() const {
return m_data; return m_data;
} }
void SingleChannelController::waveformName(QString newName) void SingleChannelController::waveformName(QString newName)
@ -12,7 +12,7 @@ void SingleChannelController::waveformName(QString newName)
qDebug() << "newName = " << newName; qDebug() << "newName = " << newName;
newName.append(".tlw"); newName.append(".tlw");
int length; int length;
#ifdef PLATFORM_ANDROID #ifdef PLATFORM_ANDROID
QString waveformFilePath("assets:/waveforms/"); QString waveformFilePath("assets:/waveforms/");
@ -41,12 +41,12 @@ void SingleChannelController::waveformName(QString newName)
QByteArray remainingData = fptr.readAll(); QByteArray remainingData = fptr.readAll();
char *dataString = remainingData.data(); char *dataString = remainingData.data();
m_data.samples.resize(length); m_data.samples.resize(length);
int dummy; int dummy;
char *dataStringCurrent = dataString; char *dataStringCurrent = dataString;
for (int i = 0; i < length; i++) for (int i = 0; i < length; i++)
{ {
sscanf(dataStringCurrent, "%d", &dummy); sscanf(dataStringCurrent, "%d", &dummy);
dataStringCurrent += strcspn(dataStringCurrent, "\t") + 1; dataStringCurrent += strcspn(dataStringCurrent, "\t") + 1;
m_data.samples[i] = static_cast<uint8_t>(dummy); m_data.samples[i] = static_cast<uint8_t>(dummy);
@ -55,7 +55,7 @@ void SingleChannelController::waveformName(QString newName)
#else #else
QByteArray filePath = QCoreApplication::applicationDirPath() QByteArray filePath = QCoreApplication::applicationDirPath()
.append("/waveforms/").append(newName).toLocal8Bit(); .append("/waveforms/").append(newName).toLocal8Bit();
qDebug() << "opening" << filePath; qDebug() << "opening" << filePath;
@ -70,17 +70,17 @@ void SingleChannelController::waveformName(QString newName)
char divisibilityString[16]; char divisibilityString[16];
//Bit of bullshit to deal with CRLF line endings on Mac. //Bit of bullshit to deal with CRLF line endings on Mac.
do do
{ {
fgets(divisibilityString, 5, fptr); fgets(divisibilityString, 5, fptr);
} }
while ((divisibilityString[0] == '\r') || (divisibilityString[0] == '\n')); while ((divisibilityString[0] == '\r') || (divisibilityString[0] == '\n'));
sscanf(divisibilityString, "%d", &m_data.divisibility); sscanf(divisibilityString, "%d", &m_data.divisibility);
qDebug() << "Length = " << length; qDebug() << "Length = " << length;
qDebug() << "Divisibility = " << m_data.divisibility; qDebug() << "Divisibility = " << m_data.divisibility;
m_data.samples.resize(length); m_data.samples.resize(length);
char *dataString = (char *) malloc(length*5+1); char *dataString = (char *) malloc(length*5+1);
fgets(dataString, length*5+1, fptr); fgets(dataString, length*5+1, fptr);
@ -88,7 +88,7 @@ void SingleChannelController::waveformName(QString newName)
int dummy; int dummy;
char *dataStringCurrent = dataString; char *dataStringCurrent = dataString;
for (int i = 0; i < length; i++) for (int i = 0; i < length; i++)
{ {
sscanf(dataStringCurrent, "%d", &dummy); sscanf(dataStringCurrent, "%d", &dummy);
dataStringCurrent += strcspn(dataStringCurrent, "\t") + 1; dataStringCurrent += strcspn(dataStringCurrent, "\t") + 1;
m_data.samples[i] = static_cast<uint8_t>(dummy); m_data.samples[i] = static_cast<uint8_t>(dummy);
@ -98,62 +98,62 @@ void SingleChannelController::waveformName(QString newName)
fclose(fptr); fclose(fptr);
#endif #endif
double newMaxFreq = DAC_SPS / (length >> (m_data.divisibility - 1)); double newMaxFreq = DAC_SPS / (length >> (m_data.divisibility - 1));
double newMinFreq = double(CLOCK_FREQ) / 1024.0 / 65535.0 / static_cast<double>(length); double newMinFreq = double(CLOCK_FREQ) / 1024.0 / 65535.0 / static_cast<double>(length);
setMaxFreq(newMaxFreq); setMaxFreq(newMaxFreq);
setMinFreq(newMinFreq); setMinFreq(newMinFreq);
notifyUpdate(this); notifyUpdate(this);
} }
void SingleChannelController::freqUpdate(double newFreq) void SingleChannelController::freqUpdate(double newFreq)
{ {
qDebug() << "newFreq = " << newFreq; qDebug() << "newFreq = " << newFreq;
m_data.freq = newFreq; m_data.freq = newFreq;
notifyUpdate(this); notifyUpdate(this);
} }
void SingleChannelController::amplitudeUpdate(double newAmplitude) void SingleChannelController::amplitudeUpdate(double newAmplitude)
{ {
qDebug() << "newAmplitude = " << newAmplitude; qDebug() << "newAmplitude = " << newAmplitude;
m_data.amplitude = newAmplitude; m_data.amplitude = newAmplitude;
notifyUpdate(this); notifyUpdate(this);
} }
void SingleChannelController::offsetUpdate(double newOffset) void SingleChannelController::offsetUpdate(double newOffset)
{ {
qDebug() << "newOffset = " << newOffset; qDebug() << "newOffset = " << newOffset;
m_data.offset = newOffset; m_data.offset = newOffset;
notifyUpdate(this); notifyUpdate(this);
} }
DualChannelController::DualChannelController(QWidget *parent) : QLabel(parent) DualChannelController::DualChannelController(QWidget *parent) : QLabel(parent)
{ {
// A bunch of plumbing to forward the SingleChannelController's signals // A bunch of plumbing to forward the SingleChannelController's signals
SingleChannelController* controller1 = getChannelController(ChannelID::CH1); SingleChannelController* controller1 = getChannelController(ChannelID::CH1);
SingleChannelController* controller2 = getChannelController(ChannelID::CH2); SingleChannelController* controller2 = getChannelController(ChannelID::CH2);
connect(controller1, &SingleChannelController::notifyUpdate, connect(controller1, &SingleChannelController::notifyUpdate,
this, [=](SingleChannelController* ptr){ this->functionGenToUpdate(ChannelID::CH1, ptr); }); this, [=](SingleChannelController* ptr){ this->functionGenToUpdate(ChannelID::CH1, ptr); });
connect(controller1, &SingleChannelController::setMaxFreq, connect(controller1, &SingleChannelController::setMaxFreq,
this, &DualChannelController::setMaxFreq_CH1); this, &DualChannelController::setMaxFreq_CH1);
connect(controller1, &SingleChannelController::setMinFreq, connect(controller1, &SingleChannelController::setMinFreq,
this, &DualChannelController::setMinFreq_CH1); this, &DualChannelController::setMinFreq_CH1);
connect(controller2, &SingleChannelController::notifyUpdate, connect(controller2, &SingleChannelController::notifyUpdate,
this, [=](SingleChannelController* ptr){ this->functionGenToUpdate(ChannelID::CH2, ptr); }); this, [=](SingleChannelController* ptr){ this->functionGenToUpdate(ChannelID::CH2, ptr); });
connect(controller1, &SingleChannelController::setMaxFreq, connect(controller1, &SingleChannelController::setMaxFreq,
this, &DualChannelController::setMaxFreq_CH2); this, &DualChannelController::setMaxFreq_CH2);
connect(controller1, &SingleChannelController::setMinFreq, connect(controller1, &SingleChannelController::setMinFreq,
this, &DualChannelController::setMinFreq_CH2); this, &DualChannelController::setMinFreq_CH2);
this->hide(); this->hide();
} }
@ -161,72 +161,71 @@ DualChannelController::DualChannelController(QWidget *parent) : QLabel(parent)
SingleChannelController* DualChannelController::getChannelController(ChannelID channelID) SingleChannelController* DualChannelController::getChannelController(ChannelID channelID)
{ {
return &m_channels[(int)channelID]; return &m_channels[(int)channelID];
} }
// The rest of this file is just plumbing to forward slot calls to SingleChannelController's // The rest of this file is just plumbing to forward slot calls to SingleChannelController's
// Hopefuly it can be mostly removed eventually // Hopefuly it can be mostly removed eventually
void DualChannelController::waveformName(ChannelID channelID, QString newName) void DualChannelController::waveformName(ChannelID channelID, QString newName)
{ {
getChannelController(channelID)->waveformName(newName); getChannelController(channelID)->waveformName(newName);
} }
void DualChannelController::freqUpdate(ChannelID channelID, double newFreq) void DualChannelController::freqUpdate(ChannelID channelID, double newFreq)
{ {
getChannelController(channelID)->freqUpdate(newFreq); getChannelController(channelID)->freqUpdate(newFreq);
} }
void DualChannelController::amplitudeUpdate(ChannelID channelID, double newAmplitude) void DualChannelController::amplitudeUpdate(ChannelID channelID, double newAmplitude)
{ {
getChannelController(channelID)->amplitudeUpdate(newAmplitude); getChannelController(channelID)->amplitudeUpdate(newAmplitude);
} }
void DualChannelController::offsetUpdate(ChannelID channelID, double newOffset) void DualChannelController::offsetUpdate(ChannelID channelID, double newOffset)
{ {
getChannelController(channelID)->offsetUpdate(newOffset); getChannelController(channelID)->offsetUpdate(newOffset);
} }
void DualChannelController::waveformName_CH1(QString newName) void DualChannelController::waveformName_CH1(QString newName)
{ {
waveformName(ChannelID::CH1, newName); waveformName(ChannelID::CH1, newName);
} }
void DualChannelController::freqUpdate_CH1(double newFreq) void DualChannelController::freqUpdate_CH1(double newFreq)
{ {
freqUpdate(ChannelID::CH1, newFreq); freqUpdate(ChannelID::CH1, newFreq);
} }
void DualChannelController::amplitudeUpdate_CH1(double newAmplitude) void DualChannelController::amplitudeUpdate_CH1(double newAmplitude)
{ {
amplitudeUpdate(ChannelID::CH1, newAmplitude); amplitudeUpdate(ChannelID::CH1, newAmplitude);
} }
void DualChannelController::offsetUpdate_CH1(double newOffset) void DualChannelController::offsetUpdate_CH1(double newOffset)
{ {
offsetUpdate(ChannelID::CH1, newOffset); offsetUpdate(ChannelID::CH1, newOffset);
} }
void DualChannelController::waveformName_CH2(QString newName) void DualChannelController::waveformName_CH2(QString newName)
{ {
waveformName(ChannelID::CH2, newName); waveformName(ChannelID::CH2, newName);
} }
void DualChannelController::freqUpdate_CH2(double newFreq) void DualChannelController::freqUpdate_CH2(double newFreq)
{ {
freqUpdate(ChannelID::CH2, newFreq); freqUpdate(ChannelID::CH2, newFreq);
} }
void DualChannelController::amplitudeUpdate_CH2(double newAmplitude) void DualChannelController::amplitudeUpdate_CH2(double newAmplitude)
{ {
amplitudeUpdate(ChannelID::CH2, newAmplitude); amplitudeUpdate(ChannelID::CH2, newAmplitude);
} }
void DualChannelController::offsetUpdate_CH2(double newOffset) void DualChannelController::offsetUpdate_CH2(double newOffset)
{ {
offsetUpdate(ChannelID::CH2, newOffset); offsetUpdate(ChannelID::CH2, newOffset);
} }
} }

View File

@ -17,29 +17,29 @@ namespace functionGen {
enum class ChannelID enum class ChannelID
{ {
CH1 = 0, CH1 = 0,
CH2 = 1 CH2 = 1
}; };
struct ChannelData struct ChannelData
{ {
std::vector<uint8_t> samples; std::vector<uint8_t> samples;
int divisibility; int divisibility;
double freq = 1000.0; double freq = 1000.0;
double amplitude = 0.0; double amplitude = 0.0;
double offset = 0.0; double offset = 0.0;
}; };
class SingleChannelController : public QObject class SingleChannelController : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
ChannelData const& getData() const; ChannelData const& getData() const;
signals: signals:
void notifyUpdate(SingleChannelController* controller); void notifyUpdate(SingleChannelController* controller);
void setMaxFreq(double maxFreq); void setMaxFreq(double maxFreq);
void setMinFreq(double minFreq); void setMinFreq(double minFreq);
public slots: public slots:
@ -49,7 +49,7 @@ public slots:
void offsetUpdate(double newOffset); void offsetUpdate(double newOffset);
private: private:
ChannelData m_data; ChannelData m_data;
}; };
class DualChannelController : public QLabel class DualChannelController : public QLabel
@ -59,7 +59,7 @@ public:
explicit DualChannelController(QWidget *parent = 0); explicit DualChannelController(QWidget *parent = 0);
public: public:
SingleChannelController* getChannelController(ChannelID channelID); SingleChannelController* getChannelController(ChannelID channelID);
signals: signals:
void functionGenToUpdate(ChannelID channel, SingleChannelController* fGenControl); void functionGenToUpdate(ChannelID channel, SingleChannelController* fGenControl);
@ -85,7 +85,7 @@ public slots:
void offsetUpdate_CH2(double newOffset); void offsetUpdate_CH2(double newOffset);
private: private:
SingleChannelController m_channels[2]; SingleChannelController m_channels[2];
}; };
} }

View File

@ -81,29 +81,29 @@ genericUsbDriver::genericUsbDriver(QWidget *parent) : QLabel(parent)
connectTimer->start(USB_RECONNECT_PERIOD); connectTimer->start(USB_RECONNECT_PERIOD);
connect(connectTimer, SIGNAL(timeout()), this, SLOT(checkConnection())); connect(connectTimer, SIGNAL(timeout()), this, SLOT(checkConnection()));
qDebug()<< "Generic Usb Driver setup complete"; qDebug()<< "Generic Usb Driver setup complete";
messageBox = new QMessageBox(); messageBox = new QMessageBox();
} }
genericUsbDriver::~genericUsbDriver(void){ genericUsbDriver::~genericUsbDriver(void){
qDebug() << "genericUsbDriver dectructor entering"; qDebug() << "genericUsbDriver dectructor entering";
if(connected){ if(connected){
if (psuTimer) if (psuTimer)
{ {
psuTimer->stop(); psuTimer->stop();
delete(psuTimer); delete(psuTimer);
} }
if (recoveryTimer) if (recoveryTimer)
{ {
recoveryTimer->stop(); recoveryTimer->stop();
delete(recoveryTimer); delete(recoveryTimer);
} }
if (isoTimer) if (isoTimer)
{ {
isoTimer->stop(); isoTimer->stop();
delete(isoTimer); delete(isoTimer);
} }
} }
qDebug() << "genericUsbDriver dectructor completed"; qDebug() << "genericUsbDriver dectructor completed";
} }
@ -136,33 +136,33 @@ void genericUsbDriver::setFunctionGen(functionGen::ChannelID channelID, function
////////////////////////////////////// //////////////////////////////////////
//For recalling on crash. //For recalling on crash.
fGenPtrData[(int)channelID] = fGenControl; fGenPtrData[(int)channelID] = fGenControl;
sendFunctionGenData(channelID); sendFunctionGenData(channelID);
} }
void genericUsbDriver::sendFunctionGenData(functionGen::ChannelID channelID) void genericUsbDriver::sendFunctionGenData(functionGen::ChannelID channelID)
{ {
//Reading in data //Reading in data
functionGen::ChannelData channelData = fGenPtrData[(int)channelID]->getData(); functionGen::ChannelData channelData = fGenPtrData[(int)channelID]->getData();
//Triple mode //Triple mode
if ((channelData.amplitude + channelData.offset) > FGEN_LIMIT) if ((channelData.amplitude + channelData.offset) > FGEN_LIMIT)
{ {
channelData.amplitude /= 3.0; channelData.amplitude /= 3.0;
channelData.offset /= 3.0; channelData.offset /= 3.0;
fGenTriple |= static_cast<uint8_t>(!static_cast<uint8_t>(channelID) + 1); fGenTriple |= static_cast<uint8_t>(!static_cast<uint8_t>(channelID) + 1);
} }
else else
{ {
fGenTriple &= static_cast<uint8_t>(254 - !static_cast<uint8_t>(channelID)); fGenTriple &= static_cast<uint8_t>(254 - !static_cast<uint8_t>(channelID));
} }
//Waveform scaling in V //Waveform scaling in V
channelData.amplitude = (channelData.amplitude * 255) / FGEN_LIMIT; channelData.amplitude = (channelData.amplitude * 255) / FGEN_LIMIT;
channelData.offset = (channelData.offset * 255) / FGEN_LIMIT; channelData.offset = (channelData.offset * 255) / FGEN_LIMIT;
if (channelData.offset < FGEN_OFFSET) if (channelData.offset < FGEN_OFFSET)
{ {
if (channelData.amplitude > 5) if (channelData.amplitude > 5)
channelData.amplitude -= FGEN_OFFSET; channelData.amplitude -= FGEN_OFFSET;
else else
@ -179,62 +179,61 @@ void genericUsbDriver::sendFunctionGenData(functionGen::ChannelID channelID)
usbSendControl(0x40, 0xa4, fGenTriple, 0, 0, NULL); usbSendControl(0x40, 0xa4, fGenTriple, 0, 0, NULL);
#endif #endif
auto applyAmplitudeAndOffset = [&](unsigned char sample) -> unsigned char auto applyAmplitudeAndOffset = [&](unsigned char sample) -> unsigned char
{ {
return sample / 255.0 * channelData.amplitude + channelData.offset; return sample / 255.0 * channelData.amplitude + channelData.offset;
}; };
std::transform(channelData.samples.begin(), channelData.samples.end(), std::transform(channelData.samples.begin(), channelData.samples.end(),
channelData.samples.begin(), // transform in place channelData.samples.begin(), // transform in place
applyAmplitudeAndOffset); applyAmplitudeAndOffset);
//Need to increase size of wave if its freq too high, or too low! //Need to increase size of wave if its freq too high, or too low!
{ {
int shift = 0; int shift = 0;
int newLength = channelData.samples.size(); int newLength = channelData.samples.size();
while ((newLength >> shift) * channelData.freq > DAC_SPS) while ((newLength >> shift) * channelData.freq > DAC_SPS)
shift++; shift++;
if (shift != 0) if (shift != 0)
{ {
channelData.divisibility -= shift; channelData.divisibility -= shift;
newLength >>= shift; newLength >>= shift;
for (int i = 0; i < newLength; ++i) for (int i = 0; i < newLength; ++i)
channelData.samples[i] = channelData.samples[i << shift]; channelData.samples[i] = channelData.samples[i << shift];
channelData.samples.resize(newLength); channelData.samples.resize(newLength);
channelData.samples.shrink_to_fit(); channelData.samples.shrink_to_fit();
if (channelData.divisibility <= 0) if (channelData.divisibility <= 0)
qDebug("genericUsbDriver::setFunctionGen: channel divisibility <= 0 after T-stretching"); qDebug("genericUsbDriver::setFunctionGen: channel divisibility <= 0 after T-stretching");
} }
} }
// Timer Setup // Timer Setup
int validClockDivs[7] = {1, 2, 4, 8, 64, 256, 1024}; int validClockDivs[7] = {1, 2, 4, 8, 64, 256, 1024};
auto period = [&](int division) -> int auto period = [&](int division) -> int
{ {
return CLOCK_FREQ / (division * channelData.samples.size() * channelData.freq); return CLOCK_FREQ / (division * channelData.samples.size() * channelData.freq);
}; };
int* clkSettingIt = std::find_if(std::begin(validClockDivs), std::end(validClockDivs), int* clkSettingIt = std::find_if(std::begin(validClockDivs), std::end(validClockDivs),
[&](int division) -> bool { return period(division) < 65535; }); [&](int division) -> bool { return period(division) < 65535; });
int timerPeriod = period(*clkSettingIt); int timerPeriod = period(*clkSettingIt);
// +1 to change from [0:n) to [1:n] // +1 to change from [0:n) to [1:n]
int clkSetting = std::distance(std::begin(validClockDivs), clkSettingIt) + 1; int clkSetting = std::distance(std::begin(validClockDivs), clkSettingIt) + 1;
if(deviceMode == 5) if(deviceMode == 5)
qDebug("DEVICE IS IN MODE 5"); qDebug("DEVICE IS IN MODE 5");
if (channelID == functionGen::ChannelID::CH2) if (channelID == functionGen::ChannelID::CH2)
usbSendControl(0x40, 0xa1, timerPeriod, clkSetting, channelData.samples.size(), channelData.samples.data()); usbSendControl(0x40, 0xa1, timerPeriod, clkSetting, channelData.samples.size(), channelData.samples.data());
else else
usbSendControl(0x40, 0xa2, timerPeriod, clkSetting, channelData.samples.size(), channelData.samples.data()); usbSendControl(0x40, 0xa2, timerPeriod, clkSetting, channelData.samples.size(), channelData.samples.data());
return; return;
@ -258,10 +257,10 @@ void genericUsbDriver::setDeviceMode(int mode){
usbSendControl(0x40, 0xa5, (mode == 5 ? 0 : mode), gainMask, 0, NULL); usbSendControl(0x40, 0xa5, (mode == 5 ? 0 : mode), gainMask, 0, NULL);
if (fGenPtrData[(int)functionGen::ChannelID::CH1] != NULL) if (fGenPtrData[(int)functionGen::ChannelID::CH1] != NULL)
sendFunctionGenData(functionGen::ChannelID::CH1); sendFunctionGenData(functionGen::ChannelID::CH1);
if (fGenPtrData[(int)functionGen::ChannelID::CH2] != NULL) if (fGenPtrData[(int)functionGen::ChannelID::CH2] != NULL)
sendFunctionGenData(functionGen::ChannelID::CH2); sendFunctionGenData(functionGen::ChannelID::CH2);
//switch on new deviceMode!! //switch on new deviceMode!!
switch(deviceMode){ switch(deviceMode){
@ -487,11 +486,11 @@ void genericUsbDriver::checkConnection(){
newDig(digitalPinState); newDig(digitalPinState);
int ret = usbIsoInit(); int ret = usbIsoInit();
if (ret != 0) if (ret != 0)
{ {
messageBox->setText("A USB connection was established, but isochronous communications could not be initialised.<br>This is usually due to bandwidth limitations on the current USB host and can be fixed by moving to a different port.<br>Please see <a href = 'https://github.com/EspoTek/Labrador/wiki/Troubleshooting-Guide#usb-connection-issues-other-platforms'>https://github.com/EspoTek/Labrador/wiki/Troubleshooting-Guide#usb-connection-issues-other-platforms</a>"); messageBox->setText("A USB connection was established, but isochronous communications could not be initialised.<br>This is usually due to bandwidth limitations on the current USB host and can be fixed by moving to a different port.<br>Please see <a href = 'https://github.com/EspoTek/Labrador/wiki/Troubleshooting-Guide#usb-connection-issues-other-platforms'>https://github.com/EspoTek/Labrador/wiki/Troubleshooting-Guide#usb-connection-issues-other-platforms</a>");
messageBox->exec(); messageBox->exec();
} }
psuTimer = new QTimer(); psuTimer = new QTimer();
psuTimer->setTimerType(Qt::PreciseTimer); psuTimer->setTimerType(Qt::PreciseTimer);
@ -514,4 +513,3 @@ void genericUsbDriver::checkConnection(){
void genericUsbDriver::bootloaderJump(){ void genericUsbDriver::bootloaderJump(){
usbSendControl(0x40, 0xa7, 1, 0, 0, NULL); usbSendControl(0x40, 0xa7, 1, 0, 0, NULL);
} }

View File

@ -83,7 +83,7 @@ protected:
//State Vars //State Vars
unsigned char fGenTriple=0; unsigned char fGenTriple=0;
unsigned short gainMask = 2056; unsigned short gainMask = 2056;
functionGen::SingleChannelController* fGenPtrData[2] = {NULL, NULL}; functionGen::SingleChannelController* fGenPtrData[2] = {NULL, NULL};
int dutyPsu = 0; int dutyPsu = 0;
double currentPsuVoltage; double currentPsuVoltage;
int digitalPinState = 0; int digitalPinState = 0;
@ -124,7 +124,7 @@ signals:
public slots: public slots:
void setPsu(double voltage); void setPsu(double voltage);
void setFunctionGen(functionGen::ChannelID channelID, functionGen::SingleChannelController *fGenControl); void setFunctionGen(functionGen::ChannelID channelID, functionGen::SingleChannelController *fGenControl);
void sendFunctionGenData(functionGen::ChannelID channelID); void sendFunctionGenData(functionGen::ChannelID channelID);
void setDeviceMode(int mode); void setDeviceMode(int mode);
void newDig(int digState); void newDig(int digState);
void psuTick(void); void psuTick(void);

View File

@ -48,13 +48,13 @@ void i2cDecoder::run()
{ {
// qDebug() << "i2cDecoder::run()"; // qDebug() << "i2cDecoder::run()";
while (serialDistance(sda) > SERIAL_DELAY * sda->m_sampleRate_bit) while (serialDistance(sda) > SERIAL_DELAY * sda->m_sampleRate_bit)
{ {
updateBitValues(); updateBitValues();
runStateMachine(); runStateMachine();
serialPtr_bit ++; serialPtr_bit ++;
if (serialPtr_bit >= (sda->m_bufferLen * 8)) if (serialPtr_bit >= (sda->m_bufferLen * 8))
serialPtr_bit -= (sda->m_bufferLen * 8); serialPtr_bit -= (sda->m_bufferLen * 8);
} }
} }
int i2cDecoder::serialDistance(isoBuffer* buffer) int i2cDecoder::serialDistance(isoBuffer* buffer)
@ -64,7 +64,7 @@ int i2cDecoder::serialDistance(isoBuffer* buffer)
if (back_bit >= serialPtr_bit) if (back_bit >= serialPtr_bit)
return back_bit - serialPtr_bit; return back_bit - serialPtr_bit;
else else
return bufferEnd_bit - serialPtr_bit + back_bit; return bufferEnd_bit - serialPtr_bit + back_bit;
} }
void i2cDecoder::updateBitValues(){ void i2cDecoder::updateBitValues(){
@ -77,66 +77,66 @@ void i2cDecoder::updateBitValues(){
unsigned char dataByteScl = scl->m_buffer[coord_byte]; unsigned char dataByteScl = scl->m_buffer[coord_byte];
unsigned char mask = (0x01 << coord_bit); unsigned char mask = (0x01 << coord_bit);
currentSdaValue = dataByteSda & mask; currentSdaValue = dataByteSda & mask;
currentSclValue = dataByteScl & mask; currentSclValue = dataByteScl & mask;
} }
void i2cDecoder::runStateMachine() void i2cDecoder::runStateMachine()
{ {
edge sdaEdge = edgeDetection(currentSdaValue, previousSdaValue); edge sdaEdge = edgeDetection(currentSdaValue, previousSdaValue);
edge sclEdge = edgeDetection(currentSclValue, previousSclValue); edge sclEdge = edgeDetection(currentSclValue, previousSclValue);
if ((sdaEdge == edge::rising) && (sclEdge == edge::falling)) // INVALID STATE TRANSITION if ((sdaEdge == edge::rising) && (sclEdge == edge::falling)) // INVALID STATE TRANSITION
{ {
state = transmissionState::unknown; state = transmissionState::unknown;
qDebug() << "Dumping I2C state and aborting..."; qDebug() << "Dumping I2C state and aborting...";
for (int i=31; i>=0; i--) for (int i=31; i>=0; i--)
qDebug("%02x\t%02x", sda->m_buffer[serialPtr_bit/8 - i] & 0xFF, scl->m_buffer[serialPtr_bit/8 - i] & 0xFF); qDebug("%02x\t%02x", sda->m_buffer[serialPtr_bit/8 - i] & 0xFF, scl->m_buffer[serialPtr_bit/8 - i] & 0xFF);
throw std::runtime_error("unknown i2c transmission state"); throw std::runtime_error("unknown i2c transmission state");
return; return;
} }
if ((sdaEdge == edge::rising) && (sclEdge == edge::held_high)) // START if ((sdaEdge == edge::rising) && (sclEdge == edge::held_high)) // START
{ {
stopCondition(); stopCondition();
return; return;
} }
if ((sdaEdge == edge::falling) && (sclEdge == edge::held_high)) // STOP if ((sdaEdge == edge::falling) && (sclEdge == edge::held_high)) // STOP
{ {
startCondition(); startCondition();
return; return;
} }
switch (state) switch (state)
{ {
case transmissionState::idle: case transmissionState::idle:
return; return;
case transmissionState::address: case transmissionState::address:
decodeAddress(sdaEdge, sclEdge); decodeAddress(sdaEdge, sclEdge);
break; break;
case transmissionState::data: case transmissionState::data:
decodeData(sdaEdge, sclEdge); decodeData(sdaEdge, sclEdge);
break; break;
} }
} }
edge i2cDecoder::edgeDetection(uint8_t current, uint8_t prev) edge i2cDecoder::edgeDetection(uint8_t current, uint8_t prev)
{ {
if (current && prev) if (current && prev)
return edge::held_high; return edge::held_high;
if (!current && !prev) if (!current && !prev)
return edge::held_low; return edge::held_low;
if (current && !prev) if (current && !prev)
return edge::rising; return edge::rising;
if (!current && prev) if (!current && prev)
return edge::falling; return edge::falling;
throw std::runtime_error("i2c Edge Detection critical failure"); throw std::runtime_error("i2c Edge Detection critical failure");
} }
void i2cDecoder::decodeAddress(edge sdaEdge, edge sclEdge) void i2cDecoder::decodeAddress(edge sdaEdge, edge sclEdge)
{ {
// Read in the next bit. // Read in the next bit.
if (sclEdge == edge::rising && sdaEdge == edge::held_high && currentBitIndex++ < addressBitStreamLength) if (sclEdge == edge::rising && sdaEdge == edge::held_high && currentBitIndex++ < addressBitStreamLength)
currentBitStream = (currentBitStream << 1) | 0x0001; currentBitStream = (currentBitStream << 1) | 0x0001;
else if (sclEdge == edge::rising && sdaEdge == edge::held_low && currentBitIndex++ < addressBitStreamLength) else if (sclEdge == edge::rising && sdaEdge == edge::held_low && currentBitIndex++ < addressBitStreamLength)
@ -197,9 +197,9 @@ void i2cDecoder::decodeData(edge sdaEdge, edge sclEdge)
void i2cDecoder::startCondition() void i2cDecoder::startCondition()
{ {
currentBitIndex = 0; currentBitIndex = 0;
currentBitStream = 0x0000; currentBitStream = 0x0000;
state = transmissionState::address; state = transmissionState::address;
qDebug() << "I2C START"; qDebug() << "I2C START";
} }

View File

@ -13,18 +13,18 @@ namespace i2c
enum class transmissionState: uint8_t enum class transmissionState: uint8_t
{ {
unknown, unknown,
idle, idle,
address, address,
data data
}; };
enum class edge: uint8_t enum class edge: uint8_t
{ {
rising, rising,
falling, falling,
held_high, held_high,
held_low held_low
}; };
constexpr uint8_t addressBitStreamLength = 9; constexpr uint8_t addressBitStreamLength = 9;
@ -37,37 +37,37 @@ class i2cDecoder : public QObject
public: public:
explicit i2cDecoder(isoBuffer* sda_in, isoBuffer* scl_in, QPlainTextEdit* console_in); explicit i2cDecoder(isoBuffer* sda_in, isoBuffer* scl_in, QPlainTextEdit* console_in);
~i2cDecoder(); ~i2cDecoder();
// misc // misc
isoBuffer* sda; isoBuffer* sda;
isoBuffer* scl; isoBuffer* scl;
QPlainTextEdit* console; QPlainTextEdit* console;
isoBufferBuffer* serialBuffer = nullptr; isoBufferBuffer* serialBuffer = nullptr;
std::mutex mutex; std::mutex mutex;
QTimer *updateTimer; QTimer *updateTimer;
// State vars // State vars
uint8_t currentSdaValue = 0; uint8_t currentSdaValue = 0;
uint8_t previousSdaValue = 0; uint8_t previousSdaValue = 0;
uint8_t currentSclValue = 0; uint8_t currentSclValue = 0;
uint8_t previousSclValue = 0; uint8_t previousSclValue = 0;
uint64_t serialPtr_bit = 0; uint64_t serialPtr_bit = 0;
transmissionState state = transmissionState::unknown; transmissionState state = transmissionState::unknown;
bool consoleStateInvalid; bool consoleStateInvalid;
// Data Transmission // Data Transmission
uint8_t currentBitIndex = 0; uint8_t currentBitIndex = 0;
uint16_t currentBitStream; uint16_t currentBitStream;
// Member functions // Member functions
void updateBitValues(); void updateBitValues();
void runStateMachine(); void runStateMachine();
void run(); void run();
int serialDistance(isoBuffer* buffer); int serialDistance(isoBuffer* buffer);
edge edgeDetection(uint8_t current, uint8_t prev); edge edgeDetection(uint8_t current, uint8_t prev);
void decodeAddress(edge sdaEdge, edge sclEdge); void decodeAddress(edge sdaEdge, edge sclEdge);
void decodeData(edge sdaEdge, edge sclEdge); void decodeData(edge sdaEdge, edge sclEdge);
void startCondition(); void startCondition();
void stopCondition(); void stopCondition();
void reset(); void reset();
signals: signals:
public slots: public slots:

View File

@ -350,7 +350,7 @@ void isoBuffer::serialManage(double baudRate, UartParity parity, bool hexDisplay
m_isDecoding = true; m_isDecoding = true;
} }
m_decoder->m_baudRate = baudRate; m_decoder->m_baudRate = baudRate;
m_decoder->setParityMode(parity); m_decoder->setParityMode(parity);
m_decoder->setHexDisplay(hexDisplay); m_decoder->setHexDisplay(hexDisplay);
m_decoder->serialDecode(); m_decoder->serialDecode();

View File

@ -46,43 +46,43 @@ constexpr uint32_t CONSOLE_UPDATE_TIMER_PERIOD = ISO_PACKETS_PER_CTX * 4;
// TODO: Change integer types to cstdint types // TODO: Change integer types to cstdint types
class isoBuffer : public QWidget class isoBuffer : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
isoBuffer(QWidget* parent = 0, int bufferLen = 0, isoDriver* caller = 0, unsigned char channel_value = 0); isoBuffer(QWidget* parent = 0, int bufferLen = 0, isoDriver* caller = 0, unsigned char channel_value = 0);
~isoBuffer() = default; ~isoBuffer() = default;
// Basic buffer operations // Basic buffer operations
short bufferAt(uint32_t idx) const; short bufferAt(uint32_t idx) const;
void insertIntoBuffer(short item); void insertIntoBuffer(short item);
void clearBuffer(); void clearBuffer();
void gainBuffer(int gain_log); void gainBuffer(int gain_log);
// Advanced buffer operations // Advanced buffer operations
private: private:
template<typename T, typename Function> template<typename T, typename Function>
void writeBuffer(T* data, int len, int TOP, Function transform); void writeBuffer(T* data, int len, int TOP, Function transform);
public: public:
void writeBuffer_char(char* data, int len); void writeBuffer_char(char* data, int len);
void writeBuffer_short(short* data, int len); void writeBuffer_short(short* data, int len);
std::unique_ptr<short[]> readBuffer(double sampleWindow, int numSamples, bool singleBit, double delayOffset); std::unique_ptr<short[]> readBuffer(double sampleWindow, int numSamples, bool singleBit, double delayOffset);
// file I/O // file I/O
private: private:
void outputSampleToFile(double averageSample); void outputSampleToFile(double averageSample);
void maybeOutputSampleToFile(double convertedSample); void maybeOutputSampleToFile(double convertedSample);
public: public:
double sampleConvert(short sample, int TOP, bool AC) const; double sampleConvert(short sample, int TOP, bool AC) const;
short inverseSampleConvert(double voltageLevel, int TOP, bool AC) const; short inverseSampleConvert(double voltageLevel, int TOP, bool AC) const;
private: private:
template<typename Function> template<typename Function>
int capSample(int offset, int target, double seconds, double value, Function comp); int capSample(int offset, int target, double seconds, double value, Function comp);
void checkTriggered(); void checkTriggered();
public: public:
int cap_x0fromLast(double seconds, double vbot); int cap_x0fromLast(double seconds, double vbot);
int cap_x1fromLast(double seconds, int x0, double vbot); int cap_x1fromLast(double seconds, int x0, double vbot);
int cap_x2fromLast(double seconds, int x1, double vtop); int cap_x2fromLast(double seconds, int x1, double vtop);
void serialManage(double baudRate, UartParity parity, bool hexDisplay); void serialManage(double baudRate, UartParity parity, bool hexDisplay);
void setTriggerType(TriggerType newType); void setTriggerType(TriggerType newType);
void setTriggerLevel(double voltageLevel, uint16_t top, bool acCoupled); void setTriggerLevel(double voltageLevel, uint16_t top, bool acCoupled);
double getDelayedTriggerPoint(double delay); double getDelayedTriggerPoint(double delay);
@ -90,56 +90,56 @@ public:
// ---- MEMBER VARIABLES ---- // ---- MEMBER VARIABLES ----
// Presentation? // Presentation?
// TODO: Add consoles as constructor arguments // TODO: Add consoles as constructor arguments
// NOTE: These are initialized in mainwindow.cpp // NOTE: These are initialized in mainwindow.cpp
QPlainTextEdit* m_console1; QPlainTextEdit* m_console1;
QPlainTextEdit* m_console2; QPlainTextEdit* m_console2;
unsigned char m_channel = 255; unsigned char m_channel = 255;
bool m_serialAutoScroll = true; bool m_serialAutoScroll = true;
// Internal Storage // Internal Storage
std::unique_ptr<short[]> m_bufferPtr; std::unique_ptr<short[]> m_bufferPtr;
short* m_buffer; short* m_buffer;
uint32_t m_back = 0; uint32_t m_back = 0;
uint32_t m_insertedCount = 0; uint32_t m_insertedCount = 0;
uint32_t m_bufferLen; uint32_t m_bufferLen;
// Conversion And Sampling // Conversion And Sampling
double m_voltage_ref = 1.65; double m_voltage_ref = 1.65;
double m_frontendGain = (R4 / (R3 + R4)); double m_frontendGain = (R4 / (R3 + R4));
int m_samplesPerSecond; int m_samplesPerSecond;
int m_sampleRate_bit; int m_sampleRate_bit;
TriggerType m_triggerType = TriggerType::Disabled; TriggerType m_triggerType = TriggerType::Disabled;
TriggerSeekState m_triggerSeekState = TriggerSeekState::BelowTriggerLevel; TriggerSeekState m_triggerSeekState = TriggerSeekState::BelowTriggerLevel;
short m_triggerLevel = 0; short m_triggerLevel = 0;
short m_triggerSensitivity = 0; short m_triggerSensitivity = 0;
std::vector<uint32_t> m_triggerPositionList = {}; std::vector<uint32_t> m_triggerPositionList = {};
// UARTS decoding // UARTS decoding
uartStyleDecoder* m_decoder = NULL; uartStyleDecoder* m_decoder = NULL;
bool m_isDecoding = true; bool m_isDecoding = true;
//DFT // DFT
AsyncDFT async_dft; AsyncDFT async_dft;
private: private:
// File I/O // File I/O
bool m_fileIOEnabled = false; bool m_fileIOEnabled = false;
QFile* m_currentFile; QFile* m_currentFile;
int m_fileIO_sampleCountPerWrite; int m_fileIO_sampleCountPerWrite;
int m_fileIO_sampleCount; int m_fileIO_sampleCount;
double m_fileIO_sampleAccumulator; double m_fileIO_sampleAccumulator;
qulonglong m_fileIO_maxFileSize; qulonglong m_fileIO_maxFileSize;
qulonglong m_fileIO_numBytesWritten; qulonglong m_fileIO_numBytesWritten;
unsigned int m_currentColumn = 0; unsigned int m_currentColumn = 0;
uint32_t m_lastTriggerDetlaT = 0; uint32_t m_lastTriggerDetlaT = 0;
isoDriver* m_virtualParent; isoDriver* m_virtualParent;
void addTriggerPosition(uint32_t position); void addTriggerPosition(uint32_t position);
signals: signals:
void fileIOinternalDisable(); void fileIOinternalDisable();
public slots: public slots:
void enableFileIO(QFile* file, int samplesToAverage, qulonglong max_file_size); void enableFileIO(QFile* file, int samplesToAverage, qulonglong max_file_size);
void disableFileIO(); void disableFileIO();
}; };
#endif // ISOBUFFER_H #endif // ISOBUFFER_H

View File

@ -79,4 +79,3 @@ void isoBuffer_file::clearBuffer()
back = 0; back = 0;
} }

View File

@ -23,80 +23,78 @@
*/ */
isoBufferBuffer::isoBufferBuffer(uint32_t length) isoBufferBuffer::isoBufferBuffer(uint32_t length)
: m_data(std::make_unique<char[]>(length*2)) : m_data(std::make_unique<char[]>(length*2))
, m_capacity(length) , m_capacity(length)
{ {
} }
// Adds a character to the end of the buffer // Adds a character to the end of the buffer
void isoBufferBuffer::insert(char c) void isoBufferBuffer::insert(char c)
{ {
char* dataPtr = m_data.get(); char* dataPtr = m_data.get();
// Add character to first half of the buffer // Add character to first half of the buffer
dataPtr[m_top] = c; dataPtr[m_top] = c;
// Then to the second // Then to the second
dataPtr[m_top+m_capacity] = c; dataPtr[m_top+m_capacity] = c;
// Loop the buffer index if necessary and update size accordingly // Loop the buffer index if necessary and update size accordingly
m_top = (m_top + 1) % m_capacity; m_top = (m_top + 1) % m_capacity;
m_size = std::min(m_size + 1, m_capacity); m_size = std::min(m_size + 1, m_capacity);
} }
void isoBufferBuffer::insert(char const * s) void isoBufferBuffer::insert(char const * s)
{ {
while (*s != '\0') while (*s != '\0')
insert(*s++); insert(*s++);
} }
void isoBufferBuffer::insert(std::string const & s) void isoBufferBuffer::insert(std::string const & s)
{ {
for (char c : s) for (char c : s)
insert(c); insert(c);
} }
void isoBufferBuffer::insert_hex(uint8_t x) void isoBufferBuffer::insert_hex(uint8_t x)
{ {
char str[5]; char str[5];
sprintf(str, "0x%02hhx", x); sprintf(str, "0x%02hhx", x);
insert((char const *)str); insert((char const *)str);
} }
char const* isoBufferBuffer::query(uint32_t count) const char const* isoBufferBuffer::query(uint32_t count) const
{ {
if (count > m_capacity) if (count > m_capacity)
qFatal("isoBufferBuffer::query : you may not request more items than the capacity of the buffer"); qFatal("isoBufferBuffer::query : you may not request more items than the capacity of the buffer");
if (count > m_size) if (count > m_size)
qFatal("isoBufferBuffer::query : you may not request more items than inserted"); qFatal("isoBufferBuffer::query : you may not request more items than inserted");
return end() - count; return end() - count;
} }
void isoBufferBuffer::clear() void isoBufferBuffer::clear()
{ {
m_top = 0; m_top = 0;
m_size = 0; m_size = 0;
} }
char const * isoBufferBuffer::begin() const char const * isoBufferBuffer::begin() const
{ {
return m_data.get() + m_top - m_size + m_capacity; return m_data.get() + m_top - m_size + m_capacity;
} }
char const * isoBufferBuffer::end() const char const * isoBufferBuffer::end() const
{ {
return m_data.get() + m_top + m_capacity; return m_data.get() + m_top + m_capacity;
} }
uint32_t isoBufferBuffer::size() const uint32_t isoBufferBuffer::size() const
{ {
return m_size; return m_size;
} }
uint32_t isoBufferBuffer::capacity() const uint32_t isoBufferBuffer::capacity() const
{ {
return m_capacity; return m_capacity;
} }

View File

@ -24,30 +24,30 @@
class isoBufferBuffer class isoBufferBuffer
{ {
public: public:
isoBufferBuffer(uint32_t length); isoBufferBuffer(uint32_t length);
~isoBufferBuffer() = default; ~isoBufferBuffer() = default;
void insert(char c); void insert(char c);
void insert(char const * s); void insert(char const * s);
void insert(std::string const & s); void insert(std::string const & s);
void insert_hex(uint8_t x); void insert_hex(uint8_t x);
char const * query(uint32_t length) const; char const * query(uint32_t length) const;
// TODO?: add ability to get a copy of the content // TODO?: add ability to get a copy of the content
// (e.g. return std::string or Qstring) // (e.g. return std::string or Qstring)
void clear(); void clear();
char const * begin() const; char const * begin() const;
char const * end() const; char const * end() const;
uint32_t size() const; uint32_t size() const;
uint32_t capacity() const; uint32_t capacity() const;
private: private:
std::unique_ptr<char[]> m_data; std::unique_ptr<char[]> m_data;
uint32_t m_capacity; uint32_t m_capacity;
uint32_t m_size = 0; uint32_t m_size = 0;
uint32_t m_top = 0; uint32_t m_top = 0;
}; };
#endif // ISOBUFFERBUFFER_H #endif // ISOBUFFERBUFFER_H

View File

@ -668,7 +668,7 @@ void isoDriver::frameActionGeneric(char CH1_mode, char CH2_mode)
double triggerDelay = 0; double triggerDelay = 0;
if (triggerEnabled) if (triggerEnabled)
{ {
isoBuffer* internalBuffer_CH1 = (CH1_mode == -1) ? internalBuffer750 : internalBuffer375_CH1; isoBuffer* internalBuffer_CH1 = (CH1_mode == -1) ? internalBuffer750 : internalBuffer375_CH1;
triggerDelay = (triggerMode < 2) ? internalBuffer_CH1->getDelayedTriggerPoint(display.window) - display.window : internalBuffer375_CH2->getDelayedTriggerPoint(display.window) - display.window; triggerDelay = (triggerMode < 2) ? internalBuffer_CH1->getDelayedTriggerPoint(display.window) - display.window : internalBuffer375_CH2->getDelayedTriggerPoint(display.window) - display.window;
if (triggerDelay < 0) if (triggerDelay < 0)
@ -1316,7 +1316,7 @@ double isoDriver::meanVoltageLast(double seconds, unsigned char channel, int TOP
break; break;
} }
std::unique_ptr<short[]> tempBuffer = currentBuffer->readBuffer(seconds, 1024, 0, 0); std::unique_ptr<short[]> tempBuffer = currentBuffer->readBuffer(seconds, 1024, 0, 0);
double sum = 0; double sum = 0;
double temp; double temp;
for(int i = 0; i<1024; i++){ for(int i = 0; i<1024; i++){
@ -1540,12 +1540,12 @@ void isoDriver::setSerialType(unsigned char type)
void isoDriver::hideCH1(bool enable) void isoDriver::hideCH1(bool enable)
{ {
axes->graph(0)->setVisible(!enable); axes->graph(0)->setVisible(!enable);
} }
void isoDriver::hideCH2(bool enable) void isoDriver::hideCH2(bool enable)
{ {
axes->graph(1)->setVisible(!enable); axes->graph(1)->setVisible(!enable);
} }
void isoDriver::triggerStateChanged() void isoDriver::triggerStateChanged()
@ -1658,4 +1658,3 @@ void isoDriver::setMaxSpectrum(int maxSpectrum)
{ {
m_spectrumMaxX = static_cast<double>(maxSpectrum); m_spectrumMaxX = static_cast<double>(maxSpectrum);
} }

View File

@ -140,9 +140,9 @@ private:
void triggerStateChanged(); void triggerStateChanged();
//Variables that are just pointers to other classes/vars //Variables that are just pointers to other classes/vars
QCustomPlot *axes; // TODO: move into DisplayControl QCustomPlot *axes; // TODO: move into DisplayControl
std::unique_ptr<short[]> readData375_CH1; std::unique_ptr<short[]> readData375_CH1;
std::unique_ptr<short[]> readData375_CH2; std::unique_ptr<short[]> readData375_CH2;
std::unique_ptr<short[]> readData750; std::unique_ptr<short[]> readData750;
float *readDataFile; float *readDataFile;
char *isoTemp = NULL; char *isoTemp = NULL;
short *isoTemp_short = NULL; short *isoTemp_short = NULL;
@ -280,8 +280,8 @@ public slots:
void fileTimerTick(); void fileTimerTick();
void enableFileMode(); void enableFileMode();
void disableFileMode(); void disableFileMode();
void hideCH1(bool enable); void hideCH1(bool enable);
void hideCH2(bool enable); void hideCH2(bool enable);
void offsetChanged_CH1(double newOffset); void offsetChanged_CH1(double newOffset);
void offsetChanged_CH2(double newOffset); void offsetChanged_CH2(double newOffset);
void attenuationChanged_CH1(int attenuationIndex); void attenuationChanged_CH1(int attenuationIndex);

View File

@ -151,10 +151,10 @@ MainWindow::MainWindow(QWidget *parent) :
connect(ui->controller_iso, SIGNAL(setGain(double)), ui->controller_iso->driver, SLOT(setGain(double))); connect(ui->controller_iso, SIGNAL(setGain(double)), ui->controller_iso->driver, SLOT(setGain(double)));
connect(ui->controller_fg, &functionGenControl::functionGenToUpdate, ui->controller_iso->driver, &genericUsbDriver::setFunctionGen); connect(ui->controller_fg, &functionGenControl::functionGenToUpdate, ui->controller_iso->driver, &genericUsbDriver::setFunctionGen);
connect(ui->bufferDisplay, SIGNAL(modeChange(int)), ui->controller_iso->driver, SLOT(setDeviceMode(int))); connect(ui->bufferDisplay, SIGNAL(modeChange(int)), ui->controller_iso->driver, SLOT(setDeviceMode(int)));
connect(ui->bufferDisplay, &bufferControl::modeChange, this, [this](){ connect(ui->bufferDisplay, &bufferControl::modeChange, this, [this](){
// Force a trigger refresh // Force a trigger refresh
ui->controller_iso->setTriggerLevel(ui->triggerLevelValue->value()); ui->controller_iso->setTriggerLevel(ui->triggerLevelValue->value());
}); });
connect(ui->bufferDisplay, SIGNAL(updateDig(int)), ui->controller_iso->driver, SLOT(newDig(int))); connect(ui->bufferDisplay, SIGNAL(updateDig(int)), ui->controller_iso->driver, SLOT(newDig(int)));
//Set the settings again! //Set the settings again!
@ -223,8 +223,8 @@ MainWindow::MainWindow(QWidget *parent) :
connect(ui->actionHexDisplay, &QAction::toggled, ui->controller_iso, &isoDriver::setHexDisplay_CH1); connect(ui->actionHexDisplay, &QAction::toggled, ui->controller_iso, &isoDriver::setHexDisplay_CH1);
connect(ui->actionHexDisplay_2, &QAction::toggled, ui->controller_iso, &isoDriver::setHexDisplay_CH2); connect(ui->actionHexDisplay_2, &QAction::toggled, ui->controller_iso, &isoDriver::setHexDisplay_CH2);
ui->hideCH1Box->setVisible(false); ui->hideCH1Box->setVisible(false);
ui->hideCH2Box->setVisible(false); ui->hideCH2Box->setVisible(false);
#endif #endif
ui->realTimeButton->setVisible(false); ui->realTimeButton->setVisible(false);
@ -1380,10 +1380,10 @@ void MainWindow::reinitUsbStage2(void){
connect(ui->controller_iso, SIGNAL(setGain(double)), ui->controller_iso->driver, SLOT(setGain(double))); connect(ui->controller_iso, SIGNAL(setGain(double)), ui->controller_iso->driver, SLOT(setGain(double)));
connect(ui->controller_fg, &functionGenControl::functionGenToUpdate, ui->controller_iso->driver, &genericUsbDriver::setFunctionGen); connect(ui->controller_fg, &functionGenControl::functionGenToUpdate, ui->controller_iso->driver, &genericUsbDriver::setFunctionGen);
connect(ui->bufferDisplay, SIGNAL(modeChange(int)), ui->controller_iso->driver, SLOT(setDeviceMode(int))); connect(ui->bufferDisplay, SIGNAL(modeChange(int)), ui->controller_iso->driver, SLOT(setDeviceMode(int)));
connect(ui->bufferDisplay, &bufferControl::modeChange, this, [this](){ connect(ui->bufferDisplay, &bufferControl::modeChange, this, [this](){
// Force a trigger refresh // Force a trigger refresh
ui->controller_iso->setTriggerLevel(ui->triggerLevelValue->value()); ui->controller_iso->setTriggerLevel(ui->triggerLevelValue->value());
}); });
connect(ui->bufferDisplay, SIGNAL(updateDig(int)), ui->controller_iso->driver, SLOT(newDig(int))); connect(ui->bufferDisplay, SIGNAL(updateDig(int)), ui->controller_iso->driver, SLOT(newDig(int)));
//Set the settings again! //Set the settings again!
@ -1411,7 +1411,7 @@ void MainWindow::reinitUsbStage2(void){
} }
void MainWindow::resetUsbState(void){ void MainWindow::resetUsbState(void){
using functionGen::ChannelID; using functionGen::ChannelID;
//ui->controller_iso->driver->setDeviceMode(deviceMode); //ui->controller_iso->driver->setDeviceMode(deviceMode);
//ui->controller_iso->driver->setPsu(currentPsuVoltage); //ui->controller_iso->driver->setPsu(currentPsuVoltage);
ui->psuSlider->poke(); ui->psuSlider->poke();
@ -2402,15 +2402,15 @@ void MainWindow::on_actionShow_Range_Dialog_on_Main_Page_triggered(bool checked)
void MainWindow::paused(bool enabled) void MainWindow::paused(bool enabled)
{ {
#ifndef PLATFORM_ANDROID #ifndef PLATFORM_ANDROID
qDebug() << "MainWindow::paused(" << enabled << ")"; qDebug() << "MainWindow::paused(" << enabled << ")";
ui->hideCH1Box->setVisible(enabled); ui->hideCH1Box->setVisible(enabled);
ui->hideCH2Box->setVisible(enabled); ui->hideCH2Box->setVisible(enabled);
if (! enabled) if (! enabled)
{ {
ui->hideCH1Box->setChecked(false); ui->hideCH1Box->setChecked(false);
ui->hideCH2Box->setChecked(false); ui->hideCH2Box->setChecked(false);
} }
#endif #endif
} }
@ -2473,7 +2473,6 @@ void MainWindow::cursorGroupEnabled(bool enabled)
ui->makeCursorsNicer->setTurnedOn(false); ui->makeCursorsNicer->setTurnedOn(false);
ui->cursorGroup->setEnabled(false); ui->cursorGroup->setEnabled(false);
} }
} }
void MainWindow::on_actionHide_Widget_Oscilloscope_triggered(bool checked) void MainWindow::on_actionHide_Widget_Oscilloscope_triggered(bool checked)

View File

@ -193,7 +193,7 @@ private slots:
void on_actionShow_Range_Dialog_on_Main_Page_triggered(bool checked); void on_actionShow_Range_Dialog_on_Main_Page_triggered(bool checked);
void paused(bool enabled); void paused(bool enabled);
void on_actionNone_triggered(); void on_actionNone_triggered();
@ -246,7 +246,7 @@ private:
int reinitDigitalPinState; int reinitDigitalPinState;
QSettings *settings; QSettings *settings;
bool calibrationCanceled = false; bool calibrationCanceled = false;
QPalette defaultPalette; QPalette defaultPalette;
QString defaultStyleName; QString defaultStyleName;

View File

@ -16,10 +16,10 @@ scopeRangeEnterDialog::scopeRangeEnterDialog(QWidget *parent, bool buttonVisible
ui->buttonBox->setVisible(buttonVisible); ui->buttonBox->setVisible(buttonVisible);
for (espoSpinBox* spinBox : {ui->vMaxBox, ui->vMinBox, ui->timeWindowBox, ui->delayBox}) for (espoSpinBox* spinBox : {ui->vMaxBox, ui->vMinBox, ui->timeWindowBox, ui->delayBox})
{ {
spinBox->changeStepping(spinBox->value()); spinBox->changeStepping(spinBox->value());
connect(spinBox, SIGNAL(valueChanged(double)), spinBox, SLOT(changeStepping(double))); connect(spinBox, SIGNAL(valueChanged(double)), spinBox, SLOT(changeStepping(double)));
} }
} }
scopeRangeEnterDialog::~scopeRangeEnterDialog() scopeRangeEnterDialog::~scopeRangeEnterDialog()
@ -90,4 +90,3 @@ void scopeRangeEnterDialog::delayChanged(double val)
{ {
ui->delayBox->setValue(val); ui->delayBox->setValue(val);
} }

View File

@ -3,37 +3,37 @@
#include <cassert> #include <cassert>
uartStyleDecoder::uartStyleDecoder(double baudRate, QObject *parent) uartStyleDecoder::uartStyleDecoder(double baudRate, QObject *parent)
: QObject(parent) : QObject(parent)
, m_parent{static_cast<isoBuffer*>(parent)} , m_parent{static_cast<isoBuffer*>(parent)}
, m_serialBuffer{SERIAL_BUFFER_LENGTH} , m_serialBuffer{SERIAL_BUFFER_LENGTH}
, m_baudRate{baudRate} , m_baudRate{baudRate}
{ {
// Begin decoding SAMPLE_DELAY seconds in the past. // Begin decoding SAMPLE_DELAY seconds in the past.
serialPtr_bit = (int)(m_parent->m_back * 8 - SERIAL_DELAY * m_parent->m_sampleRate_bit + m_parent->m_bufferLen * 8) % (m_parent->m_bufferLen*8); serialPtr_bit = (int)(m_parent->m_back * 8 - SERIAL_DELAY * m_parent->m_sampleRate_bit + m_parent->m_bufferLen * 8) % (m_parent->m_bufferLen*8);
m_updateTimer.setTimerType(Qt::PreciseTimer); m_updateTimer.setTimerType(Qt::PreciseTimer);
m_updateTimer.start(CONSOLE_UPDATE_TIMER_PERIOD); m_updateTimer.start(CONSOLE_UPDATE_TIMER_PERIOD);
connect(&m_updateTimer, &QTimer::timeout, this, &uartStyleDecoder::updateConsole); connect(&m_updateTimer, &QTimer::timeout, this, &uartStyleDecoder::updateConsole);
if (m_parent->m_channel == 1) if (m_parent->m_channel == 1)
console = m_parent->m_console1; console = m_parent->m_console1;
else if (m_parent->m_channel == 2) else if (m_parent->m_channel == 2)
console = m_parent->m_console2; console = m_parent->m_console2;
else else
qFatal("Nonexistant console requested in uartStyleDecoder::serialDecode"); qFatal("Nonexistant console requested in uartStyleDecoder::serialDecode");
} }
void uartStyleDecoder::updateConsole() void uartStyleDecoder::updateConsole()
{ {
if (!newUartSymbol) if (!newUartSymbol)
return; return;
std::lock_guard<std::mutex> lock(mutex); std::lock_guard<std::mutex> lock(mutex);
console->setPlainText(QString::fromLocal8Bit(m_serialBuffer.begin(), m_serialBuffer.size())); console->setPlainText(QString::fromLocal8Bit(m_serialBuffer.begin(), m_serialBuffer.size()));
if (m_parent->m_serialAutoScroll) if (m_parent->m_serialAutoScroll)
{ {
//http://stackoverflow.com/questions/21059678/how-can-i-set-auto-scroll-for-a-qtgui-qtextedit-in-pyqt4 DANKON //http://stackoverflow.com/questions/21059678/how-can-i-set-auto-scroll-for-a-qtgui-qtextedit-in-pyqt4 DANKON
QTextCursor c = console->textCursor(); QTextCursor c = console->textCursor();
c.movePosition(QTextCursor::End); c.movePosition(QTextCursor::End);
@ -53,7 +53,7 @@ void uartStyleDecoder::serialDecode()
bool allZeroes = true; bool allZeroes = true;
while(dist_seconds > (bitPeriod_seconds + SERIAL_DELAY)) while(dist_seconds > (bitPeriod_seconds + SERIAL_DELAY))
{ {
// Read next uart bit // Read next uart bit
bool uart_bit = getNextUartBit(); bool uart_bit = getNextUartBit();
@ -67,7 +67,7 @@ void uartStyleDecoder::serialDecode()
} }
else else
{ {
// Uart starts transmitting after start bit (logic low). // Uart starts transmitting after start bit (logic low).
uartTransmitting = uart_bit == false; uartTransmitting = uart_bit == false;
jitterCompensationNeeded = true; jitterCompensationNeeded = true;
} }
@ -80,7 +80,7 @@ void uartStyleDecoder::serialDecode()
//Not a single stop bit, or idle bit, in the whole stream. Wire must be disconnected. //Not a single stop bit, or idle bit, in the whole stream. Wire must be disconnected.
if (allZeroes) if (allZeroes)
{ {
qDebug() << "Wire Disconnect detected!"; qDebug() << "Wire Disconnect detected!";
wireDisconnected(m_parent->m_channel); wireDisconnected(m_parent->m_channel);
m_parent->m_isDecoding = false; m_parent->m_isDecoding = false;
@ -95,7 +95,7 @@ int uartStyleDecoder::serialDistance() const
if (back_bit >= serialPtr_bit) if (back_bit >= serialPtr_bit)
return back_bit - serialPtr_bit; return back_bit - serialPtr_bit;
else else
return bufferEnd_bit - serialPtr_bit + back_bit; return bufferEnd_bit - serialPtr_bit + back_bit;
} }
void uartStyleDecoder::updateSerialPtr(bool current_bit) void uartStyleDecoder::updateSerialPtr(bool current_bit)
@ -106,8 +106,8 @@ void uartStyleDecoder::updateSerialPtr(bool current_bit)
int distance_between_bits = (m_parent->m_sampleRate_bit)/ m_baudRate; int distance_between_bits = (m_parent->m_sampleRate_bit)/ m_baudRate;
if (uartTransmitting) if (uartTransmitting)
serialPtr_bit += distance_between_bits; serialPtr_bit += distance_between_bits;
else else
serialPtr_bit += (distance_between_bits - 1); //Less than one baud period so that it will always see that start bit. serialPtr_bit += (distance_between_bits - 1); //Less than one baud period so that it will always see that start bit.
if (serialPtr_bit >= (m_parent->m_bufferLen * 8)) if (serialPtr_bit >= (m_parent->m_bufferLen * 8))
serialPtr_bit -= (m_parent->m_bufferLen * 8); serialPtr_bit -= (m_parent->m_bufferLen * 8);
@ -115,7 +115,7 @@ void uartStyleDecoder::updateSerialPtr(bool current_bit)
bool uartStyleDecoder::getNextUartBit() const bool uartStyleDecoder::getNextUartBit() const
{ {
int bitIndex = serialPtr_bit; int bitIndex = serialPtr_bit;
int coord_byte = bitIndex/8; int coord_byte = bitIndex/8;
int coord_bit = bitIndex - (8*coord_byte); int coord_bit = bitIndex - (8*coord_byte);
@ -140,11 +140,11 @@ void uartStyleDecoder::decodeNextUartBit(bool bitValue)
{ {
char decodedDatabit = decodeDatabit(dataBit_max + 1, currentUartSymbol); char decodedDatabit = decodeDatabit(dataBit_max + 1, currentUartSymbol);
if (parityCheckFailed) if (parityCheckFailed)
{ {
m_serialBuffer.insert("\n<ERROR: Following character contains parity error>\n"); m_serialBuffer.insert("\n<ERROR: Following character contains parity error>\n");
parityCheckFailed = false; parityCheckFailed = false;
} }
if (m_hexDisplay) if (m_hexDisplay)
{ {
@ -183,11 +183,11 @@ bool uartStyleDecoder::jitterCompensationProcedure(bool current_bit)
uint8_t left_byte = (m_parent->m_buffer[left_coord/8] & 0xff); uint8_t left_byte = (m_parent->m_buffer[left_coord/8] & 0xff);
//Only run when a zero is detected in the leftmost symbol. //Only run when a zero is detected in the leftmost symbol.
if (left_byte != 0xff) if (left_byte != 0xff)
{ {
//Step back, one sample at a time, to the 0->1 transition point //Step back, one sample at a time, to the 0->1 transition point
bool temp_bit = 1; bool temp_bit = 1;
while(temp_bit) while(temp_bit)
{ {
temp_bit = getNextUartBit(); temp_bit = getNextUartBit();
serialPtr_bit--; serialPtr_bit--;
} }
@ -203,7 +203,7 @@ bool uartStyleDecoder::jitterCompensationProcedure(bool current_bit)
char uartStyleDecoder::decodeDatabit(int mode, short symbol) const char uartStyleDecoder::decodeDatabit(int mode, short symbol) const
{ {
switch(mode) switch(mode)
{ {
case 5: case 5:
return decodeBaudot(symbol); return decodeBaudot(symbol);
break; break;
@ -212,7 +212,7 @@ char uartStyleDecoder::decodeDatabit(int mode, short symbol) const
break; break;
default: default:
qDebug() << "uartStyleDecoder::decodeDatabit is failing..."; qDebug() << "uartStyleDecoder::decodeDatabit is failing...";
return -1; // Garbage return -1; // Garbage
} }
} }
@ -243,18 +243,17 @@ void uartStyleDecoder::setHexDisplay(bool enabled)
bool uartStyleDecoder::isParityCorrect(uint32_t bitField) const bool uartStyleDecoder::isParityCorrect(uint32_t bitField) const
{ {
assert(parity != UartParity::None); assert(parity != UartParity::None);
return parityOf(bitField) == parity; return parityOf(bitField) == parity;
} }
UartParity uartStyleDecoder::parityOf(uint32_t bitField) const UartParity uartStyleDecoder::parityOf(uint32_t bitField) const
{ {
bool result = false; bool result = false;
for (uint32_t mask = 1 << (dataBit_max-1); mask != 0; mask >>= 1) for (uint32_t mask = 1 << (dataBit_max-1); mask != 0; mask >>= 1)
result ^= static_cast<bool>(bitField & mask); result ^= static_cast<bool>(bitField & mask);
return result ? UartParity::Odd : UartParity::Even; return result ? UartParity::Odd : UartParity::Even;
} }

View File

@ -20,13 +20,13 @@ class uartStyleDecoder : public QObject
Q_OBJECT Q_OBJECT
public: public:
explicit uartStyleDecoder(double baudRate, QObject *parent = NULL); explicit uartStyleDecoder(double baudRate, QObject *parent = NULL);
~uartStyleDecoder() = default; ~uartStyleDecoder() = default;
private: private:
isoBuffer *m_parent; isoBuffer *m_parent;
// Indicates the current bit being decoded. // Indicates the current bit being decoded.
int serialPtr_bit; int serialPtr_bit;
bool uartTransmitting = false; bool uartTransmitting = false;
@ -47,7 +47,7 @@ private:
QPlainTextEdit *console; QPlainTextEdit *console;
isoBufferBuffer m_serialBuffer; isoBufferBuffer m_serialBuffer;
public: public:
double m_baudRate; double m_baudRate;
QTimer m_updateTimer; // IMPORTANT: must be after m_serialBuffer. construction / destruction order matters QTimer m_updateTimer; // IMPORTANT: must be after m_serialBuffer. construction / destruction order matters
void serialDecode(); void serialDecode();
int serialDistance() const; int serialDistance() const;
@ -64,11 +64,11 @@ private:
char decodeDatabit(int mode, short symbol) const; char decodeDatabit(int mode, short symbol) const;
char decodeBaudot(short symbol) const; char decodeBaudot(short symbol) const;
std::mutex mutex; std::mutex mutex;
UartParity parity = UartParity::None; UartParity parity = UartParity::None;
bool isParityCorrect(uint32_t bitField) const; bool isParityCorrect(uint32_t bitField) const;
UartParity parityOf(uint32_t bitField) const; UartParity parityOf(uint32_t bitField) const;
bool parityCheckFailed = false; bool parityCheckFailed = false;

View File

@ -254,4 +254,3 @@ void bufferControl::poke(void){
updateMode(); updateMode();
updateBuffer(0,0); updateBuffer(0,0);
} }

View File

@ -103,4 +103,3 @@ void espoSlider::poke(void){
//qDebug() << "Refreshing to voltage" << ((double) (this->value())) / 20; //qDebug() << "Refreshing to voltage" << ((double) (this->value())) / 20;
voltageChanged(((double) (this->value())) / 20); voltageChanged(((double) (this->value())) / 20);
} }

View File

@ -2,43 +2,43 @@
espoSpinBox::espoSpinBox(QWidget *parent) : QDoubleSpinBox(parent) espoSpinBox::espoSpinBox(QWidget *parent) : QDoubleSpinBox(parent)
{ {
setKeyboardTracking(false); setKeyboardTracking(false);
//connect(this, SIGNAL(valueChanged(double)), this, SLOT(changeStepping(double))); //connect(this, SIGNAL(valueChanged(double)), this, SLOT(changeStepping(double)));
} }
QString espoSpinBox::textFromValue(double value) const{ QString espoSpinBox::textFromValue(double value) const{
QString windowText; QString windowText;
double approximatelyZero = pow(10, -1 * (decimals() + 1)); double approximatelyZero = pow(10, -1 * (decimals() + 1));
if (abs(value) <= approximatelyZero){ if (abs(value) <= approximatelyZero){
QTextStream(&windowText) << 0; QTextStream(&windowText) << 0;
lastValidValue = 0; lastValidValue = 0;
return windowText; return windowText;
} }
if (abs(value) >= 1000000){ if (abs(value) >= 1000000){
QTextStream(&windowText) << value/1000000 << "M"; QTextStream(&windowText) << value/1000000 << "M";
lastValidValue = value; lastValidValue = value;
return windowText; return windowText;
} }
if (abs(value) >= 1000){ if (abs(value) >= 1000){
QTextStream(&windowText) << value/1000 << "k"; QTextStream(&windowText) << value/1000 << "k";
lastValidValue = value; lastValidValue = value;
return windowText; return windowText;
} }
if (abs(value) >= 1){ if (abs(value) >= 1){
QTextStream(&windowText) << value; QTextStream(&windowText) << value;
lastValidValue = value; lastValidValue = value;
return windowText; return windowText;
} }
if (abs(value) >= 1/1000){ if (abs(value) >= 1/1000){
QTextStream(&windowText) << value * 1000 << "m"; QTextStream(&windowText) << value * 1000 << "m";
lastValidValue = value; lastValidValue = value;
return windowText; return windowText;
} }
if (abs(value) >= 1/1000000){ if (abs(value) >= 1/1000000){
QTextStream(&windowText) << value * 1000000 << "u"; QTextStream(&windowText) << value * 1000000 << "u";
lastValidValue = value; lastValidValue = value;
return windowText; return windowText;
} }
return "invalid"; return "invalid";
@ -58,53 +58,53 @@ void espoSpinBox::setMin(double newMin){
void espoSpinBox::changeStepping(double value){ void espoSpinBox::changeStepping(double value){
double roundval = pow(10.0, floor(log10(abs(value)))); //http://stackoverflow.com/questions/22491505/how-to-round-down-to-the-nearest-power-of-10 double roundval = pow(10.0, floor(log10(abs(value)))); //http://stackoverflow.com/questions/22491505/how-to-round-down-to-the-nearest-power-of-10
double minimumStepSize = pow(10, -1 * decimals()); double minimumStepSize = pow(10, -1 * decimals());
setSingleStep(std::max(minimumStepSize, roundval/10)); setSingleStep(std::max(minimumStepSize, roundval/10));
} }
QValidator::State espoSpinBox::validate(QString& text, int& pos) const QValidator::State espoSpinBox::validate(QString& text, int& pos) const
{ {
return QValidator::State::Acceptable; return QValidator::State::Acceptable;
} }
double espoSpinBox::valueFromText(const QString &text) const double espoSpinBox::valueFromText(const QString &text) const
{ {
double ret; double ret;
bool isValid; bool isValid;
uint32_t prefixLength = text.length() - suffix().length(); uint32_t prefixLength = text.length() - suffix().length();
qDebug() << text.mid(0, prefixLength - 1) << text.at(prefixLength - 1).toLatin1(); qDebug() << text.mid(0, prefixLength - 1) << text.at(prefixLength - 1).toLatin1();
switch (text.at(prefixLength - 1).toLatin1()) switch (text.at(prefixLength - 1).toLatin1())
{ {
case 'M': case 'M':
ret = text.mid(0, prefixLength - 1).toDouble(&isValid) * 1000000; ret = text.mid(0, prefixLength - 1).toDouble(&isValid) * 1000000;
break; break;
case 'k': case 'k':
ret = text.mid(0, prefixLength - 1).toDouble(&isValid) * 1000; ret = text.mid(0, prefixLength - 1).toDouble(&isValid) * 1000;
break; break;
case 'm': case 'm':
ret = text.mid(0, prefixLength - 1).toDouble(&isValid) / 1000; ret = text.mid(0, prefixLength - 1).toDouble(&isValid) / 1000;
break; break;
case 'u': case 'u':
ret = text.mid(0, prefixLength - 1).toDouble(&isValid) / 1000000; ret = text.mid(0, prefixLength - 1).toDouble(&isValid) / 1000000;
break; break;
default: default:
ret = text.mid(0, prefixLength).toDouble(&isValid); ret = text.mid(0, prefixLength).toDouble(&isValid);
} }
if (isValid) if (isValid)
{ {
return ret; return ret;
} }
else else
{ {
qDebug() << "espoSpinBox: warning: invalid text input." << "Defaulting to last known good value of" << lastValidValue; qDebug() << "espoSpinBox: warning: invalid text input." << "Defaulting to last known good value of" << lastValidValue;
return lastValidValue; return lastValidValue;
} }
} }

View File

@ -15,11 +15,11 @@ class espoSpinBox : public QDoubleSpinBox
Q_OBJECT Q_OBJECT
public: public:
explicit espoSpinBox(QWidget *parent = 0); explicit espoSpinBox(QWidget *parent = 0);
QValidator::State validate(QString& text, int& pos) const override; QValidator::State validate(QString& text, int& pos) const override;
private: private:
QString textFromValue(double value) const override; QString textFromValue(double value) const override;
double valueFromText(const QString &text) const override; double valueFromText(const QString &text) const override;
mutable double lastValidValue = -1; mutable double lastValidValue = -1;
signals: signals:
public slots: public slots:

View File

@ -57,4 +57,3 @@ void swipeyStack::cycleStack(int delta){
void swipeyStack::enableWrapping(bool enabled){ void swipeyStack::enableWrapping(bool enabled){
wrapEnabled = enabled; wrapEnabled = enabled;
} }

View File

@ -20,24 +20,24 @@ unixUsbDriver::~unixUsbDriver(void){
qDebug() << "\n\nunixUsbDriver destructor ran!"; qDebug() << "\n\nunixUsbDriver destructor ran!";
//unixDriverDeleteMutex.lock(); //unixDriverDeleteMutex.lock();
if(connected){ if(connected){
if (workerThread) if (workerThread)
{ {
workerThread->deleteLater(); workerThread->deleteLater();
while(workerThread->isRunning()){ while(workerThread->isRunning()){
workerThread->quit(); workerThread->quit();
qDebug() << "isRunning?" << workerThread->isFinished(); qDebug() << "isRunning?" << workerThread->isFinished();
QThread::msleep(100); QThread::msleep(100);
} }
} }
if (isoHandler) if (isoHandler)
delete(isoHandler); delete(isoHandler);
//delete(workerThread); //delete(workerThread);
qDebug() << "THREAD Gone!"; qDebug() << "THREAD Gone!";
for (int i=0; i<NUM_FUTURE_CTX; i++){ for (int i=0; i<NUM_FUTURE_CTX; i++){
for (int k=0; k<NUM_ISO_ENDPOINTS; k++){ for (int k=0; k<NUM_ISO_ENDPOINTS; k++){
if (isoCtx[k][i]) if (isoCtx[k][i])
libusb_free_transfer(isoCtx[k][i]); libusb_free_transfer(isoCtx[k][i]);
} }
} }
qDebug() << "Transfers freed."; qDebug() << "Transfers freed.";
@ -160,7 +160,7 @@ int unixUsbDriver::usbIsoInit(void){
if(error){ if(error){
qDebug() << "libusb_submit_transfer FAILED"; qDebug() << "libusb_submit_transfer FAILED";
qDebug() << "ERROR" << libusb_error_name(error); qDebug() << "ERROR" << libusb_error_name(error);
return -1; return -1;
} else { } else {
if(n == 0){ if(n == 0){
qint64 t0; qint64 t0;
@ -334,8 +334,8 @@ void unixUsbDriver::shutdownProcedure(){
//On physical disconnect, isoTimerTick will not assert stopTime. Hence this duct-tape function. //On physical disconnect, isoTimerTick will not assert stopTime. Hence this duct-tape function.
void unixUsbDriver::backupCleanup(){ void unixUsbDriver::backupCleanup(){
if (isoHandler) if (isoHandler)
isoHandler->stopTime = true; isoHandler->stopTime = true;
} }
int unixUsbDriver::flashFirmware(void){ int unixUsbDriver::flashFirmware(void){

View File

@ -42,7 +42,7 @@ unsigned char winUsbDriver::usbInit(unsigned long VIDin, unsigned long PIDin){
KLST_HANDLE deviceList = NULL; KLST_HANDLE deviceList = NULL;
//List libusbk devices connected //List libusbk devices connected
if (!LstK_Init(&deviceList, (KLST_FLAG) 0)) { if (!LstK_Init(&deviceList, (KLST_FLAG) 0)) {
qDebug("Error initializing device list"); qDebug("Error initializing device list");
return 1; return 1;
} //else qDebug() << "Device List initialised!"; } //else qDebug() << "Device List initialised!";
@ -51,7 +51,7 @@ unsigned char winUsbDriver::usbInit(unsigned long VIDin, unsigned long PIDin){
LstK_Count(deviceList, &deviceCount); LstK_Count(deviceList, &deviceCount);
if (!deviceCount) { if (!deviceCount) {
qDebug("Device list empty"); qDebug("Device list empty");
LstK_Free(deviceList); // If LstK_Init returns TRUE, the list must be freed. LstK_Free(deviceList); // If LstK_Init returns TRUE, the list must be freed.
return 0; return 0;
} //else qDebug() << "Device Count initialised!"; } //else qDebug() << "Device Count initialised!";
*/ */