From b34c025a5019e29343993018a392045d3542ee4b Mon Sep 17 00:00:00 2001 From: Jannis Achstetter Date: Fri, 11 Apr 2014 17:19:55 +0200 Subject: [PATCH 01/14] Add DMX KeyPad with UI to SimpleDesk --- ui/src/dmxkeypad.cpp | 104 ++++++++++++++++++++++++++++++++++++++++++ ui/src/dmxkeypad.h | 37 +++++++++++++++ ui/src/simpledesk.cpp | 11 ++++- ui/src/simpledesk.h | 4 ++ ui/src/src.pro | 4 +- 5 files changed, 157 insertions(+), 3 deletions(-) create mode 100644 ui/src/dmxkeypad.cpp create mode 100644 ui/src/dmxkeypad.h diff --git a/ui/src/dmxkeypad.cpp b/ui/src/dmxkeypad.cpp new file mode 100644 index 0000000000..86998f3a6e --- /dev/null +++ b/ui/src/dmxkeypad.cpp @@ -0,0 +1,104 @@ +#include "dmxkeypad.h" + +#define DMXKEYPAD_BUTTON_SIZE 40 + +DmxKeyPad::DmxKeyPad(QWidget *parent) : + QWidget(parent) +{ + setupUi(); + + m_KPSelectedChannels = new QList(); + m_KPStateMachine = new QStateMachine(this); + m_KPState_Init = new QState(); + m_KPState_Channel = new QState(); + m_KPState_Value = new QState(); + m_KPStateMachine->setInitialState(m_KPState_Init); + m_KPStateMachine->start(); +} + +void DmxKeyPad::setupUi() +{ + lay = new QGridLayout(this); + lay->setContentsMargins(1, 1, 1, 1); + this->setFixedWidth(3 * DMXKEYPAD_BUTTON_SIZE + 15); + + this->setLayout(lay); + + QLineEdit* kP_commandDisplay = new QLineEdit(this); + kP_commandDisplay->setEnabled(false); + kP_commandDisplay->setReadOnly(true); + lay->addWidget(kP_commandDisplay, 0, 0, 1, 3); + + QPushButton* kP_7 = new QPushButton(this); + kP_7->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); + kP_7->setText("7"); + lay->addWidget(kP_7, 1, 0); + QPushButton* kP_8 = new QPushButton(this); + kP_8->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); + kP_8->setText("8"); + lay->addWidget(kP_8, 1, 1); + QPushButton* kP_9 = new QPushButton(this); + kP_9->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); + kP_9->setText("9"); + lay->addWidget(kP_9, 1, 2); + QPushButton* kP_4 = new QPushButton(this); + kP_4->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); + kP_4->setText("4"); + lay->addWidget(kP_4, 2, 0); + QPushButton* kP_5 = new QPushButton(this); + kP_5->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); + kP_5->setText("5"); + lay->addWidget(kP_5, 2, 1); + QPushButton* kP_6 = new QPushButton(this); + kP_6->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); + kP_6->setText("6"); + lay->addWidget(kP_6, 2, 2); + QPushButton* kP_1 = new QPushButton(this); + kP_1->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); + kP_1->setText("1"); + lay->addWidget(kP_1, 3, 0); + QPushButton* kP_2 = new QPushButton(this); + kP_2->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); + kP_2->setText("2"); + lay->addWidget(kP_2, 3, 1); + QPushButton* kP_3 = new QPushButton(this); + kP_3->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); + kP_3->setText("3"); + lay->addWidget(kP_3, 3, 2); + QPushButton* kP_0 = new QPushButton(this); + kP_0->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); + kP_0->setText("0"); + lay->addWidget(kP_0, 5, 0); + QPushButton* kP_CLR = new QPushButton(this); + kP_CLR->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); + kP_CLR->setText("CLR"); + lay->addWidget(kP_CLR, 5, 1); + QPushButton* kP_AT = new QPushButton(this); + kP_AT->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); + kP_AT->setText("AT"); + lay->addWidget(kP_AT, 5, 2); + QPushButton* kP_MINUS = new QPushButton(this); + kP_MINUS->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); + kP_MINUS->setText("-"); + lay->addWidget(kP_MINUS, 6, 0); + QPushButton* kP_THRU = new QPushButton(this); + kP_THRU->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); + kP_THRU->setText("THRU"); + lay->addWidget(kP_THRU, 6, 1); + QPushButton* kP_PLUS = new QPushButton(this); + kP_PLUS->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); + kP_PLUS->setText("+"); + lay->addWidget(kP_PLUS, 6, 2); + QPushButton* kP_BY = new QPushButton(this); + kP_BY->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); + kP_BY->setText("BY"); + lay->addWidget(kP_BY, 7, 0); + QPushButton* kP_FULL = new QPushButton(this); + kP_FULL->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); + kP_FULL->setText("FULL"); + lay->addWidget(kP_FULL, 7, 1); + QPushButton* kP_ENTER = new QPushButton(this); + kP_ENTER->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); + kP_ENTER->setText("ENTER"); + lay->addWidget(kP_ENTER, 7, 2); +} diff --git a/ui/src/dmxkeypad.h b/ui/src/dmxkeypad.h new file mode 100644 index 0000000000..bbf761f3f4 --- /dev/null +++ b/ui/src/dmxkeypad.h @@ -0,0 +1,37 @@ +#ifndef DMXKEYPAD_H +#define DMXKEYPAD_H + +#include +#include +#include +#include +#include +#include + +class DmxKeyPad : public QWidget +{ + Q_OBJECT +public: + explicit DmxKeyPad(QWidget *parent = 0); + +private: + QList* m_KPSelectedChannels; + QStateMachine* m_KPStateMachine; + QState* m_KPState_Init; // Clear string, reset List of channels to modify (but do NOT reset universe) + QState* m_KPState_Channel; // Wait for channel(range) specification + QState* m_KPState_Value; // Wait for value(range) specification + + QGridLayout* lay; + + void setupUi(); + +private slots: + //void KP_clear(); + +signals: + +public slots: + +}; + +#endif // DMXKEYPAD_H diff --git a/ui/src/simpledesk.cpp b/ui/src/simpledesk.cpp index 838178b2e4..6f887bef0e 100644 --- a/ui/src/simpledesk.cpp +++ b/ui/src/simpledesk.cpp @@ -34,6 +34,7 @@ #include #include +#include "dmxkeypad.h" #include "grandmasterslider.h" #include "simpledeskengine.h" #include "speeddialwidget.h" @@ -187,10 +188,16 @@ void SimpleDesk::initView() void SimpleDesk::initTopSide() { - QWidget* topSide = new QWidget(this); + m_topSplitter = new QSplitter(this); + m_splitter->addWidget(m_topSplitter); + + QWidget* topSide = new QWidget(m_topSplitter); QVBoxLayout* lay = new QVBoxLayout(topSide); lay->setContentsMargins(1, 1, 1, 1); - m_splitter->addWidget(topSide); + m_topSplitter->addWidget(topSide); + + DmxKeyPad* keyPad = new DmxKeyPad(m_topSplitter); + m_topSplitter->addWidget(keyPad); QHBoxLayout* uniLay = new QHBoxLayout; uniLay->setContentsMargins(1, 1, 1, 1); diff --git a/ui/src/simpledesk.h b/ui/src/simpledesk.h index 2c094981c2..d1a27a0bd9 100644 --- a/ui/src/simpledesk.h +++ b/ui/src/simpledesk.h @@ -27,6 +27,7 @@ #include #include +class DmxKeyPad; class GrandMasterSlider; class SimpleDeskEngine; class SpeedDialWidget; @@ -114,6 +115,9 @@ private slots: void slotUniversesWritten(int idx, const QByteArray& ua); private: + QSplitter* m_topSplitter; + + QGroupBox* m_universeGroup; QComboBox* m_universesCombo; QToolButton* m_viewModeButton; diff --git a/ui/src/src.pro b/ui/src/src.pro index 187bafa0bd..bfe2c9c46f 100644 --- a/ui/src/src.pro +++ b/ui/src/src.pro @@ -60,6 +60,7 @@ HEADERS += aboutbox.h \ cuestackmodel.h \ docbrowser.h \ dmxdumpfactory.h \ + dmxkeypad.h \ efxeditor.h \ efxpreviewarea.h \ fixtureconsole.h \ @@ -199,6 +200,7 @@ SOURCES += aboutbox.cpp \ cuestackmodel.cpp \ docbrowser.cpp \ dmxdumpfactory.cpp \ + dmxkeypad.cpp \ efxeditor.cpp \ efxpreviewarea.cpp \ fixtureconsole.cpp \ @@ -271,7 +273,7 @@ SOURCES += aboutbox.cpp \ vcxypadfixtureeditor.cpp \ vcxypadproperties.cpp \ virtualconsole.cpp - + greaterThan(QT_MAJOR_VERSION, 4) { HEADERS += videoeditor.h FORMS += videoeditor.ui From d75ec316cf7bf29267cae2113c4ef920c4be66a7 Mon Sep 17 00:00:00 2001 From: Jannis Achstetter Date: Sun, 13 Apr 2014 01:23:24 +0200 Subject: [PATCH 02/14] Make DMXKeyPad work --- ui/src/dmxkeypad.cpp | 307 +++++++++++++++++++++++++++++++----------- ui/src/dmxkeypad.h | 57 +++++++- ui/src/simpledesk.cpp | 7 + ui/src/simpledesk.h | 1 + 4 files changed, 292 insertions(+), 80 deletions(-) diff --git a/ui/src/dmxkeypad.cpp b/ui/src/dmxkeypad.cpp index 86998f3a6e..2d37f36611 100644 --- a/ui/src/dmxkeypad.cpp +++ b/ui/src/dmxkeypad.cpp @@ -7,13 +7,29 @@ DmxKeyPad::DmxKeyPad(QWidget *parent) : { setupUi(); - m_KPSelectedChannels = new QList(); + m_KPSelectedChannels = new QList(); m_KPStateMachine = new QStateMachine(this); m_KPState_Init = new QState(); m_KPState_Channel = new QState(); + m_KPState_ChannelTHRU = new QState(); m_KPState_Value = new QState(); + + m_KPState_Init->addTransition(this, SIGNAL(SM_InitDone()), m_KPState_Channel); + m_KPState_Channel->addTransition(this, SIGNAL(SM_ChannelsDone()), m_KPState_Value); + m_KPState_Channel->addTransition(this, SIGNAL(SM_ChannelTHRU()), m_KPState_ChannelTHRU); + + m_KPState_Channel->addTransition(this, SIGNAL(SM_Reset()), m_KPState_Init); + m_KPState_ChannelTHRU->addTransition(this, SIGNAL(SM_Reset()), m_KPState_Init); + m_KPState_Value->addTransition(this, SIGNAL(SM_Reset()), m_KPState_Init); + + m_KPStateMachine->addState(m_KPState_Init); + m_KPStateMachine->addState(m_KPState_Channel); + m_KPStateMachine->addState(m_KPState_ChannelTHRU); + m_KPStateMachine->addState(m_KPState_Value); m_KPStateMachine->setInitialState(m_KPState_Init); m_KPStateMachine->start(); + + connect(m_KPState_Init, SIGNAL(entered()), this, SLOT(SM_Init())); } void DmxKeyPad::setupUi() @@ -24,81 +40,216 @@ void DmxKeyPad::setupUi() this->setLayout(lay); - QLineEdit* kP_commandDisplay = new QLineEdit(this); - kP_commandDisplay->setEnabled(false); - kP_commandDisplay->setReadOnly(true); - lay->addWidget(kP_commandDisplay, 0, 0, 1, 3); - - QPushButton* kP_7 = new QPushButton(this); - kP_7->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); - kP_7->setText("7"); - lay->addWidget(kP_7, 1, 0); - QPushButton* kP_8 = new QPushButton(this); - kP_8->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); - kP_8->setText("8"); - lay->addWidget(kP_8, 1, 1); - QPushButton* kP_9 = new QPushButton(this); - kP_9->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); - kP_9->setText("9"); - lay->addWidget(kP_9, 1, 2); - QPushButton* kP_4 = new QPushButton(this); - kP_4->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); - kP_4->setText("4"); - lay->addWidget(kP_4, 2, 0); - QPushButton* kP_5 = new QPushButton(this); - kP_5->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); - kP_5->setText("5"); - lay->addWidget(kP_5, 2, 1); - QPushButton* kP_6 = new QPushButton(this); - kP_6->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); - kP_6->setText("6"); - lay->addWidget(kP_6, 2, 2); - QPushButton* kP_1 = new QPushButton(this); - kP_1->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); - kP_1->setText("1"); - lay->addWidget(kP_1, 3, 0); - QPushButton* kP_2 = new QPushButton(this); - kP_2->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); - kP_2->setText("2"); - lay->addWidget(kP_2, 3, 1); - QPushButton* kP_3 = new QPushButton(this); - kP_3->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); - kP_3->setText("3"); - lay->addWidget(kP_3, 3, 2); - QPushButton* kP_0 = new QPushButton(this); - kP_0->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); - kP_0->setText("0"); - lay->addWidget(kP_0, 5, 0); - QPushButton* kP_CLR = new QPushButton(this); - kP_CLR->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); - kP_CLR->setText("CLR"); - lay->addWidget(kP_CLR, 5, 1); - QPushButton* kP_AT = new QPushButton(this); - kP_AT->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); - kP_AT->setText("AT"); - lay->addWidget(kP_AT, 5, 2); - QPushButton* kP_MINUS = new QPushButton(this); - kP_MINUS->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); - kP_MINUS->setText("-"); - lay->addWidget(kP_MINUS, 6, 0); - QPushButton* kP_THRU = new QPushButton(this); - kP_THRU->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); - kP_THRU->setText("THRU"); - lay->addWidget(kP_THRU, 6, 1); - QPushButton* kP_PLUS = new QPushButton(this); - kP_PLUS->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); - kP_PLUS->setText("+"); - lay->addWidget(kP_PLUS, 6, 2); - QPushButton* kP_BY = new QPushButton(this); - kP_BY->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); - kP_BY->setText("BY"); - lay->addWidget(kP_BY, 7, 0); - QPushButton* kP_FULL = new QPushButton(this); - kP_FULL->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); - kP_FULL->setText("FULL"); - lay->addWidget(kP_FULL, 7, 1); - QPushButton* kP_ENTER = new QPushButton(this); - kP_ENTER->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); - kP_ENTER->setText("ENTER"); - lay->addWidget(kP_ENTER, 7, 2); + m_commandDisplay = new QLineEdit(this); + m_commandDisplay->setEnabled(false); + m_commandDisplay->setReadOnly(true); + lay->addWidget(m_commandDisplay, 0, 0, 1, 3); + + m_7 = new QPushButton(this); + m_7->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); + m_7->setText("7"); + lay->addWidget(m_7, 1, 0); + m_8 = new QPushButton(this); + m_8->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); + m_8->setText("8"); + lay->addWidget(m_8, 1, 1); + m_9 = new QPushButton(this); + m_9->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); + m_9->setText("9"); + lay->addWidget(m_9, 1, 2); + m_4 = new QPushButton(this); + m_4->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); + m_4->setText("4"); + lay->addWidget(m_4, 2, 0); + m_5 = new QPushButton(this); + m_5->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); + m_5->setText("5"); + lay->addWidget(m_5, 2, 1); + m_6 = new QPushButton(this); + m_6->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); + m_6->setText("6"); + lay->addWidget(m_6, 2, 2); + m_1 = new QPushButton(this); + m_1->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); + m_1->setText("1"); + lay->addWidget(m_1, 3, 0); + m_2 = new QPushButton(this); + m_2->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); + m_2->setText("2"); + lay->addWidget(m_2, 3, 1); + m_3 = new QPushButton(this); + m_3->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); + m_3->setText("3"); + lay->addWidget(m_3, 3, 2); + m_0 = new QPushButton(this); + m_0->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); + m_0->setText("0"); + lay->addWidget(m_0, 5, 0); + m_CLR = new QPushButton(this); + m_CLR->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); + m_CLR->setText("CLR"); + lay->addWidget(m_CLR, 5, 1); + m_AT = new QPushButton(this); + m_AT->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); + m_AT->setText("AT"); + lay->addWidget(m_AT, 5, 2); + m_MINUS = new QPushButton(this); + m_MINUS->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); + m_MINUS->setText("-"); + lay->addWidget(m_MINUS, 6, 0); + m_THRU = new QPushButton(this); + m_THRU->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); + m_THRU->setText("THRU"); + lay->addWidget(m_THRU, 6, 1); + m_PLUS = new QPushButton(this); + m_PLUS->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); + m_PLUS->setText("+"); + lay->addWidget(m_PLUS, 6, 2); + m_BY = new QPushButton(this); + m_BY->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); + m_BY->setText("BY"); + lay->addWidget(m_BY, 7, 0); + m_FULL = new QPushButton(this); + m_FULL->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); + m_FULL->setText("FULL"); + lay->addWidget(m_FULL, 7, 1); + m_ENTER = new QPushButton(this); + m_ENTER->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); + m_ENTER->setText("ENTER"); + lay->addWidget(m_ENTER, 7, 2); + + connect(m_0, SIGNAL(clicked()), this, SLOT(addDigitToNumber())); + connect(m_1, SIGNAL(clicked()), this, SLOT(addDigitToNumber())); + connect(m_2, SIGNAL(clicked()), this, SLOT(addDigitToNumber())); + connect(m_3, SIGNAL(clicked()), this, SLOT(addDigitToNumber())); + connect(m_4, SIGNAL(clicked()), this, SLOT(addDigitToNumber())); + connect(m_5, SIGNAL(clicked()), this, SLOT(addDigitToNumber())); + connect(m_6, SIGNAL(clicked()), this, SLOT(addDigitToNumber())); + connect(m_7, SIGNAL(clicked()), this, SLOT(addDigitToNumber())); + connect(m_8, SIGNAL(clicked()), this, SLOT(addDigitToNumber())); + connect(m_9, SIGNAL(clicked()), this, SLOT(addDigitToNumber())); + connect(m_CLR, SIGNAL(clicked()), this, SLOT(KP_CLR())); + connect(m_AT, SIGNAL(clicked()), this, SLOT(KP_AT())); + connect(m_MINUS, SIGNAL(clicked()), this, SLOT(KP_MINUS())); + connect(m_THRU, SIGNAL(clicked()), this, SLOT(KP_THRU())); + connect(m_PLUS, SIGNAL(clicked()), this, SLOT(KP_PLUS())); + connect(m_BY, SIGNAL(clicked()), this, SLOT(KP_BY())); + connect(m_FULL, SIGNAL(clicked()), this, SLOT(KP_FULL())); + connect(m_ENTER, SIGNAL(clicked()), this, SLOT(KP_ENTER())); +} + +void DmxKeyPad::calculateTHRURange() +{ + uint i; + if (m_currentChannel < m_rangeStartChan) + { + for (i = m_currentChannel; i <= m_rangeStartChan; i++) + { + m_KPSelectedChannels->append(i); + } + } else if (m_currentChannel > m_rangeStartChan) + { + for (i = m_currentChannel; i >= m_rangeStartChan; i--) + { + m_KPSelectedChannels->append(i); + } + } else + { + m_KPSelectedChannels->append(m_currentChannel); + } +} + +void DmxKeyPad::KP_CLR() +{ + +} + +void DmxKeyPad::KP_AT() +{ + if (m_KPStateMachine->configuration().contains(m_KPState_ChannelTHRU)) { + calculateTHRURange(); + } + m_KPSelectedChannels->append(m_currentChannel); // Only for single channel! Modify later! + m_currentChannel = 0; + m_commandDisplay->setText(QString("%1 AT ").arg(m_commandDisplay->text())); + emit SM_ChannelsDone(); // Change state machine to "Values" state +} +void DmxKeyPad::KP_MINUS() +{ + +} + +void DmxKeyPad::KP_THRU() +{ + // TODO: "FAN" function => Check current state if channel or value + m_rangeStartChan = m_currentChannel; + m_currentChannel = 0; + m_commandDisplay->setText(QString("%1 THRU ").arg(m_commandDisplay->text())); + emit SM_ChannelTHRU(); +} + +void DmxKeyPad::KP_PLUS() +{ + +} + +void DmxKeyPad::KP_BY() +{ + +} + +void DmxKeyPad::KP_FULL() +{ + KP_AT(); // FULL always refers to a value, not a channel. So this makes sure we end channel selection if FULL is requested + if (m_KPStateMachine->configuration().contains(m_KPState_Value) || m_KPStateMachine->configuration().contains(m_KPState_ChannelTHRU)) { + m_currentValue = 255; + KP_ENTER(); // Wrong in case we want to support "FULL THRU ..." + } +} + +void DmxKeyPad::KP_ENTER() +{ + quint16 chan; + foreach(chan, *m_KPSelectedChannels) + { + if (chan < 1) continue; + qDebug() << "KEYPAD: SET CHANNEL" << chan << "TO" << m_currentValue; + emit newChanValue(chan - 1, m_currentValue); + } + emit SM_Reset(); +} + +void DmxKeyPad::SM_Init() +{ + m_KPSelectedChannels->clear(); + m_commandDisplay->setText(""); + + m_currentChannel = 0; + m_rangeStartChan = 0; + m_currentValue = 0; + + emit SM_InitDone(); // Changes state machine to "Channel" state +} + +void DmxKeyPad::addDigitToNumber() +{ + if (sender() == 0) return; + addDigitToNumber(((QPushButton*)sender())->text().toInt()); +} + +void DmxKeyPad::addDigitToNumber(quint8 digit) +{ + if (m_KPStateMachine->configuration().contains(m_KPState_Channel) || m_KPStateMachine->configuration().contains(m_KPState_ChannelTHRU)) + { + if ((m_currentChannel * 10 + digit) > 512) return; // Invalid channel + m_currentChannel = m_currentChannel * 10 + digit; + m_commandDisplay->setText(QString("%1%2").arg(m_commandDisplay->text()).arg(digit)); + if (m_currentChannel >= 52) KP_AT(); + } else if (m_KPStateMachine->configuration().contains(m_KPState_Value)) { + if ((m_currentValue * 10 + digit) > 255) return; // Invalid value + m_currentValue = m_currentValue * 10 + digit; + m_commandDisplay->setText(QString("%1%2").arg(m_commandDisplay->text()).arg(digit)); + if (m_currentValue >= 26) KP_ENTER(); + if (m_currentValue == 0) KP_ENTER(); // special case: 0 entered and we expect no leading zero => value is 0! + } } diff --git a/ui/src/dmxkeypad.h b/ui/src/dmxkeypad.h index bbf761f3f4..0bc75837fa 100644 --- a/ui/src/dmxkeypad.h +++ b/ui/src/dmxkeypad.h @@ -3,10 +3,14 @@ #include #include +#include #include #include #include #include +#include + +#include "simpledesk.h" class DmxKeyPad : public QWidget { @@ -15,18 +19,67 @@ class DmxKeyPad : public QWidget explicit DmxKeyPad(QWidget *parent = 0); private: - QList* m_KPSelectedChannels; + QList* m_KPSelectedChannels; + uint m_rangeStartChan; + uint m_currentChannel; + uchar m_currentValue; + QStateMachine* m_KPStateMachine; QState* m_KPState_Init; // Clear string, reset List of channels to modify (but do NOT reset universe) QState* m_KPState_Channel; // Wait for channel(range) specification + QState* m_KPState_ChannelTHRU; // Wait for second part of channel "THRU" specification (range end) QState* m_KPState_Value; // Wait for value(range) specification QGridLayout* lay; + QLineEdit* m_commandDisplay; + + QPushButton* m_0; + QPushButton* m_1; + QPushButton* m_2; + QPushButton* m_3; + QPushButton* m_4; + QPushButton* m_5; + QPushButton* m_6; + QPushButton* m_7; + QPushButton* m_8; + QPushButton* m_9; + QPushButton* m_CLR; + QPushButton* m_AT; + QPushButton* m_MINUS; + QPushButton* m_THRU; + QPushButton* m_PLUS; + QPushButton* m_BY; + QPushButton* m_FULL; + QPushButton* m_ENTER; + void setupUi(); + void calculateTHRURange(); private slots: - //void KP_clear(); + void KP_CLR(); + void KP_AT(); + void KP_MINUS(); + void KP_THRU(); + void KP_PLUS(); + void KP_BY(); + void KP_FULL(); + void KP_ENTER(); + + void SM_Init(); + + void addDigitToNumber(); + +signals: + void SM_Reset(); + void SM_InitDone(); + void SM_ChannelsDone(); + void SM_ChannelTHRU(); + + void newChanValue(uint channel, uchar value); + +private: + void addDigitToNumber(quint8 digit); signals: diff --git a/ui/src/simpledesk.cpp b/ui/src/simpledesk.cpp index 6f887bef0e..0a2692c192 100644 --- a/ui/src/simpledesk.cpp +++ b/ui/src/simpledesk.cpp @@ -198,6 +198,7 @@ void SimpleDesk::initTopSide() DmxKeyPad* keyPad = new DmxKeyPad(m_topSplitter); m_topSplitter->addWidget(keyPad); + connect(keyPad, SIGNAL(newChanValue(uint,uchar)), this, SLOT(slotKeyPadNewChanValue(uint,uchar))); QHBoxLayout* uniLay = new QHBoxLayout; uniLay->setContentsMargins(1, 1, 1, 1); @@ -746,6 +747,12 @@ void SimpleDesk::slotUniversesWritten(int idx, const QByteArray& ua) } } +void SimpleDesk::slotKeyPadNewChanValue(uint channel, uchar value) +{ + m_engine->setValue(channel, value); + slotUpdateUniverseSliders(); +} + void SimpleDesk::slotUpdateUniverseSliders() { qDebug() << Q_FUNC_INFO; diff --git a/ui/src/simpledesk.h b/ui/src/simpledesk.h index d1a27a0bd9..6e01064d1d 100644 --- a/ui/src/simpledesk.h +++ b/ui/src/simpledesk.h @@ -113,6 +113,7 @@ private slots: void slotUniverseSliderValueChanged(quint32, quint32, uchar value); void slotUpdateUniverseSliders(); void slotUniversesWritten(int idx, const QByteArray& ua); + void slotKeyPadNewChanValue(uint channel, uchar value); private: QSplitter* m_topSplitter; From ae35185f854648bf9b991503cd53f2f3d209df4a Mon Sep 17 00:00:00 2001 From: Jannis Achstetter Date: Sun, 13 Apr 2014 01:36:28 +0200 Subject: [PATCH 03/14] Make CLR work --- ui/src/dmxkeypad.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/src/dmxkeypad.cpp b/ui/src/dmxkeypad.cpp index 2d37f36611..0023462dad 100644 --- a/ui/src/dmxkeypad.cpp +++ b/ui/src/dmxkeypad.cpp @@ -161,7 +161,7 @@ void DmxKeyPad::calculateTHRURange() void DmxKeyPad::KP_CLR() { - + emit SM_Reset(); } void DmxKeyPad::KP_AT() From cdee8dc8bb32a2c4eb058aea1f2fd3aedf211ec5 Mon Sep 17 00:00:00 2001 From: Jannis Achstetter Date: Sun, 13 Apr 2014 17:57:23 +0200 Subject: [PATCH 04/14] First work on "BY" button --- ui/src/dmxkeypad.cpp | 10 +++++++--- ui/src/dmxkeypad.h | 2 ++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/ui/src/dmxkeypad.cpp b/ui/src/dmxkeypad.cpp index 0023462dad..bfe4d3d750 100644 --- a/ui/src/dmxkeypad.cpp +++ b/ui/src/dmxkeypad.cpp @@ -12,6 +12,7 @@ DmxKeyPad::DmxKeyPad(QWidget *parent) : m_KPState_Init = new QState(); m_KPState_Channel = new QState(); m_KPState_ChannelTHRU = new QState(); + m_KPState_StepSize = new QState(); m_KPState_Value = new QState(); m_KPState_Init->addTransition(this, SIGNAL(SM_InitDone()), m_KPState_Channel); @@ -20,11 +21,13 @@ DmxKeyPad::DmxKeyPad(QWidget *parent) : m_KPState_Channel->addTransition(this, SIGNAL(SM_Reset()), m_KPState_Init); m_KPState_ChannelTHRU->addTransition(this, SIGNAL(SM_Reset()), m_KPState_Init); + m_KPState_StepSize->addTransition(this, SIGNAL(SM_Reset()), m_KPState_Init); m_KPState_Value->addTransition(this, SIGNAL(SM_Reset()), m_KPState_Init); m_KPStateMachine->addState(m_KPState_Init); m_KPStateMachine->addState(m_KPState_Channel); m_KPStateMachine->addState(m_KPState_ChannelTHRU); + m_KPStateMachine->addState(m_KPState_StepSize); m_KPStateMachine->addState(m_KPState_Value); m_KPStateMachine->setInitialState(m_KPState_Init); m_KPStateMachine->start(); @@ -143,13 +146,13 @@ void DmxKeyPad::calculateTHRURange() uint i; if (m_currentChannel < m_rangeStartChan) { - for (i = m_currentChannel; i <= m_rangeStartChan; i++) + for (i = m_currentChannel; i <= m_rangeStartChan; i = i + m_byStepSize) { m_KPSelectedChannels->append(i); } } else if (m_currentChannel > m_rangeStartChan) { - for (i = m_currentChannel; i >= m_rangeStartChan; i--) + for (i = m_currentChannel; i >= m_rangeStartChan; i = i - m_byStepSize) { m_KPSelectedChannels->append(i); } @@ -169,7 +172,7 @@ void DmxKeyPad::KP_AT() if (m_KPStateMachine->configuration().contains(m_KPState_ChannelTHRU)) { calculateTHRURange(); } - m_KPSelectedChannels->append(m_currentChannel); // Only for single channel! Modify later! + m_KPSelectedChannels->append(m_currentChannel); m_currentChannel = 0; m_commandDisplay->setText(QString("%1 AT ").arg(m_commandDisplay->text())); emit SM_ChannelsDone(); // Change state machine to "Values" state @@ -227,6 +230,7 @@ void DmxKeyPad::SM_Init() m_currentChannel = 0; m_rangeStartChan = 0; m_currentValue = 0; + m_byStepSize = 1; emit SM_InitDone(); // Changes state machine to "Channel" state } diff --git a/ui/src/dmxkeypad.h b/ui/src/dmxkeypad.h index 0bc75837fa..c219e32402 100644 --- a/ui/src/dmxkeypad.h +++ b/ui/src/dmxkeypad.h @@ -23,11 +23,13 @@ class DmxKeyPad : public QWidget uint m_rangeStartChan; uint m_currentChannel; uchar m_currentValue; + uchar m_byStepSize; QStateMachine* m_KPStateMachine; QState* m_KPState_Init; // Clear string, reset List of channels to modify (but do NOT reset universe) QState* m_KPState_Channel; // Wait for channel(range) specification QState* m_KPState_ChannelTHRU; // Wait for second part of channel "THRU" specification (range end) + QState* m_KPState_StepSize; // Wait for entry of step size (entered by "BY") QState* m_KPState_Value; // Wait for value(range) specification QGridLayout* lay; From bedd1889c7815bf86bd87d7a267f5a02d6f21de6 Mon Sep 17 00:00:00 2001 From: Jannis Achstetter Date: Sun, 13 Apr 2014 22:42:34 +0200 Subject: [PATCH 05/14] WiP: StateMachine refactoring --- ui/src/dmxkeypad.cpp | 168 +++++++++++++++++++++++++++++-------------- ui/src/dmxkeypad.h | 4 +- 2 files changed, 119 insertions(+), 53 deletions(-) diff --git a/ui/src/dmxkeypad.cpp b/ui/src/dmxkeypad.cpp index bfe4d3d750..6cbc37cf80 100644 --- a/ui/src/dmxkeypad.cpp +++ b/ui/src/dmxkeypad.cpp @@ -5,9 +5,12 @@ DmxKeyPad::DmxKeyPad(QWidget *parent) : QWidget(parent) { + qDebug() << Q_FUNC_INFO; + setupUi(); m_KPSelectedChannels = new QList(); + m_KPStateMachine = new QStateMachine(this); m_KPState_Init = new QState(); m_KPState_Channel = new QState(); @@ -15,15 +18,23 @@ DmxKeyPad::DmxKeyPad(QWidget *parent) : m_KPState_StepSize = new QState(); m_KPState_Value = new QState(); - m_KPState_Init->addTransition(this, SIGNAL(SM_InitDone()), m_KPState_Channel); - m_KPState_Channel->addTransition(this, SIGNAL(SM_ChannelsDone()), m_KPState_Value); + // Valid/possible transitions from one state to another. Triggered by SIGNALs + m_KPState_Init->addTransition(this, SIGNAL(SM_InitDone()), m_KPState_Channel); // DONE + m_KPState_Channel->addTransition(this, SIGNAL(SM_ChannelsDone()), m_KPState_Value); // DONE + m_KPState_Channel->addTransition(this, SIGNAL(SM_ChannelTHRU()), m_KPState_ChannelTHRU); + m_KPState_ChannelTHRU->addTransition(this, SIGNAL(SM_ByStart()), m_KPState_StepSize); + // Transitions from every possible state to Init via SM_Reset() m_KPState_Channel->addTransition(this, SIGNAL(SM_Reset()), m_KPState_Init); m_KPState_ChannelTHRU->addTransition(this, SIGNAL(SM_Reset()), m_KPState_Init); m_KPState_StepSize->addTransition(this, SIGNAL(SM_Reset()), m_KPState_Init); m_KPState_Value->addTransition(this, SIGNAL(SM_Reset()), m_KPState_Init); + // Connect the entered() and exited() SIGNALs to some SLOTs that do the actual work/calculations + connect(m_KPState_Init, SIGNAL(entered()), this, SLOT(SM_Init())); + + // Add all states to the StateMachine and start it m_KPStateMachine->addState(m_KPState_Init); m_KPStateMachine->addState(m_KPState_Channel); m_KPStateMachine->addState(m_KPState_ChannelTHRU); @@ -31,23 +42,25 @@ DmxKeyPad::DmxKeyPad(QWidget *parent) : m_KPStateMachine->addState(m_KPState_Value); m_KPStateMachine->setInitialState(m_KPState_Init); m_KPStateMachine->start(); - - connect(m_KPState_Init, SIGNAL(entered()), this, SLOT(SM_Init())); } void DmxKeyPad::setupUi() { + qDebug() << Q_FUNC_INFO; + + // Layout lay = new QGridLayout(this); lay->setContentsMargins(1, 1, 1, 1); this->setFixedWidth(3 * DMXKEYPAD_BUTTON_SIZE + 15); - this->setLayout(lay); + // LineEdit to display current command status m_commandDisplay = new QLineEdit(this); m_commandDisplay->setEnabled(false); m_commandDisplay->setReadOnly(true); lay->addWidget(m_commandDisplay, 0, 0, 1, 3); + // Buttons in the order they are layed out m_7 = new QPushButton(this); m_7->setFixedSize(DMXKEYPAD_BUTTON_SIZE, DMXKEYPAD_BUTTON_SIZE); m_7->setText("7"); @@ -121,62 +134,54 @@ void DmxKeyPad::setupUi() m_ENTER->setText("ENTER"); lay->addWidget(m_ENTER, 7, 2); - connect(m_0, SIGNAL(clicked()), this, SLOT(addDigitToNumber())); - connect(m_1, SIGNAL(clicked()), this, SLOT(addDigitToNumber())); - connect(m_2, SIGNAL(clicked()), this, SLOT(addDigitToNumber())); - connect(m_3, SIGNAL(clicked()), this, SLOT(addDigitToNumber())); - connect(m_4, SIGNAL(clicked()), this, SLOT(addDigitToNumber())); - connect(m_5, SIGNAL(clicked()), this, SLOT(addDigitToNumber())); - connect(m_6, SIGNAL(clicked()), this, SLOT(addDigitToNumber())); - connect(m_7, SIGNAL(clicked()), this, SLOT(addDigitToNumber())); - connect(m_8, SIGNAL(clicked()), this, SLOT(addDigitToNumber())); - connect(m_9, SIGNAL(clicked()), this, SLOT(addDigitToNumber())); - connect(m_CLR, SIGNAL(clicked()), this, SLOT(KP_CLR())); - connect(m_AT, SIGNAL(clicked()), this, SLOT(KP_AT())); + // Connections handling button clicks + connect(m_0, SIGNAL(clicked()), this, SLOT(addDigitToNumber())); + connect(m_1, SIGNAL(clicked()), this, SLOT(addDigitToNumber())); + connect(m_2, SIGNAL(clicked()), this, SLOT(addDigitToNumber())); + connect(m_3, SIGNAL(clicked()), this, SLOT(addDigitToNumber())); + connect(m_4, SIGNAL(clicked()), this, SLOT(addDigitToNumber())); + connect(m_5, SIGNAL(clicked()), this, SLOT(addDigitToNumber())); + connect(m_6, SIGNAL(clicked()), this, SLOT(addDigitToNumber())); + connect(m_7, SIGNAL(clicked()), this, SLOT(addDigitToNumber())); + connect(m_8, SIGNAL(clicked()), this, SLOT(addDigitToNumber())); + connect(m_9, SIGNAL(clicked()), this, SLOT(addDigitToNumber())); + connect(m_CLR, SIGNAL(clicked()), this, SLOT(KP_CLR())); + connect(m_AT, SIGNAL(clicked()), this, SLOT(KP_AT())); connect(m_MINUS, SIGNAL(clicked()), this, SLOT(KP_MINUS())); - connect(m_THRU, SIGNAL(clicked()), this, SLOT(KP_THRU())); - connect(m_PLUS, SIGNAL(clicked()), this, SLOT(KP_PLUS())); - connect(m_BY, SIGNAL(clicked()), this, SLOT(KP_BY())); - connect(m_FULL, SIGNAL(clicked()), this, SLOT(KP_FULL())); + connect(m_THRU, SIGNAL(clicked()), this, SLOT(KP_THRU())); + connect(m_PLUS, SIGNAL(clicked()), this, SLOT(KP_PLUS())); + connect(m_BY, SIGNAL(clicked()), this, SLOT(KP_BY())); + connect(m_FULL, SIGNAL(clicked()), this, SLOT(KP_FULL())); connect(m_ENTER, SIGNAL(clicked()), this, SLOT(KP_ENTER())); } -void DmxKeyPad::calculateTHRURange() -{ - uint i; - if (m_currentChannel < m_rangeStartChan) - { - for (i = m_currentChannel; i <= m_rangeStartChan; i = i + m_byStepSize) - { - m_KPSelectedChannels->append(i); - } - } else if (m_currentChannel > m_rangeStartChan) - { - for (i = m_currentChannel; i >= m_rangeStartChan; i = i - m_byStepSize) - { - m_KPSelectedChannels->append(i); - } - } else - { - m_KPSelectedChannels->append(m_currentChannel); - } -} +/********************************************************************* + * Button handling slots + *********************************************************************/ void DmxKeyPad::KP_CLR() { + qDebug() << Q_FUNC_INFO; + emit SM_Reset(); } void DmxKeyPad::KP_AT() { - if (m_KPStateMachine->configuration().contains(m_KPState_ChannelTHRU)) { + qDebug() << Q_FUNC_INFO; + + // MOVE TO Channel, ChannelTHRU and BY exited() methods + /* + if (m_KPStateMachine->configuration().contains(m_KPState_ChannelTHRU) || m_KPStateMachine->configuration().contains(m_KPState_StepSize)) { calculateTHRURange(); } - m_KPSelectedChannels->append(m_currentChannel); + m_KPSelectedChannels->append(m_currentChannel); // Wrong anyway in case calculateTHRURange() was used m_currentChannel = 0; - m_commandDisplay->setText(QString("%1 AT ").arg(m_commandDisplay->text())); + */ + appendToCommand(" AT "); emit SM_ChannelsDone(); // Change state machine to "Values" state } + void DmxKeyPad::KP_MINUS() { @@ -184,35 +189,46 @@ void DmxKeyPad::KP_MINUS() void DmxKeyPad::KP_THRU() { + qDebug() << Q_FUNC_INFO; + // TODO: "FAN" function => Check current state if channel or value m_rangeStartChan = m_currentChannel; m_currentChannel = 0; - m_commandDisplay->setText(QString("%1 THRU ").arg(m_commandDisplay->text())); + appendToCommand(" THRU "); emit SM_ChannelTHRU(); } void DmxKeyPad::KP_PLUS() { + qDebug() << Q_FUNC_INFO; } void DmxKeyPad::KP_BY() { + qDebug() << Q_FUNC_INFO; + appendToCommand(" BY "); + //emit SM_ByStart(); } void DmxKeyPad::KP_FULL() { + qDebug() << Q_FUNC_INFO; + KP_AT(); // FULL always refers to a value, not a channel. So this makes sure we end channel selection if FULL is requested if (m_KPStateMachine->configuration().contains(m_KPState_Value) || m_KPStateMachine->configuration().contains(m_KPState_ChannelTHRU)) { m_currentValue = 255; + appendToCommand("FULL"); KP_ENTER(); // Wrong in case we want to support "FULL THRU ..." } } void DmxKeyPad::KP_ENTER() { - quint16 chan; + qDebug() << Q_FUNC_INFO; + + uint chan; foreach(chan, *m_KPSelectedChannels) { if (chan < 1) continue; @@ -222,8 +238,44 @@ void DmxKeyPad::KP_ENTER() emit SM_Reset(); } +void DmxKeyPad::addDigitToNumber() +{ + qDebug() << Q_FUNC_INFO; + + if (sender() == 0) return; + addDigitToNumber(((QPushButton*)sender())->text().toInt()); +} + + + + +void DmxKeyPad::calculateTHRURange() +{ + qDebug() << Q_FUNC_INFO; + + uint i; + if (m_currentChannel < m_rangeStartChan) // range defined in reverse order (higher channel to lower channel) + { + for (i = m_rangeStartChan; i >= m_currentChannel; i = i - m_byStepSize) + { + m_KPSelectedChannels->append(i); + } + } else if (m_currentChannel > m_rangeStartChan) // range defined in regular order (lower channel to higher channel) + { + for (i = m_rangeStartChan; i <= m_currentChannel; i = i + m_byStepSize) + { + m_KPSelectedChannels->append(i); + } + } else // range start = range end => only one channel selected + { + m_KPSelectedChannels->append(m_currentChannel); + } +} + void DmxKeyPad::SM_Init() { + qDebug() << Q_FUNC_INFO; + m_KPSelectedChannels->clear(); m_commandDisplay->setText(""); @@ -235,25 +287,37 @@ void DmxKeyPad::SM_Init() emit SM_InitDone(); // Changes state machine to "Channel" state } -void DmxKeyPad::addDigitToNumber() +void DmxKeyPad::SM_ChannelTHRUExited() { - if (sender() == 0) return; - addDigitToNumber(((QPushButton*)sender())->text().toInt()); + } void DmxKeyPad::addDigitToNumber(quint8 digit) { - if (m_KPStateMachine->configuration().contains(m_KPState_Channel) || m_KPStateMachine->configuration().contains(m_KPState_ChannelTHRU)) + qDebug() << Q_FUNC_INFO; + + if (m_KPStateMachine->configuration().contains(m_KPState_StepSize)) + { + if ((m_byStepSize * 10 + digit) > 512) return; // Invalid channel + m_byStepSize = m_byStepSize * 10 + digit; + appendToCommand(QString("%1").arg(digit)); + if (m_currentChannel >= 52) KP_AT(); + } else if (m_KPStateMachine->configuration().contains(m_KPState_Channel) || m_KPStateMachine->configuration().contains(m_KPState_ChannelTHRU)) { if ((m_currentChannel * 10 + digit) > 512) return; // Invalid channel m_currentChannel = m_currentChannel * 10 + digit; - m_commandDisplay->setText(QString("%1%2").arg(m_commandDisplay->text()).arg(digit)); + appendToCommand(QString("%1").arg(digit)); if (m_currentChannel >= 52) KP_AT(); } else if (m_KPStateMachine->configuration().contains(m_KPState_Value)) { if ((m_currentValue * 10 + digit) > 255) return; // Invalid value m_currentValue = m_currentValue * 10 + digit; - m_commandDisplay->setText(QString("%1%2").arg(m_commandDisplay->text()).arg(digit)); + appendToCommand(QString("%1").arg(digit)); if (m_currentValue >= 26) KP_ENTER(); if (m_currentValue == 0) KP_ENTER(); // special case: 0 entered and we expect no leading zero => value is 0! } } + +void DmxKeyPad::appendToCommand(QString text) +{ + m_commandDisplay->setText(QString("%1%2").arg(m_commandDisplay->text()).arg(text)); +} diff --git a/ui/src/dmxkeypad.h b/ui/src/dmxkeypad.h index c219e32402..54d5ff808b 100644 --- a/ui/src/dmxkeypad.h +++ b/ui/src/dmxkeypad.h @@ -3,7 +3,6 @@ #include #include -#include #include #include #include @@ -69,6 +68,7 @@ private slots: void KP_ENTER(); void SM_Init(); + void SM_ChannelTHRUExited(); void addDigitToNumber(); @@ -77,11 +77,13 @@ private slots: void SM_InitDone(); void SM_ChannelsDone(); void SM_ChannelTHRU(); + void SM_ByStart(); void newChanValue(uint channel, uchar value); private: void addDigitToNumber(quint8 digit); + void appendToCommand(QString text); signals: From 82d22e7f48c4bfe27cb3afaaabb75198b1f78724 Mon Sep 17 00:00:00 2001 From: Jannis Achstetter Date: Mon, 14 Apr 2014 20:00:07 +0200 Subject: [PATCH 06/14] Finish StateMachine refactoring --- ui/src/dmxkeypad.cpp | 91 ++++++++++++++++++++++++-------------------- ui/src/dmxkeypad.h | 1 + 2 files changed, 50 insertions(+), 42 deletions(-) diff --git a/ui/src/dmxkeypad.cpp b/ui/src/dmxkeypad.cpp index 6cbc37cf80..1b87d7edeb 100644 --- a/ui/src/dmxkeypad.cpp +++ b/ui/src/dmxkeypad.cpp @@ -19,11 +19,13 @@ DmxKeyPad::DmxKeyPad(QWidget *parent) : m_KPState_Value = new QState(); // Valid/possible transitions from one state to another. Triggered by SIGNALs - m_KPState_Init->addTransition(this, SIGNAL(SM_InitDone()), m_KPState_Channel); // DONE - m_KPState_Channel->addTransition(this, SIGNAL(SM_ChannelsDone()), m_KPState_Value); // DONE + m_KPState_Init->addTransition(this, SIGNAL(SM_InitDone()), m_KPState_Channel); + m_KPState_Channel->addTransition(this, SIGNAL(SM_ChannelsDone()), m_KPState_Value); m_KPState_Channel->addTransition(this, SIGNAL(SM_ChannelTHRU()), m_KPState_ChannelTHRU); - m_KPState_ChannelTHRU->addTransition(this, SIGNAL(SM_ByStart()), m_KPState_StepSize); + m_KPState_ChannelTHRU->addTransition(this, SIGNAL(SM_ChannelsDone()), m_KPState_Value); + + //m_KPState_ChannelTHRU->addTransition(this, SIGNAL(SM_ByStart()), m_KPState_StepSize); // Transitions from every possible state to Init via SM_Reset() m_KPState_Channel->addTransition(this, SIGNAL(SM_Reset()), m_KPState_Init); @@ -33,6 +35,8 @@ DmxKeyPad::DmxKeyPad(QWidget *parent) : // Connect the entered() and exited() SIGNALs to some SLOTs that do the actual work/calculations connect(m_KPState_Init, SIGNAL(entered()), this, SLOT(SM_Init())); + connect(m_KPState_Channel, SIGNAL(exited()), this, SLOT(SM_ChannelExited())); + connect(m_KPState_ChannelTHRU, SIGNAL(exited()), this, SLOT(SM_ChannelTHRUExited())); // Add all states to the StateMachine and start it m_KPStateMachine->addState(m_KPState_Init); @@ -170,14 +174,6 @@ void DmxKeyPad::KP_AT() { qDebug() << Q_FUNC_INFO; - // MOVE TO Channel, ChannelTHRU and BY exited() methods - /* - if (m_KPStateMachine->configuration().contains(m_KPState_ChannelTHRU) || m_KPStateMachine->configuration().contains(m_KPState_StepSize)) { - calculateTHRURange(); - } - m_KPSelectedChannels->append(m_currentChannel); // Wrong anyway in case calculateTHRURange() was used - m_currentChannel = 0; - */ appendToCommand(" AT "); emit SM_ChannelsDone(); // Change state machine to "Values" state } @@ -208,7 +204,7 @@ void DmxKeyPad::KP_BY() { qDebug() << Q_FUNC_INFO; - appendToCommand(" BY "); + //appendToCommand(" BY "); //emit SM_ByStart(); } @@ -217,7 +213,7 @@ void DmxKeyPad::KP_FULL() qDebug() << Q_FUNC_INFO; KP_AT(); // FULL always refers to a value, not a channel. So this makes sure we end channel selection if FULL is requested - if (m_KPStateMachine->configuration().contains(m_KPState_Value) || m_KPStateMachine->configuration().contains(m_KPState_ChannelTHRU)) { + if (m_KPStateMachine->configuration().contains(m_KPState_Value)) { m_currentValue = 255; appendToCommand("FULL"); KP_ENTER(); // Wrong in case we want to support "FULL THRU ..." @@ -246,8 +242,30 @@ void DmxKeyPad::addDigitToNumber() addDigitToNumber(((QPushButton*)sender())->text().toInt()); } +/********************************************************************* + * private (helper) methods + *********************************************************************/ +void DmxKeyPad::addDigitToNumber(quint8 digit) +{ + qDebug() << Q_FUNC_INFO; + if (m_KPStateMachine->configuration().contains(m_KPState_StepSize)) + { + if ((m_byStepSize * 10 + digit) > 512) return; // Invalid channel + m_byStepSize = m_byStepSize * 10 + digit; + appendToCommand(QString("%1").arg(digit)); + } else if (m_KPStateMachine->configuration().contains(m_KPState_Channel) || m_KPStateMachine->configuration().contains(m_KPState_ChannelTHRU)) + { + if ((m_currentChannel * 10 + digit) > 512) return; // Invalid channel + m_currentChannel = m_currentChannel * 10 + digit; + appendToCommand(QString("%1").arg(digit)); + } else if (m_KPStateMachine->configuration().contains(m_KPState_Value)) { + if ((m_currentValue * 10 + digit) > 255) return; // Invalid value + m_currentValue = m_currentValue * 10 + digit; + appendToCommand(QString("%1").arg(digit)); + } +} void DmxKeyPad::calculateTHRURange() { @@ -258,20 +276,30 @@ void DmxKeyPad::calculateTHRURange() { for (i = m_rangeStartChan; i >= m_currentChannel; i = i - m_byStepSize) { - m_KPSelectedChannels->append(i); + if (i == UINT_MAX) break; // don't shoot through the floor if going down to channel 0 was requested + if (!m_KPSelectedChannels->contains(i)) m_KPSelectedChannels->append(i); } } else if (m_currentChannel > m_rangeStartChan) // range defined in regular order (lower channel to higher channel) { for (i = m_rangeStartChan; i <= m_currentChannel; i = i + m_byStepSize) { - m_KPSelectedChannels->append(i); + if (!m_KPSelectedChannels->contains(i)) m_KPSelectedChannels->append(i); } } else // range start = range end => only one channel selected { - m_KPSelectedChannels->append(m_currentChannel); + if (!m_KPSelectedChannels->contains(i)) m_KPSelectedChannels->append(i); } } +void DmxKeyPad::appendToCommand(QString text) +{ + m_commandDisplay->setText(QString("%1%2").arg(m_commandDisplay->text()).arg(text)); +} + +/********************************************************************* + * StateMachine workhorse methods/slots + *********************************************************************/ + void DmxKeyPad::SM_Init() { qDebug() << Q_FUNC_INFO; @@ -287,37 +315,16 @@ void DmxKeyPad::SM_Init() emit SM_InitDone(); // Changes state machine to "Channel" state } -void DmxKeyPad::SM_ChannelTHRUExited() +void DmxKeyPad::SM_ChannelExited() { + qDebug() << Q_FUNC_INFO; + m_KPSelectedChannels->append(m_currentChannel); } -void DmxKeyPad::addDigitToNumber(quint8 digit) +void DmxKeyPad::SM_ChannelTHRUExited() { qDebug() << Q_FUNC_INFO; - if (m_KPStateMachine->configuration().contains(m_KPState_StepSize)) - { - if ((m_byStepSize * 10 + digit) > 512) return; // Invalid channel - m_byStepSize = m_byStepSize * 10 + digit; - appendToCommand(QString("%1").arg(digit)); - if (m_currentChannel >= 52) KP_AT(); - } else if (m_KPStateMachine->configuration().contains(m_KPState_Channel) || m_KPStateMachine->configuration().contains(m_KPState_ChannelTHRU)) - { - if ((m_currentChannel * 10 + digit) > 512) return; // Invalid channel - m_currentChannel = m_currentChannel * 10 + digit; - appendToCommand(QString("%1").arg(digit)); - if (m_currentChannel >= 52) KP_AT(); - } else if (m_KPStateMachine->configuration().contains(m_KPState_Value)) { - if ((m_currentValue * 10 + digit) > 255) return; // Invalid value - m_currentValue = m_currentValue * 10 + digit; - appendToCommand(QString("%1").arg(digit)); - if (m_currentValue >= 26) KP_ENTER(); - if (m_currentValue == 0) KP_ENTER(); // special case: 0 entered and we expect no leading zero => value is 0! - } -} - -void DmxKeyPad::appendToCommand(QString text) -{ - m_commandDisplay->setText(QString("%1%2").arg(m_commandDisplay->text()).arg(text)); + calculateTHRURange(); } diff --git a/ui/src/dmxkeypad.h b/ui/src/dmxkeypad.h index 54d5ff808b..0996923398 100644 --- a/ui/src/dmxkeypad.h +++ b/ui/src/dmxkeypad.h @@ -68,6 +68,7 @@ private slots: void KP_ENTER(); void SM_Init(); + void SM_ChannelExited(); void SM_ChannelTHRUExited(); void addDigitToNumber(); From ccf8a677d4c1cf16044e2d56603cefbf3192dad1 Mon Sep 17 00:00:00 2001 From: Jannis Achstetter Date: Mon, 14 Apr 2014 21:36:01 +0200 Subject: [PATCH 07/14] Amazing speed-up if we don't update the sliders after every channel change but only once after the range --- ui/src/dmxkeypad.cpp | 1 + ui/src/dmxkeypad.h | 1 + ui/src/simpledesk.cpp | 3 ++- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/ui/src/dmxkeypad.cpp b/ui/src/dmxkeypad.cpp index 1b87d7edeb..1ee1417ea2 100644 --- a/ui/src/dmxkeypad.cpp +++ b/ui/src/dmxkeypad.cpp @@ -231,6 +231,7 @@ void DmxKeyPad::KP_ENTER() qDebug() << "KEYPAD: SET CHANNEL" << chan << "TO" << m_currentValue; emit newChanValue(chan - 1, m_currentValue); } + emit newValuesDone(); emit SM_Reset(); } diff --git a/ui/src/dmxkeypad.h b/ui/src/dmxkeypad.h index 0996923398..bc4c204bb3 100644 --- a/ui/src/dmxkeypad.h +++ b/ui/src/dmxkeypad.h @@ -81,6 +81,7 @@ private slots: void SM_ByStart(); void newChanValue(uint channel, uchar value); + void newValuesDone(); private: void addDigitToNumber(quint8 digit); diff --git a/ui/src/simpledesk.cpp b/ui/src/simpledesk.cpp index 0a2692c192..17fa26f35a 100644 --- a/ui/src/simpledesk.cpp +++ b/ui/src/simpledesk.cpp @@ -198,7 +198,9 @@ void SimpleDesk::initTopSide() DmxKeyPad* keyPad = new DmxKeyPad(m_topSplitter); m_topSplitter->addWidget(keyPad); + connect(keyPad, SIGNAL(newChanValue(uint,uchar)), this, SLOT(slotKeyPadNewChanValue(uint,uchar))); + connect(keyPad, SIGNAL(newValuesDone()), this, SLOT(slotUpdateUniverseSliders())); QHBoxLayout* uniLay = new QHBoxLayout; uniLay->setContentsMargins(1, 1, 1, 1); @@ -750,7 +752,6 @@ void SimpleDesk::slotUniversesWritten(int idx, const QByteArray& ua) void SimpleDesk::slotKeyPadNewChanValue(uint channel, uchar value) { m_engine->setValue(channel, value); - slotUpdateUniverseSliders(); } void SimpleDesk::slotUpdateUniverseSliders() From 9d6d6112d70c76aca113e69009e5673b3de943aa Mon Sep 17 00:00:00 2001 From: Jannis Achstetter Date: Mon, 14 Apr 2014 22:08:13 +0200 Subject: [PATCH 08/14] Make StepSize ("BY") work --- ui/src/dmxkeypad.cpp | 43 +++++++++++++++++++++++++++++++++++++------ ui/src/dmxkeypad.h | 4 ++++ 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/ui/src/dmxkeypad.cpp b/ui/src/dmxkeypad.cpp index 1ee1417ea2..b5f51782db 100644 --- a/ui/src/dmxkeypad.cpp +++ b/ui/src/dmxkeypad.cpp @@ -25,7 +25,9 @@ DmxKeyPad::DmxKeyPad(QWidget *parent) : m_KPState_Channel->addTransition(this, SIGNAL(SM_ChannelTHRU()), m_KPState_ChannelTHRU); m_KPState_ChannelTHRU->addTransition(this, SIGNAL(SM_ChannelsDone()), m_KPState_Value); - //m_KPState_ChannelTHRU->addTransition(this, SIGNAL(SM_ByStart()), m_KPState_StepSize); + m_KPState_ChannelTHRU->addTransition(this, SIGNAL(SM_ByStart()), m_KPState_StepSize); + + m_KPState_StepSize->addTransition(this, SIGNAL(SM_ChannelsDone()), m_KPState_Value); // Transitions from every possible state to Init via SM_Reset() m_KPState_Channel->addTransition(this, SIGNAL(SM_Reset()), m_KPState_Init); @@ -37,6 +39,7 @@ DmxKeyPad::DmxKeyPad(QWidget *parent) : connect(m_KPState_Init, SIGNAL(entered()), this, SLOT(SM_Init())); connect(m_KPState_Channel, SIGNAL(exited()), this, SLOT(SM_ChannelExited())); connect(m_KPState_ChannelTHRU, SIGNAL(exited()), this, SLOT(SM_ChannelTHRUExited())); + connect(m_KPState_StepSize, SIGNAL(exited()), this, SLOT(SM_StepSizeExited())); // Add all states to the StateMachine and start it m_KPStateMachine->addState(m_KPState_Init); @@ -198,14 +201,21 @@ void DmxKeyPad::KP_PLUS() { qDebug() << Q_FUNC_INFO; + /* + if (m_KPStateMachine->configuration().contains(m_KPState_Channel) || m_KPStateMachine->configuration().contains(m_KPState_ChannelTHRU)) + { + m_addToRange = true; + appendToCommand(" + "); + emit SM_AddRange(); + }*/ } void DmxKeyPad::KP_BY() { qDebug() << Q_FUNC_INFO; - //appendToCommand(" BY "); - //emit SM_ByStart(); + appendToCommand(" BY "); + emit SM_ByStart(); } void DmxKeyPad::KP_FULL() @@ -254,14 +264,24 @@ void DmxKeyPad::addDigitToNumber(quint8 digit) if (m_KPStateMachine->configuration().contains(m_KPState_StepSize)) { if ((m_byStepSize * 10 + digit) > 512) return; // Invalid channel - m_byStepSize = m_byStepSize * 10 + digit; + if (m_byStepSize == 1) + { + m_byStepSize = digit; + } + else + { + m_byStepSize = m_byStepSize * 10 + digit; + } appendToCommand(QString("%1").arg(digit)); - } else if (m_KPStateMachine->configuration().contains(m_KPState_Channel) || m_KPStateMachine->configuration().contains(m_KPState_ChannelTHRU)) + } + else if (m_KPStateMachine->configuration().contains(m_KPState_Channel) || m_KPStateMachine->configuration().contains(m_KPState_ChannelTHRU)) { if ((m_currentChannel * 10 + digit) > 512) return; // Invalid channel m_currentChannel = m_currentChannel * 10 + digit; appendToCommand(QString("%1").arg(digit)); - } else if (m_KPStateMachine->configuration().contains(m_KPState_Value)) { + } + else if (m_KPStateMachine->configuration().contains(m_KPState_Value)) + { if ((m_currentValue * 10 + digit) > 255) return; // Invalid value m_currentValue = m_currentValue * 10 + digit; appendToCommand(QString("%1").arg(digit)); @@ -272,6 +292,8 @@ void DmxKeyPad::calculateTHRURange() { qDebug() << Q_FUNC_INFO; + if (!m_addToRange) m_KPSelectedChannels->clear(); + uint i; if (m_currentChannel < m_rangeStartChan) // range defined in reverse order (higher channel to lower channel) { @@ -312,6 +334,8 @@ void DmxKeyPad::SM_Init() m_rangeStartChan = 0; m_currentValue = 0; m_byStepSize = 1; + m_addToRange = false; + m_subtractFromRange = false; emit SM_InitDone(); // Changes state machine to "Channel" state } @@ -329,3 +353,10 @@ void DmxKeyPad::SM_ChannelTHRUExited() calculateTHRURange(); } + +void DmxKeyPad::SM_StepSizeExited() +{ + qDebug() << Q_FUNC_INFO; + + calculateTHRURange(); +} diff --git a/ui/src/dmxkeypad.h b/ui/src/dmxkeypad.h index bc4c204bb3..3d2da584cd 100644 --- a/ui/src/dmxkeypad.h +++ b/ui/src/dmxkeypad.h @@ -23,6 +23,8 @@ class DmxKeyPad : public QWidget uint m_currentChannel; uchar m_currentValue; uchar m_byStepSize; + bool m_addToRange; + bool m_subtractFromRange; QStateMachine* m_KPStateMachine; QState* m_KPState_Init; // Clear string, reset List of channels to modify (but do NOT reset universe) @@ -70,6 +72,7 @@ private slots: void SM_Init(); void SM_ChannelExited(); void SM_ChannelTHRUExited(); + void SM_StepSizeExited(); void addDigitToNumber(); @@ -78,6 +81,7 @@ private slots: void SM_InitDone(); void SM_ChannelsDone(); void SM_ChannelTHRU(); + void SM_AddRange(); void SM_ByStart(); void newChanValue(uint channel, uchar value); From 77a7955ef93a5b2596a14d3e0b29527439c77c24 Mon Sep 17 00:00:00 2001 From: Jannis Achstetter Date: Thu, 17 Apr 2014 19:55:02 +0200 Subject: [PATCH 09/14] WiP: Add channel(s) to range --- ui/src/dmxkeypad.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/ui/src/dmxkeypad.cpp b/ui/src/dmxkeypad.cpp index b5f51782db..6997044db3 100644 --- a/ui/src/dmxkeypad.cpp +++ b/ui/src/dmxkeypad.cpp @@ -20,12 +20,14 @@ DmxKeyPad::DmxKeyPad(QWidget *parent) : // Valid/possible transitions from one state to another. Triggered by SIGNALs m_KPState_Init->addTransition(this, SIGNAL(SM_InitDone()), m_KPState_Channel); - m_KPState_Channel->addTransition(this, SIGNAL(SM_ChannelsDone()), m_KPState_Value); + m_KPState_Channel->addTransition(this, SIGNAL(SM_ChannelsDone()), m_KPState_Value); m_KPState_Channel->addTransition(this, SIGNAL(SM_ChannelTHRU()), m_KPState_ChannelTHRU); - m_KPState_ChannelTHRU->addTransition(this, SIGNAL(SM_ChannelsDone()), m_KPState_Value); + m_KPState_Channel->addTransition(this, SIGNAL(SM_AddRange()), m_KPState_Channel); + m_KPState_ChannelTHRU->addTransition(this, SIGNAL(SM_ChannelsDone()), m_KPState_Value); m_KPState_ChannelTHRU->addTransition(this, SIGNAL(SM_ByStart()), m_KPState_StepSize); + m_KPState_ChannelTHRU->addTransition(this, SIGNAL(SM_AddRange()), m_KPState_Channel); m_KPState_StepSize->addTransition(this, SIGNAL(SM_ChannelsDone()), m_KPState_Value); @@ -201,13 +203,12 @@ void DmxKeyPad::KP_PLUS() { qDebug() << Q_FUNC_INFO; - /* if (m_KPStateMachine->configuration().contains(m_KPState_Channel) || m_KPStateMachine->configuration().contains(m_KPState_ChannelTHRU)) { m_addToRange = true; appendToCommand(" + "); emit SM_AddRange(); - }*/ + } } void DmxKeyPad::KP_BY() @@ -312,6 +313,8 @@ void DmxKeyPad::calculateTHRURange() { if (!m_KPSelectedChannels->contains(i)) m_KPSelectedChannels->append(i); } + + if (m_addToRange) m_currentChannel = 0; } void DmxKeyPad::appendToCommand(QString text) @@ -345,6 +348,7 @@ void DmxKeyPad::SM_ChannelExited() qDebug() << Q_FUNC_INFO; m_KPSelectedChannels->append(m_currentChannel); + m_currentChannel = 0; // In case of + after a single channel } void DmxKeyPad::SM_ChannelTHRUExited() From b0ce839223f9dee11e684a1ed3abfb51d668f4fd Mon Sep 17 00:00:00 2001 From: Jannis Achstetter Date: Sun, 20 Apr 2014 21:56:50 +0200 Subject: [PATCH 10/14] Add more debugging output, fix PLUS function, implement MINUS (subtract range) function (not all cases covered yet) --- ui/src/dmxkeypad.cpp | 63 +++++++++++++++++++++++++++++++++++--------- ui/src/dmxkeypad.h | 1 + 2 files changed, 52 insertions(+), 12 deletions(-) diff --git a/ui/src/dmxkeypad.cpp b/ui/src/dmxkeypad.cpp index 6997044db3..2a760cedf6 100644 --- a/ui/src/dmxkeypad.cpp +++ b/ui/src/dmxkeypad.cpp @@ -5,7 +5,7 @@ DmxKeyPad::DmxKeyPad(QWidget *parent) : QWidget(parent) { - qDebug() << Q_FUNC_INFO; + qDebug() << Q_FUNC_INFO << "parent:" << parent; setupUi(); @@ -24,10 +24,12 @@ DmxKeyPad::DmxKeyPad(QWidget *parent) : m_KPState_Channel->addTransition(this, SIGNAL(SM_ChannelsDone()), m_KPState_Value); m_KPState_Channel->addTransition(this, SIGNAL(SM_ChannelTHRU()), m_KPState_ChannelTHRU); m_KPState_Channel->addTransition(this, SIGNAL(SM_AddRange()), m_KPState_Channel); + m_KPState_Channel->addTransition(this, SIGNAL(SM_SubtractRange()), m_KPState_Channel); m_KPState_ChannelTHRU->addTransition(this, SIGNAL(SM_ChannelsDone()), m_KPState_Value); m_KPState_ChannelTHRU->addTransition(this, SIGNAL(SM_ByStart()), m_KPState_StepSize); m_KPState_ChannelTHRU->addTransition(this, SIGNAL(SM_AddRange()), m_KPState_Channel); + m_KPState_ChannelTHRU->addTransition(this, SIGNAL(SM_SubtractRange()), m_KPState_Channel); m_KPState_StepSize->addTransition(this, SIGNAL(SM_ChannelsDone()), m_KPState_Value); @@ -185,7 +187,15 @@ void DmxKeyPad::KP_AT() void DmxKeyPad::KP_MINUS() { + qDebug() << Q_FUNC_INFO; + if (m_KPStateMachine->configuration().contains(m_KPState_Channel) || m_KPStateMachine->configuration().contains(m_KPState_ChannelTHRU)) + { + emit SM_SubtractRange(); // re-calculate the current (pre-Subtract range) + m_currentChannel = 0; + m_subtractFromRange = true; + appendToCommand(" - "); + } } void DmxKeyPad::KP_THRU() @@ -205,9 +215,10 @@ void DmxKeyPad::KP_PLUS() if (m_KPStateMachine->configuration().contains(m_KPState_Channel) || m_KPStateMachine->configuration().contains(m_KPState_ChannelTHRU)) { + emit SM_AddRange(); // re-calculate the current (pre-Add range) + m_currentChannel = 0; m_addToRange = true; appendToCommand(" + "); - emit SM_AddRange(); } } @@ -227,7 +238,7 @@ void DmxKeyPad::KP_FULL() if (m_KPStateMachine->configuration().contains(m_KPState_Value)) { m_currentValue = 255; appendToCommand("FULL"); - KP_ENTER(); // Wrong in case we want to support "FULL THRU ..." + KP_ENTER(); // Wrong in case we want to support "FULL THRU ..." (FAN function) } } @@ -248,7 +259,7 @@ void DmxKeyPad::KP_ENTER() void DmxKeyPad::addDigitToNumber() { - qDebug() << Q_FUNC_INFO; + qDebug() << Q_FUNC_INFO << "sender:" << (QPushButton*)sender(); if (sender() == 0) return; addDigitToNumber(((QPushButton*)sender())->text().toInt()); @@ -260,7 +271,7 @@ void DmxKeyPad::addDigitToNumber() void DmxKeyPad::addDigitToNumber(quint8 digit) { - qDebug() << Q_FUNC_INFO; + qDebug() << Q_FUNC_INFO << "digit:" << digit; if (m_KPStateMachine->configuration().contains(m_KPState_StepSize)) { @@ -291,9 +302,10 @@ void DmxKeyPad::addDigitToNumber(quint8 digit) void DmxKeyPad::calculateTHRURange() { - qDebug() << Q_FUNC_INFO; + qDebug() << Q_FUNC_INFO << "rangeStart:" << m_rangeStartChan << "currentChannel:" << m_currentChannel << "addToRange:" << m_addToRange << "subtractRange:" << m_subtractFromRange; + qDebug() << "Selected channels PRE:" << *m_KPSelectedChannels; - if (!m_addToRange) m_KPSelectedChannels->clear(); + if (!m_addToRange && !m_subtractFromRange) m_KPSelectedChannels->clear(); uint i; if (m_currentChannel < m_rangeStartChan) // range defined in reverse order (higher channel to lower channel) @@ -301,24 +313,50 @@ void DmxKeyPad::calculateTHRURange() for (i = m_rangeStartChan; i >= m_currentChannel; i = i - m_byStepSize) { if (i == UINT_MAX) break; // don't shoot through the floor if going down to channel 0 was requested - if (!m_KPSelectedChannels->contains(i)) m_KPSelectedChannels->append(i); + if (!m_subtractFromRange) + { + if (!m_KPSelectedChannels->contains(i)) m_KPSelectedChannels->append(i); + } + else + { + if (m_KPSelectedChannels->contains(i)) m_KPSelectedChannels->removeAll(i); + } } } else if (m_currentChannel > m_rangeStartChan) // range defined in regular order (lower channel to higher channel) { for (i = m_rangeStartChan; i <= m_currentChannel; i = i + m_byStepSize) { - if (!m_KPSelectedChannels->contains(i)) m_KPSelectedChannels->append(i); + if (!m_subtractFromRange) + { + if (!m_KPSelectedChannels->contains(i)) m_KPSelectedChannels->append(i); + } + else + { + if (m_KPSelectedChannels->contains(i)) m_KPSelectedChannels->removeAll(i); + } } } else // range start = range end => only one channel selected { - if (!m_KPSelectedChannels->contains(i)) m_KPSelectedChannels->append(i); + if (!m_subtractFromRange) + { + if (!m_KPSelectedChannels->contains(i)) m_KPSelectedChannels->append(i); + } + else + { + if (m_KPSelectedChannels->contains(i)) m_KPSelectedChannels->removeAll(i); + } } + m_subtractFromRange = false; // Needs another "-" to subtract another range if (m_addToRange) m_currentChannel = 0; + + qDebug() << "Selected channels POST:" << *m_KPSelectedChannels; } void DmxKeyPad::appendToCommand(QString text) { + qDebug() << Q_FUNC_INFO << "text:" << text; + m_commandDisplay->setText(QString("%1%2").arg(m_commandDisplay->text()).arg(text)); } @@ -347,8 +385,9 @@ void DmxKeyPad::SM_ChannelExited() { qDebug() << Q_FUNC_INFO; - m_KPSelectedChannels->append(m_currentChannel); - m_currentChannel = 0; // In case of + after a single channel + if (!m_KPSelectedChannels->contains(m_currentChannel)) m_KPSelectedChannels->append(m_currentChannel); + + m_currentChannel = 0; // In case of +/- after a single channel } void DmxKeyPad::SM_ChannelTHRUExited() diff --git a/ui/src/dmxkeypad.h b/ui/src/dmxkeypad.h index 3d2da584cd..9988e526c7 100644 --- a/ui/src/dmxkeypad.h +++ b/ui/src/dmxkeypad.h @@ -82,6 +82,7 @@ private slots: void SM_ChannelsDone(); void SM_ChannelTHRU(); void SM_AddRange(); + void SM_SubtractRange(); void SM_ByStart(); void newChanValue(uint channel, uchar value); From 981115a0756ec4d0e01b6322d4a1ced2380650ea Mon Sep 17 00:00:00 2001 From: Jannis Achstetter Date: Sun, 20 Apr 2014 22:37:10 +0200 Subject: [PATCH 11/14] Add "FAN function" (value range) --- ui/src/dmxkeypad.cpp | 50 +++++++++++++++++++++++++++++++++++--------- ui/src/dmxkeypad.h | 3 +++ 2 files changed, 43 insertions(+), 10 deletions(-) diff --git a/ui/src/dmxkeypad.cpp b/ui/src/dmxkeypad.cpp index 2a760cedf6..6ef272ce7c 100644 --- a/ui/src/dmxkeypad.cpp +++ b/ui/src/dmxkeypad.cpp @@ -17,6 +17,7 @@ DmxKeyPad::DmxKeyPad(QWidget *parent) : m_KPState_ChannelTHRU = new QState(); m_KPState_StepSize = new QState(); m_KPState_Value = new QState(); + m_KPState_ValueTHRU = new QState(); // Valid/possible transitions from one state to another. Triggered by SIGNALs m_KPState_Init->addTransition(this, SIGNAL(SM_InitDone()), m_KPState_Channel); @@ -33,11 +34,14 @@ DmxKeyPad::DmxKeyPad(QWidget *parent) : m_KPState_StepSize->addTransition(this, SIGNAL(SM_ChannelsDone()), m_KPState_Value); + m_KPState_Value->addTransition(this, SIGNAL(SM_ValueTHRU()), m_KPState_ValueTHRU); + // Transitions from every possible state to Init via SM_Reset() m_KPState_Channel->addTransition(this, SIGNAL(SM_Reset()), m_KPState_Init); m_KPState_ChannelTHRU->addTransition(this, SIGNAL(SM_Reset()), m_KPState_Init); m_KPState_StepSize->addTransition(this, SIGNAL(SM_Reset()), m_KPState_Init); m_KPState_Value->addTransition(this, SIGNAL(SM_Reset()), m_KPState_Init); + m_KPState_ValueTHRU->addTransition(this, SIGNAL(SM_Reset()), m_KPState_Init); // Connect the entered() and exited() SIGNALs to some SLOTs that do the actual work/calculations connect(m_KPState_Init, SIGNAL(entered()), this, SLOT(SM_Init())); @@ -51,6 +55,7 @@ DmxKeyPad::DmxKeyPad(QWidget *parent) : m_KPStateMachine->addState(m_KPState_ChannelTHRU); m_KPStateMachine->addState(m_KPState_StepSize); m_KPStateMachine->addState(m_KPState_Value); + m_KPStateMachine->addState(m_KPState_ValueTHRU); m_KPStateMachine->setInitialState(m_KPState_Init); m_KPStateMachine->start(); } @@ -202,11 +207,20 @@ void DmxKeyPad::KP_THRU() { qDebug() << Q_FUNC_INFO; - // TODO: "FAN" function => Check current state if channel or value - m_rangeStartChan = m_currentChannel; - m_currentChannel = 0; - appendToCommand(" THRU "); - emit SM_ChannelTHRU(); + if (m_KPStateMachine->configuration().contains(m_KPState_Channel)) + { + m_rangeStartChan = m_currentChannel; + m_currentChannel = 0; + appendToCommand(" THRU "); + emit SM_ChannelTHRU(); + } + else if (m_KPStateMachine->configuration().contains(m_KPState_Value)) + { + m_fanStartValue = m_currentValue; + m_currentValue = 0; + appendToCommand(" THRU "); + emit SM_ValueTHRU(); + } } void DmxKeyPad::KP_PLUS() @@ -238,20 +252,35 @@ void DmxKeyPad::KP_FULL() if (m_KPStateMachine->configuration().contains(m_KPState_Value)) { m_currentValue = 255; appendToCommand("FULL"); - KP_ENTER(); // Wrong in case we want to support "FULL THRU ..." (FAN function) + KP_ENTER(); // FULL implies ENTER for simplicity. If you want "FULL" and FAN function, use 255 please! } } void DmxKeyPad::KP_ENTER() { - qDebug() << Q_FUNC_INFO; + qreal valueStepSize = 0; + qint32 i = 0; + + qDebug() << Q_FUNC_INFO << "currentValue:" << m_currentValue << "fanStartValue" << m_fanStartValue; + + // Remove invalid channel + if (m_KPSelectedChannels->contains(0)) m_KPSelectedChannels->removeAll(0); + + if (m_KPStateMachine->configuration().contains(m_KPState_ValueTHRU)) + { + valueStepSize = (m_currentValue - m_fanStartValue) / (qreal)(m_KPSelectedChannels->count() - 1); + } + + qDebug() << "valueStepSize" << valueStepSize; uint chan; foreach(chan, *m_KPSelectedChannels) { if (chan < 1) continue; - qDebug() << "KEYPAD: SET CHANNEL" << chan << "TO" << m_currentValue; - emit newChanValue(chan - 1, m_currentValue); + + qDebug() << "KEYPAD: SET CHANNEL" << chan << "TO" << m_fanStartValue + i*valueStepSize; + emit newChanValue(chan - 1, m_fanStartValue + i*valueStepSize); + i++; } emit newValuesDone(); emit SM_Reset(); @@ -292,7 +321,7 @@ void DmxKeyPad::addDigitToNumber(quint8 digit) m_currentChannel = m_currentChannel * 10 + digit; appendToCommand(QString("%1").arg(digit)); } - else if (m_KPStateMachine->configuration().contains(m_KPState_Value)) + else if (m_KPStateMachine->configuration().contains(m_KPState_Value) || m_KPStateMachine->configuration().contains(m_KPState_ValueTHRU)) { if ((m_currentValue * 10 + digit) > 255) return; // Invalid value m_currentValue = m_currentValue * 10 + digit; @@ -374,6 +403,7 @@ void DmxKeyPad::SM_Init() m_currentChannel = 0; m_rangeStartChan = 0; m_currentValue = 0; + m_fanStartValue = 0; m_byStepSize = 1; m_addToRange = false; m_subtractFromRange = false; diff --git a/ui/src/dmxkeypad.h b/ui/src/dmxkeypad.h index 9988e526c7..95521244eb 100644 --- a/ui/src/dmxkeypad.h +++ b/ui/src/dmxkeypad.h @@ -22,6 +22,7 @@ class DmxKeyPad : public QWidget uint m_rangeStartChan; uint m_currentChannel; uchar m_currentValue; + uchar m_fanStartValue; uchar m_byStepSize; bool m_addToRange; bool m_subtractFromRange; @@ -32,6 +33,7 @@ class DmxKeyPad : public QWidget QState* m_KPState_ChannelTHRU; // Wait for second part of channel "THRU" specification (range end) QState* m_KPState_StepSize; // Wait for entry of step size (entered by "BY") QState* m_KPState_Value; // Wait for value(range) specification + QState* m_KPState_ValueTHRU; // Wait for second pard of value "THRU" specification (range end) QGridLayout* lay; @@ -84,6 +86,7 @@ private slots: void SM_AddRange(); void SM_SubtractRange(); void SM_ByStart(); + void SM_ValueTHRU(); void newChanValue(uint channel, uchar value); void newValuesDone(); From 292cfc78f9379ba35e020ca4cab6c9a8b1ca6a95 Mon Sep 17 00:00:00 2001 From: Jannis Achstetter Date: Sun, 20 Apr 2014 22:39:09 +0200 Subject: [PATCH 12/14] Fix for non-faned values --- ui/src/dmxkeypad.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ui/src/dmxkeypad.cpp b/ui/src/dmxkeypad.cpp index 6ef272ce7c..cb353d0c48 100644 --- a/ui/src/dmxkeypad.cpp +++ b/ui/src/dmxkeypad.cpp @@ -270,6 +270,10 @@ void DmxKeyPad::KP_ENTER() { valueStepSize = (m_currentValue - m_fanStartValue) / (qreal)(m_KPSelectedChannels->count() - 1); } + else + { + m_fanStartValue = m_currentValue; + } qDebug() << "valueStepSize" << valueStepSize; From 416456084491455f2c8b2542a2edc03692319a22 Mon Sep 17 00:00:00 2001 From: Jannis Achstetter Date: Sun, 20 Apr 2014 22:46:10 +0200 Subject: [PATCH 13/14] Disable buttons for not-yet-implemented functions/combinations --- ui/src/dmxkeypad.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/ui/src/dmxkeypad.cpp b/ui/src/dmxkeypad.cpp index cb353d0c48..de2f8fed05 100644 --- a/ui/src/dmxkeypad.cpp +++ b/ui/src/dmxkeypad.cpp @@ -196,6 +196,8 @@ void DmxKeyPad::KP_MINUS() if (m_KPStateMachine->configuration().contains(m_KPState_Channel) || m_KPStateMachine->configuration().contains(m_KPState_ChannelTHRU)) { + m_BY->setEnabled(false); // not implemented yet + emit SM_SubtractRange(); // re-calculate the current (pre-Subtract range) m_currentChannel = 0; m_subtractFromRange = true; @@ -229,6 +231,8 @@ void DmxKeyPad::KP_PLUS() if (m_KPStateMachine->configuration().contains(m_KPState_Channel) || m_KPStateMachine->configuration().contains(m_KPState_ChannelTHRU)) { + m_BY->setEnabled(false); // not implemented yet + emit SM_AddRange(); // re-calculate the current (pre-Add range) m_currentChannel = 0; m_addToRange = true; @@ -241,6 +245,11 @@ void DmxKeyPad::KP_BY() qDebug() << Q_FUNC_INFO; appendToCommand(" BY "); + + // Not implemented yet + m_PLUS->setEnabled(false); + m_MINUS->setEnabled(false); + emit SM_ByStart(); } @@ -412,6 +421,10 @@ void DmxKeyPad::SM_Init() m_addToRange = false; m_subtractFromRange = false; + m_PLUS->setEnabled(true); + m_MINUS->setEnabled(true); + m_BY->setEnabled(true); + emit SM_InitDone(); // Changes state machine to "Channel" state } From 335177ced6bb0d4265ee549060a48233e29a8d53 Mon Sep 17 00:00:00 2001 From: Jannis Achstetter Date: Tue, 22 Apr 2014 21:43:32 +0200 Subject: [PATCH 14/14] very minor comment fixes --- ui/src/dmxkeypad.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ui/src/dmxkeypad.cpp b/ui/src/dmxkeypad.cpp index de2f8fed05..757bff4fab 100644 --- a/ui/src/dmxkeypad.cpp +++ b/ui/src/dmxkeypad.cpp @@ -36,7 +36,7 @@ DmxKeyPad::DmxKeyPad(QWidget *parent) : m_KPState_Value->addTransition(this, SIGNAL(SM_ValueTHRU()), m_KPState_ValueTHRU); - // Transitions from every possible state to Init via SM_Reset() + // Transitions from every possible state to Init via SIGNAL SM_Reset() m_KPState_Channel->addTransition(this, SIGNAL(SM_Reset()), m_KPState_Init); m_KPState_ChannelTHRU->addTransition(this, SIGNAL(SM_Reset()), m_KPState_Init); m_KPState_StepSize->addTransition(this, SIGNAL(SM_Reset()), m_KPState_Init); @@ -198,7 +198,7 @@ void DmxKeyPad::KP_MINUS() { m_BY->setEnabled(false); // not implemented yet - emit SM_SubtractRange(); // re-calculate the current (pre-Subtract range) + emit SM_SubtractRange(); // re-calculate the current (pre-Subtract) range m_currentChannel = 0; m_subtractFromRange = true; appendToCommand(" - "); @@ -233,7 +233,7 @@ void DmxKeyPad::KP_PLUS() { m_BY->setEnabled(false); // not implemented yet - emit SM_AddRange(); // re-calculate the current (pre-Add range) + emit SM_AddRange(); // re-calculate the current (pre-Add) range m_currentChannel = 0; m_addToRange = true; appendToCommand(" + ");