diff --git a/main.cpp b/main.cpp index 02cb0a4..803faf7 100644 --- a/main.cpp +++ b/main.cpp @@ -89,7 +89,7 @@ int main(int argc, char *argv[]) MainWindow w(&settings, µ, parser.isSet(secondaryOption)); - RelayDialog relayDialog; + RelayDialog relayDialog(µ); if(!parser.isSet(secondaryOption)) { diff --git a/microcontroller.cpp b/microcontroller.cpp index 0c3cdb0..c5494fb 100644 --- a/microcontroller.cpp +++ b/microcontroller.cpp @@ -2,6 +2,7 @@ Microcontroller::Microcontroller(QIODevice* port): _port(port) { + getState(); } Microcontroller::Microcontroller() @@ -16,6 +17,7 @@ Microcontroller::~Microcontroller() void Microcontroller::setIODevice(QIODevice *port) { _port = port; + getState(); } void Microcontroller::relayToggle(int state, int relay) @@ -84,6 +86,11 @@ void Microcontroller::run() loop->exec(); } +void Microcontroller::getState() +{ + if(_port != nullptr) _port->write("relay state\n", sizeof("relay state\n")); +} + void Microcontroller::abort() { @@ -93,6 +100,29 @@ void Microcontroller::abort() } } +void Microcontroller::processMicroReturn() +{ + QString workbuff = _buffer; + + workbuff.remove(0, 2); + QStringList workbufList = workbuff.split(','); + int numberOfRelays = workbufList[0].toInt(); + if(workbufList.size() >= numberOfRelays+1) + { + bool hasChanged = false; + _relayStates.resize(numberOfRelays, false); + for(int i = 0; i < numberOfRelays; i++) + { + if(_relayStates[i] != (bool)workbufList[i+1].toInt()) + { + _relayStates[i] = (bool)workbufList[i+1].toInt(); + hasChanged = true; + } + } + if(hasChanged)relayStateChanged(_relayStates); + } +} + void Microcontroller::doTick() { if(_port != nullptr) @@ -101,10 +131,12 @@ void Microcontroller::doTick() while(_port->getChar(&charBuf)) { _buffer.push_back(charBuf); - std::cout< 2 && _buffer[0] == "S" && _buffer[1] == "T") + { + processMicroReturn(); + } textRecived(_buffer); _buffer.clear(); } diff --git a/microcontroller.h b/microcontroller.h index eeb08c2..13fdc78 100644 --- a/microcontroller.h +++ b/microcontroller.h @@ -11,17 +11,22 @@ #include #include #include +#include class Microcontroller: public QObject { Q_OBJECT private: + std::vector _relayStates; //ugh vector of bools QIODevice* _port = nullptr; QScopedPointer loop; QString _buffer; + void processMicroReturn(); + void getState(); + public: Microcontroller(QIODevice* port); Microcontroller(); @@ -45,6 +50,7 @@ public slots: signals: void textRecived(const QString string); + void relayStateChanged(std::vector relayStates); }; diff --git a/relaydialog.cpp b/relaydialog.cpp index f09a9f3..77197d9 100644 --- a/relaydialog.cpp +++ b/relaydialog.cpp @@ -1,15 +1,43 @@ #include "relaydialog.h" #include "ui_relaydialog.h" -RelayDialog::RelayDialog(QWidget *parent) : +RelayDialog::RelayDialog(Microcontroller *micro, QWidget *parent) : QDialog(parent), - ui(new Ui::RelayDialog) + ui(new Ui::RelayDialog), + _micro(micro) { ui->setupUi(this); + _relayCheckBoxes.push_back(ui->checkBox_R0); + _relayCheckBoxes.push_back(ui->checkBox_R1); + _relayCheckBoxes.push_back(ui->checkBox_R2); + _relayCheckBoxes.push_back(ui->checkBox_R3); + + for(unsigned int i = 0; i < _relayCheckBoxes.size(); i++) connect(_relayCheckBoxes[i], SIGNAL(toggled(bool)), this, SLOT(relayCheckBoxToggeled(bool))); + + _micro->relayOn(STARTING_RELAY); + _micro->relayOn(STARTING_RELAY+1); + } RelayDialog::~RelayDialog() { delete ui; } + + +void RelayDialog::relayCheckBoxToggeled(bool checked) +{ + for(unsigned int i = 0; i < _relayCheckBoxes.size(); i++) + { + if(_relayCheckBoxes[i] == sender()) + { + checked ? _micro->relayOn(i+4) : _micro->relayOff(i+4); + } + } +} + +void RelayDialog::relayStateChanged(std::vector relayStates) +{ + if(relayStates.size() >= 8) for(unsigned int i = 0; i < _relayCheckBoxes.size(); i++) _relayCheckBoxes[i]->setChecked(relayStates[i+4]); +} diff --git a/relaydialog.h b/relaydialog.h index 1f522c6..ee27419 100644 --- a/relaydialog.h +++ b/relaydialog.h @@ -2,6 +2,12 @@ #define RELAYDIALOG_H #include +#include +#include +#include +#include "microcontroller.h" + +#define STARTING_RELAY 4 namespace Ui { class RelayDialog; @@ -12,11 +18,22 @@ class RelayDialog : public QDialog Q_OBJECT public: - explicit RelayDialog(QWidget *parent = 0); + explicit RelayDialog(Microcontroller *micro, QWidget *parent = 0); ~RelayDialog(); private: + + std::vector _relayCheckBoxes; + Ui::RelayDialog *ui; + + Microcontroller *_micro; + +private slots: + void relayCheckBoxToggeled(bool checked); + +public slots: + void relayStateChanged(std::vector relayStates); }; #endif // RELAYDIALOG_H diff --git a/relaydialog.ui b/relaydialog.ui index a6b5ccd..e64964e 100644 --- a/relaydialog.ui +++ b/relaydialog.ui @@ -7,7 +7,7 @@ 0 0 358 - 277 + 279 @@ -50,10 +50,13 @@ - + On + + true + @@ -66,7 +69,7 @@ - + @@ -88,10 +91,13 @@ - + On + + true + @@ -126,7 +132,7 @@ - + On @@ -146,7 +152,7 @@ - Aux 2 + Aux 1 @@ -164,7 +170,7 @@ - + On