From 872488d1741afbf0bdfff3b259a46d5774424b67 Mon Sep 17 00:00:00 2001 From: uvos Date: Fri, 11 Feb 2022 11:46:30 +0100 Subject: [PATCH 01/10] switch from spaces to tabs --- src/QJoysticks.cpp | 376 +++++++++++++++++----------------- src/QJoysticks.h | 96 ++++----- src/auxitem.cpp | 11 +- src/auxitem.h | 11 +- src/items/auxitem.cpp | 11 +- src/items/auxitem.h | 11 +- src/items/item.cpp | 19 +- src/items/item.h | 31 +-- src/items/itemstore.cpp | 56 ++--- src/items/itemstore.h | 27 +-- src/items/train.cpp | 20 +- src/items/train.h | 20 +- src/items/turnout.cpp | 8 +- src/items/turnout.h | 11 +- src/main.cpp | 145 ++++++------- src/mainobject.cpp | 8 +- src/mainobject.h | 18 +- src/microcontroller.cpp | 184 +++++++++-------- src/microcontroller.h | 70 +++---- src/trainjs.h | 5 +- src/ui/itemcreationdialog.cpp | 22 +- src/ui/itemcreationdialog.h | 19 +- src/ui/itemscrollbox.cpp | 120 +++++------ src/ui/itemscrollbox.h | 21 +- src/ui/itemsettingsdialog.cpp | 254 +++++++++++------------ src/ui/itemsettingsdialog.h | 25 +-- src/ui/itemwidget.cpp | 210 ++++++++++--------- src/ui/itemwidget.h | 43 ++-- src/ui/mainwindow.cpp | 32 +-- src/ui/mainwindow.h | 16 +- 30 files changed, 971 insertions(+), 929 deletions(-) diff --git a/src/QJoysticks.cpp b/src/QJoysticks.cpp index 2deb989..2d6e964 100644 --- a/src/QJoysticks.cpp +++ b/src/QJoysticks.cpp @@ -28,38 +28,38 @@ QJoysticks::QJoysticks() { - /* Initialize input methods */ - m_sdlJoysticks = new SDL_Joysticks(this); - m_virtualJoystick = new VirtualJoystick(this); + /* Initialize input methods */ + m_sdlJoysticks = new SDL_Joysticks(this); + m_virtualJoystick = new VirtualJoystick(this); - /* Configure SDL joysticks */ - connect(sdlJoysticks(), &SDL_Joysticks::POVEvent, this, &QJoysticks::POVEvent); - connect(sdlJoysticks(), &SDL_Joysticks::axisEvent, this, &QJoysticks::axisEvent); - connect(sdlJoysticks(), &SDL_Joysticks::buttonEvent, this, &QJoysticks::buttonEvent); - connect(sdlJoysticks(), &SDL_Joysticks::countChanged, this, &QJoysticks::updateInterfaces); + /* Configure SDL joysticks */ + connect(sdlJoysticks(), &SDL_Joysticks::POVEvent, this, &QJoysticks::POVEvent); + connect(sdlJoysticks(), &SDL_Joysticks::axisEvent, this, &QJoysticks::axisEvent); + connect(sdlJoysticks(), &SDL_Joysticks::buttonEvent, this, &QJoysticks::buttonEvent); + connect(sdlJoysticks(), &SDL_Joysticks::countChanged, this, &QJoysticks::updateInterfaces); - /* Configure virtual joysticks */ - connect(virtualJoystick(), &VirtualJoystick::povEvent, this, &QJoysticks::POVEvent); - connect(virtualJoystick(), &VirtualJoystick::axisEvent, this, &QJoysticks::axisEvent); - connect(virtualJoystick(), &VirtualJoystick::buttonEvent, this, &QJoysticks::buttonEvent); - connect(virtualJoystick(), &VirtualJoystick::enabledChanged, this, &QJoysticks::updateInterfaces); + /* Configure virtual joysticks */ + connect(virtualJoystick(), &VirtualJoystick::povEvent, this, &QJoysticks::POVEvent); + connect(virtualJoystick(), &VirtualJoystick::axisEvent, this, &QJoysticks::axisEvent); + connect(virtualJoystick(), &VirtualJoystick::buttonEvent, this, &QJoysticks::buttonEvent); + connect(virtualJoystick(), &VirtualJoystick::enabledChanged, this, &QJoysticks::updateInterfaces); - /* React to own signals to create QML signals */ - connect(this, &QJoysticks::POVEvent, this, &QJoysticks::onPOVEvent); - connect(this, &QJoysticks::axisEvent, this, &QJoysticks::onAxisEvent); - connect(this, &QJoysticks::buttonEvent, this, &QJoysticks::onButtonEvent); + /* React to own signals to create QML signals */ + connect(this, &QJoysticks::POVEvent, this, &QJoysticks::onPOVEvent); + connect(this, &QJoysticks::axisEvent, this, &QJoysticks::onAxisEvent); + connect(this, &QJoysticks::buttonEvent, this, &QJoysticks::onButtonEvent); - /* Configure the settings */ - m_sortJoyticks = 0; - m_settings = new QSettings(qApp->organizationName(), qApp->applicationName()); - m_settings->beginGroup("Blacklisted Joysticks"); + /* Configure the settings */ + m_sortJoyticks = 0; + m_settings = new QSettings(qApp->organizationName(), qApp->applicationName()); + m_settings->beginGroup("Blacklisted Joysticks"); } QJoysticks::~QJoysticks() { - delete m_settings; - delete m_sdlJoysticks; - delete m_virtualJoystick; + delete m_settings; + delete m_sdlJoysticks; + delete m_virtualJoystick; } /** @@ -67,8 +67,8 @@ QJoysticks::~QJoysticks() */ QJoysticks *QJoysticks::getInstance() { - static QJoysticks joysticks; - return &joysticks; + static QJoysticks joysticks; + return &joysticks; } /** @@ -79,7 +79,7 @@ QJoysticks *QJoysticks::getInstance() */ int QJoysticks::count() const { - return inputDevices().count(); + return inputDevices().count(); } /** @@ -88,13 +88,13 @@ int QJoysticks::count() const */ int QJoysticks::nonBlacklistedCount() { - int cnt = count(); + int cnt = count(); - for (int i = 0; i < count(); ++i) - if (isBlacklisted(i)) - --cnt; + for (int i = 0; i < count(); ++i) + if (isBlacklisted(i)) + --cnt; - return cnt; + return cnt; } /** @@ -105,12 +105,12 @@ int QJoysticks::nonBlacklistedCount() */ QStringList QJoysticks::deviceNames() const { - QStringList names; + QStringList names; - foreach (QJoystickDevice *joystick, inputDevices()) - names.append(joystick->name); + foreach (QJoystickDevice *joystick, inputDevices()) + names.append(joystick->name); - return names; + return names; } /** @@ -118,10 +118,10 @@ QStringList QJoysticks::deviceNames() const */ int QJoysticks::getPOV(const int index, const int pov) { - if (joystickExists(index)) - return getInputDevice(index)->povs.at(pov); + if (joystickExists(index)) + return getInputDevice(index)->povs.at(pov); - return -1; + return -1; } /** @@ -129,10 +129,10 @@ int QJoysticks::getPOV(const int index, const int pov) */ double QJoysticks::getAxis(const int index, const int axis) { - if (joystickExists(index)) - return getInputDevice(index)->axes.at(axis); + if (joystickExists(index)) + return getInputDevice(index)->axes.at(axis); - return 0; + return 0; } /** @@ -140,10 +140,10 @@ double QJoysticks::getAxis(const int index, const int axis) */ bool QJoysticks::getButton(const int index, const int button) { - if (joystickExists(index)) - return getInputDevice(index)->buttons.at(button); + if (joystickExists(index)) + return getInputDevice(index)->buttons.at(button); - return false; + return false; } /** @@ -151,10 +151,10 @@ bool QJoysticks::getButton(const int index, const int button) */ int QJoysticks::getNumAxes(const int index) { - if (joystickExists(index)) - return getInputDevice(index)->axes.count(); + if (joystickExists(index)) + return getInputDevice(index)->axes.count(); - return -1; + return -1; } /** @@ -162,10 +162,10 @@ int QJoysticks::getNumAxes(const int index) */ int QJoysticks::getNumPOVs(const int index) { - if (joystickExists(index)) - return getInputDevice(index)->povs.count(); + if (joystickExists(index)) + return getInputDevice(index)->povs.count(); - return -1; + return -1; } /** @@ -173,10 +173,10 @@ int QJoysticks::getNumPOVs(const int index) */ int QJoysticks::getNumButtons(const int index) { - if (joystickExists(index)) - return getInputDevice(index)->buttons.count(); + if (joystickExists(index)) + return getInputDevice(index)->buttons.count(); - return -1; + return -1; } /** @@ -184,10 +184,10 @@ int QJoysticks::getNumButtons(const int index) */ bool QJoysticks::isBlacklisted(const int index) { - if (joystickExists(index)) - return inputDevices().at(index)->blacklisted; + if (joystickExists(index)) + return inputDevices().at(index)->blacklisted; - return true; + return true; } /** @@ -196,7 +196,7 @@ bool QJoysticks::isBlacklisted(const int index) */ bool QJoysticks::joystickExists(const int index) { - return (index >= 0) && (count() > index); + return (index >= 0) && (count() > index); } /** @@ -204,10 +204,10 @@ bool QJoysticks::joystickExists(const int index) */ QString QJoysticks::getName(const int index) { - if (joystickExists(index)) - return m_devices.at(index)->name; + if (joystickExists(index)) + return m_devices.at(index)->name; - return "Invalid Joystick"; + return "Invalid Joystick"; } /** @@ -217,7 +217,7 @@ QString QJoysticks::getName(const int index) */ SDL_Joysticks *QJoysticks::sdlJoysticks() const { - return m_sdlJoysticks; + return m_sdlJoysticks; } /** @@ -230,7 +230,7 @@ SDL_Joysticks *QJoysticks::sdlJoysticks() const */ VirtualJoystick *QJoysticks::virtualJoystick() const { - return m_virtualJoystick; + return m_virtualJoystick; } /** @@ -238,10 +238,10 @@ VirtualJoystick *QJoysticks::virtualJoystick() const */ QJoystickDevice *QJoysticks::getInputDevice(const int index) { - if (joystickExists(index)) - return inputDevices().at(index); + if (joystickExists(index)) + return inputDevices().at(index); - return Q_NULLPTR; + return Q_NULLPTR; } /** @@ -251,7 +251,7 @@ QJoystickDevice *QJoysticks::getInputDevice(const int index) */ QList QJoysticks::inputDevices() const { - return m_devices; + return m_devices; } /** @@ -260,11 +260,11 @@ QList QJoysticks::inputDevices() const */ void QJoysticks::setSortJoysticksByBlacklistState(bool sort) { - if (m_sortJoyticks != sort) - { - m_sortJoyticks = sort; - updateInterfaces(); - } + if (m_sortJoyticks != sort) + { + m_sortJoyticks = sort; + updateInterfaces(); + } } /** @@ -275,31 +275,31 @@ void QJoysticks::setSortJoysticksByBlacklistState(bool sort) */ void QJoysticks::setBlacklisted(const int index, bool blacklisted) { - Q_ASSERT(joystickExists(index)); + Q_ASSERT(joystickExists(index)); - /* Netrualize the joystick */ - if (blacklisted) - { - for (int i = 0; i < getNumAxes(index); ++i) - emit axisChanged(index, i, 0); + /* Netrualize the joystick */ + if (blacklisted) + { + for (int i = 0; i < getNumAxes(index); ++i) + emit axisChanged(index, i, 0); - for (int i = 0; i < getNumButtons(index); ++i) - emit buttonChanged(index, i, false); + for (int i = 0; i < getNumButtons(index); ++i) + emit buttonChanged(index, i, false); - for (int i = 0; i < getNumPOVs(index); ++i) - emit povChanged(index, i, 0); - } + for (int i = 0; i < getNumPOVs(index); ++i) + emit povChanged(index, i, 0); + } - /* See if blacklist value was actually changed */ - bool changed = m_devices.at(index)->blacklisted != blacklisted; + /* See if blacklist value was actually changed */ + bool changed = m_devices.at(index)->blacklisted != blacklisted; - /* Save settings */ - m_devices.at(index)->blacklisted = blacklisted; - m_settings->setValue(getName(index), blacklisted); + /* Save settings */ + m_devices.at(index)->blacklisted = blacklisted; + m_settings->setValue(getName(index), blacklisted); - /* Re-scan joysticks if blacklist value has changed */ - if (changed) - updateInterfaces(); + /* Re-scan joysticks if blacklist value has changed */ + if (changed) + updateInterfaces(); } /** @@ -307,76 +307,76 @@ void QJoysticks::setBlacklisted(const int index, bool blacklisted) */ void QJoysticks::updateInterfaces() { - m_devices.clear(); + m_devices.clear(); - /* Put blacklisted joysticks at the bottom of the list */ - if (m_sortJoyticks) - { - /* Register non-blacklisted SDL joysticks */ - foreach (QJoystickDevice *joystick, sdlJoysticks()->joysticks()) - { - joystick->blacklisted = m_settings->value(joystick->name, false).toBool(); - if (!joystick->blacklisted) - addInputDevice(joystick); - } + /* Put blacklisted joysticks at the bottom of the list */ + if (m_sortJoyticks) + { + /* Register non-blacklisted SDL joysticks */ + foreach (QJoystickDevice *joystick, sdlJoysticks()->joysticks()) + { + joystick->blacklisted = m_settings->value(joystick->name, false).toBool(); + if (!joystick->blacklisted) + addInputDevice(joystick); + } - /* Register the virtual joystick (if its not blacklisted) */ - if (virtualJoystick()->joystickEnabled()) - { - QJoystickDevice *joystick = virtualJoystick()->joystick(); - joystick->blacklisted = m_settings->value(joystick->name, false).toBool(); + /* Register the virtual joystick (if its not blacklisted) */ + if (virtualJoystick()->joystickEnabled()) + { + QJoystickDevice *joystick = virtualJoystick()->joystick(); + joystick->blacklisted = m_settings->value(joystick->name, false).toBool(); - if (!joystick->blacklisted) - { - addInputDevice(joystick); - virtualJoystick()->setJoystickID(inputDevices().count() - 1); - } - } + if (!joystick->blacklisted) + { + addInputDevice(joystick); + virtualJoystick()->setJoystickID(inputDevices().count() - 1); + } + } - /* Register blacklisted SDL joysticks */ - foreach (QJoystickDevice *joystick, sdlJoysticks()->joysticks()) - { - joystick->blacklisted = m_settings->value(joystick->name, false).toBool(); - if (joystick->blacklisted) - addInputDevice(joystick); - } + /* Register blacklisted SDL joysticks */ + foreach (QJoystickDevice *joystick, sdlJoysticks()->joysticks()) + { + joystick->blacklisted = m_settings->value(joystick->name, false).toBool(); + if (joystick->blacklisted) + addInputDevice(joystick); + } - /* Register the virtual joystick (if its blacklisted) */ - if (virtualJoystick()->joystickEnabled()) - { - QJoystickDevice *joystick = virtualJoystick()->joystick(); - joystick->blacklisted = m_settings->value(joystick->name, false).toBool(); + /* Register the virtual joystick (if its blacklisted) */ + if (virtualJoystick()->joystickEnabled()) + { + QJoystickDevice *joystick = virtualJoystick()->joystick(); + joystick->blacklisted = m_settings->value(joystick->name, false).toBool(); - if (joystick->blacklisted) - { - addInputDevice(joystick); - virtualJoystick()->setJoystickID(inputDevices().count() - 1); - } - } - } + if (joystick->blacklisted) + { + addInputDevice(joystick); + virtualJoystick()->setJoystickID(inputDevices().count() - 1); + } + } + } - /* Sort normally */ - else - { - /* Register SDL joysticks */ - foreach (QJoystickDevice *joystick, sdlJoysticks()->joysticks()) - { - addInputDevice(joystick); - joystick->blacklisted = m_settings->value(joystick->name, false).toBool(); - } + /* Sort normally */ + else + { + /* Register SDL joysticks */ + foreach (QJoystickDevice *joystick, sdlJoysticks()->joysticks()) + { + addInputDevice(joystick); + joystick->blacklisted = m_settings->value(joystick->name, false).toBool(); + } - /* Register virtual joystick */ - if (virtualJoystick()->joystickEnabled()) - { - QJoystickDevice *joystick = virtualJoystick()->joystick(); - joystick->blacklisted = m_settings->value(joystick->name, false).toBool(); + /* Register virtual joystick */ + if (virtualJoystick()->joystickEnabled()) + { + QJoystickDevice *joystick = virtualJoystick()->joystick(); + joystick->blacklisted = m_settings->value(joystick->name, false).toBool(); - addInputDevice(joystick); - virtualJoystick()->setJoystickID(inputDevices().count() - 1); - } - } + addInputDevice(joystick); + virtualJoystick()->setJoystickID(inputDevices().count() - 1); + } + } - emit countChanged(); + emit countChanged(); } /** @@ -387,7 +387,7 @@ void QJoysticks::updateInterfaces() */ void QJoysticks::setVirtualJoystickRange(qreal range) { - virtualJoystick()->setAxisRange(range); + virtualJoystick()->setAxisRange(range); } /** @@ -395,12 +395,12 @@ void QJoysticks::setVirtualJoystickRange(qreal range) */ void QJoysticks::setVirtualJoystickEnabled(bool enabled) { - virtualJoystick()->setJoystickEnabled(enabled); + virtualJoystick()->setJoystickEnabled(enabled); } void QJoysticks::setVirtualJoystickAxisSensibility(qreal sensibility) { - virtualJoystick()->setAxisSensibility(sensibility); + virtualJoystick()->setAxisSensibility(sensibility); } /** @@ -408,8 +408,8 @@ void QJoysticks::setVirtualJoystickAxisSensibility(qreal sensibility) */ void QJoysticks::resetJoysticks() { - m_devices.clear(); - emit countChanged(); + m_devices.clear(); + emit countChanged(); } /** @@ -417,8 +417,8 @@ void QJoysticks::resetJoysticks() */ void QJoysticks::addInputDevice(QJoystickDevice *device) { - Q_ASSERT(device); - m_devices.append(device); + Q_ASSERT(device); + m_devices.append(device); } /** @@ -427,17 +427,17 @@ void QJoysticks::addInputDevice(QJoystickDevice *device) */ void QJoysticks::onPOVEvent(const QJoystickPOVEvent &e) { - if (e.joystick == nullptr) - return; + if (e.joystick == nullptr) + return; - if (!isBlacklisted(e.joystick->id)) - { - if (e.pov < getInputDevice(e.joystick->id)->povs.count()) - { - getInputDevice(e.joystick->id)->povs[e.pov] = e.angle; - emit povChanged(e.joystick->id, e.pov, e.angle); - } - } + if (!isBlacklisted(e.joystick->id)) + { + if (e.pov < getInputDevice(e.joystick->id)->povs.count()) + { + getInputDevice(e.joystick->id)->povs[e.pov] = e.angle; + emit povChanged(e.joystick->id, e.pov, e.angle); + } + } } /** @@ -446,17 +446,17 @@ void QJoysticks::onPOVEvent(const QJoystickPOVEvent &e) */ void QJoysticks::onAxisEvent(const QJoystickAxisEvent &e) { - if (e.joystick == nullptr) - return; + if (e.joystick == nullptr) + return; - if (!isBlacklisted(e.joystick->id)) - { - if (e.axis < getInputDevice(e.joystick->id)->axes.count()) - { - getInputDevice(e.joystick->id)->axes[e.axis] = e.value; - emit axisChanged(e.joystick->id, e.axis, e.value); - } - } + if (!isBlacklisted(e.joystick->id)) + { + if (e.axis < getInputDevice(e.joystick->id)->axes.count()) + { + getInputDevice(e.joystick->id)->axes[e.axis] = e.value; + emit axisChanged(e.joystick->id, e.axis, e.value); + } + } } /** @@ -465,15 +465,15 @@ void QJoysticks::onAxisEvent(const QJoystickAxisEvent &e) */ void QJoysticks::onButtonEvent(const QJoystickButtonEvent &e) { - if (e.joystick == nullptr) - return; + if (e.joystick == nullptr) + return; - if (!isBlacklisted(e.joystick->id)) - { - if (e.button < getInputDevice(e.joystick->id)->buttons.count()) - { - getInputDevice(e.joystick->id)->buttons[e.button] = e.pressed; - emit buttonChanged(e.joystick->id, e.button, e.pressed); - } - } + if (!isBlacklisted(e.joystick->id)) + { + if (e.button < getInputDevice(e.joystick->id)->buttons.count()) + { + getInputDevice(e.joystick->id)->buttons[e.button] = e.pressed; + emit buttonChanged(e.joystick->id, e.button, e.pressed); + } + } } diff --git a/src/QJoysticks.h b/src/QJoysticks.h index 819e092..6988a82 100644 --- a/src/QJoysticks.h +++ b/src/QJoysticks.h @@ -50,73 +50,73 @@ class VirtualJoystick; */ class QJoysticks : public QObject { - Q_OBJECT - Q_PROPERTY(int count READ count NOTIFY countChanged) - Q_PROPERTY(int nonBlacklistedCount READ nonBlacklistedCount NOTIFY countChanged) - Q_PROPERTY(QStringList deviceNames READ deviceNames NOTIFY countChanged) + Q_OBJECT + Q_PROPERTY(int count READ count NOTIFY countChanged) + Q_PROPERTY(int nonBlacklistedCount READ nonBlacklistedCount NOTIFY countChanged) + Q_PROPERTY(QStringList deviceNames READ deviceNames NOTIFY countChanged) - friend class Test_QJoysticks; + friend class Test_QJoysticks; signals: - void countChanged(); - void enabledChanged(const bool enabled); - void POVEvent(const QJoystickPOVEvent &event); - void axisEvent(const QJoystickAxisEvent &event); - void buttonEvent(const QJoystickButtonEvent &event); - void povChanged(const int js, const int pov, const int angle); - void axisChanged(const int js, const int axis, const qreal value); - void buttonChanged(const int js, const int button, const bool pressed); + void countChanged(); + void enabledChanged(const bool enabled); + void POVEvent(const QJoystickPOVEvent &event); + void axisEvent(const QJoystickAxisEvent &event); + void buttonEvent(const QJoystickButtonEvent &event); + void povChanged(const int js, const int pov, const int angle); + void axisChanged(const int js, const int axis, const qreal value); + void buttonChanged(const int js, const int button, const bool pressed); public: - static QJoysticks *getInstance(); + static QJoysticks *getInstance(); - int count() const; - int nonBlacklistedCount(); - QStringList deviceNames() const; + int count() const; + int nonBlacklistedCount(); + QStringList deviceNames() const; - Q_INVOKABLE int getPOV(const int index, const int pov); - Q_INVOKABLE double getAxis(const int index, const int axis); - Q_INVOKABLE bool getButton(const int index, const int button); + Q_INVOKABLE int getPOV(const int index, const int pov); + Q_INVOKABLE double getAxis(const int index, const int axis); + Q_INVOKABLE bool getButton(const int index, const int button); - Q_INVOKABLE int getNumAxes(const int index); - Q_INVOKABLE int getNumPOVs(const int index); - Q_INVOKABLE int getNumButtons(const int index); - Q_INVOKABLE bool isBlacklisted(const int index); - Q_INVOKABLE bool joystickExists(const int index); - Q_INVOKABLE QString getName(const int index); + Q_INVOKABLE int getNumAxes(const int index); + Q_INVOKABLE int getNumPOVs(const int index); + Q_INVOKABLE int getNumButtons(const int index); + Q_INVOKABLE bool isBlacklisted(const int index); + Q_INVOKABLE bool joystickExists(const int index); + Q_INVOKABLE QString getName(const int index); - SDL_Joysticks *sdlJoysticks() const; - VirtualJoystick *virtualJoystick() const; - QJoystickDevice *getInputDevice(const int index); - QList inputDevices() const; + SDL_Joysticks *sdlJoysticks() const; + VirtualJoystick *virtualJoystick() const; + QJoystickDevice *getInputDevice(const int index); + QList inputDevices() const; public slots: - void updateInterfaces(); - void setVirtualJoystickRange(qreal range); - void setVirtualJoystickEnabled(bool enabled); - void setVirtualJoystickAxisSensibility(qreal sensibility); - void setSortJoysticksByBlacklistState(bool sort); - void setBlacklisted(int index, bool blacklisted); + void updateInterfaces(); + void setVirtualJoystickRange(qreal range); + void setVirtualJoystickEnabled(bool enabled); + void setVirtualJoystickAxisSensibility(qreal sensibility); + void setSortJoysticksByBlacklistState(bool sort); + void setBlacklisted(int index, bool blacklisted); protected: - explicit QJoysticks(); - ~QJoysticks(); + explicit QJoysticks(); + ~QJoysticks(); private slots: - void resetJoysticks(); - void addInputDevice(QJoystickDevice *device); - void onPOVEvent(const QJoystickPOVEvent &e); - void onAxisEvent(const QJoystickAxisEvent &e); - void onButtonEvent(const QJoystickButtonEvent &e); + void resetJoysticks(); + void addInputDevice(QJoystickDevice *device); + void onPOVEvent(const QJoystickPOVEvent &e); + void onAxisEvent(const QJoystickAxisEvent &e); + void onButtonEvent(const QJoystickButtonEvent &e); private: - bool m_sortJoyticks; + bool m_sortJoyticks; - QSettings *m_settings; - SDL_Joysticks *m_sdlJoysticks; - VirtualJoystick *m_virtualJoystick; + QSettings *m_settings; + SDL_Joysticks *m_sdlJoysticks; + VirtualJoystick *m_virtualJoystick; - QList m_devices; + QList m_devices; }; #endif diff --git a/src/auxitem.cpp b/src/auxitem.cpp index 8f104c5..860a121 100644 --- a/src/auxitem.cpp +++ b/src/auxitem.cpp @@ -1,18 +1,19 @@ #include "auxitem.h" -AuxItem::AuxItem(Microcontroller* micro, uint32_t itemIdIn, QString name, uint8_t value, QObject* parent): Item(itemIdIn, name, value, parent), micro_(micro) +AuxItem::AuxItem(Microcontroller* micro, uint32_t itemIdIn, QString name, uint8_t value, + QObject* parent): Item(itemIdIn, name, value, parent), micro_(micro) { } void AuxItem::setValue(uint8_t value) { - Item::setValue(value); - micro_->setAuxPwm(value); + Item::setValue(value); + micro_->setAuxPwm(value); } void AuxItem::store(QJsonObject &json) { - json["Type"] = "Aux"; - Item::store(json); + json["Type"] = "Aux"; + Item::store(json); } diff --git a/src/auxitem.h b/src/auxitem.h index a1e6765..512144f 100644 --- a/src/auxitem.h +++ b/src/auxitem.h @@ -5,16 +5,17 @@ class AuxItem: public Item { - Q_OBJECT + Q_OBJECT private: - Microcontroller* micro_; + Microcontroller* micro_; public slots: - virtual void setValue(uint8_t value); + virtual void setValue(uint8_t value); public: - AuxItem(Microcontroller* micro, uint32_t itemIdIn = QRandomGenerator::global()->generate(), QString name = "", uint8_t value = 0, QObject* parent = nullptr); + AuxItem(Microcontroller* micro, uint32_t itemIdIn = QRandomGenerator::global()->generate(), QString name = "", + uint8_t value = 0, QObject* parent = nullptr); - virtual void store(QJsonObject& json); + virtual void store(QJsonObject& json); }; diff --git a/src/items/auxitem.cpp b/src/items/auxitem.cpp index 8f104c5..860a121 100644 --- a/src/items/auxitem.cpp +++ b/src/items/auxitem.cpp @@ -1,18 +1,19 @@ #include "auxitem.h" -AuxItem::AuxItem(Microcontroller* micro, uint32_t itemIdIn, QString name, uint8_t value, QObject* parent): Item(itemIdIn, name, value, parent), micro_(micro) +AuxItem::AuxItem(Microcontroller* micro, uint32_t itemIdIn, QString name, uint8_t value, + QObject* parent): Item(itemIdIn, name, value, parent), micro_(micro) { } void AuxItem::setValue(uint8_t value) { - Item::setValue(value); - micro_->setAuxPwm(value); + Item::setValue(value); + micro_->setAuxPwm(value); } void AuxItem::store(QJsonObject &json) { - json["Type"] = "Aux"; - Item::store(json); + json["Type"] = "Aux"; + Item::store(json); } diff --git a/src/items/auxitem.h b/src/items/auxitem.h index a1e6765..512144f 100644 --- a/src/items/auxitem.h +++ b/src/items/auxitem.h @@ -5,16 +5,17 @@ class AuxItem: public Item { - Q_OBJECT + Q_OBJECT private: - Microcontroller* micro_; + Microcontroller* micro_; public slots: - virtual void setValue(uint8_t value); + virtual void setValue(uint8_t value); public: - AuxItem(Microcontroller* micro, uint32_t itemIdIn = QRandomGenerator::global()->generate(), QString name = "", uint8_t value = 0, QObject* parent = nullptr); + AuxItem(Microcontroller* micro, uint32_t itemIdIn = QRandomGenerator::global()->generate(), QString name = "", + uint8_t value = 0, QObject* parent = nullptr); - virtual void store(QJsonObject& json); + virtual void store(QJsonObject& json); }; diff --git a/src/items/item.cpp b/src/items/item.cpp index 36756b9..6a8dd2f 100644 --- a/src/items/item.cpp +++ b/src/items/item.cpp @@ -10,28 +10,29 @@ ItemData::ItemData(uint32_t itemIdIn, QString name, int8_t value): name_(name), QString ItemData::getName() const { - return name_; + return name_; } void ItemData::setName(QString name) { - name_ = name; + name_ = name; } int8_t ItemData::getValue() const { - return value_; + return value_; } uint32_t ItemData::id() const { - return itemId_; + return itemId_; } //item -Item::Item(uint32_t itemIdIn, QString name, int8_t value, QObject *parent): QObject(parent), ItemData (itemIdIn, name, value) +Item::Item(uint32_t itemIdIn, QString name, int8_t value, QObject *parent): QObject(parent), ItemData (itemIdIn, name, + value) { } @@ -47,16 +48,16 @@ Item::~Item() void Item::setFunction(uint8_t function, bool on) { - functionChanged(function, on); + functionChanged(function, on); } void Item::setValue(int8_t value) { - value_ = value; - valueChanged(value_); + value_ = value; + valueChanged(value_); } void Item::informValue(int8_t value) { - Item::setValue(value); + Item::setValue(value); } diff --git a/src/items/item.h b/src/items/item.h index be563d7..9034be5 100644 --- a/src/items/item.h +++ b/src/items/item.h @@ -11,28 +11,34 @@ class Actor; class ItemData { protected: - QString name_; + QString name_; int8_t value_; - uint32_t itemId_; + uint32_t itemId_; public: ItemData(uint32_t itemIdIn = QRandomGenerator::global()->generate(), QString name = "Item", int8_t value = 0); - inline bool operator==(const ItemData& in) const{ return itemId_==in.itemId_; } - inline bool operator!=(const ItemData& in) const{ return itemId_!=in.itemId_; } + inline bool operator==(const ItemData& in) const + { + return itemId_==in.itemId_; + } + inline bool operator!=(const ItemData& in) const + { + return itemId_!=in.itemId_; + } - uint32_t id() const; + uint32_t id() const; - void setName(QString name); + void setName(QString name); int8_t getValue() const; - virtual QString getName() const; + virtual QString getName() const; }; class Item: public QObject, public ItemData { - Q_OBJECT + Q_OBJECT private: signals: @@ -43,14 +49,15 @@ signals: public slots: virtual void setValue(int8_t value); - virtual void setFunction(uint8_t funciton, bool value); + virtual void setFunction(uint8_t funciton, bool value); public: - Item(uint32_t itemIdIn = QRandomGenerator::global()->generate(), QString name = "Item", int8_t value = 0, QObject *parent = nullptr); - Item(const ItemData& itemData, QObject *parent = nullptr); + Item(uint32_t itemIdIn = QRandomGenerator::global()->generate(), QString name = "Item", int8_t value = 0, + QObject *parent = nullptr); + Item(const ItemData& itemData, QObject *parent = nullptr); - virtual ~Item(); + virtual ~Item(); void informValue(int8_t value); diff --git a/src/items/itemstore.cpp b/src/items/itemstore.cpp index 61b41eb..2a335f8 100644 --- a/src/items/itemstore.cpp +++ b/src/items/itemstore.cpp @@ -15,12 +15,12 @@ void ItemStore::addItem(std::shared_ptr item) qWarning()<<"invalid item"; return; } - bool mached = false; - for(unsigned i = 0; i < items_.size(); i++ ) - if(*items_[i] == *item) mached = true; - if(!mached) - { - items_.push_back(std::shared_ptr(item)); + bool mached = false; + for(unsigned i = 0; i < items_.size(); i++ ) + if(*items_[i] == *item) mached = true; + if(!mached) + { + items_.push_back(std::shared_ptr(item)); if(dynamic_cast(item.get())) { @@ -36,9 +36,9 @@ void ItemStore::addItem(std::shared_ptr item) } } - itemAdded(std::weak_ptr(items_.back())); - } - qDebug()<<"Got item: "<id()<<" matched: "<(items_.back())); + } + qDebug()<<"Got item: "<id()<<" matched: "<>& itemIn) { - for(unsigned j = 0; j < itemIn.size(); j++) - addItem(itemIn[j]); + for(unsigned j = 0; j < itemIn.size(); j++) + addItem(itemIn[j]); } void ItemStore::removeItem(const ItemData& item) { - for(unsigned j = 0; j < items_.size(); j++) - { - if(item == *items_[j]) - { - items_.erase(items_.begin()+j); - --j; - } - } + for(unsigned j = 0; j < items_.size(); j++) + { + if(item == *items_[j]) + { + items_.erase(items_.begin()+j); + --j; + } + } } void ItemStore::clear() { - for(size_t i = 0; i < items_.size(); ++i) itemDeleted(*items_[i]); - items_.clear(); + for(size_t i = 0; i < items_.size(); ++i) itemDeleted(*items_[i]); + items_.clear(); } void ItemStore::itemStateChanged(const ItemData& item) { - for(unsigned i = 0; i < items_.size(); i++ ) - { - if(items_[i]->operator==(item)) - { + for(unsigned i = 0; i < items_.size(); i++ ) + { + if(items_[i]->operator==(item)) + { - if(items_[i]->getValue() != item.getValue())items_[i]->informValue(item.getValue()); - } + if(items_[i]->getValue() != item.getValue())items_[i]->informValue(item.getValue()); + } - } + } } diff --git a/src/items/itemstore.h b/src/items/itemstore.h index 6148027..8e94404 100644 --- a/src/items/itemstore.h +++ b/src/items/itemstore.h @@ -7,18 +7,21 @@ class ItemStore: public QObject { - Q_OBJECT + Q_OBJECT private: - std::vector< std::shared_ptr > items_; + std::vector< std::shared_ptr > items_; public: - ItemStore(QObject *parent = nullptr); - virtual ~ItemStore(){} + ItemStore(QObject *parent = nullptr); + virtual ~ItemStore() {} - inline std::vector< std::shared_ptr >* getItems(){ return &items_; } + inline std::vector< std::shared_ptr >* getItems() + { + return &items_; + } - void clear(); + void clear(); private slots: @@ -26,13 +29,13 @@ private slots: signals: - void itemDeleted(ItemData item); - void itemAdded(std::weak_ptr Item); + void itemDeleted(ItemData item); + void itemAdded(std::weak_ptr Item); public slots: - void removeItem(const ItemData& item); - void addItem(std::shared_ptr item); - void addItems(const std::vector>& itemsIn); - void itemStateChanged(const ItemData& item); + void removeItem(const ItemData& item); + void addItem(std::shared_ptr item); + void addItems(const std::vector>& itemsIn); + void itemStateChanged(const ItemData& item); }; diff --git a/src/items/train.cpp b/src/items/train.cpp index 09266de..2929df9 100644 --- a/src/items/train.cpp +++ b/src/items/train.cpp @@ -2,8 +2,8 @@ Train::Train(uint8_t id, uint8_t address, uint8_t functionMask, int8_t initalValue): Item(address, QString("Train ")+QString::number(id), initalValue), - functionMask_(functionMask), - train_id_(id) + functionMask_(functionMask), + train_id_(id) { } @@ -11,21 +11,21 @@ Microcontroller *Train::micro = nullptr; void Train::setFunction(uint8_t funciton, bool value) { - Item::setFunction(funciton, value); - if(micro) - micro->trainSetFunction(train_id_, funciton, value); + Item::setFunction(funciton, value); + if(micro) + micro->trainSetFunction(train_id_, funciton, value); } void Train::setValue(int8_t value) { - Item::setValue(value); - if(micro) - micro->trainSetSpeed(train_id_, value); + Item::setValue(value); + if(micro) + micro->trainSetSpeed(train_id_, value); } void Train::reverse() { - if(micro) - micro->trainReverse(train_id_); + if(micro) + micro->trainReverse(train_id_); } diff --git a/src/items/train.h b/src/items/train.h index 41bbf0e..dec8b31 100644 --- a/src/items/train.h +++ b/src/items/train.h @@ -6,21 +6,27 @@ class Train : public Item { - Q_OBJECT - uint8_t functionMask_; - uint8_t train_id_; + Q_OBJECT + uint8_t functionMask_; + uint8_t train_id_; public: - static Microcontroller *micro; + static Microcontroller *micro; Train(uint8_t id = 0, uint8_t address = 0, uint8_t functionMask = 0, int8_t initalValue = 0); - uint8_t getFunctionMask() {return functionMask_;} + uint8_t getFunctionMask() + { + return functionMask_; + } public slots: - void reverse(); + void reverse(); virtual void setFunction(uint8_t function, bool on); virtual void setValue(int8_t value); - uint8_t getTrainId(){return train_id_;} + uint8_t getTrainId() + { + return train_id_; + } }; #endif // TRAIN_H diff --git a/src/items/turnout.cpp b/src/items/turnout.cpp index a2d3133..df82938 100644 --- a/src/items/turnout.cpp +++ b/src/items/turnout.cpp @@ -6,13 +6,13 @@ Turnout::Turnout(uint8_t id, uint8_t address, uint8_t subaddress, int8_t initalV : Item(address | (subaddress << 8), QString("Turnout ")+QString::number(id), initalValue), subaddress_(subaddress), turnoutId_(id) { - itemId_ = address | (subaddress << 8); - name_ = QString("Turnout ")+QString::number(id); + itemId_ = address | (subaddress << 8); + name_ = QString("Turnout ")+QString::number(id); } void Turnout::setValue(int8_t value) { - Item::setValue(value); - if(micro) + Item::setValue(value); + if(micro) micro->tunoutSetDirection(turnoutId_, value > 0); } diff --git a/src/items/turnout.h b/src/items/turnout.h index 27cd975..6f203c2 100644 --- a/src/items/turnout.h +++ b/src/items/turnout.h @@ -6,14 +6,17 @@ class Turnout : public Item { - uint8_t subaddress_; - uint8_t turnoutId_; + uint8_t subaddress_; + uint8_t turnoutId_; public: - static Microcontroller *micro; + static Microcontroller *micro; explicit Turnout(uint8_t id = 0, uint8_t address = 0, uint8_t subaddress = 0, int8_t initalValue = 0); virtual void setValue(int8_t value); - uint8_t getTurnoutId(){return turnoutId_;} + uint8_t getTurnoutId() + { + return turnoutId_; + } }; #endif // TURNOUT_H diff --git a/src/main.cpp b/src/main.cpp index 4464629..8975970 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -18,94 +18,97 @@ int main(int argc, char *argv[]) { - QApplication a(argc, argv); + QApplication a(argc, argv); - //set info - QCoreApplication::setOrganizationName("UVOS"); - QCoreApplication::setOrganizationDomain("uvos.xyz"); - QCoreApplication::setApplicationName("traincontrollerui"); - QCoreApplication::setApplicationVersion("0.1"); + //set info + QCoreApplication::setOrganizationName("UVOS"); + QCoreApplication::setOrganizationDomain("uvos.xyz"); + QCoreApplication::setApplicationName("traincontrollerui"); + QCoreApplication::setApplicationVersion("0.1"); - QDir::setCurrent(a.applicationDirPath()); + QDir::setCurrent(a.applicationDirPath()); - //parse comand line - QCommandLineParser parser; - parser.setApplicationDescription("Smart Home Interface"); - parser.addHelpOption(); - parser.addVersionOption(); - QCommandLineOption tcpOption(QStringList() << "t" << "tcp", QCoreApplication::translate("main", "Use Tcp connection")); - parser.addOption(tcpOption); - QCommandLineOption hostOption(QStringList() << "H" << "host", QCoreApplication::translate("main", "Set server host ip addres"), "adress"); - parser.addOption(hostOption); - QCommandLineOption portOption(QStringList() << "p" << "port", QCoreApplication::translate("main", "Set server Port in TCP mode or Serial port in serial mode"), "port"); - parser.addOption(portOption); - QCommandLineOption serialOption(QStringList() << "s" << "serial", QCoreApplication::translate("main", "Use serial connection")); - parser.addOption(serialOption); - QCommandLineOption baudOption(QStringList() << "b" << "baud", QCoreApplication::translate("main", "Set Baud Rate")); - parser.addOption(baudOption); - parser.process(a); + //parse comand line + QCommandLineParser parser; + parser.setApplicationDescription("Smart Home Interface"); + parser.addHelpOption(); + parser.addVersionOption(); + QCommandLineOption tcpOption(QStringList() << "t" << "tcp", QCoreApplication::translate("main", "Use Tcp connection")); + parser.addOption(tcpOption); + QCommandLineOption hostOption(QStringList() << "H" << "host", QCoreApplication::translate("main", + "Set server host ip addres"), "adress"); + parser.addOption(hostOption); + QCommandLineOption portOption(QStringList() << "p" << "port", QCoreApplication::translate("main", + "Set server Port in TCP mode or Serial port in serial mode"), "port"); + parser.addOption(portOption); + QCommandLineOption serialOption(QStringList() << "s" << "serial", QCoreApplication::translate("main", + "Use serial connection")); + parser.addOption(serialOption); + QCommandLineOption baudOption(QStringList() << "b" << "baud", QCoreApplication::translate("main", "Set Baud Rate")); + parser.addOption(baudOption); + parser.process(a); - QIODevice* masterIODevice = nullptr; + QIODevice* masterIODevice = nullptr; - if(parser.isSet(tcpOption)) - { - QTcpSocket* microSocket = new QTcpSocket; + if(parser.isSet(tcpOption)) + { + QTcpSocket* microSocket = new QTcpSocket; - int port = 6856; - if(parser.isSet(portOption)) port = parser.value(portOption).toInt(); + int port = 6856; + if(parser.isSet(portOption)) port = parser.value(portOption).toInt(); - QString host("127.0.0.1"); - if(parser.isSet(hostOption)) host = parser.value(hostOption); - std::cout<<"connecting to "<connectToHost(host, port, QIODevice::ReadWrite); - if(!microSocket->waitForConnected(3000)) - { - std::cout<<"Can not connect to to Server.\n"; - QMessageBox::critical(nullptr, "Error", "Can not connect to to Server"); - return 1; - } - masterIODevice = microSocket; - } - else - { - QSerialPort* microPort = new QSerialPort; - if(parser.isSet(portOption)) microPort->setPortName(parser.value(portOption)); - else microPort->setPortName("ttyUSB0"); + QString host("127.0.0.1"); + if(parser.isSet(hostOption)) host = parser.value(hostOption); + std::cout<<"connecting to "<connectToHost(host, port, QIODevice::ReadWrite); + if(!microSocket->waitForConnected(3000)) + { + std::cout<<"Can not connect to to Server.\n"; + QMessageBox::critical(nullptr, "Error", "Can not connect to to Server"); + return 1; + } + masterIODevice = microSocket; + } + else + { + QSerialPort* microPort = new QSerialPort; + if(parser.isSet(portOption)) microPort->setPortName(parser.value(portOption)); + else microPort->setPortName("ttyUSB0"); - if(parser.isSet(portOption)) microPort->setBaudRate(parser.value(baudOption).toInt()); - else microPort->setBaudRate(BAUD); + if(parser.isSet(portOption)) microPort->setBaudRate(parser.value(baudOption).toInt()); + else microPort->setBaudRate(BAUD); - if(!microPort->open(QIODevice::ReadWrite)) - { - QMessageBox::critical(nullptr, "Error", QString("Can not open serial port ")+microPort->portName()); - std::cout<<"Can not open serial port "<portName().toStdString()<<". Continueing in demo mode"<<'\n'; - return 1; - } - masterIODevice = microPort; - } + if(!microPort->open(QIODevice::ReadWrite)) + { + QMessageBox::critical(nullptr, "Error", QString("Can not open serial port ")+microPort->portName()); + std::cout<<"Can not open serial port "<portName().toStdString()<<". Continueing in demo mode"<<'\n'; + return 1; + } + masterIODevice = microPort; + } - Microcontroller micro(masterIODevice); - micro.setPower(true); + Microcontroller micro(masterIODevice); + micro.setPower(true); - TrainJs::init(); + TrainJs::init(); - Train::micro = µ - Turnout::micro = µ - ItemStore items; + Train::micro = µ + Turnout::micro = µ + ItemStore items; - QObject::connect(µ, &Microcontroller::gotItemList, &items, &ItemStore::addItems); + QObject::connect(µ, &Microcontroller::gotItemList, &items, &ItemStore::addItems); QObject::connect(µ, &Microcontroller::itemChanged, &items, &ItemStore::itemStateChanged); - //mainwindow - MainWindow w(µ, &items); + //mainwindow + MainWindow w(µ, &items); - w.show(); + w.show(); - int retVal = a.exec(); - micro.setPower(false); + int retVal = a.exec(); + micro.setPower(false); - if(masterIODevice) - delete masterIODevice; - return retVal; + if(masterIODevice) + delete masterIODevice; + return retVal; } diff --git a/src/mainobject.cpp b/src/mainobject.cpp index 4af15c0..3a0558b 100644 --- a/src/mainobject.cpp +++ b/src/mainobject.cpp @@ -1,11 +1,11 @@ #include "mainobject.h" MainObject::MainObject(QIODevice* ioDevice) : - masterIODevice(ioDevice), - micro(masterIODevice) + masterIODevice(ioDevice), + micro(masterIODevice) { - //connect item store - QObject::connect(µ, &Microcontroller::gotItemList, &items, &ItemStore::addItems); + //connect item store + QObject::connect(µ, &Microcontroller::gotItemList, &items, &ItemStore::addItems); } MainObject::~MainObject() diff --git a/src/mainobject.h b/src/mainobject.h index 234bd16..62596d8 100644 --- a/src/mainobject.h +++ b/src/mainobject.h @@ -26,22 +26,22 @@ class MainObject : public QObject { - Q_OBJECT + Q_OBJECT public: - //io - QIODevice * const masterIODevice = nullptr; + //io + QIODevice * const masterIODevice = nullptr; - Microcontroller micro; + Microcontroller micro; - const QString settingsPath; + const QString settingsPath; - //items - ItemStore items; + //items + ItemStore items; public: - explicit MainObject(QIODevice* ioDevice); - ~MainObject(); + explicit MainObject(QIODevice* ioDevice); + ~MainObject(); }; #endif // MAINOBJECT_H diff --git a/src/microcontroller.cpp b/src/microcontroller.cpp index 093be50..a162d8d 100644 --- a/src/microcontroller.cpp +++ b/src/microcontroller.cpp @@ -7,83 +7,83 @@ void Microcontroller::trainSetSpeed(uint8_t id, int8_t speed) { - qDebug()<<__func__; - std::stringstream ss; + qDebug()<<__func__; + std::stringstream ss; ss<<"train "<<(unsigned)id<<" speed "<<(int)speed<<'\n'; - write(ss.str().c_str()); + write(ss.str().c_str()); } void Microcontroller::trainReverse(uint8_t id) { - std::stringstream ss; - ss<<"train "<<(unsigned)id<<" reverse\n"; - write(ss.str().c_str()); + std::stringstream ss; + ss<<"train "<<(unsigned)id<<" reverse\n"; + write(ss.str().c_str()); } void Microcontroller::trainSetFunction(uint8_t id, uint8_t function, bool on) { - std::stringstream ss; - ss<<"train "<<(unsigned)id<<" function "<<(unsigned)function<<' '<<(on ? "on" : "off")<<'\n'; - write(ss.str().c_str()); + std::stringstream ss; + ss<<"train "<<(unsigned)id<<" function "<<(unsigned)function<<' '<<(on ? "on" : "off")<<'\n'; + write(ss.str().c_str()); } void Microcontroller::tunoutSetDirection(uint8_t id, bool direction) { - std::stringstream ss; - ss<<"turnout "<<(unsigned)id<<" set "<<(!direction ? "left" : "right")<<'\n'; - write(ss.str().c_str()); + std::stringstream ss; + ss<<"turnout "<<(unsigned)id<<" set "<<(!direction ? "left" : "right")<<'\n'; + write(ss.str().c_str()); } void Microcontroller::setPower(bool on) { - write(on ? "power on\n" : "power off\n"); + write(on ? "power on\n" : "power off\n"); } void Microcontroller::estop() { - write("stop\n"); + write("stop\n"); } void Microcontroller::write(const QByteArray& buffer) { - qDebug()<write(buffer); + qDebug()<write(buffer); _port->waitForBytesWritten(1000); - } + } std::this_thread::sleep_for(std::chrono::milliseconds(40)); } void Microcontroller::write(char* buffer, const size_t length) { - qDebug()<write(buffer, length); + qDebug()<write(buffer, length); //_port->waitForBytesWritten(1000); - } + } std::this_thread::sleep_for(std::chrono::milliseconds(40)); } bool Microcontroller::connected() { - if(_port != nullptr) - return _port->isOpen(); - else return false; + if(_port != nullptr) + return _port->isOpen(); + else return false; } void Microcontroller::requestState() { - write("train list\n"); - write("turnout list\n"); + write("train list\n"); + write("turnout list\n"); } //housekeeping Microcontroller::Microcontroller(QIODevice* port) { - setIODevice(port); + setIODevice(port); } Microcontroller::Microcontroller() @@ -96,54 +96,56 @@ Microcontroller::~Microcontroller() void Microcontroller::setIODevice(QIODevice *port) { - _port = port; - QObject::connect(_port, &QIODevice::readyRead, this, &Microcontroller::isReadyRead); + _port = port; + QObject::connect(_port, &QIODevice::readyRead, this, &Microcontroller::isReadyRead); } std::shared_ptr Microcontroller::processTrainLine(const QString& buffer) { - QStringList bufferList = buffer.split(' '); + QStringList bufferList = buffer.split(' '); if(bufferList.size() >= 14 && buffer.startsWith("TRAIN NUMBER:")) - { - return std::shared_ptr(new Train(bufferList[2].toInt(), bufferList[4].toInt(), bufferList[13].toInt(nullptr, 2), bufferList[9].toInt())); - } - return nullptr; + { + return std::shared_ptr(new Train(bufferList[2].toInt(), bufferList[4].toInt(), bufferList[13].toInt(nullptr, 2), + bufferList[9].toInt())); + } + return nullptr; } std::shared_ptr Microcontroller::processTurnoutLine(const QString& buffer) { - QStringList bufferList = buffer.split(' '); + QStringList bufferList = buffer.split(' '); if(bufferList.size() >= 11 && buffer.startsWith("TURNOUT NUMBER:")) - { - return std::shared_ptr(new Turnout(bufferList[2].toInt(), bufferList[4].toInt(), bufferList[6].toInt(), bufferList[11].toInt())); - } - return nullptr; + { + return std::shared_ptr(new Turnout(bufferList[2].toInt(), bufferList[4].toInt(), bufferList[6].toInt(), + bufferList[11].toInt())); + } + return nullptr; } void Microcontroller::processList(const QString& buffer) { - QStringList bufferList = buffer.split(' '); - qDebug()<<__func__<<" :"<= 10 && buffer.contains("NUMBER:")) - { + { std::shared_ptr item; - if(listMode == TRAIN_LIST) + if(listMode == TRAIN_LIST) item = processTrainLine(buffer); - else if(listMode == TURNOUT_LIST) + else if(listMode == TURNOUT_LIST) item = processTurnoutLine(buffer); if(item) itemList.push_back(item); - } - else - { - listMode = false; - if(!itemList.empty()) - { - qDebug()<<"got item list " << itemList.size(); - gotItemList(itemList); - itemList.clear(); - } - } + } + else + { + listMode = false; + if(!itemList.empty()) + { + qDebug()<<"got item list " << itemList.size(); + gotItemList(itemList); + itemList.clear(); + } + } } void Microcontroller::processItemState(const QString& buffer) @@ -157,43 +159,43 @@ void Microcontroller::processItemState(const QString& buffer) void Microcontroller::processMicroReturn() { - if(listMode) - processList(_buffer); - else - { - if(_buffer.startsWith("Trains:")) - { - listMode = TRAIN_LIST; - itemList.clear(); - } - else if(_buffer.startsWith("Turnouts:")) - { - listMode = TURNOUT_LIST; - } - else if(_buffer.startsWith("TRAIN NUMBER:") || _buffer.startsWith("TURNOUT NUMBER:")) - { - processItemState(_buffer); + if(listMode) + processList(_buffer); + else + { + if(_buffer.startsWith("Trains:")) + { + listMode = TRAIN_LIST; + itemList.clear(); } - else if(_buffer.startsWith("TrainController")) - { - requestState(); - } - } + else if(_buffer.startsWith("Turnouts:")) + { + listMode = TURNOUT_LIST; + } + else if(_buffer.startsWith("TRAIN NUMBER:") || _buffer.startsWith("TURNOUT NUMBER:")) + { + processItemState(_buffer); + } + else if(_buffer.startsWith("TrainController")) + { + requestState(); + } + } } void Microcontroller::isReadyRead() { - char charBuf; - while(_port->getChar(&charBuf)) - { - _buffer.push_back(charBuf); - if( _buffer.endsWith('\n') ) - { - _buffer.remove('\n'); - processMicroReturn(); - textRecived(_buffer); - _buffer.clear(); - } - } + char charBuf; + while(_port->getChar(&charBuf)) + { + _buffer.push_back(charBuf); + if( _buffer.endsWith('\n') ) + { + _buffer.remove('\n'); + processMicroReturn(); + textRecived(_buffer); + _buffer.clear(); + } + } } diff --git a/src/microcontroller.h b/src/microcontroller.h index cddfe2e..c9ad9e2 100644 --- a/src/microcontroller.h +++ b/src/microcontroller.h @@ -20,64 +20,64 @@ class Microcontroller : public QObject { - Q_OBJECT + Q_OBJECT public: - static constexpr char AMP_RELAY = 0; - static constexpr char SENSOR_TEMPERATURE = 1; - static constexpr char SENSOR_DOOR = 0 ; + static constexpr char AMP_RELAY = 0; + static constexpr char SENSOR_TEMPERATURE = 1; + static constexpr char SENSOR_DOOR = 0 ; private: - static constexpr int TRAIN_LIST = 1; - static constexpr int TURNOUT_LIST = 2; + static constexpr int TRAIN_LIST = 1; + static constexpr int TURNOUT_LIST = 2; - int listMode = 0; + int listMode = 0; - //uint8_t _auxState = 0; + //uint8_t _auxState = 0; - QIODevice* _port = nullptr; + QIODevice* _port = nullptr; - std::vector< std::shared_ptr > itemList; + std::vector< std::shared_ptr > itemList; - QScopedPointer loop; - QString _buffer; + QScopedPointer loop; + QString _buffer; - void processMicroReturn(); - void processList(const QString& buffer); - void processItemState(const QString& buffer); - std::shared_ptr processTrainLine(const QString& buffer); - std::shared_ptr processTurnoutLine(const QString& buffer); + void processMicroReturn(); + void processList(const QString& buffer); + void processItemState(const QString& buffer); + std::shared_ptr processTrainLine(const QString& buffer); + std::shared_ptr processTurnoutLine(const QString& buffer); - void write(char *buffer, const size_t length); - void write(const QByteArray& buffer); + void write(char *buffer, const size_t length); + void write(const QByteArray& buffer); public: - Microcontroller(QIODevice* port); - Microcontroller(); - ~Microcontroller(); - bool connected(); - void setIODevice(QIODevice* port); + Microcontroller(QIODevice* port); + Microcontroller(); + ~Microcontroller(); + bool connected(); + void setIODevice(QIODevice* port); public slots: - void requestState(); + void requestState(); void trainSetSpeed(uint8_t id, int8_t speed); - void trainReverse(uint8_t id); - void trainSetFunction(uint8_t id, uint8_t function, bool on); - void tunoutSetDirection(uint8_t id, bool direction); - void estop(); - void setPower(bool on); + void trainReverse(uint8_t id); + void trainSetFunction(uint8_t id, uint8_t function, bool on); + void tunoutSetDirection(uint8_t id, bool direction); + void estop(); + void setPower(bool on); private slots: - void isReadyRead(); + void isReadyRead(); signals: - void textRecived(const QString string); - void itemChanged(ItemData relay); - void auxStateChanged(int value); - void gotItemList(std::vector< std::shared_ptr >&); + void textRecived(const QString string); + void itemChanged(ItemData relay); + void auxStateChanged(int value); + void gotItemList(std::vector< std::shared_ptr >&); }; #endif // MICROCONTROLLER_H diff --git a/src/trainjs.h b/src/trainjs.h index fb5f94f..f8a325b 100644 --- a/src/trainjs.h +++ b/src/trainjs.h @@ -41,7 +41,10 @@ public: std::weak_ptr getItem(); void setItem(std::weak_ptr); bool itemIsSet(); - bool getWantsNewItem() {return wantsNewItem;} + bool getWantsNewItem() + { + return wantsNewItem; + } }; #endif // TRAINJS_H diff --git a/src/ui/itemcreationdialog.cpp b/src/ui/itemcreationdialog.cpp index 55b26ca..de0d51d 100644 --- a/src/ui/itemcreationdialog.cpp +++ b/src/ui/itemcreationdialog.cpp @@ -2,29 +2,29 @@ #include "ui_itemcreationdialog.h" ItemCreationDialog::ItemCreationDialog(QWidget *parent) : - QDialog(parent), - ui(new Ui::ItemCreationDialog) + QDialog(parent), + ui(new Ui::ItemCreationDialog) { - ui->setupUi(this); - connect(ui->comboBox, &QComboBox::currentTextChanged, this, &ItemCreationDialog::itemTypeChanged); - connect(ui->lineEdit, &QLineEdit::textChanged, this, &ItemCreationDialog::itemNameChanged); + ui->setupUi(this); + connect(ui->comboBox, &QComboBox::currentTextChanged, this, &ItemCreationDialog::itemTypeChanged); + connect(ui->lineEdit, &QLineEdit::textChanged, this, &ItemCreationDialog::itemNameChanged); } ItemCreationDialog::~ItemCreationDialog() { - delete ui; + delete ui; } void ItemCreationDialog::itemTypeChanged(const QString& type) { - ui->verticalLayout->removeWidget(widget); + ui->verticalLayout->removeWidget(widget); } void ItemCreationDialog::itemNameChanged(const QString& name) { - if(item) - { - item->setName(name); - } + if(item) + { + item->setName(name); + } } diff --git a/src/ui/itemcreationdialog.h b/src/ui/itemcreationdialog.h index 57421ae..6e993d3 100644 --- a/src/ui/itemcreationdialog.h +++ b/src/ui/itemcreationdialog.h @@ -5,29 +5,30 @@ #include #include "../items/item.h" -namespace Ui { +namespace Ui +{ class ItemCreationDialog; } class ItemCreationDialog : public QDialog { - Q_OBJECT + Q_OBJECT - QWidget* widget; + QWidget* widget; public: - explicit ItemCreationDialog(QWidget *parent = nullptr); - ~ItemCreationDialog(); + explicit ItemCreationDialog(QWidget *parent = nullptr); + ~ItemCreationDialog(); - std::shared_ptr item; + std::shared_ptr item; private slots: - void itemTypeChanged(const QString& type); - void itemNameChanged(const QString& name); + void itemTypeChanged(const QString& type); + void itemNameChanged(const QString& name); private: - Ui::ItemCreationDialog *ui; + Ui::ItemCreationDialog *ui; }; #endif // ITEMCREATIONDIALOG_H diff --git a/src/ui/itemscrollbox.cpp b/src/ui/itemscrollbox.cpp index a83b7e0..3d92249 100644 --- a/src/ui/itemscrollbox.cpp +++ b/src/ui/itemscrollbox.cpp @@ -6,79 +6,79 @@ #include "../trainjs.h" ItemScrollBox::ItemScrollBox(QWidget *parent) : - QWidget(parent), - ui(new Ui::RelayScrollBox) + QWidget(parent), + ui(new Ui::RelayScrollBox) { - ui->setupUi(this); - QScroller::grabGesture(ui->scrollArea, QScroller::TouchGesture); - QScroller::grabGesture(ui->scrollArea, QScroller::LeftMouseButtonGesture); + ui->setupUi(this); + QScroller::grabGesture(ui->scrollArea, QScroller::TouchGesture); + QScroller::grabGesture(ui->scrollArea, QScroller::LeftMouseButtonGesture); } ItemScrollBox::~ItemScrollBox() { - delete ui; + delete ui; } void ItemScrollBox::addItem(std::weak_ptr item) { - if(auto workItem = item.lock()) - { - widgets_.push_back(new ItemWidget(item, this)); - Train* train = dynamic_cast(workItem.get()); - Turnout* turnout = dynamic_cast(workItem.get()); - if(train) - { - if(train->getTrainId() == 0) - widgets_.back()->setShortcuts(QKeySequence(Qt::Key_Q), QKeySequence(Qt::Key_A), QKeySequence(Qt::Key_Z)); - else if(train->getTrainId() == 1) - widgets_.back()->setShortcuts(QKeySequence(Qt::Key_W), QKeySequence(Qt::Key_S), QKeySequence(Qt::Key_X)); - else if(train->getTrainId() == 2) - widgets_.back()->setShortcuts(QKeySequence(Qt::Key_E), QKeySequence(Qt::Key_D), QKeySequence(Qt::Key_C)); - else if(train->getTrainId() == 3) - widgets_.back()->setShortcuts(QKeySequence(Qt::Key_R), QKeySequence(Qt::Key_F), QKeySequence(Qt::Key_V)); - else if(train->getTrainId() == 4) - widgets_.back()->setShortcuts(QKeySequence(Qt::Key_T), QKeySequence(Qt::Key_G), QKeySequence(Qt::Key_B)); - } - else if(turnout) - { - if(turnout->getTurnoutId() == 0) - widgets_.back()->setShortcuts(QKeySequence(), QKeySequence(), QKeySequence(Qt::Key_1)); - else if(turnout->getTurnoutId() == 1) - widgets_.back()->setShortcuts(QKeySequence(), QKeySequence(), QKeySequence(Qt::Key_2)); - else if(turnout->getTurnoutId() == 2) - widgets_.back()->setShortcuts(QKeySequence(), QKeySequence(), QKeySequence(Qt::Key_3)); - else if(turnout->getTurnoutId() == 3) - widgets_.back()->setShortcuts(QKeySequence(), QKeySequence(), QKeySequence(Qt::Key_4)); - else if(turnout->getTurnoutId() == 4) - widgets_.back()->setShortcuts(QKeySequence(), QKeySequence(), QKeySequence(Qt::Key_5)); - else if(turnout->getTurnoutId() == 5) - widgets_.back()->setShortcuts(QKeySequence(), QKeySequence(), QKeySequence(Qt::Key_6)); - else if(turnout->getTurnoutId() == 6) - widgets_.back()->setShortcuts(QKeySequence(), QKeySequence(), QKeySequence(Qt::Key_7)); - else if(turnout->getTurnoutId() == 7) - widgets_.back()->setShortcuts(QKeySequence(), QKeySequence(), QKeySequence(Qt::Key_8)); - else if(turnout->getTurnoutId() == 8) - widgets_.back()->setShortcuts(QKeySequence(), QKeySequence(), QKeySequence(Qt::Key_9)); - else if(turnout->getTurnoutId() == 9) - widgets_.back()->setShortcuts(QKeySequence(), QKeySequence(), QKeySequence(Qt::Key_0)); - } - ui->relayWidgetVbox->addWidget(widgets_.back()); - connect(widgets_.back(), &ItemWidget::deleteRequest, this, &ItemScrollBox::deleteRequest); - connect(widgets_.back(), &ItemWidget::deleteRequest, this, &ItemScrollBox::removeItem); - } + if(auto workItem = item.lock()) + { + widgets_.push_back(new ItemWidget(item, this)); + Train* train = dynamic_cast(workItem.get()); + Turnout* turnout = dynamic_cast(workItem.get()); + if(train) + { + if(train->getTrainId() == 0) + widgets_.back()->setShortcuts(QKeySequence(Qt::Key_Q), QKeySequence(Qt::Key_A), QKeySequence(Qt::Key_Z)); + else if(train->getTrainId() == 1) + widgets_.back()->setShortcuts(QKeySequence(Qt::Key_W), QKeySequence(Qt::Key_S), QKeySequence(Qt::Key_X)); + else if(train->getTrainId() == 2) + widgets_.back()->setShortcuts(QKeySequence(Qt::Key_E), QKeySequence(Qt::Key_D), QKeySequence(Qt::Key_C)); + else if(train->getTrainId() == 3) + widgets_.back()->setShortcuts(QKeySequence(Qt::Key_R), QKeySequence(Qt::Key_F), QKeySequence(Qt::Key_V)); + else if(train->getTrainId() == 4) + widgets_.back()->setShortcuts(QKeySequence(Qt::Key_T), QKeySequence(Qt::Key_G), QKeySequence(Qt::Key_B)); + } + else if(turnout) + { + if(turnout->getTurnoutId() == 0) + widgets_.back()->setShortcuts(QKeySequence(), QKeySequence(), QKeySequence(Qt::Key_1)); + else if(turnout->getTurnoutId() == 1) + widgets_.back()->setShortcuts(QKeySequence(), QKeySequence(), QKeySequence(Qt::Key_2)); + else if(turnout->getTurnoutId() == 2) + widgets_.back()->setShortcuts(QKeySequence(), QKeySequence(), QKeySequence(Qt::Key_3)); + else if(turnout->getTurnoutId() == 3) + widgets_.back()->setShortcuts(QKeySequence(), QKeySequence(), QKeySequence(Qt::Key_4)); + else if(turnout->getTurnoutId() == 4) + widgets_.back()->setShortcuts(QKeySequence(), QKeySequence(), QKeySequence(Qt::Key_5)); + else if(turnout->getTurnoutId() == 5) + widgets_.back()->setShortcuts(QKeySequence(), QKeySequence(), QKeySequence(Qt::Key_6)); + else if(turnout->getTurnoutId() == 6) + widgets_.back()->setShortcuts(QKeySequence(), QKeySequence(), QKeySequence(Qt::Key_7)); + else if(turnout->getTurnoutId() == 7) + widgets_.back()->setShortcuts(QKeySequence(), QKeySequence(), QKeySequence(Qt::Key_8)); + else if(turnout->getTurnoutId() == 8) + widgets_.back()->setShortcuts(QKeySequence(), QKeySequence(), QKeySequence(Qt::Key_9)); + else if(turnout->getTurnoutId() == 9) + widgets_.back()->setShortcuts(QKeySequence(), QKeySequence(), QKeySequence(Qt::Key_0)); + } + ui->relayWidgetVbox->addWidget(widgets_.back()); + connect(widgets_.back(), &ItemWidget::deleteRequest, this, &ItemScrollBox::deleteRequest); + connect(widgets_.back(), &ItemWidget::deleteRequest, this, &ItemScrollBox::removeItem); + } } void ItemScrollBox::removeItem(const ItemData& item) { - for(unsigned i = 0; i < widgets_.size(); i++) - { - if(widgets_[i]->controles(item)) - { - ui->relayWidgetVbox->removeWidget(widgets_[i]); - delete widgets_[i]; - widgets_.erase(widgets_.begin()+i); - } - } + for(unsigned i = 0; i < widgets_.size(); i++) + { + if(widgets_[i]->controles(item)) + { + ui->relayWidgetVbox->removeWidget(widgets_[i]); + delete widgets_[i]; + widgets_.erase(widgets_.begin()+i); + } + } } diff --git a/src/ui/itemscrollbox.h b/src/ui/itemscrollbox.h index 2d78f2a..228a315 100644 --- a/src/ui/itemscrollbox.h +++ b/src/ui/itemscrollbox.h @@ -10,32 +10,33 @@ #include "../items/itemstore.h" -namespace Ui { +namespace Ui +{ class RelayScrollBox; } class ItemScrollBox : public QWidget { - Q_OBJECT + Q_OBJECT private: - std::vector< ItemWidget* > widgets_; + std::vector< ItemWidget* > widgets_; signals: - void deleteRequest(const ItemData& item); + void deleteRequest(const ItemData& item); public: - explicit ItemScrollBox(QWidget *parent = nullptr); - ~ItemScrollBox(); + explicit ItemScrollBox(QWidget *parent = nullptr); + ~ItemScrollBox(); - void setItemStore(ItemStore* itemStore); + void setItemStore(ItemStore* itemStore); public slots: - void addItem(std::weak_ptr item); - void removeItem(const ItemData& item); + void addItem(std::weak_ptr item); + void removeItem(const ItemData& item); private: - Ui::RelayScrollBox *ui; + Ui::RelayScrollBox *ui; }; #endif // RELAYSCROLLBOX_H diff --git a/src/ui/itemsettingsdialog.cpp b/src/ui/itemsettingsdialog.cpp index 179ce19..9f2086d 100644 --- a/src/ui/itemsettingsdialog.cpp +++ b/src/ui/itemsettingsdialog.cpp @@ -1,176 +1,176 @@ - #include "itemsettingsdialog.h" +#include "itemsettingsdialog.h" #include "ui_itemsettingsdialog.h" #include ItemSettingsDialog::ItemSettingsDialog(std::shared_ptr item, QWidget *parent) : - QDialog(parent), - item_(item), - ui(new Ui::ItemSettingsDialog) + QDialog(parent), + item_(item), + ui(new Ui::ItemSettingsDialog) { - ui->setupUi(this); + ui->setupUi(this); - setModal(false); + setModal(false); - ui->label_name->setText(item_->getName()); - ui->checkBox_Override->setChecked(item_->getOverride()); + ui->label_name->setText(item_->getName()); + ui->checkBox_Override->setChecked(item_->getOverride()); - if(std::shared_ptr relay = std::dynamic_pointer_cast(item_)) - { - itemSpecificWidget_ = new RelayItemSettingsWidget(relay); - } - else if(std::shared_ptr msgItem = std::dynamic_pointer_cast(item_)) - { - itemSpecificWidget_ = new MessageItemSettingsWidget(msgItem); - } - else if(std::shared_ptr sysItem = std::dynamic_pointer_cast(item_)) - { - itemSpecificWidget_ = new SystemItemSettingsWidget(sysItem); - } + if(std::shared_ptr relay = std::dynamic_pointer_cast(item_)) + { + itemSpecificWidget_ = new RelayItemSettingsWidget(relay); + } + else if(std::shared_ptr msgItem = std::dynamic_pointer_cast(item_)) + { + itemSpecificWidget_ = new MessageItemSettingsWidget(msgItem); + } + else if(std::shared_ptr sysItem = std::dynamic_pointer_cast(item_)) + { + itemSpecificWidget_ = new SystemItemSettingsWidget(sysItem); + } - if(itemSpecificWidget_) - { - ui->verticalLayout_2->addWidget(itemSpecificWidget_); - } + if(itemSpecificWidget_) + { + ui->verticalLayout_2->addWidget(itemSpecificWidget_); + } - connect(ui->pushButton_add, &QPushButton::clicked, this, &ItemSettingsDialog::addActor); - connect(ui->pushButton_remove, &QPushButton::clicked, this, &ItemSettingsDialog::removeActor); - connect(ui->pushButton_edit, &QPushButton::clicked, this, &ItemSettingsDialog::editActor); - connect(ui->checkBox_Override, &QPushButton::clicked, this, &ItemSettingsDialog::changeOverride); + connect(ui->pushButton_add, &QPushButton::clicked, this, &ItemSettingsDialog::addActor); + connect(ui->pushButton_remove, &QPushButton::clicked, this, &ItemSettingsDialog::removeActor); + connect(ui->pushButton_edit, &QPushButton::clicked, this, &ItemSettingsDialog::editActor); + connect(ui->checkBox_Override, &QPushButton::clicked, this, &ItemSettingsDialog::changeOverride); - ui->tableWidget->setHorizontalHeaderItem(0, new QTableWidgetItem("Actor")); - ui->tableWidget->setHorizontalHeaderItem(1, new QTableWidgetItem("Action")); - ui->tableWidget->setHorizontalHeaderItem(2, new QTableWidgetItem("Enabled")); - ui->tableWidget->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch); - ui->tableWidget->horizontalHeader()->resizeSection(1, 60); - ui->tableWidget->horizontalHeader()->resizeSection(2, 75); - loadActorList(); + ui->tableWidget->setHorizontalHeaderItem(0, new QTableWidgetItem("Actor")); + ui->tableWidget->setHorizontalHeaderItem(1, new QTableWidgetItem("Action")); + ui->tableWidget->setHorizontalHeaderItem(2, new QTableWidgetItem("Enabled")); + ui->tableWidget->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch); + ui->tableWidget->horizontalHeader()->resizeSection(1, 60); + ui->tableWidget->horizontalHeader()->resizeSection(2, 75); + loadActorList(); } ItemSettingsDialog::~ItemSettingsDialog() { - if(itemSpecificWidget_) delete itemSpecificWidget_; - delete ui; + if(itemSpecificWidget_) delete itemSpecificWidget_; + delete ui; } void ItemSettingsDialog::changeOverride() { - item_->setOverride(ui->checkBox_Override->isChecked()); + item_->setOverride(ui->checkBox_Override->isChecked()); } void ItemSettingsDialog::loadActorList() { - //ui->listWidget->clear(); - ui->tableWidget->setRowCount(item_->getActors().size()); + //ui->listWidget->clear(); + ui->tableWidget->setRowCount(item_->getActors().size()); - for(unsigned i = 0; i < item_->getActors().size(); i++) - { - ui->tableWidget->setItem(i, 0, new QTableWidgetItem(item_->getActors()[i]->getName())); - ui->tableWidget->setItem(i, 1, new QTableWidgetItem(item_->getActors()[i]->actionName())); - ui->tableWidget->setItem(i, 2, new QTableWidgetItem(item_->getActors()[i]->isActive() ? "Y" : "N")); - } + for(unsigned i = 0; i < item_->getActors().size(); i++) + { + ui->tableWidget->setItem(i, 0, new QTableWidgetItem(item_->getActors()[i]->getName())); + ui->tableWidget->setItem(i, 1, new QTableWidgetItem(item_->getActors()[i]->actionName())); + ui->tableWidget->setItem(i, 2, new QTableWidgetItem(item_->getActors()[i]->isActive() ? "Y" : "N")); + } } void ItemSettingsDialog::addActor() { - ActorSettingsDialog* dialog = nullptr; - std::shared_ptr actor = nullptr; + ActorSettingsDialog* dialog = nullptr; + std::shared_ptr actor = nullptr; - if(ui->comboBox->currentText() == "Alarm") - { - std::shared_ptr alarm = std::shared_ptr(new AlarmTime); - actor = alarm; - dialog = new ActorSettingsDialog(alarm, this); - } - else if(ui->comboBox->currentText() == "Sensor") - { - std::shared_ptr sensorActor = std::shared_ptr(new SensorActor); - actor = sensorActor; - dialog = new ActorSettingsDialog(sensorActor, this); - } - else if(ui->comboBox->currentText() == "Timer" ) - { - std::shared_ptr timerActor = std::shared_ptr(new TimerActor); - actor = timerActor; - dialog = new ActorSettingsDialog(timerActor, this); - } - else if(ui->comboBox->currentText() == "Regulator") - { - std::shared_ptr regulator = std::shared_ptr(new Regulator); - actor = regulator; - dialog = new ActorSettingsDialog(regulator, this); - } + if(ui->comboBox->currentText() == "Alarm") + { + std::shared_ptr alarm = std::shared_ptr(new AlarmTime); + actor = alarm; + dialog = new ActorSettingsDialog(alarm, this); + } + else if(ui->comboBox->currentText() == "Sensor") + { + std::shared_ptr sensorActor = std::shared_ptr(new SensorActor); + actor = sensorActor; + dialog = new ActorSettingsDialog(sensorActor, this); + } + else if(ui->comboBox->currentText() == "Timer" ) + { + std::shared_ptr timerActor = std::shared_ptr(new TimerActor); + actor = timerActor; + dialog = new ActorSettingsDialog(timerActor, this); + } + else if(ui->comboBox->currentText() == "Regulator") + { + std::shared_ptr regulator = std::shared_ptr(new Regulator); + actor = regulator; + dialog = new ActorSettingsDialog(regulator, this); + } - else if(ui->comboBox->currentText() == "Polynomal") - { - std::shared_ptr polynomalActor = std::shared_ptr(new PolynomalActor); - actor = polynomalActor; - dialog = new ActorSettingsDialog(polynomalActor, this); - } + else if(ui->comboBox->currentText() == "Polynomal") + { + std::shared_ptr polynomalActor = std::shared_ptr(new PolynomalActor); + actor = polynomalActor; + dialog = new ActorSettingsDialog(polynomalActor, this); + } - else if(ui->comboBox->currentText() == "Multi Factor") - { - std::shared_ptr polynomalActor = std::shared_ptr(new MultiFactorActor); - actor = polynomalActor; - dialog = new ActorSettingsDialog(polynomalActor, this); - } + else if(ui->comboBox->currentText() == "Multi Factor") + { + std::shared_ptr polynomalActor = std::shared_ptr(new MultiFactorActor); + actor = polynomalActor; + dialog = new ActorSettingsDialog(polynomalActor, this); + } - if(dialog != nullptr) - { - dialog->setParent(this); - dialog->show(); - if(dialog->exec() == QDialog::Accepted) - { - item_->addActor(actor); - loadActorList(); - } - delete dialog; - } + if(dialog != nullptr) + { + dialog->setParent(this); + dialog->show(); + if(dialog->exec() == QDialog::Accepted) + { + item_->addActor(actor); + loadActorList(); + } + delete dialog; + } } void ItemSettingsDialog::removeActor() { - if(item_->getActors().size() > ui->tableWidget->currentRow()) - { - item_->removeActor(item_->getActors().at(ui->tableWidget->currentRow())); - loadActorList(); - } + if(item_->getActors().size() > ui->tableWidget->currentRow()) + { + item_->removeActor(item_->getActors().at(ui->tableWidget->currentRow())); + loadActorList(); + } } void ItemSettingsDialog::editActor() { - if(item_->getActors().size() > ui->tableWidget->currentRow()) - { - std::shared_ptr actor = item_->getActors()[ui->tableWidget->currentRow()]; + if(item_->getActors().size() > ui->tableWidget->currentRow()) + { + std::shared_ptr actor = item_->getActors()[ui->tableWidget->currentRow()]; - std::shared_ptr alarmTime = std::dynamic_pointer_cast(actor); - std::shared_ptr regulator = std::dynamic_pointer_cast(actor); - std::shared_ptr sensorActor = std::dynamic_pointer_cast(actor); - std::shared_ptr timerActor = std::dynamic_pointer_cast(actor); - std::shared_ptr polynomalActor = std::dynamic_pointer_cast(actor); - std::shared_ptr factorActor = std::dynamic_pointer_cast(actor); + std::shared_ptr alarmTime = std::dynamic_pointer_cast(actor); + std::shared_ptr regulator = std::dynamic_pointer_cast(actor); + std::shared_ptr sensorActor = std::dynamic_pointer_cast(actor); + std::shared_ptr timerActor = std::dynamic_pointer_cast(actor); + std::shared_ptr polynomalActor = std::dynamic_pointer_cast(actor); + std::shared_ptr factorActor = std::dynamic_pointer_cast(actor); - ActorSettingsDialog* dialog; + ActorSettingsDialog* dialog; - if(alarmTime) dialog = new ActorSettingsDialog(alarmTime, this); - else if(regulator) dialog = new ActorSettingsDialog(regulator, this); - else if(sensorActor) dialog = new ActorSettingsDialog(sensorActor, this); - else if(timerActor) dialog = new ActorSettingsDialog(timerActor, this); - else if(polynomalActor) dialog = new ActorSettingsDialog(polynomalActor, this); - else if(factorActor) dialog = new ActorSettingsDialog(factorActor, this); - else dialog = new ActorSettingsDialog(actor, this); - dialog->setParent(this); - dialog->show(); - dialog->exec(); + if(alarmTime) dialog = new ActorSettingsDialog(alarmTime, this); + else if(regulator) dialog = new ActorSettingsDialog(regulator, this); + else if(sensorActor) dialog = new ActorSettingsDialog(sensorActor, this); + else if(timerActor) dialog = new ActorSettingsDialog(timerActor, this); + else if(polynomalActor) dialog = new ActorSettingsDialog(polynomalActor, this); + else if(factorActor) dialog = new ActorSettingsDialog(factorActor, this); + else dialog = new ActorSettingsDialog(actor, this); + dialog->setParent(this); + dialog->show(); + dialog->exec(); - for(int i = 0; i < ui->tableWidget->rowCount() && i < item_->getActors().size(); ++i) - { - ui->tableWidget->item(i, 0)->setText(item_->getActors()[i]->getName()); - ui->tableWidget->item(i, 1)->setText(item_->getActors()[i]->actionName()); - ui->tableWidget->item(i, 2)->setText(item_->getActors()[i]->isActive() ? "Y" : "N"); - } - } + for(int i = 0; i < ui->tableWidget->rowCount() && i < item_->getActors().size(); ++i) + { + ui->tableWidget->item(i, 0)->setText(item_->getActors()[i]->getName()); + ui->tableWidget->item(i, 1)->setText(item_->getActors()[i]->actionName()); + ui->tableWidget->item(i, 2)->setText(item_->getActors()[i]->isActive() ? "Y" : "N"); + } + } } diff --git a/src/ui/itemsettingsdialog.h b/src/ui/itemsettingsdialog.h index ca12f21..5ec31a2 100644 --- a/src/ui/itemsettingsdialog.h +++ b/src/ui/itemsettingsdialog.h @@ -6,32 +6,33 @@ #include #include "../items/item.h" -namespace Ui { +namespace Ui +{ class ItemSettingsDialog; } class ItemSettingsDialog : public QDialog { - Q_OBJECT - std::shared_ptr item_; - QWidget* itemSpecificWidget_ = nullptr; + Q_OBJECT + std::shared_ptr item_; + QWidget* itemSpecificWidget_ = nullptr; private: - void loadActorList(); + void loadActorList(); public: - explicit ItemSettingsDialog(std::shared_ptr item, QWidget *parent = nullptr); - ~ItemSettingsDialog(); + explicit ItemSettingsDialog(std::shared_ptr item, QWidget *parent = nullptr); + ~ItemSettingsDialog(); private slots: - void removeActor(); - void addActor(); - void editActor(); - void changeOverride(); + void removeActor(); + void addActor(); + void editActor(); + void changeOverride(); private: - Ui::ItemSettingsDialog *ui; + Ui::ItemSettingsDialog *ui; }; #endif // RELAYSETTINGSDIALOG_H diff --git a/src/ui/itemwidget.cpp b/src/ui/itemwidget.cpp index af6426e..f56cdc7 100644 --- a/src/ui/itemwidget.cpp +++ b/src/ui/itemwidget.cpp @@ -8,68 +8,74 @@ #include "../items/turnout.h" ItemWidget::ItemWidget(std::weak_ptr item, QWidget *parent) : - QWidget(parent), - item_(item), - ui(new Ui::ItemWidget) + QWidget(parent), + item_(item), + ui(new Ui::ItemWidget) { - ui->setupUi(this); + ui->setupUi(this); if(auto workingItem = item_.lock()) - { + { ui->label->setText(workingItem->getName()); connect(ui->slider, &QSlider::valueChanged, this, &ItemWidget::setValue); - connect(ui->checkBox_f1, &QCheckBox::stateChanged, this, &ItemWidget::f1); - connect(ui->checkBox_f2, &QCheckBox::stateChanged, this, &ItemWidget::f2); - connect(ui->checkBox_f3, &QCheckBox::stateChanged, this, &ItemWidget::f3); - connect(ui->checkBox_f4, &QCheckBox::stateChanged, this, &ItemWidget::f4); - connect(ui->pushButton_reverse, &QPushButton::clicked, this, &ItemWidget::reverse); - connect(ui->radioButton_left, &QRadioButton::clicked, this, [this](){setValue(0);}); - connect(ui->radioButton_right, &QRadioButton::clicked, this, [this](){setValue(1);}); + connect(ui->checkBox_f1, &QCheckBox::stateChanged, this, &ItemWidget::f1); + connect(ui->checkBox_f2, &QCheckBox::stateChanged, this, &ItemWidget::f2); + connect(ui->checkBox_f3, &QCheckBox::stateChanged, this, &ItemWidget::f3); + connect(ui->checkBox_f4, &QCheckBox::stateChanged, this, &ItemWidget::f4); + connect(ui->pushButton_reverse, &QPushButton::clicked, this, &ItemWidget::reverse); + connect(ui->radioButton_left, &QRadioButton::clicked, this, [this]() + { + setValue(0); + }); + connect(ui->radioButton_right, &QRadioButton::clicked, this, [this]() + { + setValue(1); + }); connect(workingItem.get(), &Item::valueChanged, this, &ItemWidget::moveToValue); Train* train = dynamic_cast(workingItem.get()); Turnout* turnout = dynamic_cast(workingItem.get()); - if(turnout) - { - ui->checkBox_f1->hide(); - ui->checkBox_f2->hide(); - ui->checkBox_f3->hide(); - ui->checkBox_f4->hide(); - ui->slider->hide(); - } + if(turnout) + { + ui->checkBox_f1->hide(); + ui->checkBox_f2->hide(); + ui->checkBox_f3->hide(); + ui->checkBox_f4->hide(); + ui->slider->hide(); + } - if(!train) - { - ui->pushButton_reverse->hide(); - } - else - { - ui->radioButton_left->hide(); - ui->radioButton_right->hide(); - uint8_t functionMask = train->getFunctionMask(); + if(!train) + { + ui->pushButton_reverse->hide(); + } + else + { + ui->radioButton_left->hide(); + ui->radioButton_right->hide(); + uint8_t functionMask = train->getFunctionMask(); qDebug()<<"functionMask: "<<(int)functionMask; - if(!(functionMask & (1 << 0))) - ui->checkBox_f1->hide(); - if(!(functionMask & (1 << 1))) - ui->checkBox_f2->hide(); - if(!(functionMask & (1 << 2))) - ui->checkBox_f3->hide(); - if(!(functionMask & (1 << 3))) - ui->checkBox_f4->hide(); - } - } - else disable(); + if(!(functionMask & (1 << 0))) + ui->checkBox_f1->hide(); + if(!(functionMask & (1 << 1))) + ui->checkBox_f2->hide(); + if(!(functionMask & (1 << 2))) + ui->checkBox_f3->hide(); + if(!(functionMask & (1 << 3))) + ui->checkBox_f4->hide(); + } + } + else disable(); } void ItemWidget::deleteItem() { - if(auto workingItem = item_.lock()) - { - deleteRequest(*workingItem); - } + if(auto workingItem = item_.lock()) + { + deleteRequest(*workingItem); + } } void ItemWidget::setValue(int8_t value) @@ -82,85 +88,85 @@ void ItemWidget::setValue(int8_t value) void ItemWidget::moveToValue(int8_t value) { - ui->slider->blockSignals(true); - ui->radioButton_left->blockSignals(true); - ui->radioButton_right->blockSignals(true); + ui->slider->blockSignals(true); + ui->radioButton_left->blockSignals(true); + ui->radioButton_right->blockSignals(true); ui->pushButton_reverse->setText(value == 0 ? "Reverse" : "Stop"); - ui->slider->setValue(value); - ui->radioButton_left->setChecked(!value); - ui->radioButton_right->setChecked(value); + ui->slider->setValue(value); + ui->radioButton_left->setChecked(!value); + ui->radioButton_right->setChecked(value); - ui->slider->blockSignals(false); - ui->radioButton_left->blockSignals(false); - ui->radioButton_right->blockSignals(false); + ui->slider->blockSignals(false); + ui->radioButton_left->blockSignals(false); + ui->radioButton_right->blockSignals(false); } void ItemWidget::f1(int value) { - if(auto workingItem = item_.lock()) - workingItem->setFunction(0, value == Qt::Checked); - else disable(); + if(auto workingItem = item_.lock()) + workingItem->setFunction(0, value == Qt::Checked); + else disable(); } void ItemWidget::f2(int value) { - if(auto workingItem = item_.lock()) - workingItem->setFunction(1, value == Qt::Checked); - else disable(); + if(auto workingItem = item_.lock()) + workingItem->setFunction(1, value == Qt::Checked); + else disable(); } void ItemWidget::f3(int value) { - if(auto workingItem = item_.lock()) - workingItem->setFunction(2, value == Qt::Checked); - else disable(); + if(auto workingItem = item_.lock()) + workingItem->setFunction(2, value == Qt::Checked); + else disable(); } void ItemWidget::f4(int value) { - if(auto workingItem = item_.lock()) - workingItem->setFunction(3, value == Qt::Checked); - else disable(); + if(auto workingItem = item_.lock()) + workingItem->setFunction(3, value == Qt::Checked); + else disable(); } void ItemWidget::reverse() { - if(auto workingItem = item_.lock()) - { - Train* train = dynamic_cast(workingItem.get()); - if(train && workingItem->getValue() == 0) - train->reverse(); - else + if(auto workingItem = item_.lock()) + { + Train* train = dynamic_cast(workingItem.get()); + if(train && workingItem->getValue() == 0) + train->reverse(); + else { setValue(!((bool)workingItem->getValue())); - } - } - else disable(); + } + } + else disable(); } void ItemWidget::disable() { - ui->checkBox_f1->setEnabled(false); - ui->checkBox_f2->setEnabled(false); - ui->checkBox_f3->setEnabled(false); - ui->checkBox_f4->setEnabled(false); - ui->label->setEnabled(false); - ui->slider->setEnabled(false); - ui->pushButton_reverse->setEnabled(false); + ui->checkBox_f1->setEnabled(false); + ui->checkBox_f2->setEnabled(false); + ui->checkBox_f3->setEnabled(false); + ui->checkBox_f4->setEnabled(false); + ui->label->setEnabled(false); + ui->slider->setEnabled(false); + ui->pushButton_reverse->setEnabled(false); } bool ItemWidget::controles(const ItemData& relay) { - if(auto workingRelay = item_.lock()) - { - if(relay == *workingRelay) - return true; - else - return false; - } - return true; + if(auto workingRelay = item_.lock()) + { + if(relay == *workingRelay) + return true; + else + return false; + } + return true; } void ItemWidget::stepUp() @@ -175,29 +181,29 @@ void ItemWidget::stepDown() void ItemWidget::setShortcuts(QKeySequence up, QKeySequence down, QKeySequence rev) { - shortcuts_.clear(); - shortcuts_.push_back(std::unique_ptr(new QShortcut(up, this))); - connect(shortcuts_.back().get(), &QShortcut::activated, this, &ItemWidget::stepUp); - shortcuts_.push_back(std::unique_ptr(new QShortcut(down, this))); - connect(shortcuts_.back().get(), &QShortcut::activated, this, &ItemWidget::stepDown); - shortcuts_.push_back(std::unique_ptr(new QShortcut(rev, this))); - connect(shortcuts_.back().get(), &QShortcut::activated, this, &ItemWidget::reverse); + shortcuts_.clear(); + shortcuts_.push_back(std::unique_ptr(new QShortcut(up, this))); + connect(shortcuts_.back().get(), &QShortcut::activated, this, &ItemWidget::stepUp); + shortcuts_.push_back(std::unique_ptr(new QShortcut(down, this))); + connect(shortcuts_.back().get(), &QShortcut::activated, this, &ItemWidget::stepDown); + shortcuts_.push_back(std::unique_ptr(new QShortcut(rev, this))); + connect(shortcuts_.back().get(), &QShortcut::activated, this, &ItemWidget::reverse); } std::weak_ptr ItemWidget::getItem() { - return item_; + return item_; } void ItemWidget::stateChanged(int state) { - qDebug()<<"widget got state "<slider->blockSignals(true); - ui->slider->setValue(state); - ui->slider->blockSignals(false); + qDebug()<<"widget got state "<slider->blockSignals(true); + ui->slider->setValue(state); + ui->slider->blockSignals(false); } ItemWidget::~ItemWidget() { - delete ui; + delete ui; } diff --git a/src/ui/itemwidget.h b/src/ui/itemwidget.h index c0eb45b..465fed6 100644 --- a/src/ui/itemwidget.h +++ b/src/ui/itemwidget.h @@ -7,51 +7,52 @@ #include "itemsettingsdialog.h" #include "../items/item.h" -namespace Ui { +namespace Ui +{ class ItemWidget; } class ItemWidget : public QWidget { - Q_OBJECT + Q_OBJECT private: - std::weak_ptr item_; + std::weak_ptr item_; - std::vector< std::unique_ptr > shortcuts_; + std::vector< std::unique_ptr > shortcuts_; - void disable(); + void disable(); signals: - void deleteRequest(const ItemData& item); + void deleteRequest(const ItemData& item); private slots: void setValue(int8_t value); void moveToValue(int8_t value); - void deleteItem(); + void deleteItem(); - void stepUp(); - void stepDown(); + void stepUp(); + void stepDown(); - void f1(int state); - void f2(int state); - void f3(int state); - void f4(int state); - void reverse(); + void f1(int state); + void f2(int state); + void f3(int state); + void f4(int state); + void reverse(); public: - explicit ItemWidget(std::weak_ptr item, QWidget *parent); - std::weak_ptr getItem(); - bool controles(const ItemData& relay); - ~ItemWidget(); - void setShortcuts(QKeySequence up, QKeySequence down, QKeySequence rev); + explicit ItemWidget(std::weak_ptr item, QWidget *parent); + std::weak_ptr getItem(); + bool controles(const ItemData& relay); + ~ItemWidget(); + void setShortcuts(QKeySequence up, QKeySequence down, QKeySequence rev); public slots: - void stateChanged(int state); + void stateChanged(int state); private: - Ui::ItemWidget *ui; + Ui::ItemWidget *ui; }; #endif // RELAYWIDGET_H diff --git a/src/ui/mainwindow.cpp b/src/ui/mainwindow.cpp index 93187a4..7f7d361 100644 --- a/src/ui/mainwindow.cpp +++ b/src/ui/mainwindow.cpp @@ -5,31 +5,31 @@ #include "itemcreationdialog.h" MainWindow::MainWindow(Microcontroller * const micro, ItemStore* items, QWidget *parent) : - QMainWindow(parent), - stopShort(QKeySequence(Qt::Key_Space), this), - ui(new Ui::MainWindow), - _micro(micro) + QMainWindow(parent), + stopShort(QKeySequence(Qt::Key_Space), this), + ui(new Ui::MainWindow), + _micro(micro) { - ui->setupUi(this); + ui->setupUi(this); - connect(&stopShort, &QShortcut::activated, _micro, &Microcontroller::estop); - connect(ui->pushButton_stop, &QPushButton::clicked, _micro, &Microcontroller::estop); - connect(ui->pushButton_refesh, &QPushButton::clicked, _micro, &Microcontroller::requestState); + connect(&stopShort, &QShortcut::activated, _micro, &Microcontroller::estop); + connect(ui->pushButton_stop, &QPushButton::clicked, _micro, &Microcontroller::estop); + connect(ui->pushButton_refesh, &QPushButton::clicked, _micro, &Microcontroller::requestState); - connect(items, &ItemStore::itemAdded, ui->relayList, &ItemScrollBox::addItem); - connect(items, &ItemStore::itemDeleted, ui->relayList, &ItemScrollBox::removeItem); + connect(items, &ItemStore::itemAdded, ui->relayList, &ItemScrollBox::addItem); + connect(items, &ItemStore::itemDeleted, ui->relayList, &ItemScrollBox::removeItem); - for(size_t i = 0; i < items->getItems()->size(); ++i) - { - ui->relayList->addItem(items->getItems()->at(i)); - } + for(size_t i = 0; i < items->getItems()->size(); ++i) + { + ui->relayList->addItem(items->getItems()->at(i)); + } - connect(ui->relayList, &ItemScrollBox::deleteRequest, items, &ItemStore::removeItem); + connect(ui->relayList, &ItemScrollBox::deleteRequest, items, &ItemStore::removeItem); } MainWindow::~MainWindow() { - delete ui; + delete ui; } /* diff --git a/src/ui/mainwindow.h b/src/ui/mainwindow.h index 890b84b..17a9071 100644 --- a/src/ui/mainwindow.h +++ b/src/ui/mainwindow.h @@ -20,25 +20,25 @@ class MainWindow; class MainWindow : public QMainWindow { - Q_OBJECT - QShortcut stopShort; + Q_OBJECT + QShortcut stopShort; public: - explicit MainWindow(Microcontroller * const micro, ItemStore* items, QWidget *parent = nullptr); - ~MainWindow(); + explicit MainWindow(Microcontroller * const micro, ItemStore* items, QWidget *parent = nullptr); + ~MainWindow(); private: - Ui::MainWindow *ui; + Ui::MainWindow *ui; - Microcontroller *_micro; + Microcontroller *_micro; signals: - void createdItem(std::shared_ptr item); + void createdItem(std::shared_ptr item); private slots: - //void showItemCreationDialog(); + //void showItemCreationDialog(); }; From 039c093b15454acb4deb825a2a74077a1cabf235 Mon Sep 17 00:00:00 2001 From: uvos Date: Sat, 12 Feb 2022 00:38:31 +0100 Subject: [PATCH 02/10] Add support for signals --- src/main.cpp | 2 + src/microcontroller.cpp | 42 ++++- src/microcontroller.h | 3 + src/ui/itemscrollbox.cpp | 44 +++-- src/ui/itemwidget.cpp | 177 +-------------------- src/ui/itemwidget.h | 35 +--- src/ui/signalwidget.cpp | 93 +++++++++++ src/ui/signalwidget.h | 36 +++++ src/ui/signalwidget.ui | 98 ++++++++++++ src/ui/trainwidget.cpp | 194 +++++++++++++++++++++++ src/ui/trainwidget.h | 49 ++++++ src/ui/{itemwidget.ui => trainwidget.ui} | 4 +- trainControllerUI.pro | 25 +-- 13 files changed, 565 insertions(+), 237 deletions(-) create mode 100644 src/ui/signalwidget.cpp create mode 100644 src/ui/signalwidget.h create mode 100644 src/ui/signalwidget.ui create mode 100644 src/ui/trainwidget.cpp create mode 100644 src/ui/trainwidget.h rename src/ui/{itemwidget.ui => trainwidget.ui} (98%) diff --git a/src/main.cpp b/src/main.cpp index 8975970..4b8cb3f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -13,6 +13,7 @@ #include "items/itemstore.h" #include "items/train.h" #include "items/turnout.h" +#include "items/signal.h" #define BAUD QSerialPort::Baud38400 @@ -94,6 +95,7 @@ int main(int argc, char *argv[]) Train::micro = µ Turnout::micro = µ + Signal::micro = µ ItemStore items; QObject::connect(µ, &Microcontroller::gotItemList, &items, &ItemStore::addItems); diff --git a/src/microcontroller.cpp b/src/microcontroller.cpp index a162d8d..406c482 100644 --- a/src/microcontroller.cpp +++ b/src/microcontroller.cpp @@ -4,6 +4,7 @@ #include #include "items/train.h" #include "items/turnout.h" +#include "items/signal.h" void Microcontroller::trainSetSpeed(uint8_t id, int8_t speed) { @@ -34,6 +35,13 @@ void Microcontroller::tunoutSetDirection(uint8_t id, bool direction) write(ss.str().c_str()); } +void Microcontroller::signalSetValue(uint8_t id, uint8_t state) +{ + std::stringstream ss; + ss<<"signal "<<(unsigned)id<<" set "<<(unsigned)state<<'\n'; + write(ss.str().c_str()); +} + void Microcontroller::setPower(bool on) { write(on ? "power on\n" : "power off\n"); @@ -77,6 +85,7 @@ void Microcontroller::requestState() { write("train list\n"); write("turnout list\n"); + write("signal list\n"); } //housekeeping @@ -94,7 +103,7 @@ Microcontroller::~Microcontroller() { } -void Microcontroller::setIODevice(QIODevice *port) +void Microcontroller::setIODevice(QIODevice* port) { _port = port; QObject::connect(_port, &QIODevice::readyRead, this, &Microcontroller::isReadyRead); @@ -122,6 +131,17 @@ std::shared_ptr Microcontroller::processTurnoutLine(const QString& buffer) return nullptr; } +std::shared_ptr Microcontroller::processSignalLine(const QString& buffer) +{ + QStringList bufferList = buffer.split(' '); + if(bufferList.size() >= 13 && buffer.startsWith("SIGNAL NUMBER:")) + { + return std::shared_ptr(new Signal(bufferList[2].toInt(), bufferList[4].toInt(), bufferList[6].toInt(), + bufferList[8].toInt(), bufferList[13].toInt())); + } + return nullptr; +} + void Microcontroller::processList(const QString& buffer) { QStringList bufferList = buffer.split(' '); @@ -133,6 +153,8 @@ void Microcontroller::processList(const QString& buffer) item = processTrainLine(buffer); else if(listMode == TURNOUT_LIST) item = processTurnoutLine(buffer); + else if(listMode == SIGNAL_LIST) + item = processSignalLine(buffer); if(item) itemList.push_back(item); } @@ -150,10 +172,17 @@ void Microcontroller::processList(const QString& buffer) void Microcontroller::processItemState(const QString& buffer) { + std::shared_ptr item = processTrainLine(buffer); if(_buffer.startsWith("TRAIN NUMBER:")) - itemChanged(static_cast(*processTrainLine(buffer))); + item = processTrainLine(buffer); else if(_buffer.startsWith("TURNOUT NUMBER:")) - itemChanged(static_cast(*processTurnoutLine(buffer))); + item = processTurnoutLine(buffer); + else if(_buffer.startsWith("SIGNAL NUMBER:")) + item = processSignalLine(buffer); + if(item) + itemChanged(static_cast(*item)); + else + qWarning()<<__func__<<"failed to process status line"; } @@ -172,7 +201,12 @@ void Microcontroller::processMicroReturn() { listMode = TURNOUT_LIST; } - else if(_buffer.startsWith("TRAIN NUMBER:") || _buffer.startsWith("TURNOUT NUMBER:")) + else if(_buffer.startsWith("Signals:")) + { + listMode = SIGNAL_LIST; + } + else if(_buffer.startsWith("TRAIN NUMBER:") || _buffer.startsWith("TURNOUT NUMBER:") || + _buffer.startsWith("SIGNAL NUMBER:")) { processItemState(_buffer); } diff --git a/src/microcontroller.h b/src/microcontroller.h index c9ad9e2..22e0c21 100644 --- a/src/microcontroller.h +++ b/src/microcontroller.h @@ -32,6 +32,7 @@ private: static constexpr int TRAIN_LIST = 1; static constexpr int TURNOUT_LIST = 2; + static constexpr int SIGNAL_LIST = 3; int listMode = 0; @@ -49,6 +50,7 @@ private: void processItemState(const QString& buffer); std::shared_ptr processTrainLine(const QString& buffer); std::shared_ptr processTurnoutLine(const QString& buffer); + std::shared_ptr processSignalLine(const QString& buffer); void write(char *buffer, const size_t length); void write(const QByteArray& buffer); @@ -67,6 +69,7 @@ public slots: void trainReverse(uint8_t id); void trainSetFunction(uint8_t id, uint8_t function, bool on); void tunoutSetDirection(uint8_t id, bool direction); + void signalSetValue(uint8_t id, uint8_t state); void estop(); void setPower(bool on); diff --git a/src/ui/itemscrollbox.cpp b/src/ui/itemscrollbox.cpp index 3d92249..d24caa2 100644 --- a/src/ui/itemscrollbox.cpp +++ b/src/ui/itemscrollbox.cpp @@ -3,7 +3,10 @@ #include "ui_relayscrollbox.h" #include "../items/train.h" #include "../items/turnout.h" +#include "../items/signal.h" #include "../trainjs.h" +#include "trainwidget.h" +#include "signalwidget.h" ItemScrollBox::ItemScrollBox(QWidget *parent) : QWidget(parent), @@ -23,44 +26,53 @@ void ItemScrollBox::addItem(std::weak_ptr item) { if(auto workItem = item.lock()) { - widgets_.push_back(new ItemWidget(item, this)); Train* train = dynamic_cast(workItem.get()); Turnout* turnout = dynamic_cast(workItem.get()); + Signal* signal = dynamic_cast(workItem.get()); if(train) { + TrainWidget *widget = new TrainWidget(item, this); + widgets_.push_back(widget); if(train->getTrainId() == 0) - widgets_.back()->setShortcuts(QKeySequence(Qt::Key_Q), QKeySequence(Qt::Key_A), QKeySequence(Qt::Key_Z)); + widget->setShortcuts(QKeySequence(Qt::Key_Q), QKeySequence(Qt::Key_A), QKeySequence(Qt::Key_Z)); else if(train->getTrainId() == 1) - widgets_.back()->setShortcuts(QKeySequence(Qt::Key_W), QKeySequence(Qt::Key_S), QKeySequence(Qt::Key_X)); + widget->setShortcuts(QKeySequence(Qt::Key_W), QKeySequence(Qt::Key_S), QKeySequence(Qt::Key_X)); else if(train->getTrainId() == 2) - widgets_.back()->setShortcuts(QKeySequence(Qt::Key_E), QKeySequence(Qt::Key_D), QKeySequence(Qt::Key_C)); + widget->setShortcuts(QKeySequence(Qt::Key_E), QKeySequence(Qt::Key_D), QKeySequence(Qt::Key_C)); else if(train->getTrainId() == 3) - widgets_.back()->setShortcuts(QKeySequence(Qt::Key_R), QKeySequence(Qt::Key_F), QKeySequence(Qt::Key_V)); + widget->setShortcuts(QKeySequence(Qt::Key_R), QKeySequence(Qt::Key_F), QKeySequence(Qt::Key_V)); else if(train->getTrainId() == 4) - widgets_.back()->setShortcuts(QKeySequence(Qt::Key_T), QKeySequence(Qt::Key_G), QKeySequence(Qt::Key_B)); + widget->setShortcuts(QKeySequence(Qt::Key_T), QKeySequence(Qt::Key_G), QKeySequence(Qt::Key_B)); } else if(turnout) { + TrainWidget *widget = new TrainWidget(item, this); + widgets_.push_back(widget); if(turnout->getTurnoutId() == 0) - widgets_.back()->setShortcuts(QKeySequence(), QKeySequence(), QKeySequence(Qt::Key_1)); + widget->setShortcuts(QKeySequence(), QKeySequence(), QKeySequence(Qt::Key_1)); else if(turnout->getTurnoutId() == 1) - widgets_.back()->setShortcuts(QKeySequence(), QKeySequence(), QKeySequence(Qt::Key_2)); + widget->setShortcuts(QKeySequence(), QKeySequence(), QKeySequence(Qt::Key_2)); else if(turnout->getTurnoutId() == 2) - widgets_.back()->setShortcuts(QKeySequence(), QKeySequence(), QKeySequence(Qt::Key_3)); + widget->setShortcuts(QKeySequence(), QKeySequence(), QKeySequence(Qt::Key_3)); else if(turnout->getTurnoutId() == 3) - widgets_.back()->setShortcuts(QKeySequence(), QKeySequence(), QKeySequence(Qt::Key_4)); + widget->setShortcuts(QKeySequence(), QKeySequence(), QKeySequence(Qt::Key_4)); else if(turnout->getTurnoutId() == 4) - widgets_.back()->setShortcuts(QKeySequence(), QKeySequence(), QKeySequence(Qt::Key_5)); + widget->setShortcuts(QKeySequence(), QKeySequence(), QKeySequence(Qt::Key_5)); else if(turnout->getTurnoutId() == 5) - widgets_.back()->setShortcuts(QKeySequence(), QKeySequence(), QKeySequence(Qt::Key_6)); + widget->setShortcuts(QKeySequence(), QKeySequence(), QKeySequence(Qt::Key_6)); else if(turnout->getTurnoutId() == 6) - widgets_.back()->setShortcuts(QKeySequence(), QKeySequence(), QKeySequence(Qt::Key_7)); + widget->setShortcuts(QKeySequence(), QKeySequence(), QKeySequence(Qt::Key_7)); else if(turnout->getTurnoutId() == 7) - widgets_.back()->setShortcuts(QKeySequence(), QKeySequence(), QKeySequence(Qt::Key_8)); + widget->setShortcuts(QKeySequence(), QKeySequence(), QKeySequence(Qt::Key_8)); else if(turnout->getTurnoutId() == 8) - widgets_.back()->setShortcuts(QKeySequence(), QKeySequence(), QKeySequence(Qt::Key_9)); + widget->setShortcuts(QKeySequence(), QKeySequence(), QKeySequence(Qt::Key_9)); else if(turnout->getTurnoutId() == 9) - widgets_.back()->setShortcuts(QKeySequence(), QKeySequence(), QKeySequence(Qt::Key_0)); + widget->setShortcuts(QKeySequence(), QKeySequence(), QKeySequence(Qt::Key_0)); + } + else if(signal) + { + SignalWidget *widget = new SignalWidget(item, this); + widgets_.push_back(widget); } ui->relayWidgetVbox->addWidget(widgets_.back()); connect(widgets_.back(), &ItemWidget::deleteRequest, this, &ItemScrollBox::deleteRequest); diff --git a/src/ui/itemwidget.cpp b/src/ui/itemwidget.cpp index f56cdc7..b780b09 100644 --- a/src/ui/itemwidget.cpp +++ b/src/ui/itemwidget.cpp @@ -1,5 +1,4 @@ #include "itemwidget.h" -#include "ui_itemwidget.h" #include #include @@ -9,152 +8,10 @@ ItemWidget::ItemWidget(std::weak_ptr item, QWidget *parent) : QWidget(parent), - item_(item), - ui(new Ui::ItemWidget) + item_(item) { - ui->setupUi(this); + qDebug()<<__func__<<" "<<(bool)item_.lock(); - if(auto workingItem = item_.lock()) - { - ui->label->setText(workingItem->getName()); - - connect(ui->slider, &QSlider::valueChanged, this, &ItemWidget::setValue); - connect(ui->checkBox_f1, &QCheckBox::stateChanged, this, &ItemWidget::f1); - connect(ui->checkBox_f2, &QCheckBox::stateChanged, this, &ItemWidget::f2); - connect(ui->checkBox_f3, &QCheckBox::stateChanged, this, &ItemWidget::f3); - connect(ui->checkBox_f4, &QCheckBox::stateChanged, this, &ItemWidget::f4); - connect(ui->pushButton_reverse, &QPushButton::clicked, this, &ItemWidget::reverse); - connect(ui->radioButton_left, &QRadioButton::clicked, this, [this]() - { - setValue(0); - }); - connect(ui->radioButton_right, &QRadioButton::clicked, this, [this]() - { - setValue(1); - }); - - connect(workingItem.get(), &Item::valueChanged, this, &ItemWidget::moveToValue); - - Train* train = dynamic_cast(workingItem.get()); - Turnout* turnout = dynamic_cast(workingItem.get()); - - if(turnout) - { - ui->checkBox_f1->hide(); - ui->checkBox_f2->hide(); - ui->checkBox_f3->hide(); - ui->checkBox_f4->hide(); - ui->slider->hide(); - } - - if(!train) - { - ui->pushButton_reverse->hide(); - } - else - { - ui->radioButton_left->hide(); - ui->radioButton_right->hide(); - uint8_t functionMask = train->getFunctionMask(); - qDebug()<<"functionMask: "<<(int)functionMask; - if(!(functionMask & (1 << 0))) - ui->checkBox_f1->hide(); - if(!(functionMask & (1 << 1))) - ui->checkBox_f2->hide(); - if(!(functionMask & (1 << 2))) - ui->checkBox_f3->hide(); - if(!(functionMask & (1 << 3))) - ui->checkBox_f4->hide(); - } - } - else disable(); -} - -void ItemWidget::deleteItem() -{ - if(auto workingItem = item_.lock()) - { - deleteRequest(*workingItem); - } -} - -void ItemWidget::setValue(int8_t value) -{ - if(auto workingItem = item_.lock()) - workingItem->setValue(value); - else - disable(); -} - -void ItemWidget::moveToValue(int8_t value) -{ - ui->slider->blockSignals(true); - ui->radioButton_left->blockSignals(true); - ui->radioButton_right->blockSignals(true); - - ui->pushButton_reverse->setText(value == 0 ? "Reverse" : "Stop"); - ui->slider->setValue(value); - ui->radioButton_left->setChecked(!value); - ui->radioButton_right->setChecked(value); - - ui->slider->blockSignals(false); - ui->radioButton_left->blockSignals(false); - ui->radioButton_right->blockSignals(false); -} - -void ItemWidget::f1(int value) -{ - if(auto workingItem = item_.lock()) - workingItem->setFunction(0, value == Qt::Checked); - else disable(); -} - -void ItemWidget::f2(int value) -{ - if(auto workingItem = item_.lock()) - workingItem->setFunction(1, value == Qt::Checked); - else disable(); -} - - -void ItemWidget::f3(int value) -{ - if(auto workingItem = item_.lock()) - workingItem->setFunction(2, value == Qt::Checked); - else disable(); -} - -void ItemWidget::f4(int value) -{ - if(auto workingItem = item_.lock()) - workingItem->setFunction(3, value == Qt::Checked); - else disable(); -} - -void ItemWidget::reverse() -{ - if(auto workingItem = item_.lock()) - { - Train* train = dynamic_cast(workingItem.get()); - if(train && workingItem->getValue() == 0) - train->reverse(); - else - { - setValue(!((bool)workingItem->getValue())); - } - } - else disable(); -} - -void ItemWidget::disable() -{ - ui->checkBox_f1->setEnabled(false); - ui->checkBox_f2->setEnabled(false); - ui->checkBox_f3->setEnabled(false); - ui->checkBox_f4->setEnabled(false); - ui->label->setEnabled(false); - ui->slider->setEnabled(false); - ui->pushButton_reverse->setEnabled(false); } bool ItemWidget::controles(const ItemData& relay) @@ -169,41 +26,11 @@ bool ItemWidget::controles(const ItemData& relay) return true; } -void ItemWidget::stepUp() -{ - setValue(ui->slider->value()+1); -} - -void ItemWidget::stepDown() -{ - setValue(ui->slider->value()-1); -} - -void ItemWidget::setShortcuts(QKeySequence up, QKeySequence down, QKeySequence rev) -{ - shortcuts_.clear(); - shortcuts_.push_back(std::unique_ptr(new QShortcut(up, this))); - connect(shortcuts_.back().get(), &QShortcut::activated, this, &ItemWidget::stepUp); - shortcuts_.push_back(std::unique_ptr(new QShortcut(down, this))); - connect(shortcuts_.back().get(), &QShortcut::activated, this, &ItemWidget::stepDown); - shortcuts_.push_back(std::unique_ptr(new QShortcut(rev, this))); - connect(shortcuts_.back().get(), &QShortcut::activated, this, &ItemWidget::reverse); -} - std::weak_ptr ItemWidget::getItem() { return item_; } -void ItemWidget::stateChanged(int state) -{ - qDebug()<<"widget got state "<slider->blockSignals(true); - ui->slider->setValue(state); - ui->slider->blockSignals(false); -} - ItemWidget::~ItemWidget() { - delete ui; } diff --git a/src/ui/itemwidget.h b/src/ui/itemwidget.h index 465fed6..82a64db 100644 --- a/src/ui/itemwidget.h +++ b/src/ui/itemwidget.h @@ -1,5 +1,4 @@ -#ifndef RELAYWIDGET_H -#define RELAYWIDGET_H +#pragma once #include #include @@ -7,52 +6,26 @@ #include "itemsettingsdialog.h" #include "../items/item.h" -namespace Ui -{ -class ItemWidget; -} - class ItemWidget : public QWidget { Q_OBJECT -private: +protected: std::weak_ptr item_; - std::vector< std::unique_ptr > shortcuts_; - - void disable(); + virtual void disable(){} signals: void deleteRequest(const ItemData& item); -private slots: - void setValue(int8_t value); - void moveToValue(int8_t value); - void deleteItem(); - - void stepUp(); - void stepDown(); - - void f1(int state); - void f2(int state); - void f3(int state); - void f4(int state); - void reverse(); - public: explicit ItemWidget(std::weak_ptr item, QWidget *parent); std::weak_ptr getItem(); bool controles(const ItemData& relay); ~ItemWidget(); - void setShortcuts(QKeySequence up, QKeySequence down, QKeySequence rev); public slots: - void stateChanged(int state); - -private: - Ui::ItemWidget *ui; + virtual void stateChanged(int state){(void)state;} }; -#endif // RELAYWIDGET_H diff --git a/src/ui/signalwidget.cpp b/src/ui/signalwidget.cpp new file mode 100644 index 0000000..443d7f0 --- /dev/null +++ b/src/ui/signalwidget.cpp @@ -0,0 +1,93 @@ +#include "signalwidget.h" +#include "ui_signalwidget.h" + +#include +#include +#include +#include "../items/signal.h" + +SignalWidget::SignalWidget(std::weak_ptr item, QWidget *parent) : + ItemWidget(item, parent), + ui(new Ui::SignalWidget) +{ + ui->setupUi(this); + + if(auto workingItem = item_.lock()) + { + std::shared_ptr signal = std::dynamic_pointer_cast(workingItem); + if(signal) + { + + ui->label->setText(workingItem->getName()); + + connect(ui->radioButton_go, &QRadioButton::clicked, this, [this]() + { + setValue(Signal::GO); + }); + connect(ui->radioButton_slow, &QRadioButton::clicked, this, [this]() + { + setValue(Signal::SLOW); + }); + connect(ui->radioButton_stop, &QRadioButton::clicked, this, [this]() + { + setValue(Signal::STOP); + }); + + connect(signal.get(), &Item::valueChanged, this, &SignalWidget::moveToValue); + } + } + else + { + qWarning("SignalWidget got invalid item"); + SignalWidget::disable(); + } +} + +void SignalWidget::deleteItem() +{ + if(auto workingItem = item_.lock()) + { + deleteRequest(*workingItem); + } +} + +void SignalWidget::setValue(int8_t value) +{ + if(auto workingItem = item_.lock()) + workingItem->setValue(value); + else + disable(); +} + +void SignalWidget::moveToValue(int8_t value) +{ + qDebug()<<"got value"<radioButton_go->blockSignals(true); + ui->radioButton_slow->blockSignals(true); + ui->radioButton_stop->blockSignals(true); + + ui->radioButton_go->setChecked(value == Signal::GO); + ui->radioButton_slow->setChecked(value == Signal::SLOW); + ui->radioButton_stop->setChecked(value == Signal::STOP); + + ui->radioButton_go->blockSignals(false); + ui->radioButton_slow->blockSignals(false); + ui->radioButton_stop->blockSignals(false); +} + +void SignalWidget::disable() +{ + ui->radioButton_go->setEnabled(false); + ui->radioButton_slow->setEnabled(false); + ui->radioButton_stop->setEnabled(false); +} + +void SignalWidget::stateChanged(int state) +{ + moveToValue(state); +} + +SignalWidget::~SignalWidget() +{ + delete ui; +} diff --git a/src/ui/signalwidget.h b/src/ui/signalwidget.h new file mode 100644 index 0000000..f0fbfca --- /dev/null +++ b/src/ui/signalwidget.h @@ -0,0 +1,36 @@ +#pragma once + +#include +#include +#include +#include "../items/signal.h" +#include "itemwidget.h" + +namespace Ui +{ +class SignalWidget; +} + +class SignalWidget : public ItemWidget +{ + Q_OBJECT +protected: + + virtual void disable(); + +private slots: + void moveToValue(int8_t value); + void setValue(int8_t value); + void deleteItem(); + +public: + explicit SignalWidget(std::weak_ptr item, QWidget *parent); + ~SignalWidget(); + +public slots: + + virtual void stateChanged(int state); + +private: + Ui::SignalWidget *ui; +}; diff --git a/src/ui/signalwidget.ui b/src/ui/signalwidget.ui new file mode 100644 index 0000000..2f6a4ed --- /dev/null +++ b/src/ui/signalwidget.ui @@ -0,0 +1,98 @@ + + + SignalWidget + + + + 0 + 0 + 312 + 78 + + + + + 0 + 0 + + + + Form + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 0 + + + + + TextLabel + + + + + + + + + + + Go + + + true + + + + + + + Slow + + + false + + + + + + + Stop + + + + + + + + + + + + + Qt::Horizontal + + + + + + + + diff --git a/src/ui/trainwidget.cpp b/src/ui/trainwidget.cpp new file mode 100644 index 0000000..59bd65c --- /dev/null +++ b/src/ui/trainwidget.cpp @@ -0,0 +1,194 @@ +#include "trainwidget.h" +#include "ui_trainwidget.h" + +#include +#include +#include +#include "../items/train.h" +#include "../items/turnout.h" + +TrainWidget::TrainWidget(std::weak_ptr item, QWidget *parent) : + ItemWidget(item, parent), + ui(new Ui::TrainWidget) +{ + ui->setupUi(this); + if(auto workingItem = item_.lock()) + { + ui->label->setText(workingItem->getName()); + + connect(ui->slider, &QSlider::valueChanged, this, &TrainWidget::setValue); + connect(ui->checkBox_f1, &QCheckBox::stateChanged, this, &TrainWidget::f1); + connect(ui->checkBox_f2, &QCheckBox::stateChanged, this, &TrainWidget::f2); + connect(ui->checkBox_f3, &QCheckBox::stateChanged, this, &TrainWidget::f3); + connect(ui->checkBox_f4, &QCheckBox::stateChanged, this, &TrainWidget::f4); + connect(ui->pushButton_reverse, &QPushButton::clicked, this, &TrainWidget::reverse); + connect(ui->radioButton_left, &QRadioButton::clicked, this, [this]() + { + setValue(0); + }); + connect(ui->radioButton_right, &QRadioButton::clicked, this, [this]() + { + setValue(1); + }); + + connect(workingItem.get(), &Item::valueChanged, this, &TrainWidget::moveToValue); + + Train* train = dynamic_cast(workingItem.get()); + Turnout* turnout = dynamic_cast(workingItem.get()); + + if(turnout) + { + ui->checkBox_f1->hide(); + ui->checkBox_f2->hide(); + ui->checkBox_f3->hide(); + ui->checkBox_f4->hide(); + ui->slider->hide(); + } + + if(!train) + { + ui->pushButton_reverse->hide(); + } + else + { + ui->radioButton_left->hide(); + ui->radioButton_right->hide(); + uint8_t functionMask = train->getFunctionMask(); + qDebug()<<"functionMask: "<<(int)functionMask; + if(!(functionMask & (1 << 0))) + ui->checkBox_f1->hide(); + if(!(functionMask & (1 << 1))) + ui->checkBox_f2->hide(); + if(!(functionMask & (1 << 2))) + ui->checkBox_f3->hide(); + if(!(functionMask & (1 << 3))) + ui->checkBox_f4->hide(); + } + } + else + { + qWarning("TrainWidget got invalid item"); + TrainWidget::disable(); + } +} + +void TrainWidget::deleteItem() +{ + if(auto workingItem = item_.lock()) + { + deleteRequest(*workingItem); + } +} + +void TrainWidget::setValue(int8_t value) +{ + if(auto workingItem = item_.lock()) + workingItem->setValue(value); + else + disable(); +} + +void TrainWidget::moveToValue(int8_t value) +{ + ui->slider->blockSignals(true); + ui->radioButton_left->blockSignals(true); + ui->radioButton_right->blockSignals(true); + + ui->pushButton_reverse->setText(value == 0 ? "Reverse" : "Stop"); + ui->slider->setValue(value); + ui->radioButton_left->setChecked(!value); + ui->radioButton_right->setChecked(value); + + ui->slider->blockSignals(false); + ui->radioButton_left->blockSignals(false); + ui->radioButton_right->blockSignals(false); +} + +void TrainWidget::f1(int value) +{ + if(auto workingItem = item_.lock()) + workingItem->setFunction(0, value == Qt::Checked); + else disable(); +} + +void TrainWidget::f2(int value) +{ + if(auto workingItem = item_.lock()) + workingItem->setFunction(1, value == Qt::Checked); + else disable(); +} + + +void TrainWidget::f3(int value) +{ + if(auto workingItem = item_.lock()) + workingItem->setFunction(2, value == Qt::Checked); + else disable(); +} + +void TrainWidget::f4(int value) +{ + if(auto workingItem = item_.lock()) + workingItem->setFunction(3, value == Qt::Checked); + else disable(); +} + +void TrainWidget::reverse() +{ + if(auto workingItem = item_.lock()) + { + Train* train = dynamic_cast(workingItem.get()); + if(train && workingItem->getValue() == 0) + train->reverse(); + else + { + setValue(!((bool)workingItem->getValue())); + } + } + else disable(); +} + +void TrainWidget::disable() +{ + ui->checkBox_f1->setEnabled(false); + ui->checkBox_f2->setEnabled(false); + ui->checkBox_f3->setEnabled(false); + ui->checkBox_f4->setEnabled(false); + ui->label->setEnabled(false); + ui->slider->setEnabled(false); + ui->pushButton_reverse->setEnabled(false); +} + +void TrainWidget::stepUp() +{ + setValue(ui->slider->value()+1); +} + +void TrainWidget::stepDown() +{ + setValue(ui->slider->value()-1); +} + +void TrainWidget::setShortcuts(QKeySequence up, QKeySequence down, QKeySequence rev) +{ + shortcuts_.clear(); + shortcuts_.push_back(std::unique_ptr(new QShortcut(up, this))); + connect(shortcuts_.back().get(), &QShortcut::activated, this, &TrainWidget::stepUp); + shortcuts_.push_back(std::unique_ptr(new QShortcut(down, this))); + connect(shortcuts_.back().get(), &QShortcut::activated, this, &TrainWidget::stepDown); + shortcuts_.push_back(std::unique_ptr(new QShortcut(rev, this))); + connect(shortcuts_.back().get(), &QShortcut::activated, this, &TrainWidget::reverse); +} + +void TrainWidget::stateChanged(int state) +{ + qDebug()<<"widget got state "<slider->blockSignals(true); + ui->slider->setValue(state); + ui->slider->blockSignals(false); +} + +TrainWidget::~TrainWidget() +{ + delete ui; +} diff --git a/src/ui/trainwidget.h b/src/ui/trainwidget.h new file mode 100644 index 0000000..1e250db --- /dev/null +++ b/src/ui/trainwidget.h @@ -0,0 +1,49 @@ +#pragma once + +#include +#include +#include +#include "itemsettingsdialog.h" +#include "../items/item.h" +#include "itemwidget.h" + +namespace Ui +{ +class TrainWidget; +} + +class TrainWidget : public ItemWidget +{ + Q_OBJECT +protected: + std::vector< std::unique_ptr > shortcuts_; + + void disable(); + +private slots: + void setValue(int8_t value); + void moveToValue(int8_t value); + void deleteItem(); + + void stepUp(); + void stepDown(); + + void f1(int state); + void f2(int state); + void f3(int state); + void f4(int state); + void reverse(); + +public: + explicit TrainWidget(std::weak_ptr item, QWidget *parent); + ~TrainWidget(); + void setShortcuts(QKeySequence up, QKeySequence down, QKeySequence rev); + +public slots: + + virtual void stateChanged(int state); + +private: + Ui::TrainWidget *ui; +}; + diff --git a/src/ui/itemwidget.ui b/src/ui/trainwidget.ui similarity index 98% rename from src/ui/itemwidget.ui rename to src/ui/trainwidget.ui index 8fb7574..eec9954 100644 --- a/src/ui/itemwidget.ui +++ b/src/ui/trainwidget.ui @@ -1,7 +1,7 @@ - ItemWidget - + TrainWidget + 0 diff --git a/trainControllerUI.pro b/trainControllerUI.pro index 992cae3..39a966e 100644 --- a/trainControllerUI.pro +++ b/trainControllerUI.pro @@ -25,13 +25,16 @@ QMAKE_CXXFLAGS += -std=c++17 -O2 SOURCES += \ src/items/train.cpp \ - src/items/turnout.cpp \ - src/mainobject.cpp \ - src/trainjs.cpp \ + src/items/turnout.cpp \ + src/mainobject.cpp \ + src/trainjs.cpp \ src/QJoysticks.cpp \ src/jsbackend/SDL_Joysticks.cpp \ src/jsbackend/VirtualJoystick.cpp \ src/ui/itemwidget.cpp \ + src/ui/trainwidget.cpp \ + src/items/signal.cpp \ + src/ui/signalwidget.cpp \ src/ui/itemscrollbox.cpp \ src/ui/mainwindow.cpp \ src/items/item.cpp \ @@ -41,16 +44,19 @@ SOURCES += \ HEADERS += \ src/items/train.h \ - src/items/turnout.h \ - src/mainobject.h \ - src/trainjs.h \ + src/items/turnout.h \ + src/mainobject.h \ + src/trainjs.h \ src/QJoysticks.h \ src/jsbackend/SDL_Joysticks.h \ src/jsbackend/VirtualJoystick.h \ src/jsbackend/JoysticksCommon.h \ src/ui/itemwidget.h \ + src/ui/trainwidget.h \ + src/items/signal.h \ + src/ui/signalwidget.h \ src/ui/itemscrollbox.h \ - src/ui/mainwindow.h \ + src/ui/mainwindow.h \ src/items/item.h \ src/items/itemstore.h @@ -61,5 +67,6 @@ INCLUDEPATH += src/ui/ FORMS += \ src/ui/mainwindow.ui \ - src/ui/relayscrollbox.ui \ - src/ui/itemwidget.ui + src/ui/relayscrollbox.ui \ + src/ui/trainwidget.ui \ + src/ui/signalwidget.ui From c19810162a36c00b9d6398ca92f011480bfe0af2 Mon Sep 17 00:00:00 2001 From: uvos Date: Sat, 12 Feb 2022 00:42:16 +0100 Subject: [PATCH 03/10] add missing file --- src/items/signal.cpp | 28 ++++++++++++++++++++++++++++ src/items/signal.h | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 src/items/signal.cpp create mode 100644 src/items/signal.h diff --git a/src/items/signal.cpp b/src/items/signal.cpp new file mode 100644 index 0000000..f5b4c08 --- /dev/null +++ b/src/items/signal.cpp @@ -0,0 +1,28 @@ +#include "signal.h" + +Microcontroller *Signal::micro = nullptr; + +Signal::Signal(uint8_t id, uint8_t address, uint8_t subaddress, uint8_t type, int8_t initalValue) + : Item(address | (subaddress << 8), QString("Turnout ")+QString::number(id), initalValue), + subaddress_(subaddress), signalId_(id), type_(type) +{ + itemId_ = address | (subaddress << 8); + name_ = QString("Signal ")+QString::number(id); +} + +void Signal::setValue(int8_t value) +{ + Item::setValue(value); + if(micro) + micro->signalSetValue(signalId_, value); +} + +bool Signal::hasSlow() +{ + return type_ & TYPE_HAS_SLOW; +} + +bool Signal::hasExpect() +{ + return type_ & TYPE_HAS_EXPECT; +} diff --git a/src/items/signal.h b/src/items/signal.h new file mode 100644 index 0000000..876437f --- /dev/null +++ b/src/items/signal.h @@ -0,0 +1,38 @@ +#ifndef SIGNAL_H +#define SIGNAL_H + +#include "item.h" +#include "../microcontroller.h" + +class Signal : public Item +{ +public: + static constexpr int GO = 0; + static constexpr int STOP = 1; + static constexpr int SLOW = 2; + static constexpr int EXPECT_GO = 1 << 3; + static constexpr int EXPECT_STOP = 2 << 3; + static constexpr int EXPECT_SLOW = 3 << 3; + + static constexpr uint8_t TYPE_NORMAL = 0; + static constexpr uint8_t TYPE_RELAY = 1; + static constexpr uint8_t TYPE_HAS_SLOW = 1 << 1; + static constexpr uint8_t TYPE_HAS_EXPECT = 1 << 2; +private: + uint8_t subaddress_; + uint8_t signalId_; + uint8_t type_; +public: + static Microcontroller *micro; + + explicit Signal(uint8_t id = 0, uint8_t address = 0, uint8_t subaddress = 0, uint8_t type = 0, int8_t initalValue = 0); + virtual void setValue(int8_t value); + bool hasSlow(); + bool hasExpect(); + uint8_t getSignalId() + { + return signalId_; + } +}; + +#endif // SIGNAL_H From 4a7082319fdf966c4b03b9dff03b6e7f6d37f201 Mon Sep 17 00:00:00 2001 From: uvos Date: Mon, 21 Feb 2022 19:24:31 +0100 Subject: [PATCH 04/10] Only give train items to js --- src/items/itemstore.cpp | 13 +++++++++---- src/ui/mainwindow.cpp | 2 ++ src/ui/signalwidget.cpp | 3 +++ 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/items/itemstore.cpp b/src/items/itemstore.cpp index 2a335f8..8584eae 100644 --- a/src/items/itemstore.cpp +++ b/src/items/itemstore.cpp @@ -56,10 +56,15 @@ void ItemStore::jsReqNewItem() { if(!oldItem || *items_[i] == *oldItem) { - if(i+1 < items_.size()) - joystick->setItem(items_[i+1]); - else - joystick->setItem(items_[0]); + for(size_t j = 1; j < items_.size(); ++j) + { + std::shared_ptr item = items_[(i+j) % items_.size()]; + if(dynamic_cast(item.get())) + { + joystick->setItem(item); + break; + } + } break; } } diff --git a/src/ui/mainwindow.cpp b/src/ui/mainwindow.cpp index 7f7d361..71fb464 100644 --- a/src/ui/mainwindow.cpp +++ b/src/ui/mainwindow.cpp @@ -25,6 +25,8 @@ MainWindow::MainWindow(Microcontroller * const micro, ItemStore* items, QWidget } connect(ui->relayList, &ItemScrollBox::deleteRequest, items, &ItemStore::removeItem); + + ui->pushButton_addItem->hide(); } MainWindow::~MainWindow() diff --git a/src/ui/signalwidget.cpp b/src/ui/signalwidget.cpp index 443d7f0..17550ec 100644 --- a/src/ui/signalwidget.cpp +++ b/src/ui/signalwidget.cpp @@ -34,6 +34,9 @@ SignalWidget::SignalWidget(std::weak_ptr item, QWidget *parent) : }); connect(signal.get(), &Item::valueChanged, this, &SignalWidget::moveToValue); + + if(!signal->hasSlow()) + ui->radioButton_slow->hide(); } } else From ed74a4fc83cc6c03a4e26dc4e9821c710f693e7c Mon Sep 17 00:00:00 2001 From: uvos Date: Tue, 22 Feb 2022 14:51:54 +0100 Subject: [PATCH 05/10] lower js poll rate --- src/jsbackend/SDL_Joysticks.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/jsbackend/SDL_Joysticks.cpp b/src/jsbackend/SDL_Joysticks.cpp index 4b2bdd0..b78c4ef 100644 --- a/src/jsbackend/SDL_Joysticks.cpp +++ b/src/jsbackend/SDL_Joysticks.cpp @@ -44,7 +44,7 @@ SDL_Joysticks::SDL_Joysticks(QObject *parent) for (int i = 0; i < count; ++i) configureJoystick(i); - QTimer::singleShot(100, Qt::PreciseTimer, this, SLOT(update())); + QTimer::singleShot(10, Qt::PreciseTimer, this, SLOT(update())); } SDL_Joysticks::~SDL_Joysticks() From ddd0b3a7326d9efd8511b5785c72739997108d1a Mon Sep 17 00:00:00 2001 From: uvos Date: Fri, 11 Mar 2022 21:42:28 +0100 Subject: [PATCH 06/10] small cleanup --- src/items/auxitem.cpp | 19 ------------------- src/items/auxitem.h | 21 --------------------- src/microcontroller.h | 9 +-------- 3 files changed, 1 insertion(+), 48 deletions(-) delete mode 100644 src/items/auxitem.cpp delete mode 100644 src/items/auxitem.h diff --git a/src/items/auxitem.cpp b/src/items/auxitem.cpp deleted file mode 100644 index 860a121..0000000 --- a/src/items/auxitem.cpp +++ /dev/null @@ -1,19 +0,0 @@ -#include "auxitem.h" - -AuxItem::AuxItem(Microcontroller* micro, uint32_t itemIdIn, QString name, uint8_t value, - QObject* parent): Item(itemIdIn, name, value, parent), micro_(micro) -{ - -} - -void AuxItem::setValue(uint8_t value) -{ - Item::setValue(value); - micro_->setAuxPwm(value); -} - -void AuxItem::store(QJsonObject &json) -{ - json["Type"] = "Aux"; - Item::store(json); -} diff --git a/src/items/auxitem.h b/src/items/auxitem.h deleted file mode 100644 index 512144f..0000000 --- a/src/items/auxitem.h +++ /dev/null @@ -1,21 +0,0 @@ -#pragma once - -#include "item.h" -#include "../microcontroller.h" - -class AuxItem: public Item -{ - Q_OBJECT -private: - Microcontroller* micro_; - -public slots: - - virtual void setValue(uint8_t value); - -public: - AuxItem(Microcontroller* micro, uint32_t itemIdIn = QRandomGenerator::global()->generate(), QString name = "", - uint8_t value = 0, QObject* parent = nullptr); - - virtual void store(QJsonObject& json); -}; diff --git a/src/microcontroller.h b/src/microcontroller.h index 22e0c21..c49afd6 100644 --- a/src/microcontroller.h +++ b/src/microcontroller.h @@ -19,15 +19,8 @@ class Microcontroller : public QObject { - Q_OBJECT -public: - - static constexpr char AMP_RELAY = 0; - static constexpr char SENSOR_TEMPERATURE = 1; - static constexpr char SENSOR_DOOR = 0 ; - private: static constexpr int TRAIN_LIST = 1; @@ -80,7 +73,7 @@ signals: void textRecived(const QString string); void itemChanged(ItemData relay); void auxStateChanged(int value); - void gotItemList(std::vector< std::shared_ptr >&); + void gotItemList(std::vector>&); }; #endif // MICROCONTROLLER_H From a1f9fa172b8a3992aaaefc2e9c9b9c9974e01aa8 Mon Sep 17 00:00:00 2001 From: uvos Date: Sun, 13 Mar 2022 22:21:13 +0100 Subject: [PATCH 07/10] move build system to cmake, add train overlord --- src/CMakeLists.txt | 34 +++ src/auxitem.cpp | 19 -- src/auxitem.h | 21 -- src/{ => common}/items/item.cpp | 0 src/{ => common}/items/item.h | 0 src/{ => common}/items/itemstore.cpp | 77 ++--- src/{ => common}/items/itemstore.h | 9 +- src/{ => common}/items/signal.cpp | 0 src/{ => common}/items/signal.h | 0 src/{ => common}/items/train.cpp | 0 src/{ => common}/items/train.h | 11 + src/{ => common}/items/turnout.cpp | 0 src/{ => common}/items/turnout.h | 0 src/{ => common}/microcontroller.cpp | 20 ++ src/{ => common}/microcontroller.h | 5 +- src/common/nfcuid.h | 47 +++ src/trainControllerUI/CMakeLists.txt | 28 ++ src/{ => trainControllerUI}/QJoysticks.cpp | 0 src/{ => trainControllerUI}/QJoysticks.h | 0 .../jsbackend/JoysticksCommon.h | 0 .../jsbackend/JoysticksCommon.h.orig | 0 .../jsbackend/SDL_Joysticks.cpp | 0 .../jsbackend/SDL_Joysticks.cpp.orig | 0 .../jsbackend/SDL_Joysticks.h | 0 .../jsbackend/SDL_Joysticks.h.orig | 0 .../jsbackend/VirtualJoystick.cpp | 0 .../jsbackend/VirtualJoystick.cpp.orig | 0 .../jsbackend/VirtualJoystick.h | 0 .../jsbackend/VirtualJoystick.h.orig | 0 src/{ => trainControllerUI}/mainobject.cpp | 0 src/{ => trainControllerUI}/mainobject.h | 4 - .../traincontrollerui.cpp} | 2 +- src/{ => trainControllerUI}/trainjs.cpp | 0 src/{ => trainControllerUI}/trainjs.h | 0 .../ui/itemscrollbox.cpp | 44 +++ .../ui/itemscrollbox.h | 3 +- src/{ => trainControllerUI}/ui/itemwidget.cpp | 0 src/{ => trainControllerUI}/ui/itemwidget.h | 1 - src/{ => trainControllerUI}/ui/mainwindow.cpp | 2 - src/{ => trainControllerUI}/ui/mainwindow.h | 0 src/{ => trainControllerUI}/ui/mainwindow.ui | 0 .../ui/relayscrollbox.ui | 0 .../ui/signalwidget.cpp | 0 src/{ => trainControllerUI}/ui/signalwidget.h | 0 .../ui/signalwidget.ui | 0 .../ui/trainwidget.cpp | 0 src/{ => trainControllerUI}/ui/trainwidget.h | 1 - src/{ => trainControllerUI}/ui/trainwidget.ui | 0 src/trainOverlord/CMakeLists.txt | 8 + src/trainOverlord/overlorditemstore.cpp | 26 ++ src/trainOverlord/overlorditemstore.h | 16 + src/trainOverlord/trainoverlord.cpp | 75 +++++ src/ui/alarmsettingsdialog.ui.orig | 142 --------- src/ui/itemcreationdialog.cpp | 30 -- src/ui/itemcreationdialog.h | 34 --- src/ui/itemcreationdialog.ui | 116 -------- src/ui/itemsettingsdialog.cpp | 176 ----------- src/ui/itemsettingsdialog.h | 38 --- src/ui/itemsettingsdialog.ui | 274 ------------------ trainControllerUI.pro | 72 ----- 60 files changed, 338 insertions(+), 997 deletions(-) create mode 100644 src/CMakeLists.txt delete mode 100644 src/auxitem.cpp delete mode 100644 src/auxitem.h rename src/{ => common}/items/item.cpp (100%) rename src/{ => common}/items/item.h (100%) rename src/{ => common}/items/itemstore.cpp (51%) rename src/{ => common}/items/itemstore.h (89%) rename src/{ => common}/items/signal.cpp (100%) rename src/{ => common}/items/signal.h (100%) rename src/{ => common}/items/train.cpp (100%) rename src/{ => common}/items/train.h (70%) rename src/{ => common}/items/turnout.cpp (100%) rename src/{ => common}/items/turnout.h (100%) rename src/{ => common}/microcontroller.cpp (92%) rename src/{ => common}/microcontroller.h (95%) create mode 100644 src/common/nfcuid.h create mode 100644 src/trainControllerUI/CMakeLists.txt rename src/{ => trainControllerUI}/QJoysticks.cpp (100%) rename src/{ => trainControllerUI}/QJoysticks.h (100%) rename src/{ => trainControllerUI}/jsbackend/JoysticksCommon.h (100%) rename src/{ => trainControllerUI}/jsbackend/JoysticksCommon.h.orig (100%) rename src/{ => trainControllerUI}/jsbackend/SDL_Joysticks.cpp (100%) rename src/{ => trainControllerUI}/jsbackend/SDL_Joysticks.cpp.orig (100%) rename src/{ => trainControllerUI}/jsbackend/SDL_Joysticks.h (100%) rename src/{ => trainControllerUI}/jsbackend/SDL_Joysticks.h.orig (100%) rename src/{ => trainControllerUI}/jsbackend/VirtualJoystick.cpp (100%) rename src/{ => trainControllerUI}/jsbackend/VirtualJoystick.cpp.orig (100%) rename src/{ => trainControllerUI}/jsbackend/VirtualJoystick.h (100%) rename src/{ => trainControllerUI}/jsbackend/VirtualJoystick.h.orig (100%) rename src/{ => trainControllerUI}/mainobject.cpp (100%) rename src/{ => trainControllerUI}/mainobject.h (87%) rename src/{main.cpp => trainControllerUI/traincontrollerui.cpp} (98%) rename src/{ => trainControllerUI}/trainjs.cpp (100%) rename src/{ => trainControllerUI}/trainjs.h (100%) rename src/{ => trainControllerUI}/ui/itemscrollbox.cpp (76%) rename src/{ => trainControllerUI}/ui/itemscrollbox.h (93%) rename src/{ => trainControllerUI}/ui/itemwidget.cpp (100%) rename src/{ => trainControllerUI}/ui/itemwidget.h (93%) rename src/{ => trainControllerUI}/ui/mainwindow.cpp (94%) rename src/{ => trainControllerUI}/ui/mainwindow.h (100%) rename src/{ => trainControllerUI}/ui/mainwindow.ui (100%) rename src/{ => trainControllerUI}/ui/relayscrollbox.ui (100%) rename src/{ => trainControllerUI}/ui/signalwidget.cpp (100%) rename src/{ => trainControllerUI}/ui/signalwidget.h (100%) rename src/{ => trainControllerUI}/ui/signalwidget.ui (100%) rename src/{ => trainControllerUI}/ui/trainwidget.cpp (100%) rename src/{ => trainControllerUI}/ui/trainwidget.h (96%) rename src/{ => trainControllerUI}/ui/trainwidget.ui (100%) create mode 100644 src/trainOverlord/CMakeLists.txt create mode 100644 src/trainOverlord/overlorditemstore.cpp create mode 100644 src/trainOverlord/overlorditemstore.h create mode 100644 src/trainOverlord/trainoverlord.cpp delete mode 100644 src/ui/alarmsettingsdialog.ui.orig delete mode 100644 src/ui/itemcreationdialog.cpp delete mode 100644 src/ui/itemcreationdialog.h delete mode 100644 src/ui/itemcreationdialog.ui delete mode 100644 src/ui/itemsettingsdialog.cpp delete mode 100644 src/ui/itemsettingsdialog.h delete mode 100644 src/ui/itemsettingsdialog.ui delete mode 100644 trainControllerUI.pro diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..842991e --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,34 @@ +set(CMAKE_INCLUDE_CURRENT_DIR ON) + +set(CMAKE_AUTOUIC ON) +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTORCC ON) + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +find_package(QT NAMES Qt6 Qt5 COMPONENTS Widgets Network SerialPort REQUIRED) +find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Widgets Network SerialPort REQUIRED) + +set(COMMON_SOURCES + ../common/microcontroller.cpp + ../common/items/item.cpp + ../common/items/itemstore.cpp + ../common/items/signal.cpp + ../common/items/train.cpp + ../common/items/turnout.cpp +) + +include_directories(PRIVATE + ./common/items/ + ./common + +) + +set(COMMON_LINK_LIBRARYS + Qt${QT_VERSION_MAJOR}::Network + Qt${QT_VERSION_MAJOR}::SerialPort +) + +add_subdirectory(trainControllerUI) +add_subdirectory(trainOverlord) diff --git a/src/auxitem.cpp b/src/auxitem.cpp deleted file mode 100644 index 860a121..0000000 --- a/src/auxitem.cpp +++ /dev/null @@ -1,19 +0,0 @@ -#include "auxitem.h" - -AuxItem::AuxItem(Microcontroller* micro, uint32_t itemIdIn, QString name, uint8_t value, - QObject* parent): Item(itemIdIn, name, value, parent), micro_(micro) -{ - -} - -void AuxItem::setValue(uint8_t value) -{ - Item::setValue(value); - micro_->setAuxPwm(value); -} - -void AuxItem::store(QJsonObject &json) -{ - json["Type"] = "Aux"; - Item::store(json); -} diff --git a/src/auxitem.h b/src/auxitem.h deleted file mode 100644 index 512144f..0000000 --- a/src/auxitem.h +++ /dev/null @@ -1,21 +0,0 @@ -#pragma once - -#include "item.h" -#include "../microcontroller.h" - -class AuxItem: public Item -{ - Q_OBJECT -private: - Microcontroller* micro_; - -public slots: - - virtual void setValue(uint8_t value); - -public: - AuxItem(Microcontroller* micro, uint32_t itemIdIn = QRandomGenerator::global()->generate(), QString name = "", - uint8_t value = 0, QObject* parent = nullptr); - - virtual void store(QJsonObject& json); -}; diff --git a/src/items/item.cpp b/src/common/items/item.cpp similarity index 100% rename from src/items/item.cpp rename to src/common/items/item.cpp diff --git a/src/items/item.h b/src/common/items/item.h similarity index 100% rename from src/items/item.h rename to src/common/items/item.h diff --git a/src/items/itemstore.cpp b/src/common/items/itemstore.cpp similarity index 51% rename from src/items/itemstore.cpp rename to src/common/items/itemstore.cpp index 8584eae..523d2ce 100644 --- a/src/items/itemstore.cpp +++ b/src/common/items/itemstore.cpp @@ -2,7 +2,6 @@ #include #include #include "train.h" -#include "../trainjs.h" ItemStore::ItemStore(QObject *parent): QObject(parent) { @@ -21,62 +20,35 @@ void ItemStore::addItem(std::shared_ptr item) if(!mached) { items_.push_back(std::shared_ptr(item)); - - if(dynamic_cast(item.get())) - { - std::vector> joysticks = TrainJs::getJsDevices(); - for(auto joystick: joysticks) - { - if(!joystick->itemIsSet()) - { - joystick->setItem(item); - connect(joystick.get(), &TrainJs::reqNewItem, this, &ItemStore::jsReqNewItem); - break; - } - } - } - itemAdded(std::weak_ptr(items_.back())); } qDebug()<<"Got item: "<id()<<" matched: "<> joysticks = TrainJs::getJsDevices(); - for(auto joystick: joysticks) - { - if(joystick->getWantsNewItem()) - { - std::shared_ptr oldItem = joystick->getItem().lock(); - for(size_t i = 0; i < items_.size(); ++i) - { - if(!oldItem || *items_[i] == *oldItem) - { - for(size_t j = 1; j < items_.size(); ++j) - { - std::shared_ptr item = items_[(i+j) % items_.size()]; - if(dynamic_cast(item.get())) - { - joystick->setItem(item); - break; - } - } - break; - } - } - } - } -} - void ItemStore::addItems(const std::vector>& itemIn) { for(unsigned j = 0; j < itemIn.size(); j++) + { addItem(itemIn[j]); - + Train* train = dynamic_cast(itemIn[j].get()); + if(!train) + continue; + if(train->getTrainId() == 0) + { + const uint8_t uidBytes[] = {12, 154, 110, 34}; + train->tags.push_back(NfcUid(uidBytes, sizeof(uidBytes))); + } + else if(train->getTrainId() == 3) + { + const uint8_t uidBytes[] = {136, 83, 111, 26}; + train->tags.push_back(NfcUid(uidBytes, sizeof(uidBytes))); + } + else if(train->getTrainId() == 4) + { + const uint8_t uidBytes[] = {76, 55, 220, 31}; + train->tags.push_back(NfcUid(uidBytes, sizeof(uidBytes))); + } + } } void ItemStore::removeItem(const ItemData& item) @@ -91,26 +63,21 @@ void ItemStore::removeItem(const ItemData& item) } } - void ItemStore::clear() { for(size_t i = 0; i < items_.size(); ++i) itemDeleted(*items_[i]); items_.clear(); } - void ItemStore::itemStateChanged(const ItemData& item) { - for(unsigned i = 0; i < items_.size(); i++ ) { if(items_[i]->operator==(item)) { - - if(items_[i]->getValue() != item.getValue())items_[i]->informValue(item.getValue()); + if(items_[i]->getValue() != item.getValue()) + items_[i]->informValue(item.getValue()); } - } - } diff --git a/src/items/itemstore.h b/src/common/items/itemstore.h similarity index 89% rename from src/items/itemstore.h rename to src/common/items/itemstore.h index 8e94404..7a542b9 100644 --- a/src/items/itemstore.h +++ b/src/common/items/itemstore.h @@ -2,13 +2,12 @@ #include #include #include "item.h" - -#include +#include "../nfcuid.h" class ItemStore: public QObject { Q_OBJECT -private: +protected: std::vector< std::shared_ptr > items_; public: @@ -23,10 +22,6 @@ public: void clear(); -private slots: - - void jsReqNewItem(); - signals: void itemDeleted(ItemData item); diff --git a/src/items/signal.cpp b/src/common/items/signal.cpp similarity index 100% rename from src/items/signal.cpp rename to src/common/items/signal.cpp diff --git a/src/items/signal.h b/src/common/items/signal.h similarity index 100% rename from src/items/signal.h rename to src/common/items/signal.h diff --git a/src/items/train.cpp b/src/common/items/train.cpp similarity index 100% rename from src/items/train.cpp rename to src/common/items/train.cpp diff --git a/src/items/train.h b/src/common/items/train.h similarity index 70% rename from src/items/train.h rename to src/common/items/train.h index dec8b31..e1d23ba 100644 --- a/src/items/train.h +++ b/src/common/items/train.h @@ -1,16 +1,20 @@ #ifndef TRAIN_H #define TRAIN_H +#include #include "item.h" #include "../microcontroller.h" +#include "../nfcuid.h" class Train : public Item { Q_OBJECT uint8_t functionMask_; uint8_t train_id_; + int lastReader_ = -1; public: static Microcontroller *micro; + std::vector tags; Train(uint8_t id = 0, uint8_t address = 0, uint8_t functionMask = 0, int8_t initalValue = 0); @@ -23,6 +27,13 @@ public slots: void reverse(); virtual void setFunction(uint8_t function, bool on); virtual void setValue(int8_t value); + bool passedReader(const NfcUid &uid) + { + if(lastReader_ == uid.reader) + return false; + lastReader_ = uid.reader; + return true; + } uint8_t getTrainId() { return train_id_; diff --git a/src/items/turnout.cpp b/src/common/items/turnout.cpp similarity index 100% rename from src/items/turnout.cpp rename to src/common/items/turnout.cpp diff --git a/src/items/turnout.h b/src/common/items/turnout.h similarity index 100% rename from src/items/turnout.h rename to src/common/items/turnout.h diff --git a/src/microcontroller.cpp b/src/common/microcontroller.cpp similarity index 92% rename from src/microcontroller.cpp rename to src/common/microcontroller.cpp index 406c482..ae8b1ab 100644 --- a/src/microcontroller.cpp +++ b/src/common/microcontroller.cpp @@ -142,6 +142,22 @@ std::shared_ptr Microcontroller::processSignalLine(const QString& buffer) return nullptr; } +void Microcontroller::processNfcLine(const QString& buffer) +{ + QStringList tokens = buffer.split(" "); + if(tokens.size() < 4) + return; + + NfcUid uid; + uid.reader = tokens[1].toUInt(); + tokens = tokens[3].split(':'); + uid.length = tokens.length(); + for(size_t i = 0; i < uid.length; ++i) + uid.bytes[i] = tokens[i].toInt(); + qDebug()<<"Got Tag"; + gotTag(uid); +} + void Microcontroller::processList(const QString& buffer) { QStringList bufferList = buffer.split(' '); @@ -210,6 +226,10 @@ void Microcontroller::processMicroReturn() { processItemState(_buffer); } + else if(_buffer.startsWith("NFC")) + { + processNfcLine(_buffer); + } else if(_buffer.startsWith("TrainController")) { requestState(); diff --git a/src/microcontroller.h b/src/common/microcontroller.h similarity index 95% rename from src/microcontroller.h rename to src/common/microcontroller.h index c49afd6..37f760a 100644 --- a/src/microcontroller.h +++ b/src/common/microcontroller.h @@ -4,18 +4,17 @@ #include #include -#include #include #include #include #include #include #include -#include #include #include #include #include "items/item.h" +#include "nfcuid.h" class Microcontroller : public QObject { @@ -44,6 +43,7 @@ private: std::shared_ptr processTrainLine(const QString& buffer); std::shared_ptr processTurnoutLine(const QString& buffer); std::shared_ptr processSignalLine(const QString& buffer); + void processNfcLine(const QString& buffer); void write(char *buffer, const size_t length); void write(const QByteArray& buffer); @@ -74,6 +74,7 @@ signals: void itemChanged(ItemData relay); void auxStateChanged(int value); void gotItemList(std::vector>&); + void gotTag(NfcUid uid); }; #endif // MICROCONTROLLER_H diff --git a/src/common/nfcuid.h b/src/common/nfcuid.h new file mode 100644 index 0000000..8792290 --- /dev/null +++ b/src/common/nfcuid.h @@ -0,0 +1,47 @@ +#ifndef NFCUID_H +#define NFCUID_H +#include +#include + +class NfcUid +{ +public: + uint8_t reader; + uint8_t bytes[10]; + uint8_t length; + bool operator==(NfcUid& in) const + { + if(length != in.length) + return false; + for(uint8_t i = 0; i < length; ++i) + { + if(bytes[i] != in.bytes[i]) + return false; + } + return true; + } + bool operator!=(NfcUid& in) const + { + return !operator==(in); + } + NfcUid(){} + NfcUid(const uint8_t* const bytesIn, uint8_t lengthIn, uint8_t readerIn = 0): + reader(readerIn), length(lengthIn) + { + for(uint8_t i = 0; i < length; ++i) + bytes[i] = bytesIn[i]; + } + std::string toString() + { + std::string str; + for(uint8_t i = 0; i < length; ++i) + { + str.append(std::to_string((int)bytes[i])); + if(i != length-1) + str.push_back(':'); + } + return str; + } +}; + +#endif // NFCUID_H diff --git a/src/trainControllerUI/CMakeLists.txt b/src/trainControllerUI/CMakeLists.txt new file mode 100644 index 0000000..b201225 --- /dev/null +++ b/src/trainControllerUI/CMakeLists.txt @@ -0,0 +1,28 @@ +set(UI_SOURCES + traincontrollerui.cpp + mainobject.cpp + QJoysticks.cpp + trainjs.cpp + ui/itemscrollbox.cpp + ui/itemscrollbox.h + ui/itemwidget.cpp + ui/itemwidget.h + ui/mainwindow.cpp + ui/mainwindow.h + ui/mainwindow.ui + ui/relayscrollbox.ui + ui/signalwidget.cpp + ui/signalwidget.h + ui/signalwidget.ui + ui/trainwidget.cpp + ui/trainwidget.h + ui/trainwidget.ui + jsbackend/SDL_Joysticks.cpp + jsbackend/VirtualJoystick.cpp +) + +find_package(SDL2 REQUIRED) + +add_executable(traincontrollerui ${UI_SOURCES} ${COMMON_SOURCES}) +target_link_libraries(traincontrollerui PRIVATE ${COMMON_LINK_LIBRARYS} Qt${QT_VERSION_MAJOR}::Widgets ${SDL2_LIBRARIES}) +target_include_directories(traincontrollerui PRIVATE ./ ./ui ./jsbackend ${SDL2_INCLUDE_DIRS}) diff --git a/src/QJoysticks.cpp b/src/trainControllerUI/QJoysticks.cpp similarity index 100% rename from src/QJoysticks.cpp rename to src/trainControllerUI/QJoysticks.cpp diff --git a/src/QJoysticks.h b/src/trainControllerUI/QJoysticks.h similarity index 100% rename from src/QJoysticks.h rename to src/trainControllerUI/QJoysticks.h diff --git a/src/jsbackend/JoysticksCommon.h b/src/trainControllerUI/jsbackend/JoysticksCommon.h similarity index 100% rename from src/jsbackend/JoysticksCommon.h rename to src/trainControllerUI/jsbackend/JoysticksCommon.h diff --git a/src/jsbackend/JoysticksCommon.h.orig b/src/trainControllerUI/jsbackend/JoysticksCommon.h.orig similarity index 100% rename from src/jsbackend/JoysticksCommon.h.orig rename to src/trainControllerUI/jsbackend/JoysticksCommon.h.orig diff --git a/src/jsbackend/SDL_Joysticks.cpp b/src/trainControllerUI/jsbackend/SDL_Joysticks.cpp similarity index 100% rename from src/jsbackend/SDL_Joysticks.cpp rename to src/trainControllerUI/jsbackend/SDL_Joysticks.cpp diff --git a/src/jsbackend/SDL_Joysticks.cpp.orig b/src/trainControllerUI/jsbackend/SDL_Joysticks.cpp.orig similarity index 100% rename from src/jsbackend/SDL_Joysticks.cpp.orig rename to src/trainControllerUI/jsbackend/SDL_Joysticks.cpp.orig diff --git a/src/jsbackend/SDL_Joysticks.h b/src/trainControllerUI/jsbackend/SDL_Joysticks.h similarity index 100% rename from src/jsbackend/SDL_Joysticks.h rename to src/trainControllerUI/jsbackend/SDL_Joysticks.h diff --git a/src/jsbackend/SDL_Joysticks.h.orig b/src/trainControllerUI/jsbackend/SDL_Joysticks.h.orig similarity index 100% rename from src/jsbackend/SDL_Joysticks.h.orig rename to src/trainControllerUI/jsbackend/SDL_Joysticks.h.orig diff --git a/src/jsbackend/VirtualJoystick.cpp b/src/trainControllerUI/jsbackend/VirtualJoystick.cpp similarity index 100% rename from src/jsbackend/VirtualJoystick.cpp rename to src/trainControllerUI/jsbackend/VirtualJoystick.cpp diff --git a/src/jsbackend/VirtualJoystick.cpp.orig b/src/trainControllerUI/jsbackend/VirtualJoystick.cpp.orig similarity index 100% rename from src/jsbackend/VirtualJoystick.cpp.orig rename to src/trainControllerUI/jsbackend/VirtualJoystick.cpp.orig diff --git a/src/jsbackend/VirtualJoystick.h b/src/trainControllerUI/jsbackend/VirtualJoystick.h similarity index 100% rename from src/jsbackend/VirtualJoystick.h rename to src/trainControllerUI/jsbackend/VirtualJoystick.h diff --git a/src/jsbackend/VirtualJoystick.h.orig b/src/trainControllerUI/jsbackend/VirtualJoystick.h.orig similarity index 100% rename from src/jsbackend/VirtualJoystick.h.orig rename to src/trainControllerUI/jsbackend/VirtualJoystick.h.orig diff --git a/src/mainobject.cpp b/src/trainControllerUI/mainobject.cpp similarity index 100% rename from src/mainobject.cpp rename to src/trainControllerUI/mainobject.cpp diff --git a/src/mainobject.h b/src/trainControllerUI/mainobject.h similarity index 87% rename from src/mainobject.h rename to src/trainControllerUI/mainobject.h index 62596d8..9c00769 100644 --- a/src/mainobject.h +++ b/src/trainControllerUI/mainobject.h @@ -7,9 +7,6 @@ #include #include #include -#include -#include -#include #include @@ -22,7 +19,6 @@ #include "microcontroller.h" #include "ui/mainwindow.h" #include "items/itemstore.h" -#include "items/auxitem.h" class MainObject : public QObject { diff --git a/src/main.cpp b/src/trainControllerUI/traincontrollerui.cpp similarity index 98% rename from src/main.cpp rename to src/trainControllerUI/traincontrollerui.cpp index 4b8cb3f..86cb846 100644 --- a/src/main.cpp +++ b/src/trainControllerUI/traincontrollerui.cpp @@ -31,7 +31,7 @@ int main(int argc, char *argv[]) //parse comand line QCommandLineParser parser; - parser.setApplicationDescription("Smart Home Interface"); + parser.setApplicationDescription("Train control gui"); parser.addHelpOption(); parser.addVersionOption(); QCommandLineOption tcpOption(QStringList() << "t" << "tcp", QCoreApplication::translate("main", "Use Tcp connection")); diff --git a/src/trainjs.cpp b/src/trainControllerUI/trainjs.cpp similarity index 100% rename from src/trainjs.cpp rename to src/trainControllerUI/trainjs.cpp diff --git a/src/trainjs.h b/src/trainControllerUI/trainjs.h similarity index 100% rename from src/trainjs.h rename to src/trainControllerUI/trainjs.h diff --git a/src/ui/itemscrollbox.cpp b/src/trainControllerUI/ui/itemscrollbox.cpp similarity index 76% rename from src/ui/itemscrollbox.cpp rename to src/trainControllerUI/ui/itemscrollbox.cpp index d24caa2..2810781 100644 --- a/src/ui/itemscrollbox.cpp +++ b/src/trainControllerUI/ui/itemscrollbox.cpp @@ -43,6 +43,17 @@ void ItemScrollBox::addItem(std::weak_ptr item) widget->setShortcuts(QKeySequence(Qt::Key_R), QKeySequence(Qt::Key_F), QKeySequence(Qt::Key_V)); else if(train->getTrainId() == 4) widget->setShortcuts(QKeySequence(Qt::Key_T), QKeySequence(Qt::Key_G), QKeySequence(Qt::Key_B)); + + std::vector> joysticks = TrainJs::getJsDevices(); + for(auto joystick: joysticks) + { + if(!joystick->itemIsSet()) + { + joystick->setItem(item); + connect(joystick.get(), &TrainJs::reqNewItem, this, &ItemScrollBox::jsReqNewItem); + break; + } + } } else if(turnout) { @@ -80,6 +91,39 @@ void ItemScrollBox::addItem(std::weak_ptr item) } } +void ItemScrollBox::jsReqNewItem() +{ + if(widgets_.empty()) + return; + + std::vector> joysticks = TrainJs::getJsDevices(); + for(auto joystick: joysticks) + { + if(joystick->getWantsNewItem()) + { + std::shared_ptr oldItem = joystick->getItem().lock(); + for(size_t i = 0; i < widgets_.size(); ++i) + { + std::shared_ptr item = widgets_[i]->getItem().lock(); + if(item && (!oldItem || *item == *oldItem)) + { + for(size_t j = 1; j < widgets_.size(); ++j) + { + ItemWidget* widget = widgets_[(i+j) % widgets_.size()]; + std::shared_ptr item = widgets_[i]->getItem().lock(); + if(item && dynamic_cast(item.get())) + { + joystick->setItem(item); + break; + } + } + break; + } + } + } + } +} + void ItemScrollBox::removeItem(const ItemData& item) { for(unsigned i = 0; i < widgets_.size(); i++) diff --git a/src/ui/itemscrollbox.h b/src/trainControllerUI/ui/itemscrollbox.h similarity index 93% rename from src/ui/itemscrollbox.h rename to src/trainControllerUI/ui/itemscrollbox.h index 228a315..444e608 100644 --- a/src/ui/itemscrollbox.h +++ b/src/trainControllerUI/ui/itemscrollbox.h @@ -28,12 +28,11 @@ public: explicit ItemScrollBox(QWidget *parent = nullptr); ~ItemScrollBox(); - void setItemStore(ItemStore* itemStore); - public slots: void addItem(std::weak_ptr item); void removeItem(const ItemData& item); + void jsReqNewItem(); private: Ui::RelayScrollBox *ui; diff --git a/src/ui/itemwidget.cpp b/src/trainControllerUI/ui/itemwidget.cpp similarity index 100% rename from src/ui/itemwidget.cpp rename to src/trainControllerUI/ui/itemwidget.cpp diff --git a/src/ui/itemwidget.h b/src/trainControllerUI/ui/itemwidget.h similarity index 93% rename from src/ui/itemwidget.h rename to src/trainControllerUI/ui/itemwidget.h index 82a64db..f4093d9 100644 --- a/src/ui/itemwidget.h +++ b/src/trainControllerUI/ui/itemwidget.h @@ -3,7 +3,6 @@ #include #include #include -#include "itemsettingsdialog.h" #include "../items/item.h" class ItemWidget : public QWidget diff --git a/src/ui/mainwindow.cpp b/src/trainControllerUI/ui/mainwindow.cpp similarity index 94% rename from src/ui/mainwindow.cpp rename to src/trainControllerUI/ui/mainwindow.cpp index 71fb464..b2d6b13 100644 --- a/src/ui/mainwindow.cpp +++ b/src/trainControllerUI/ui/mainwindow.cpp @@ -1,8 +1,6 @@ #include "mainwindow.h" #include "ui_mainwindow.h" #include "itemscrollbox.h" -#include "itemsettingsdialog.h" -#include "itemcreationdialog.h" MainWindow::MainWindow(Microcontroller * const micro, ItemStore* items, QWidget *parent) : QMainWindow(parent), diff --git a/src/ui/mainwindow.h b/src/trainControllerUI/ui/mainwindow.h similarity index 100% rename from src/ui/mainwindow.h rename to src/trainControllerUI/ui/mainwindow.h diff --git a/src/ui/mainwindow.ui b/src/trainControllerUI/ui/mainwindow.ui similarity index 100% rename from src/ui/mainwindow.ui rename to src/trainControllerUI/ui/mainwindow.ui diff --git a/src/ui/relayscrollbox.ui b/src/trainControllerUI/ui/relayscrollbox.ui similarity index 100% rename from src/ui/relayscrollbox.ui rename to src/trainControllerUI/ui/relayscrollbox.ui diff --git a/src/ui/signalwidget.cpp b/src/trainControllerUI/ui/signalwidget.cpp similarity index 100% rename from src/ui/signalwidget.cpp rename to src/trainControllerUI/ui/signalwidget.cpp diff --git a/src/ui/signalwidget.h b/src/trainControllerUI/ui/signalwidget.h similarity index 100% rename from src/ui/signalwidget.h rename to src/trainControllerUI/ui/signalwidget.h diff --git a/src/ui/signalwidget.ui b/src/trainControllerUI/ui/signalwidget.ui similarity index 100% rename from src/ui/signalwidget.ui rename to src/trainControllerUI/ui/signalwidget.ui diff --git a/src/ui/trainwidget.cpp b/src/trainControllerUI/ui/trainwidget.cpp similarity index 100% rename from src/ui/trainwidget.cpp rename to src/trainControllerUI/ui/trainwidget.cpp diff --git a/src/ui/trainwidget.h b/src/trainControllerUI/ui/trainwidget.h similarity index 96% rename from src/ui/trainwidget.h rename to src/trainControllerUI/ui/trainwidget.h index 1e250db..d2edca4 100644 --- a/src/ui/trainwidget.h +++ b/src/trainControllerUI/ui/trainwidget.h @@ -3,7 +3,6 @@ #include #include #include -#include "itemsettingsdialog.h" #include "../items/item.h" #include "itemwidget.h" diff --git a/src/ui/trainwidget.ui b/src/trainControllerUI/ui/trainwidget.ui similarity index 100% rename from src/ui/trainwidget.ui rename to src/trainControllerUI/ui/trainwidget.ui diff --git a/src/trainOverlord/CMakeLists.txt b/src/trainOverlord/CMakeLists.txt new file mode 100644 index 0000000..c6ec6c9 --- /dev/null +++ b/src/trainOverlord/CMakeLists.txt @@ -0,0 +1,8 @@ +set(UI_SOURCES + trainoverlord.cpp + overlorditemstore.cpp +) + +add_executable(trainoverlord ${UI_SOURCES} ${COMMON_SOURCES}) +target_link_libraries(trainoverlord PRIVATE ${COMMON_LINK_LIBRARYS}) +target_include_directories(trainoverlord PRIVATE ./) diff --git a/src/trainOverlord/overlorditemstore.cpp b/src/trainOverlord/overlorditemstore.cpp new file mode 100644 index 0000000..f367f5b --- /dev/null +++ b/src/trainOverlord/overlorditemstore.cpp @@ -0,0 +1,26 @@ +#include "overlorditemstore.h" +#include +#include "train.h" + +OverlordItemStore::OverlordItemStore(QObject *parent): ItemStore(parent) +{ +} + +void OverlordItemStore::gotNfcTag(NfcUid uid) +{ + for(std::shared_ptr item : items_) + { + Train* train = dynamic_cast(item.get()); + if(!train) + continue; + for(const NfcUid& trainUid : train->tags) + { + if(trainUid == uid) + { + if(train->passedReader(uid)) + train->setValue(0-train->getValue()); + return; + } + } + } +} diff --git a/src/trainOverlord/overlorditemstore.h b/src/trainOverlord/overlorditemstore.h new file mode 100644 index 0000000..dd4da25 --- /dev/null +++ b/src/trainOverlord/overlorditemstore.h @@ -0,0 +1,16 @@ +#pragma once +#include "itemstore.h" +#include + +class OverlordItemStore: public ItemStore +{ + Q_OBJECT +private: + QTimer timer; +public: + OverlordItemStore(QObject *parent = nullptr); + +public slots: + + void gotNfcTag(NfcUid); +}; diff --git a/src/trainOverlord/trainoverlord.cpp b/src/trainOverlord/trainoverlord.cpp new file mode 100644 index 0000000..1dc590d --- /dev/null +++ b/src/trainOverlord/trainoverlord.cpp @@ -0,0 +1,75 @@ +#include +#include +#include +#include +#include + +#include "microcontroller.h" +#include "nfcuid.h" +#include "overlorditemstore.h" +#include "train.h" +#include "turnout.h" +#include "signal.h" + +void gotTag(NfcUid uid) +{ + std::cout<<"Got tag from "< - - AlarmSettingsDialog - - - - 0 - 0 - 423 - 281 - - - - Dialog - - - - - - Sound File: - - - - - - - 0 - - - 0 - - - - - false - - - - - - - Change - - - - - - - - - 0 - - - - - Sunrise - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Enable - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - - - - buttonBox - accepted() - AlarmSettingsDialog - accept() - - - 248 - 254 - - - 157 - 274 - - - - - buttonBox - rejected() - AlarmSettingsDialog - reject() - - - 316 - 260 - - - 286 - 274 - - - - - diff --git a/src/ui/itemcreationdialog.cpp b/src/ui/itemcreationdialog.cpp deleted file mode 100644 index de0d51d..0000000 --- a/src/ui/itemcreationdialog.cpp +++ /dev/null @@ -1,30 +0,0 @@ -#include "itemcreationdialog.h" -#include "ui_itemcreationdialog.h" - -ItemCreationDialog::ItemCreationDialog(QWidget *parent) : - QDialog(parent), - ui(new Ui::ItemCreationDialog) -{ - ui->setupUi(this); - connect(ui->comboBox, &QComboBox::currentTextChanged, this, &ItemCreationDialog::itemTypeChanged); - connect(ui->lineEdit, &QLineEdit::textChanged, this, &ItemCreationDialog::itemNameChanged); -} - -ItemCreationDialog::~ItemCreationDialog() -{ - delete ui; -} - -void ItemCreationDialog::itemTypeChanged(const QString& type) -{ - ui->verticalLayout->removeWidget(widget); -} - -void ItemCreationDialog::itemNameChanged(const QString& name) -{ - if(item) - { - item->setName(name); - } -} - diff --git a/src/ui/itemcreationdialog.h b/src/ui/itemcreationdialog.h deleted file mode 100644 index 6e993d3..0000000 --- a/src/ui/itemcreationdialog.h +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef ITEMCREATIONDIALOG_H -#define ITEMCREATIONDIALOG_H - -#include -#include -#include "../items/item.h" - -namespace Ui -{ -class ItemCreationDialog; -} - -class ItemCreationDialog : public QDialog -{ - Q_OBJECT - - QWidget* widget; - -public: - explicit ItemCreationDialog(QWidget *parent = nullptr); - ~ItemCreationDialog(); - - std::shared_ptr item; - -private slots: - - void itemTypeChanged(const QString& type); - void itemNameChanged(const QString& name); - -private: - Ui::ItemCreationDialog *ui; -}; - -#endif // ITEMCREATIONDIALOG_H diff --git a/src/ui/itemcreationdialog.ui b/src/ui/itemcreationdialog.ui deleted file mode 100644 index 4b55d6d..0000000 --- a/src/ui/itemcreationdialog.ui +++ /dev/null @@ -1,116 +0,0 @@ - - - ItemCreationDialog - - - - 0 - 0 - 400 - 140 - - - - Create Item - - - - :/images/UVOSicon.bmp:/images/UVOSicon.bmp - - - - - - - - Type - - - - - - - - Message - - - - - System - - - - - - - - - - - - Name - - - - - - - Item - - - - - - - - - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - - - - - - buttonBox - accepted() - ItemCreationDialog - accept() - - - 248 - 254 - - - 157 - 274 - - - - - buttonBox - rejected() - ItemCreationDialog - reject() - - - 316 - 260 - - - 286 - 274 - - - - - diff --git a/src/ui/itemsettingsdialog.cpp b/src/ui/itemsettingsdialog.cpp deleted file mode 100644 index 9f2086d..0000000 --- a/src/ui/itemsettingsdialog.cpp +++ /dev/null @@ -1,176 +0,0 @@ -#include "itemsettingsdialog.h" -#include "ui_itemsettingsdialog.h" -#include - -ItemSettingsDialog::ItemSettingsDialog(std::shared_ptr item, QWidget *parent) : - QDialog(parent), - item_(item), - ui(new Ui::ItemSettingsDialog) -{ - ui->setupUi(this); - - setModal(false); - - ui->label_name->setText(item_->getName()); - ui->checkBox_Override->setChecked(item_->getOverride()); - - - if(std::shared_ptr relay = std::dynamic_pointer_cast(item_)) - { - itemSpecificWidget_ = new RelayItemSettingsWidget(relay); - } - else if(std::shared_ptr msgItem = std::dynamic_pointer_cast(item_)) - { - itemSpecificWidget_ = new MessageItemSettingsWidget(msgItem); - } - else if(std::shared_ptr sysItem = std::dynamic_pointer_cast(item_)) - { - itemSpecificWidget_ = new SystemItemSettingsWidget(sysItem); - } - - if(itemSpecificWidget_) - { - ui->verticalLayout_2->addWidget(itemSpecificWidget_); - } - - connect(ui->pushButton_add, &QPushButton::clicked, this, &ItemSettingsDialog::addActor); - connect(ui->pushButton_remove, &QPushButton::clicked, this, &ItemSettingsDialog::removeActor); - connect(ui->pushButton_edit, &QPushButton::clicked, this, &ItemSettingsDialog::editActor); - connect(ui->checkBox_Override, &QPushButton::clicked, this, &ItemSettingsDialog::changeOverride); - - - ui->tableWidget->setHorizontalHeaderItem(0, new QTableWidgetItem("Actor")); - ui->tableWidget->setHorizontalHeaderItem(1, new QTableWidgetItem("Action")); - ui->tableWidget->setHorizontalHeaderItem(2, new QTableWidgetItem("Enabled")); - ui->tableWidget->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch); - ui->tableWidget->horizontalHeader()->resizeSection(1, 60); - ui->tableWidget->horizontalHeader()->resizeSection(2, 75); - loadActorList(); -} - -ItemSettingsDialog::~ItemSettingsDialog() -{ - if(itemSpecificWidget_) delete itemSpecificWidget_; - delete ui; -} - -void ItemSettingsDialog::changeOverride() -{ - item_->setOverride(ui->checkBox_Override->isChecked()); -} - -void ItemSettingsDialog::loadActorList() -{ - //ui->listWidget->clear(); - ui->tableWidget->setRowCount(item_->getActors().size()); - - for(unsigned i = 0; i < item_->getActors().size(); i++) - { - ui->tableWidget->setItem(i, 0, new QTableWidgetItem(item_->getActors()[i]->getName())); - ui->tableWidget->setItem(i, 1, new QTableWidgetItem(item_->getActors()[i]->actionName())); - ui->tableWidget->setItem(i, 2, new QTableWidgetItem(item_->getActors()[i]->isActive() ? "Y" : "N")); - } -} - -void ItemSettingsDialog::addActor() -{ - ActorSettingsDialog* dialog = nullptr; - std::shared_ptr actor = nullptr; - - if(ui->comboBox->currentText() == "Alarm") - { - std::shared_ptr alarm = std::shared_ptr(new AlarmTime); - actor = alarm; - dialog = new ActorSettingsDialog(alarm, this); - } - else if(ui->comboBox->currentText() == "Sensor") - { - std::shared_ptr sensorActor = std::shared_ptr(new SensorActor); - actor = sensorActor; - dialog = new ActorSettingsDialog(sensorActor, this); - } - else if(ui->comboBox->currentText() == "Timer" ) - { - std::shared_ptr timerActor = std::shared_ptr(new TimerActor); - actor = timerActor; - dialog = new ActorSettingsDialog(timerActor, this); - } - else if(ui->comboBox->currentText() == "Regulator") - { - std::shared_ptr regulator = std::shared_ptr(new Regulator); - actor = regulator; - dialog = new ActorSettingsDialog(regulator, this); - } - - else if(ui->comboBox->currentText() == "Polynomal") - { - std::shared_ptr polynomalActor = std::shared_ptr(new PolynomalActor); - actor = polynomalActor; - dialog = new ActorSettingsDialog(polynomalActor, this); - } - - else if(ui->comboBox->currentText() == "Multi Factor") - { - std::shared_ptr polynomalActor = std::shared_ptr(new MultiFactorActor); - actor = polynomalActor; - dialog = new ActorSettingsDialog(polynomalActor, this); - } - - - if(dialog != nullptr) - { - dialog->setParent(this); - dialog->show(); - if(dialog->exec() == QDialog::Accepted) - { - item_->addActor(actor); - loadActorList(); - } - delete dialog; - } - -} - -void ItemSettingsDialog::removeActor() -{ - if(item_->getActors().size() > ui->tableWidget->currentRow()) - { - item_->removeActor(item_->getActors().at(ui->tableWidget->currentRow())); - loadActorList(); - } -} - -void ItemSettingsDialog::editActor() -{ - if(item_->getActors().size() > ui->tableWidget->currentRow()) - { - std::shared_ptr actor = item_->getActors()[ui->tableWidget->currentRow()]; - - std::shared_ptr alarmTime = std::dynamic_pointer_cast(actor); - std::shared_ptr regulator = std::dynamic_pointer_cast(actor); - std::shared_ptr sensorActor = std::dynamic_pointer_cast(actor); - std::shared_ptr timerActor = std::dynamic_pointer_cast(actor); - std::shared_ptr polynomalActor = std::dynamic_pointer_cast(actor); - std::shared_ptr factorActor = std::dynamic_pointer_cast(actor); - - ActorSettingsDialog* dialog; - - if(alarmTime) dialog = new ActorSettingsDialog(alarmTime, this); - else if(regulator) dialog = new ActorSettingsDialog(regulator, this); - else if(sensorActor) dialog = new ActorSettingsDialog(sensorActor, this); - else if(timerActor) dialog = new ActorSettingsDialog(timerActor, this); - else if(polynomalActor) dialog = new ActorSettingsDialog(polynomalActor, this); - else if(factorActor) dialog = new ActorSettingsDialog(factorActor, this); - else dialog = new ActorSettingsDialog(actor, this); - dialog->setParent(this); - dialog->show(); - dialog->exec(); - - for(int i = 0; i < ui->tableWidget->rowCount() && i < item_->getActors().size(); ++i) - { - ui->tableWidget->item(i, 0)->setText(item_->getActors()[i]->getName()); - ui->tableWidget->item(i, 1)->setText(item_->getActors()[i]->actionName()); - ui->tableWidget->item(i, 2)->setText(item_->getActors()[i]->isActive() ? "Y" : "N"); - } - } -} diff --git a/src/ui/itemsettingsdialog.h b/src/ui/itemsettingsdialog.h deleted file mode 100644 index 5ec31a2..0000000 --- a/src/ui/itemsettingsdialog.h +++ /dev/null @@ -1,38 +0,0 @@ -#ifndef RELAYSETTINGSDIALOG_H -#define RELAYSETTINGSDIALOG_H - -#include -#include -#include -#include "../items/item.h" - -namespace Ui -{ -class ItemSettingsDialog; -} - -class ItemSettingsDialog : public QDialog -{ - Q_OBJECT - std::shared_ptr item_; - QWidget* itemSpecificWidget_ = nullptr; - -private: - void loadActorList(); - -public: - explicit ItemSettingsDialog(std::shared_ptr item, QWidget *parent = nullptr); - ~ItemSettingsDialog(); - -private slots: - - void removeActor(); - void addActor(); - void editActor(); - void changeOverride(); - -private: - Ui::ItemSettingsDialog *ui; -}; - -#endif // RELAYSETTINGSDIALOG_H diff --git a/src/ui/itemsettingsdialog.ui b/src/ui/itemsettingsdialog.ui deleted file mode 100644 index 871bb9f..0000000 --- a/src/ui/itemsettingsdialog.ui +++ /dev/null @@ -1,274 +0,0 @@ - - - ItemSettingsDialog - - - - 0 - 0 - 577 - 390 - - - - Item Settings - - - - :/images/UVOSicon.bmp:/images/UVOSicon.bmp - - - - - - QFormLayout::AllNonFixedFieldsGrow - - - 0 - - - 10 - - - - - Name: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - 5 - 0 - - - - Qt::LeftToRight - - - TextLabel - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - - - - - Override - - - - - - - QFrame::StyledPanel - - - Qt::ScrollBarAsNeeded - - - Qt::ScrollBarAlwaysOff - - - false - - - QAbstractItemView::NoEditTriggers - - - false - - - false - - - false - - - QAbstractItemView::SelectRows - - - false - - - Qt::SolidLine - - - false - - - 0 - - - 3 - - - false - - - 32 - - - true - - - false - - - 32 - - - - - - - - - - 0 - - - 0 - - - - - Remove - - - - - - - Edit - - - - - - - - - - - - 0 - 0 - - - - Act on - - - - - - - - Sensor - - - - - Polynomal - - - - - Regulator - - - - - Alarm - - - - - Timer - - - - - Multi Factor - - - - - - - - - 0 - 0 - - - - Add - - - - - - - - - Qt::Horizontal - - - QDialogButtonBox::Ok - - - - - - - - - - - buttonBox - accepted() - ItemSettingsDialog - accept() - - - 248 - 254 - - - 157 - 274 - - - - - buttonBox - rejected() - ItemSettingsDialog - reject() - - - 316 - 260 - - - 286 - 274 - - - - - diff --git a/trainControllerUI.pro b/trainControllerUI.pro deleted file mode 100644 index 39a966e..0000000 --- a/trainControllerUI.pro +++ /dev/null @@ -1,72 +0,0 @@ -#------------------------------------------------- -# -# Project created by QtCreator 2017-06-01T22:31:38 -# -#------------------------------------------------- - -QT += core gui widgets network serialport - -TARGET = traincontrollerui -TEMPLATE = app - -INCLUDEPATH += /usr/include/libnl3/ -INCLUDEPATH += /usr/include/SDL2/ - -LIBS += -lnl-3 -lnl-genl-3 -lSDL2 - -# The following define makes your compiler emit warnings if you use -# any feature of Qt which as been marked as deprecated (the exact warnings -# depend on your compiler). Please consult the documentation of the -# deprecated API in order to know how to port your code away from it. -DEFINES += QT_DEPRECATED_WARNINGS -DEFINES += SDL_SUPPORTED - -QMAKE_CXXFLAGS += -std=c++17 -O2 - -SOURCES += \ - src/items/train.cpp \ - src/items/turnout.cpp \ - src/mainobject.cpp \ - src/trainjs.cpp \ - src/QJoysticks.cpp \ - src/jsbackend/SDL_Joysticks.cpp \ - src/jsbackend/VirtualJoystick.cpp \ - src/ui/itemwidget.cpp \ - src/ui/trainwidget.cpp \ - src/items/signal.cpp \ - src/ui/signalwidget.cpp \ - src/ui/itemscrollbox.cpp \ - src/ui/mainwindow.cpp \ - src/items/item.cpp \ - src/items/itemstore.cpp\ - src/main.cpp \ - src/microcontroller.cpp - -HEADERS += \ - src/items/train.h \ - src/items/turnout.h \ - src/mainobject.h \ - src/trainjs.h \ - src/QJoysticks.h \ - src/jsbackend/SDL_Joysticks.h \ - src/jsbackend/VirtualJoystick.h \ - src/jsbackend/JoysticksCommon.h \ - src/ui/itemwidget.h \ - src/ui/trainwidget.h \ - src/items/signal.h \ - src/ui/signalwidget.h \ - src/ui/itemscrollbox.h \ - src/ui/mainwindow.h \ - src/items/item.h \ - src/items/itemstore.h - -HEADERS += \ - src/microcontroller.h \ - -INCLUDEPATH += src/ui/ - -FORMS += \ - src/ui/mainwindow.ui \ - src/ui/relayscrollbox.ui \ - src/ui/trainwidget.ui \ - src/ui/signalwidget.ui From 872cc04a548be56ad0e7c083f9557d298ddb6a83 Mon Sep 17 00:00:00 2001 From: uvos Date: Mon, 21 Mar 2022 21:23:22 +0100 Subject: [PATCH 08/10] Intal version with working trainoverlord --- src/CMakeLists.txt | 9 +- src/common/items/item.h | 2 +- src/common/items/itemstore.cpp | 5 +- src/common/items/itemstore.h | 2 +- src/common/items/train.cpp | 69 +++++ src/common/items/train.h | 19 ++ .../items/{signal.cpp => trainsignal.cpp} | 2 +- src/common/items/{signal.h => trainsignal.h} | 0 src/common/microcontroller.cpp | 15 +- src/trainControllerUI/traincontrollerui.cpp | 8 +- src/trainControllerUI/ui/itemscrollbox.cpp | 8 +- src/trainControllerUI/ui/signalwidget.cpp | 2 +- src/trainControllerUI/ui/signalwidget.h | 2 +- src/trainOverlord/CMakeLists.txt | 7 + src/trainOverlord/block.cpp | 254 ++++++++++++++++++ src/trainOverlord/block.h | 65 +++++ src/trainOverlord/blockborder.cpp | 137 ++++++++++ src/trainOverlord/blockborder.h | 38 +++ src/trainOverlord/layout.cpp | 221 +++++++++++++++ src/trainOverlord/layout.h | 43 +++ src/trainOverlord/overlorditemstore.cpp | 14 +- src/trainOverlord/overlorditemstore.h | 8 +- src/trainOverlord/trainoverlord.cpp | 108 +++++++- 23 files changed, 992 insertions(+), 46 deletions(-) rename src/common/items/{signal.cpp => trainsignal.cpp} (96%) rename src/common/items/{signal.h => trainsignal.h} (100%) create mode 100644 src/trainOverlord/block.cpp create mode 100644 src/trainOverlord/block.h create mode 100644 src/trainOverlord/blockborder.cpp create mode 100644 src/trainOverlord/blockborder.h create mode 100644 src/trainOverlord/layout.cpp create mode 100644 src/trainOverlord/layout.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 842991e..11a92ee 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -12,11 +12,17 @@ find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Widgets Network SerialPort REQUIRE set(COMMON_SOURCES ../common/microcontroller.cpp + ../common/microcontroller.h ../common/items/item.cpp + ../common/items/item.h ../common/items/itemstore.cpp - ../common/items/signal.cpp + ../common/items/itemstore.h + ../common/items/trainsignal.cpp + ../common/items/trainsignal.h ../common/items/train.cpp + ../common/items/train.h ../common/items/turnout.cpp + ../common/items/turnout.h ) include_directories(PRIVATE @@ -32,3 +38,4 @@ set(COMMON_LINK_LIBRARYS add_subdirectory(trainControllerUI) add_subdirectory(trainOverlord) + diff --git a/src/common/items/item.h b/src/common/items/item.h index 9034be5..54c843a 100644 --- a/src/common/items/item.h +++ b/src/common/items/item.h @@ -59,7 +59,7 @@ public: virtual ~Item(); - void informValue(int8_t value); + virtual void informValue(int8_t value); }; diff --git a/src/common/items/itemstore.cpp b/src/common/items/itemstore.cpp index 523d2ce..faf769a 100644 --- a/src/common/items/itemstore.cpp +++ b/src/common/items/itemstore.cpp @@ -22,7 +22,6 @@ void ItemStore::addItem(std::shared_ptr item) items_.push_back(std::shared_ptr(item)); itemAdded(std::weak_ptr(items_.back())); } - qDebug()<<"Got item: "<id()<<" matched: "<>& itemIn) @@ -35,7 +34,7 @@ void ItemStore::addItems(const std::vector>& itemIn) continue; if(train->getTrainId() == 0) { - const uint8_t uidBytes[] = {12, 154, 110, 34}; + const uint8_t uidBytes[] = {154, 110, 34, 218}; train->tags.push_back(NfcUid(uidBytes, sizeof(uidBytes))); } else if(train->getTrainId() == 3) @@ -45,7 +44,7 @@ void ItemStore::addItems(const std::vector>& itemIn) } else if(train->getTrainId() == 4) { - const uint8_t uidBytes[] = {76, 55, 220, 31}; + const uint8_t uidBytes[] = {55, 220, 31, 184}; train->tags.push_back(NfcUid(uidBytes, sizeof(uidBytes))); } } diff --git a/src/common/items/itemstore.h b/src/common/items/itemstore.h index 7a542b9..ff2ce79 100644 --- a/src/common/items/itemstore.h +++ b/src/common/items/itemstore.h @@ -30,7 +30,7 @@ signals: public slots: void removeItem(const ItemData& item); - void addItem(std::shared_ptr item); + virtual void addItem(std::shared_ptr item); void addItems(const std::vector>& itemsIn); void itemStateChanged(const ItemData& item); }; diff --git a/src/common/items/train.cpp b/src/common/items/train.cpp index 2929df9..38eb6b3 100644 --- a/src/common/items/train.cpp +++ b/src/common/items/train.cpp @@ -19,13 +19,82 @@ void Train::setFunction(uint8_t funciton, bool value) void Train::setValue(int8_t value) { Item::setValue(value); + if(suspended_ && value != 0) + { + suspended_ = false; + unsuspended(id(), getDirection()); + } if(micro) micro->trainSetSpeed(train_id_, value); } +void Train::informValue(int8_t value) +{ + if(suspended_ && value != 0) + { + suspended_ = false; + unsuspended(id(), getDirection()); + } + Item::informValue(value); +} + void Train::reverse() { if(micro) micro->trainReverse(train_id_); } +int Train::ownsTag(NfcUid uid) +{ + for(size_t i = 0; i < tags.size(); ++i) + { + if(uid == tags[i]) + { + if(i == 0) + return getDirection() == FORWARD ? TAG_FRONT : TAG_BACK; + else if(i == tags.size()-1) + return getDirection() == REVERSE ? TAG_FRONT : TAG_BACK; + else + return TAG_CENTER; + } + } + return TAG_NONE; +} + +bool Train::suspend() +{ + if(suspended_) + return false; + suspendedSpeed_ = value_; + setValue(0); + suspended_ = true; + return true; +} + +bool Train::resume() +{ + if(!suspended_) + return false; + suspended_ = false; + setValue(suspendedSpeed_); + return true; +} + +bool Train::hasBackTag() +{ + return tags.size() > 1; +} + +bool Train::suspendend() +{ + return suspended_; +} + +int Train::getDirection() +{ + if(!suspended_) + return value_ < 0 ? REVERSE : FORWARD; + else + return suspendedSpeed_ < 0 ? REVERSE : FORWARD; +} + diff --git a/src/common/items/train.h b/src/common/items/train.h index e1d23ba..1d63e58 100644 --- a/src/common/items/train.h +++ b/src/common/items/train.h @@ -12,7 +12,16 @@ class Train : public Item uint8_t functionMask_; uint8_t train_id_; int lastReader_ = -1; + int8_t suspendedSpeed_; + bool suspended_ = false; public: + static constexpr int FORWARD = 1; + static constexpr int REVERSE = -1; + static constexpr int TAG_FRONT = 0; + static constexpr int TAG_BACK = 1; + static constexpr int TAG_CENTER = 2; + static constexpr int TAG_NONE = -1; + static Microcontroller *micro; std::vector tags; @@ -27,6 +36,13 @@ public slots: void reverse(); virtual void setFunction(uint8_t function, bool on); virtual void setValue(int8_t value); + virtual void informValue(int8_t value); + bool suspend(); + bool resume(); + bool suspendend(); + int getDirection(); + int ownsTag(NfcUid uid); + bool hasBackTag(); bool passedReader(const NfcUid &uid) { if(lastReader_ == uid.reader) @@ -38,6 +54,9 @@ public slots: { return train_id_; } + +signals: + void unsuspended(uint32_t id, int direction); }; #endif // TRAIN_H diff --git a/src/common/items/signal.cpp b/src/common/items/trainsignal.cpp similarity index 96% rename from src/common/items/signal.cpp rename to src/common/items/trainsignal.cpp index f5b4c08..c8178ec 100644 --- a/src/common/items/signal.cpp +++ b/src/common/items/trainsignal.cpp @@ -1,4 +1,4 @@ -#include "signal.h" +#include "trainsignal.h" Microcontroller *Signal::micro = nullptr; diff --git a/src/common/items/signal.h b/src/common/items/trainsignal.h similarity index 100% rename from src/common/items/signal.h rename to src/common/items/trainsignal.h diff --git a/src/common/microcontroller.cpp b/src/common/microcontroller.cpp index ae8b1ab..553e867 100644 --- a/src/common/microcontroller.cpp +++ b/src/common/microcontroller.cpp @@ -2,13 +2,12 @@ #include #include -#include "items/train.h" -#include "items/turnout.h" -#include "items/signal.h" +#include "train.h" +#include "turnout.h" +#include "trainsignal.h" void Microcontroller::trainSetSpeed(uint8_t id, int8_t speed) { - qDebug()<<__func__; std::stringstream ss; ss<<"train "<<(unsigned)id<<" speed "<<(int)speed<<'\n'; write(ss.str().c_str()); @@ -54,18 +53,16 @@ void Microcontroller::estop() void Microcontroller::write(const QByteArray& buffer) { - qDebug()<write(buffer); - _port->waitForBytesWritten(1000); + //_port->waitForBytesWritten(1000); } std::this_thread::sleep_for(std::chrono::milliseconds(40)); } void Microcontroller::write(char* buffer, const size_t length) { - qDebug()<write(buffer, length); @@ -86,6 +83,7 @@ void Microcontroller::requestState() write("train list\n"); write("turnout list\n"); write("signal list\n"); + write("nfc list\n"); } //housekeeping @@ -154,14 +152,12 @@ void Microcontroller::processNfcLine(const QString& buffer) uid.length = tokens.length(); for(size_t i = 0; i < uid.length; ++i) uid.bytes[i] = tokens[i].toInt(); - qDebug()<<"Got Tag"; gotTag(uid); } void Microcontroller::processList(const QString& buffer) { QStringList bufferList = buffer.split(' '); - qDebug()<<__func__<<" :"<= 10 && buffer.contains("NUMBER:")) { std::shared_ptr item; @@ -179,7 +175,6 @@ void Microcontroller::processList(const QString& buffer) listMode = false; if(!itemList.empty()) { - qDebug()<<"got item list " << itemList.size(); gotItemList(itemList); itemList.clear(); } diff --git a/src/trainControllerUI/traincontrollerui.cpp b/src/trainControllerUI/traincontrollerui.cpp index 86cb846..6541439 100644 --- a/src/trainControllerUI/traincontrollerui.cpp +++ b/src/trainControllerUI/traincontrollerui.cpp @@ -10,10 +10,10 @@ #include "microcontroller.h" #include "trainjs.h" #include "ui/mainwindow.h" -#include "items/itemstore.h" -#include "items/train.h" -#include "items/turnout.h" -#include "items/signal.h" +#include "itemstore.h" +#include "train.h" +#include "turnout.h" +#include "trainsignal.h" #define BAUD QSerialPort::Baud38400 diff --git a/src/trainControllerUI/ui/itemscrollbox.cpp b/src/trainControllerUI/ui/itemscrollbox.cpp index 2810781..50f4d7b 100644 --- a/src/trainControllerUI/ui/itemscrollbox.cpp +++ b/src/trainControllerUI/ui/itemscrollbox.cpp @@ -1,10 +1,10 @@ #include "itemscrollbox.h" #include "ui_relayscrollbox.h" #include "ui_relayscrollbox.h" -#include "../items/train.h" -#include "../items/turnout.h" -#include "../items/signal.h" -#include "../trainjs.h" +#include "train.h" +#include "turnout.h" +#include "trainsignal.h" +#include "trainjs.h" #include "trainwidget.h" #include "signalwidget.h" diff --git a/src/trainControllerUI/ui/signalwidget.cpp b/src/trainControllerUI/ui/signalwidget.cpp index 17550ec..6bb722b 100644 --- a/src/trainControllerUI/ui/signalwidget.cpp +++ b/src/trainControllerUI/ui/signalwidget.cpp @@ -4,7 +4,7 @@ #include #include #include -#include "../items/signal.h" +#include "trainsignal.h" SignalWidget::SignalWidget(std::weak_ptr item, QWidget *parent) : ItemWidget(item, parent), diff --git a/src/trainControllerUI/ui/signalwidget.h b/src/trainControllerUI/ui/signalwidget.h index f0fbfca..6cc36f3 100644 --- a/src/trainControllerUI/ui/signalwidget.h +++ b/src/trainControllerUI/ui/signalwidget.h @@ -3,7 +3,7 @@ #include #include #include -#include "../items/signal.h" +#include "../items/trainsignal.h" #include "itemwidget.h" namespace Ui diff --git a/src/trainOverlord/CMakeLists.txt b/src/trainOverlord/CMakeLists.txt index c6ec6c9..ce7f463 100644 --- a/src/trainOverlord/CMakeLists.txt +++ b/src/trainOverlord/CMakeLists.txt @@ -1,6 +1,13 @@ set(UI_SOURCES trainoverlord.cpp overlorditemstore.cpp + overlorditemstore.h + blockborder.cpp + blockborder.h + block.cpp + block.h + layout.h + layout.cpp ) add_executable(trainoverlord ${UI_SOURCES} ${COMMON_SOURCES}) diff --git a/src/trainOverlord/block.cpp b/src/trainOverlord/block.cpp new file mode 100644 index 0000000..63da753 --- /dev/null +++ b/src/trainOverlord/block.cpp @@ -0,0 +1,254 @@ +#include "block.h" +#include +#include + +Block::Block(uint32_t id): + id_(id) +{ + +} + +void Block::addBorder(std::shared_ptr border) +{ + borders_.push_back(border); + std::shared_ptr block = border->getOtherBlock(this); + if(!block || block.get() == this) + { + qWarning()<<__func__<<"no other block in border"<id(); + return; + } + connect(block.get(), &Block::blockedChanged, this, &Block::checkWaits); +} + +bool Block::blocked() +{ + if(trains_.empty() && waits_.empty()) + return false; + return true; +} + +bool Block::ownsTrain(std::weak_ptr train) +{ + std::shared_ptr trainPtr = train.lock(); + if(!trainPtr) + return false; + + for(auto ownedTrain : trains_) + { + if(ownedTrain.lock() == trainPtr) + return true; + } + return false; +} + +bool Block::ownsBorder(std::shared_ptr border) +{ + if(!border) + return false; + for(std::shared_ptr borderTest : borders_) + { + if(borderTest == border) + return true; + } + return false; +} + +void Block::checkWaits(bool ign) +{ + qDebug()<<__func__; + (void)ign; + bool wasBlocked = blocked(); + for(std::vector::iterator iter = waits_.begin(); iter != waits_.end();) + { + std::shared_ptr block = iter->targetBlock.lock(); + std::shared_ptr train = iter->train.lock(); + qDebug()<<__func__<<"trying to push train"<getTrainId()<<"to block"<id(); + if(block && train && train->suspendend() && block->pushTrain(iter->train)) + { + train->resume(); + std::shared_ptr border = iter->border.lock(); + if(border) + border->updateSignals(); + iter = waits_.erase(iter); + } + else if(!block || !train || !train->suspendend()) + { + iter = waits_.erase(iter); + } + else + { + ++iter; + } + } + if(wasBlocked != blocked()) + blockedChanged(!wasBlocked); +} + +void Block::updateBorders() +{ + for(std::shared_ptr broder : borders_) + { + broder->updateSignals(); + } +} + +bool Block::pushTrain(std::weak_ptr train) +{ + if(blocked()) + return false; + + addTrain(train); + return true; +} + +void Block::addTrain(std::weak_ptr train) +{ + std::shared_ptr trainPtr = train.lock(); + if(!trainPtr) + return; + qDebug()<<"Train"<getTrainId()<<"added to block"<::iterator iter = waits_.begin(); iter != waits_.end(); ++iter) + { + std::shared_ptr workTrain = iter->train.lock(); + if(!workTrain) + { + waits_.erase(iter); + unsuspendedTrain(id, direction); + break; + } + if(workTrain->id() == id) + { + std::shared_ptr block = iter->targetBlock.lock(); + disconnect(workTrain.get(), &Train::unsuspended, this, &Block::unsuspendedTrain); + if(iter->direction == direction) + { + if(block) + block->addTrain(workTrain); + } + else + { + addTrain(workTrain); + } + waits_.erase(iter); + break; + } + } + if(wasBlocked != blocked()) + blockedChanged(!wasBlocked); + updateBorders(); +} + +void Block::removeTrain(std::weak_ptr train) +{ + std::shared_ptr trainPtr = train.lock(); + if(!trainPtr) + return; + + for(std::vector>::iterator iter = trains_.begin(); iter != trains_.end(); ++iter) + { + if(iter->lock() == trainPtr) + { + qDebug()<<"Train"<getTrainId()<<"removed from to block"< borderIn, std::weak_ptr trainIn) +{ + qDebug()<<__func__<<"block"< border = borderIn.lock(); + if(!border) + { + qWarning()<<"border has expired in"<<__func__; + return; + } + + if(!ownsBorder(border)) + return; + + qDebug()<<"Block"<getOtherBlock(this); + if(block) + { + std::shared_ptr workTrain = trainIn.lock(); + if(workTrain) + { + if(!block->pushTrain(trainIn)) + { + workTrain->suspend(); + TrainWait wait; + wait.train = trainIn; + wait.direction = workTrain->getDirection(); + wait.targetBlock = block; + wait.border = border; + connect(workTrain.get(), &Train::unsuspended, this, &Block::unsuspendedTrain); + waits_.push_back(wait); + qDebug()<<"Train"<getTrainId()<<"is wating at border for block"<id(); + if(!block->trains_.empty() && block->trains_[0].lock()) + qDebug()<<"for train"<trains_[0].lock()->getTrainId()<<"to leave"; + } + removeTrain(workTrain); + } + } + if(wasBlocked != blocked()) + blockedChanged(blocked()); + updateBorders(); +} + +void Block::store(QJsonObject &json) +{ + json["Id"] = static_cast(id_); + QJsonArray borders; + for(auto& border : borders_) + { + QJsonObject borderObject; + borderObject["BorderId"] = static_cast(border->id()); + borders.append(borderObject); + } + json["Borders"] = borders; +} + +void Block::load(const QJsonObject &json) +{ + id_ = static_cast(json["Id"].toDouble(0)); +} + +void Block::populate(const QJsonObject& json, Layout* layout) +{ + borders_.clear(); + const QJsonArray bordersArray(json["Borders"].toArray(QJsonArray())); + for(const auto& arrayObj : bordersArray) + { + if(arrayObj.isObject()) + { + uint32_t borderId = static_cast(arrayObj.toObject()["BorderId"].toDouble(INT32_MAX)); + std::shared_ptr border = layout->getBorder(borderId); + if(border) + addBorder(border); + else if(borderId == INT32_MAX) + qWarning()<<"BorderId field is missing in border array for block"< +#include +#include +#include +#include +#include "blockborder.h" +#include "train.h" + +class BlockBorder; +class Layout; + +class Block: public QObject +{ + Q_OBJECT +protected: + static constexpr int WAIT_TYPE_BLOCK = 0; + static constexpr int WAIT_TYPE_TRAVERSE = 1; + + struct TrainWait + { + int type; + int direction; + std::weak_ptr train; + std::weak_ptr targetBlock; + std::weak_ptr border; + }; + + std::vector< std::shared_ptr > borders_; + std::vector< std::weak_ptr > trains_; + std::vector waits_; + uint32_t id_; + +protected slots: + void unsuspendedTrain(uint32_t id, int direction); + +protected: + void checkWaits(bool blocked = false); + void updateBorders(); + +public: + Block(uint32_t id = QRandomGenerator::global()->generate()); + void addBorder(std::shared_ptr border); + bool blocked(); + bool ownsTrain(std::weak_ptr train); + bool ownsBorder(std::shared_ptr border); + std::vector< std::shared_ptr > getBorders(){return borders_;} + uint32_t id(){return id_;} + void removeTrain(std::weak_ptr train); + void store(QJsonObject& json); + void load(const QJsonObject& json); + void populate(const QJsonObject& json, Layout* layout); + +public slots: + bool pushTrain(std::weak_ptr train); + void addTrain(std::weak_ptr train); + void trainArrivedAtBorder(std::weak_ptr border, std::weak_ptr train); + +signals: + void blockedChanged(bool blocked); + void trainAddedToBlock(int blockId, std::weak_ptr train); +}; + +#endif // BLOCK_H diff --git a/src/trainOverlord/blockborder.cpp b/src/trainOverlord/blockborder.cpp new file mode 100644 index 0000000..13d77af --- /dev/null +++ b/src/trainOverlord/blockborder.cpp @@ -0,0 +1,137 @@ +#include "blockborder.h" +#include +#include + +BlockBorder::BlockBorder(uint8_t reader, std::pair, std::weak_ptr> blocks, uint32_t id): reader_(reader), blocks_(blocks), id_(id) +{ + +} + +bool BlockBorder::isReader(uint8_t reader) +{ + return reader == reader_; +} + +uint8_t BlockBorder::getReader() +{ + return reader_; +} + +void BlockBorder::setSignal(std::weak_ptr signalWeak, int8_t value) +{ + std::shared_ptr signal = signalWeak.lock(); + if(signal) + { + signal->setValue(value); + } +} + +void BlockBorder::updateSignals() +{ + for(size_t i = 0; i < signals_.size(); ++i) + { + std::shared_ptr signal = signals_[i].lock(); + if(signal) + { + std::shared_ptr block = signalDirections_[i] ? blocks_.first.lock() : blocks_.second.lock(); + if(block && block->blocked()) + { + if(signal->getValue() != Signal::STOP) + { + std::weak_ptr signalWeak = signal; + QTimer::singleShot(500, signal.get(), [signalWeak](){BlockBorder::setSignal(signalWeak, Signal::STOP);}); + } + } + else + { + if(signal->getValue() != Signal::GO) + { + std::weak_ptr signalWeak = signal; + QTimer::singleShot(500, signal.get(), [signalWeak](){BlockBorder::setSignal(signalWeak, Signal::GO);}); + } + } + } + else + { + signals_.erase(signals_.begin()+i); + updateSignals(); + break; + } + } +} + +void BlockBorder::addSignal(std::weak_ptr signal, std::shared_ptr block) +{ + signals_.push_back(signal); + signalDirections_.push_back(block == blocks_.first.lock()); +} + +std::shared_ptr BlockBorder::getOtherBlock(Block* block) +{ + std::shared_ptr first = blocks_.first.lock(); + std::shared_ptr second = blocks_.second.lock(); + + if(first && first.get() == block) + return second; + if(second && second.get() == block) + return first; + return std::shared_ptr(); +} + +std::shared_ptr BlockBorder::getOverlap(BlockBorder* border) +{ + if(border->getBlocks().first.lock() == blocks_.first.lock() || border->getBlocks().first.lock() == blocks_.second.lock()) + { + return border->getBlocks().first.lock(); + } + else if(border->getBlocks().second.lock() == blocks_.first.lock() || border->getBlocks().second.lock() == blocks_.second.lock()) + { + return border->getBlocks().second.lock(); + } + return std::shared_ptr(); +} + +void BlockBorder::store(QJsonObject& json) +{ + json["Id"] = static_cast(id_); + json["Reader"] = static_cast(reader_); + QJsonArray signalArray; + for(size_t i = 0; i < signals_.size(); ++i) + { + std::shared_ptr signalPtr = signals_[i].lock(); + if(signalPtr) + { + QJsonObject signalObject; + signalObject["SignalId"] = static_cast(signalPtr->getSignalId()); + signalObject["Direction"] = static_cast(signalDirections_[i]); + signalArray.append(signalObject); + } + } + json["Signals"] = signalArray; +} + +void BlockBorder::load(const QJsonObject& json) +{ + id_ = static_cast(json["Id"].toDouble(0)); + reader_ = json["Reader"].toDouble(0); + const QJsonArray signalArray(json["Signals"].toArray(QJsonArray())); + for(const auto& arrayObj : signalArray) + { + if(arrayObj.isObject()) + { + signalIds_.push_back(std::pair(static_cast(json["SignalId"].toDouble(INT32_MAX)), static_cast(json["Direction"].toDouble(0)))); + } + } +} + +void BlockBorder::informOfSignal(std::shared_ptr signal) +{ + for(const std::pair& signalPair : signalIds_) + { + if(signalPair.first == signal->getSignalId()) + { + signals_.push_back(signal); + signalDirections_.push_back(signalPair.second); + } + } +} diff --git a/src/trainOverlord/blockborder.h b/src/trainOverlord/blockborder.h new file mode 100644 index 0000000..8c4bca2 --- /dev/null +++ b/src/trainOverlord/blockborder.h @@ -0,0 +1,38 @@ +#ifndef BLOCKBORDER_H +#define BLOCKBORDER_H +#include "trainsignal.h" +#include "block.h" +#include + +class Block; +class Layout; + +class BlockBorder +{ +private: + uint64_t reader_; + uint32_t id_; + std::vector> signalIds_; + std::vector> signals_; + std::vector signalDirections_; + std::pair, std::weak_ptr> blocks_; + + static void setSignal(std::weak_ptr signalWeak, int8_t value); + +public: + BlockBorder(uint8_t reader = 0, std::pair, std::weak_ptr> blocks = std::pair, std::weak_ptr>(), uint32_t id = QRandomGenerator::global()->generate()); + bool isReader(uint8_t reader); + uint8_t getReader(); + void updateSignals(); + std::shared_ptr getOtherBlock(Block* block); + std::pair, std::weak_ptr> getBlocks(){return blocks_;} + void setBlocks(std::pair, std::weak_ptr> blocks){blocks_ = blocks;} + void addSignal(std::weak_ptr signal, std::shared_ptr block); + void informOfSignal(std::shared_ptr signal); + std::shared_ptr getOverlap(BlockBorder* border); + uint32_t id() {return id_;} + void store(QJsonObject& json); + void load(const QJsonObject& json); +}; + +#endif // BLOCKBORDER_H diff --git a/src/trainOverlord/layout.cpp b/src/trainOverlord/layout.cpp new file mode 100644 index 0000000..39e32a9 --- /dev/null +++ b/src/trainOverlord/layout.cpp @@ -0,0 +1,221 @@ +#include "layout.h" +#include +#include + +Layout::Layout(QObject *parent): QObject{parent} +{ +} + +void Layout::itemAdded(std::weak_ptr itemIn) +{ + std::shared_ptr item = itemIn.lock(); + if(!item) + return; + std::shared_ptr train = std::dynamic_pointer_cast(item); + std::shared_ptr signal = std::dynamic_pointer_cast(item); +} + +void Layout::removeTrainFromAllBlocks(std::shared_ptr train) +{ + for(std::shared_ptr block : blocks_) + block->removeTrain(train); +} + +void Layout::registerTrainInLimbo(std::shared_ptr train, std::shared_ptr border) +{ + for(auto iter = trainLimbo_.begin(); iter != trainLimbo_.end(); ++iter) + { + std::shared_ptr limboTrain = iter->first.lock(); + std::shared_ptr limboBorder = iter->second.lock(); + if(!limboTrain || !limboBorder) + { + trainLimbo_.erase(iter); + registerTrainInLimbo(train, border); + return; + } + + if(*train == *limboTrain) + { + if(border == limboBorder) + return; + + std::shared_ptr overlap = border->getOverlap(limboBorder.get()); + if(overlap) + { + qDebug()<<"Train"<getTrainId()<<"removed from limbo and added to block"<id()<<"while crossing border"<id(); + overlap->addTrain(train); + overlap->trainArrivedAtBorder(border, train); + trainLimbo_.erase(iter); + return; + } + else + { + iter->second = border; + return; + } + + } + } + std::shared_ptr first = border->getBlocks().first.lock(); + std::shared_ptr second = border->getBlocks().second.lock(); + + qDebug()<<"Train"<getTrainId()<<"added to limbo between block"<< + (first ? QString::number(first->id()) : "invalid")<<"and block"<<(second ? QString::number(second->id()) : "invalid"); + trainLimbo_.push_back(std::pair, std::weak_ptr>(train, border)); +} + +void Layout::trainArrivedAtReader(uint8_t reader, std::shared_ptr train, int tagType) +{ + std::shared_ptr border; + for(std::shared_ptr borderTest : borders_) + { + if(borderTest->getReader() == reader) + { + border = borderTest; + break; + } + } + if(!border) + { + qWarning()<<"reader "<getTrainId()<<"arrived at border"<id(); + + bool trainHandled = false; + for(std::shared_ptr block : blocks_) + { + if(block->ownsTrain(train)) + { + trainHandled = true; + if(block->ownsBorder(border)) + { + block->trainArrivedAtBorder(border, train); + } + else + { + removeTrainFromAllBlocks(train); + registerTrainInLimbo(train, border); + } + break; + } + } + + if(!trainHandled) + registerTrainInLimbo(train, border); +} + +void Layout::addBlock(std::shared_ptr block) +{ + blocks_.push_back(block); +} + +void Layout::addBorder(std::shared_ptr border) +{ + borders_.push_back(border); +} + +std::shared_ptr Layout::getBorder(uint32_t id) +{ + for(const std::shared_ptr& border : borders_) + { + if(border->id() == id) + return border; + } + return std::shared_ptr(); +} + +std::shared_ptr Layout::getBlock(uint32_t id) +{ + for(const std::shared_ptr& block : blocks_) + { + if(block->id() == id) + return block; + } + return std::shared_ptr(); +} + +void Layout::store(QJsonObject& json) +{ + QJsonArray blockArray; + for(const std::shared_ptr& block : blocks_) + { + QJsonObject object; + block->store(object); + blockArray.append(object); + } + json["Blocks"] = blockArray; + + QJsonArray borderArray; + for(const std::shared_ptr& border : borders_) + { + QJsonObject object; + border->store(object); + borderArray.append(object); + } + json["Borders"] = borderArray; +} + +void Layout::load(const QJsonObject& json) +{ + std::vector blockJsonObjects; + const QJsonArray blockArray(json["Blocks"].toArray(QJsonArray())); + for(const auto& object : blockArray) + { + if(object.isObject()) + { + const QJsonObject jsonObject = object.toObject(); + blockJsonObjects.push_back(jsonObject); + std::shared_ptr block(new Block); + block->load(jsonObject); + blocks_.push_back(block); + } + } + + std::vector borderJsonObjects; + const QJsonArray borderArray(json["Borders"].toArray(QJsonArray())); + for(const auto& object : borderArray) + { + if(object.isObject()) + { + const QJsonObject jsonObject = object.toObject(); + borderJsonObjects.push_back(jsonObject); + std::shared_ptr border(new BlockBorder); + border->load(object.toObject()); + borders_.push_back(border); + } + } + + for(size_t i = 0; i < blocks_.size(); ++i) + { + blocks_[i]->populate(blockJsonObjects[i], this); + } + + for(std::shared_ptr& border : borders_) + { + std::shared_ptr first; + std::shared_ptr second; + for(std::shared_ptr& block : blocks_) + { + if(block->ownsBorder(border)) + { + if(!first) + first = block; + else if(!second) + second = block; + else if(!second) + qWarning()<<"border with id"<id()<<"is assigned to more than 2 blocks"; + } + } + if(!first || !second) + qWarning()<<"border with id"<id()<<"is assigned to less than than 2 blocks"; + border->setBlocks(std::pair, std::weak_ptr>(first, second)); + } + + for(size_t i = 0; i < blocks_.size(); ++i) + { + blocks_[i]->populate(blockJsonObjects[i], this); + if(blocks_[i]->getBorders().empty()) + qWarning()<<"block with id"<id()<<"doset have at least one border"; + } +} diff --git a/src/trainOverlord/layout.h b/src/trainOverlord/layout.h new file mode 100644 index 0000000..fcb8ab3 --- /dev/null +++ b/src/trainOverlord/layout.h @@ -0,0 +1,43 @@ +#ifndef BLOCKSTORE_H +#define BLOCKSTORE_H + +#include +#include +#include + +#include "block.h" +#include "blockborder.h" +#include "microcontroller.h" +#include "itemstore.h" + +class Layout : public QObject +{ + Q_OBJECT +private: + +private: + std::vector> blocks_; + std::vector> borders_; + std::vector, std::weak_ptr>> trainLimbo_; + + void removeTrainFromAllBlocks(std::shared_ptr train); + void registerTrainInLimbo(std::shared_ptr train, std::shared_ptr); + +public: + explicit Layout(QObject *parent = nullptr); + void addBlock(std::shared_ptr block); + void addBorder(std::shared_ptr border); + void store(QJsonObject& json); + void load(const QJsonObject& json); + std::shared_ptr getBorder(uint32_t id); + std::shared_ptr getBlock(uint32_t id); + +public slots: + void trainArrivedAtReader(uint8_t reader, std::shared_ptr train, int tagType); + void itemAdded(std::weak_ptr item); + +signals: + void trainArrivedAtBorder(std::weak_ptr, std::weak_ptr train, int tagType); +}; + +#endif // BLOCKSTORE_H diff --git a/src/trainOverlord/overlorditemstore.cpp b/src/trainOverlord/overlorditemstore.cpp index f367f5b..9222d9a 100644 --- a/src/trainOverlord/overlorditemstore.cpp +++ b/src/trainOverlord/overlorditemstore.cpp @@ -10,17 +10,15 @@ void OverlordItemStore::gotNfcTag(NfcUid uid) { for(std::shared_ptr item : items_) { - Train* train = dynamic_cast(item.get()); + std::shared_ptr train = std::dynamic_pointer_cast(item); if(!train) continue; - for(const NfcUid& trainUid : train->tags) + int owns = train->ownsTag(uid); + if(owns == Train::TAG_FRONT || owns == Train::TAG_BACK) { - if(trainUid == uid) - { - if(train->passedReader(uid)) - train->setValue(0-train->getValue()); - return; - } + qDebug()<<"Train"<getTrainId()<<"arrived at reader"< +#include "train.h" class OverlordItemStore: public ItemStore { Q_OBJECT -private: - QTimer timer; public: OverlordItemStore(QObject *parent = nullptr); public slots: - void gotNfcTag(NfcUid); + +signals: + void trainArrivedAtReader(uint8_t reader, std::shared_ptr train, int tagType); }; diff --git a/src/trainOverlord/trainoverlord.cpp b/src/trainOverlord/trainoverlord.cpp index 1dc590d..eee419a 100644 --- a/src/trainOverlord/trainoverlord.cpp +++ b/src/trainOverlord/trainoverlord.cpp @@ -3,20 +3,87 @@ #include #include #include +#include +#include +#include +#include +#include +#include #include "microcontroller.h" #include "nfcuid.h" #include "overlorditemstore.h" #include "train.h" #include "turnout.h" -#include "signal.h" +#include "layout.h" -void gotTag(NfcUid uid) +void sigHandler(int sig) { - std::cout<<"Got tag from "< 0) + file.setFileName(filePath); + else + file.setFileName(QStandardPaths::writableLocation(QStandardPaths::ConfigLocation) + "/trainoverloard.json"); + + file.open(QIODevice::ReadOnly); + if(!file.isOpen()) { - std::cout<<(int)uid.bytes[i]<<(i == uid.length-1 ? "" : ":"); + std::cerr<<"Can not open config file: "<getItems()->empty()) + { + micro->requestState(); + timer->start(1000); } } @@ -24,6 +91,8 @@ int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); + signal(SIGINT, &sigHandler); + //set info QCoreApplication::setOrganizationName("UVOS"); QCoreApplication::setOrganizationDomain("uvos.xyz"); @@ -60,9 +129,12 @@ int main(int argc, char *argv[]) } OverlordItemStore items; + Layout layout; + + QObject::connect(&items, &OverlordItemStore::itemAdded, &layout, &Layout::itemAdded); + QObject::connect(&items, &OverlordItemStore::trainArrivedAtReader, &layout, &Layout::trainArrivedAtReader); Microcontroller micro(µSocket); - QObject::connect(µ, &Microcontroller::gotTag, gotTag); QObject::connect(µ, &Microcontroller::gotTag, &items, &OverlordItemStore::gotNfcTag); QObject::connect(µ, &Microcontroller::gotItemList, &items, &OverlordItemStore::addItems); QObject::connect(µ, &Microcontroller::itemChanged, &items, &OverlordItemStore::itemStateChanged); @@ -71,5 +143,27 @@ int main(int argc, char *argv[]) Turnout::micro = µ Signal::micro = µ - return a.exec(); + QTimer timer; + timer.setSingleShot(false); + QObject::connect(&timer, &QTimer::timeout, &timer, [µ, &timer, &items](){getItemsCb(&timer, &items, µ);}); + getItemsCb(&timer, &items, µ); + + { + bool err = false; + QJsonObject json = getJsonObjectFromDisk(QString(), &err); + if(err) + { + std::cerr<<"Could not load config file\n"; + return -1; + } + layout.load(json); + } + + int ret = a.exec(); + /* + QJsonObject jsonStore; + layout.store(jsonStore); + storeJsonObjectToDisk(jsonStore); + */ + return ret; } From 29b887504dc2f9954377264c8445574a02508f86 Mon Sep 17 00:00:00 2001 From: uvos Date: Mon, 21 Mar 2022 21:23:59 +0100 Subject: [PATCH 09/10] add missing CMakeLists.txt --- CMakeLists.txt | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..b71f98e --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required(VERSION 3.5) + +project(trainController LANGUAGES CXX) + +add_subdirectory(src) From 96638d6f8d1f1a00ea077ebac77dc7fa0fe5ad5f Mon Sep 17 00:00:00 2001 From: uvos Date: Wed, 23 Mar 2022 15:00:56 +0100 Subject: [PATCH 10/10] trainoverlord: switch from train based blocking to tag based blocking --- src/CMakeLists.txt | 3 +- src/common/items/itemstore.cpp | 9 +- src/common/items/train.cpp | 13 +- src/common/items/train.h | 17 +- src/common/microcontroller.cpp | 7 +- src/common/microcontroller.h | 2 +- src/common/nfcuid.h | 18 +- src/trainOverlord/block.cpp | 208 +++++++++++++++--------- src/trainOverlord/block.h | 42 +++-- src/trainOverlord/blockborder.cpp | 43 ++++- src/trainOverlord/blockborder.h | 12 +- src/trainOverlord/layout.cpp | 76 ++++----- src/trainOverlord/layout.h | 17 +- src/trainOverlord/overlorditemstore.cpp | 12 +- src/trainOverlord/overlorditemstore.h | 7 +- src/trainOverlord/trainoverlord.cpp | 7 +- 16 files changed, 291 insertions(+), 202 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 11a92ee..fae25ab 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -4,7 +4,7 @@ set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) -set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) find_package(QT NAMES Qt6 Qt5 COMPONENTS Widgets Network SerialPort REQUIRED) @@ -23,6 +23,7 @@ set(COMMON_SOURCES ../common/items/train.h ../common/items/turnout.cpp ../common/items/turnout.h + ../common/nfcuid.h ) include_directories(PRIVATE diff --git a/src/common/items/itemstore.cpp b/src/common/items/itemstore.cpp index faf769a..5f0a0cb 100644 --- a/src/common/items/itemstore.cpp +++ b/src/common/items/itemstore.cpp @@ -37,10 +37,15 @@ void ItemStore::addItems(const std::vector>& itemIn) const uint8_t uidBytes[] = {154, 110, 34, 218}; train->tags.push_back(NfcUid(uidBytes, sizeof(uidBytes))); } + else if(train->getTrainId() == 1) + { + const uint8_t uidBytes[] = {83, 118, 122, 215}; + train->tags.push_back(NfcUid(uidBytes, sizeof(uidBytes))); + } else if(train->getTrainId() == 3) { - const uint8_t uidBytes[] = {136, 83, 111, 26}; - train->tags.push_back(NfcUid(uidBytes, sizeof(uidBytes))); + train->tags.push_back(NfcUid({83, 111, 26, 174})); + train->tags.push_back(NfcUid({83, 63, 78, 170})); } else if(train->getTrainId() == 4) { diff --git a/src/common/items/train.cpp b/src/common/items/train.cpp index 38eb6b3..cfa815a 100644 --- a/src/common/items/train.cpp +++ b/src/common/items/train.cpp @@ -44,21 +44,14 @@ void Train::reverse() micro->trainReverse(train_id_); } -int Train::ownsTag(NfcUid uid) +bool Train::ownsTag(NfcUid uid) { for(size_t i = 0; i < tags.size(); ++i) { if(uid == tags[i]) - { - if(i == 0) - return getDirection() == FORWARD ? TAG_FRONT : TAG_BACK; - else if(i == tags.size()-1) - return getDirection() == REVERSE ? TAG_FRONT : TAG_BACK; - else - return TAG_CENTER; - } + return true; } - return TAG_NONE; + return false; } bool Train::suspend() diff --git a/src/common/items/train.h b/src/common/items/train.h index 1d63e58..3b749f0 100644 --- a/src/common/items/train.h +++ b/src/common/items/train.h @@ -3,8 +3,8 @@ #include #include "item.h" -#include "../microcontroller.h" -#include "../nfcuid.h" +#include "microcontroller.h" +#include "nfcuid.h" class Train : public Item { @@ -18,10 +18,6 @@ public: static constexpr int FORWARD = 1; static constexpr int REVERSE = -1; static constexpr int TAG_FRONT = 0; - static constexpr int TAG_BACK = 1; - static constexpr int TAG_CENTER = 2; - static constexpr int TAG_NONE = -1; - static Microcontroller *micro; std::vector tags; @@ -41,15 +37,8 @@ public slots: bool resume(); bool suspendend(); int getDirection(); - int ownsTag(NfcUid uid); + bool ownsTag(NfcUid uid); bool hasBackTag(); - bool passedReader(const NfcUid &uid) - { - if(lastReader_ == uid.reader) - return false; - lastReader_ = uid.reader; - return true; - } uint8_t getTrainId() { return train_id_; diff --git a/src/common/microcontroller.cpp b/src/common/microcontroller.cpp index 553e867..a650895 100644 --- a/src/common/microcontroller.cpp +++ b/src/common/microcontroller.cpp @@ -146,13 +146,16 @@ void Microcontroller::processNfcLine(const QString& buffer) if(tokens.size() < 4) return; + if(tokens[1].startsWith("NUMBER")) + return; + NfcUid uid; - uid.reader = tokens[1].toUInt(); + uint8_t reader = tokens[1].toUInt(); tokens = tokens[3].split(':'); uid.length = tokens.length(); for(size_t i = 0; i < uid.length; ++i) uid.bytes[i] = tokens[i].toInt(); - gotTag(uid); + gotTag(reader, uid); } void Microcontroller::processList(const QString& buffer) diff --git a/src/common/microcontroller.h b/src/common/microcontroller.h index 37f760a..fa28075 100644 --- a/src/common/microcontroller.h +++ b/src/common/microcontroller.h @@ -74,7 +74,7 @@ signals: void itemChanged(ItemData relay); void auxStateChanged(int value); void gotItemList(std::vector>&); - void gotTag(NfcUid uid); + void gotTag(uint8_t reader, NfcUid uid); }; #endif // MICROCONTROLLER_H diff --git a/src/common/nfcuid.h b/src/common/nfcuid.h index 8792290..90cf3fd 100644 --- a/src/common/nfcuid.h +++ b/src/common/nfcuid.h @@ -6,10 +6,9 @@ class NfcUid { public: - uint8_t reader; uint8_t bytes[10]; uint8_t length; - bool operator==(NfcUid& in) const + bool operator==(const NfcUid& in) const { if(length != in.length) return false; @@ -20,18 +19,24 @@ public: } return true; } - bool operator!=(NfcUid& in) const + bool operator!=(const NfcUid& in) const { return !operator==(in); } NfcUid(){} - NfcUid(const uint8_t* const bytesIn, uint8_t lengthIn, uint8_t readerIn = 0): - reader(readerIn), length(lengthIn) + NfcUid(const std::initializer_list list) + { + length = list.size(); + uint8_t i = 0; + for(std::initializer_list::iterator iter = list.begin(); iter != list.end(); ++iter) + bytes[i++] = *iter; + } + NfcUid(const uint8_t* const bytesIn, uint8_t lengthIn): length(lengthIn) { for(uint8_t i = 0; i < length; ++i) bytes[i] = bytesIn[i]; } - std::string toString() + std::string toString() const { std::string str; for(uint8_t i = 0; i < length; ++i) @@ -45,3 +50,4 @@ public: }; #endif // NFCUID_H + diff --git a/src/trainOverlord/block.cpp b/src/trainOverlord/block.cpp index 63da753..0c9b23d 100644 --- a/src/trainOverlord/block.cpp +++ b/src/trainOverlord/block.cpp @@ -1,9 +1,12 @@ #include "block.h" #include +#include #include +#include "nfcuid.h" -Block::Block(uint32_t id): - id_(id) + +Block::Block(OverlordItemStore* items, uint32_t id): + items_(items), id_(id) { } @@ -13,29 +16,36 @@ void Block::addBorder(std::shared_ptr border) borders_.push_back(border); std::shared_ptr block = border->getOtherBlock(this); if(!block || block.get() == this) - { - qWarning()<<__func__<<"no other block in border"<id(); return; - } connect(block.get(), &Block::blockedChanged, this, &Block::checkWaits); } bool Block::blocked() { - if(trains_.empty() && waits_.empty()) + if(tags_.empty() && waits_.empty()) return false; return true; } -bool Block::ownsTrain(std::weak_ptr train) +bool Block::ownsTag(const NfcUid& tag) { - std::shared_ptr trainPtr = train.lock(); - if(!trainPtr) - return false; - - for(auto ownedTrain : trains_) + for(const NfcUid& candiate : tags_) { - if(ownedTrain.lock() == trainPtr) + if(candiate == tag) + return true; + } + return false; +} + +bool Block::tagIsOfOwnedTrain(const NfcUid& tag) +{ + std::shared_ptr train = items_->getTrainThatOwns(tag); + if(!train) + return false; + for(const NfcUid& canidate : tags_) + { + std::shared_ptr canidateTrain = items_->getTrainThatOwns(canidate); + if(*canidateTrain == *train) return true; } return false; @@ -53,17 +63,23 @@ bool Block::ownsBorder(std::shared_ptr border) return false; } -void Block::checkWaits(bool ign) +void Block::checkWaits(bool isBlocked) { - qDebug()<<__func__; - (void)ign; + if(isBlocked) + return; bool wasBlocked = blocked(); - for(std::vector::iterator iter = waits_.begin(); iter != waits_.end();) + for(std::vector::iterator iter = waits_.begin(); iter != waits_.end();) { + if(iter->type != WAIT_TYPE_BLOCK) + { + ++iter; + continue; + } + std::shared_ptr block = iter->targetBlock.lock(); std::shared_ptr train = iter->train.lock(); qDebug()<<__func__<<"trying to push train"<getTrainId()<<"to block"<id(); - if(block && train && train->suspendend() && block->pushTrain(iter->train)) + if(block && train && train->suspendend() && block->pushTag(iter->tag)) { train->resume(); std::shared_ptr border = iter->border.lock(); @@ -84,41 +100,89 @@ void Block::checkWaits(bool ign) blockedChanged(!wasBlocked); } -void Block::updateBorders() +bool Block::pushTag(const NfcUid& tag) { - for(std::shared_ptr broder : borders_) + if(!blocked() || tagIsOfOwnedTrain(tag)) { - broder->updateSignals(); + addTag(tag); + return true; + } + return false; +} + +void Block::removeTraverse(std::shared_ptr train) +{ + bool wasBlocked = blocked(); + for(std::vector::iterator iter = waits_.begin(); iter != waits_.end();) + { + if(iter->type == WAIT_TYPE_TIMED_TRAVERSE) + { + std::shared_ptr iterTrain = iter->train.lock(); + if(!iterTrain) + { + iter = waits_.erase(iter); + continue; + } + if(*iterTrain == *train) + { + qDebug()<<"Train"<getTrainId()<<"removed from traverse wait for block"< train = items_->getTrainThatOwns(tag); + if(!train) + return; + if(!train->hasBackTag()) + { + qDebug()<<"Train"<getTrainId()<<"added as timed traverse wait for block"< train) +void Block::addBlockWait(const NfcUid& tag, std::shared_ptr block, std::shared_ptr border) { - if(blocked()) - return false; - - addTrain(train); - return true; + std::shared_ptr train = items_->getTrainThatOwns(tag); + if(!train) + return; + Wait wait; + wait.type = WAIT_TYPE_BLOCK; + wait.train = train; + wait.direction = train->getDirection(); + wait.targetBlock = block; + wait.border = border; + wait.tag = tag; + connect(train.get(), &Train::unsuspended, this, &Block::unsuspendedTrain); + waits_.push_back(wait); + qDebug()<<"Train"<getTrainId()<<"is wating at border for block"<id(); } -void Block::addTrain(std::weak_ptr train) +void Block::addTag(const NfcUid& tag) { - std::shared_ptr trainPtr = train.lock(); - if(!trainPtr) - return; - qDebug()<<"Train"<getTrainId()<<"added to block"<::iterator iter = waits_.begin(); iter != waits_.end(); ++iter) + for(std::vector::iterator iter = waits_.begin(); iter != waits_.end(); ++iter) { std::shared_ptr workTrain = iter->train.lock(); if(!workTrain) @@ -131,45 +195,43 @@ void Block::unsuspendedTrain(uint32_t id, int direction) { std::shared_ptr block = iter->targetBlock.lock(); disconnect(workTrain.get(), &Train::unsuspended, this, &Block::unsuspendedTrain); - if(iter->direction == direction) - { - if(block) - block->addTrain(workTrain); - } - else - { - addTrain(workTrain); - } + if(block) + block->addTag(iter->tag); waits_.erase(iter); break; } } if(wasBlocked != blocked()) blockedChanged(!wasBlocked); - updateBorders(); } -void Block::removeTrain(std::weak_ptr train) +void Block::removeTag(const NfcUid& tag) { - std::shared_ptr trainPtr = train.lock(); - if(!trainPtr) - return; - - for(std::vector>::iterator iter = trains_.begin(); iter != trains_.end(); ++iter) + for(std::vector::iterator iter = tags_.begin(); iter != tags_.end(); ++iter) { - if(iter->lock() == trainPtr) + if(*iter == tag) { - qDebug()<<"Train"<getTrainId()<<"removed from to block"< borderIn, std::weak_ptr trainIn) +void Block::purgeTag(const NfcUid& tag) { - qDebug()<<__func__<<"block"< train = items_->getTrainThatOwns(tag); + if(train) + removeTraverse(train); + if(wasBlocked != blocked()) + blockedChanged(!wasBlocked); +} + +void Block::tagArrivedAtBorder(NfcUid tag, std::weak_ptr borderIn) +{ + bool wasBlocked = blocked(); + qDebug()<<__func__<<"block"< border = borderIn.lock(); if(!border) { @@ -182,37 +244,28 @@ void Block::trainArrivedAtBorder(std::weak_ptr borderIn, std::weak_ qDebug()<<"Block"<getOtherBlock(this); if(block) { - std::shared_ptr workTrain = trainIn.lock(); - if(workTrain) + if(!block->pushTag(tag)) { - if(!block->pushTrain(trainIn)) - { - workTrain->suspend(); - TrainWait wait; - wait.train = trainIn; - wait.direction = workTrain->getDirection(); - wait.targetBlock = block; - wait.border = border; - connect(workTrain.get(), &Train::unsuspended, this, &Block::unsuspendedTrain); - waits_.push_back(wait); - qDebug()<<"Train"<getTrainId()<<"is wating at border for block"<id(); - if(!block->trains_.empty() && block->trains_[0].lock()) - qDebug()<<"for train"<trains_[0].lock()->getTrainId()<<"to leave"; - } - removeTrain(workTrain); + std::shared_ptr train = items_->getTrainThatOwns(tag); + train->suspend(); + addBlockWait(tag, block, border); } + else + { + addTraverseWait(tag); + } + removeTag(tag); } if(wasBlocked != blocked()) - blockedChanged(blocked()); - updateBorders(); + blockedChanged(!wasBlocked); } void Block::store(QJsonObject &json) @@ -252,3 +305,4 @@ void Block::populate(const QJsonObject& json, Layout* layout) } } } + diff --git a/src/trainOverlord/block.h b/src/trainOverlord/block.h index dc9e9b6..4ea5d99 100644 --- a/src/trainOverlord/block.h +++ b/src/trainOverlord/block.h @@ -7,6 +7,7 @@ #include #include "blockborder.h" #include "train.h" +#include "overlorditemstore.h" class BlockBorder; class Layout; @@ -16,50 +17,59 @@ class Block: public QObject Q_OBJECT protected: static constexpr int WAIT_TYPE_BLOCK = 0; - static constexpr int WAIT_TYPE_TRAVERSE = 1; + static constexpr int WAIT_TYPE_TIMED_TRAVERSE = 1; - struct TrainWait + struct Wait { int type; int direction; + NfcUid tag; std::weak_ptr train; std::weak_ptr targetBlock; std::weak_ptr border; }; std::vector< std::shared_ptr > borders_; - std::vector< std::weak_ptr > trains_; - std::vector waits_; + std::vector tags_; + std::vector waits_; uint32_t id_; + OverlordItemStore* items_; protected slots: void unsuspendedTrain(uint32_t id, int direction); + void removeTraverse(std::shared_ptr train); protected: void checkWaits(bool blocked = false); - void updateBorders(); + void addTraverseWait(const NfcUid& tag); + void addBlockWait(const NfcUid& tag, std::shared_ptr block, std::shared_ptr border); + void removeTag(const NfcUid& tag); + bool tagIsOfOwnedTrain(const NfcUid& tag); public: - Block(uint32_t id = QRandomGenerator::global()->generate()); - void addBorder(std::shared_ptr border); - bool blocked(); - bool ownsTrain(std::weak_ptr train); - bool ownsBorder(std::shared_ptr border); - std::vector< std::shared_ptr > getBorders(){return borders_;} + Block(OverlordItemStore* items, uint32_t id = QRandomGenerator::global()->generate()); uint32_t id(){return id_;} - void removeTrain(std::weak_ptr train); + + void addBorder(std::shared_ptr border); + std::vector< std::shared_ptr > getBorders(){return borders_;} + bool ownsBorder(std::shared_ptr border); + + bool pushTag(const NfcUid& tag); + void addTag(const NfcUid& tag); + void purgeTag(const NfcUid& tag); + bool ownsTag(const NfcUid& tag); + + bool blocked(); + void store(QJsonObject& json); void load(const QJsonObject& json); void populate(const QJsonObject& json, Layout* layout); public slots: - bool pushTrain(std::weak_ptr train); - void addTrain(std::weak_ptr train); - void trainArrivedAtBorder(std::weak_ptr border, std::weak_ptr train); + void tagArrivedAtBorder(NfcUid tag, std::weak_ptr border); signals: void blockedChanged(bool blocked); - void trainAddedToBlock(int blockId, std::weak_ptr train); }; #endif // BLOCK_H diff --git a/src/trainOverlord/blockborder.cpp b/src/trainOverlord/blockborder.cpp index 13d77af..f6ec684 100644 --- a/src/trainOverlord/blockborder.cpp +++ b/src/trainOverlord/blockborder.cpp @@ -2,9 +2,9 @@ #include #include -BlockBorder::BlockBorder(uint8_t reader, std::pair, std::weak_ptr> blocks, uint32_t id): reader_(reader), blocks_(blocks), id_(id) +BlockBorder::BlockBorder(uint8_t reader, std::pair, std::weak_ptr> blocks, uint32_t id): reader_(reader), id_(id) { - + setBlocks(blocks); } bool BlockBorder::isReader(uint8_t reader) @@ -17,6 +17,17 @@ uint8_t BlockBorder::getReader() return reader_; } +void BlockBorder::setBlocks(std::pair, std::weak_ptr> blocks) +{ + blocks_ = blocks; + std::shared_ptr first = blocks.first.lock(); + if(first) + connect(first.get(), &Block::blockedChanged, this, &BlockBorder::blockedChanged); + std::shared_ptr second = blocks.second.lock(); + if(second) + connect(second.get(), &Block::blockedChanged, this, &BlockBorder::blockedChanged); +} + void BlockBorder::setSignal(std::weak_ptr signalWeak, int8_t value) { std::shared_ptr signal = signalWeak.lock(); @@ -26,6 +37,12 @@ void BlockBorder::setSignal(std::weak_ptr signalWeak, int8_t value) } } +void BlockBorder::blockedChanged(bool blocked) +{ + (void)blocked; + updateSignals(); +} + void BlockBorder::updateSignals() { for(size_t i = 0; i < signals_.size(); ++i) @@ -119,19 +136,37 @@ void BlockBorder::load(const QJsonObject& json) { if(arrayObj.isObject()) { - signalIds_.push_back(std::pair(static_cast(json["SignalId"].toDouble(INT32_MAX)), static_cast(json["Direction"].toDouble(0)))); + QJsonObject arrayObjObj = arrayObj.toObject(); + signalIds_.push_back(std::pair(static_cast(arrayObjObj["SignalId"].toDouble(INT32_MAX)), static_cast(arrayObjObj["Direction"].toDouble(0)))); } } } -void BlockBorder::informOfSignal(std::shared_ptr signal) +bool BlockBorder::hasMissingSingal() { + for(auto& signal : signalIds_) + { + qDebug()<<"Missing signal id:"< item) +{ + std::shared_ptr workItem = item.lock(); + if(!workItem) + return; + std::shared_ptr signal = std::dynamic_pointer_cast(workItem); + if(!signal) + return; for(const std::pair& signalPair : signalIds_) { if(signalPair.first == signal->getSignalId()) { signals_.push_back(signal); signalDirections_.push_back(signalPair.second); + qDebug()<<"Border"<getSignalId(); } } + std::erase_if(signalIds_, [signal](std::pair pair) -> bool{return pair.first == signal->getSignalId();}); } diff --git a/src/trainOverlord/blockborder.h b/src/trainOverlord/blockborder.h index 8c4bca2..8d72457 100644 --- a/src/trainOverlord/blockborder.h +++ b/src/trainOverlord/blockborder.h @@ -3,12 +3,14 @@ #include "trainsignal.h" #include "block.h" #include +#include class Block; class Layout; -class BlockBorder +class BlockBorder: public QObject { +Q_OBJECT private: uint64_t reader_; uint32_t id_; @@ -26,13 +28,17 @@ public: void updateSignals(); std::shared_ptr getOtherBlock(Block* block); std::pair, std::weak_ptr> getBlocks(){return blocks_;} - void setBlocks(std::pair, std::weak_ptr> blocks){blocks_ = blocks;} + void setBlocks(std::pair, std::weak_ptr> blocks); void addSignal(std::weak_ptr signal, std::shared_ptr block); - void informOfSignal(std::shared_ptr signal); + void informOfItem(std::weak_ptr item); + bool hasMissingSingal(); std::shared_ptr getOverlap(BlockBorder* border); uint32_t id() {return id_;} void store(QJsonObject& json); void load(const QJsonObject& json); + +public slots: + void blockedChanged(bool blocked); }; #endif // BLOCKBORDER_H diff --git a/src/trainOverlord/layout.cpp b/src/trainOverlord/layout.cpp index 39e32a9..8c27735 100644 --- a/src/trainOverlord/layout.cpp +++ b/src/trainOverlord/layout.cpp @@ -2,39 +2,32 @@ #include #include -Layout::Layout(QObject *parent): QObject{parent} +Layout::Layout(OverlordItemStore* items, QObject *parent): QObject{parent}, items_(items) { } -void Layout::itemAdded(std::weak_ptr itemIn) -{ - std::shared_ptr item = itemIn.lock(); - if(!item) - return; - std::shared_ptr train = std::dynamic_pointer_cast(item); - std::shared_ptr signal = std::dynamic_pointer_cast(item); -} - -void Layout::removeTrainFromAllBlocks(std::shared_ptr train) +void Layout::removeTagFromAllBlocks(const NfcUid& tag) { for(std::shared_ptr block : blocks_) - block->removeTrain(train); + { + block->purgeTag(tag); + } } -void Layout::registerTrainInLimbo(std::shared_ptr train, std::shared_ptr border) +void Layout::registerTagInLimbo(const NfcUid& tag, std::shared_ptr border) { - for(auto iter = trainLimbo_.begin(); iter != trainLimbo_.end(); ++iter) + for(auto iter = limbo_.begin(); iter != limbo_.end(); ++iter) { - std::shared_ptr limboTrain = iter->first.lock(); + NfcUid limboTag = iter->first; std::shared_ptr limboBorder = iter->second.lock(); - if(!limboTrain || !limboBorder) + if(!limboBorder) { - trainLimbo_.erase(iter); - registerTrainInLimbo(train, border); + limbo_.erase(iter); + registerTagInLimbo(tag, border); return; } - if(*train == *limboTrain) + if(limboTag == tag) { if(border == limboBorder) return; @@ -42,10 +35,10 @@ void Layout::registerTrainInLimbo(std::shared_ptr train, std::shared_ptr< std::shared_ptr overlap = border->getOverlap(limboBorder.get()); if(overlap) { - qDebug()<<"Train"<getTrainId()<<"removed from limbo and added to block"<id()<<"while crossing border"<id(); - overlap->addTrain(train); - overlap->trainArrivedAtBorder(border, train); - trainLimbo_.erase(iter); + qDebug()<<"Tag"<id()<<"while crossing border"<id(); + overlap->addTag(tag); + overlap->tagArrivedAtBorder(tag, border); + limbo_.erase(iter); return; } else @@ -59,12 +52,12 @@ void Layout::registerTrainInLimbo(std::shared_ptr train, std::shared_ptr< std::shared_ptr first = border->getBlocks().first.lock(); std::shared_ptr second = border->getBlocks().second.lock(); - qDebug()<<"Train"<getTrainId()<<"added to limbo between block"<< + qDebug()<<"Tag"<id()) : "invalid")<<"and block"<<(second ? QString::number(second->id()) : "invalid"); - trainLimbo_.push_back(std::pair, std::weak_ptr>(train, border)); + limbo_.push_back(std::pair>(tag, border)); } -void Layout::trainArrivedAtReader(uint8_t reader, std::shared_ptr train, int tagType) +void Layout::tagArrivedAtReader(uint8_t reader, NfcUid tag) { std::shared_ptr border; for(std::shared_ptr borderTest : borders_) @@ -80,29 +73,31 @@ void Layout::trainArrivedAtReader(uint8_t reader, std::shared_ptr train, qWarning()<<"reader "<getTrainId()<<"arrived at border"<id(); - bool trainHandled = false; - for(std::shared_ptr block : blocks_) + std::shared_ptr train = items_->getTrainThatOwns(tag); + qDebug()<<"Train"<<(train ? train->getTrainId() : -1)<<"Tag"<id(); + + bool tagHandled = false; + for(std::shared_ptr& block : blocks_) { - if(block->ownsTrain(train)) + if(block->ownsTag(tag)) { - trainHandled = true; + tagHandled = true; if(block->ownsBorder(border)) { - block->trainArrivedAtBorder(border, train); + block->tagArrivedAtBorder(tag, border); } else { - removeTrainFromAllBlocks(train); - registerTrainInLimbo(train, border); + removeTagFromAllBlocks(tag); + registerTagInLimbo(tag, border); } break; } } - if(!trainHandled) - registerTrainInLimbo(train, border); + if(!tagHandled) + registerTagInLimbo(tag, border); } void Layout::addBlock(std::shared_ptr block) @@ -166,7 +161,7 @@ void Layout::load(const QJsonObject& json) { const QJsonObject jsonObject = object.toObject(); blockJsonObjects.push_back(jsonObject); - std::shared_ptr block(new Block); + std::shared_ptr block(new Block(items_)); block->load(jsonObject); blocks_.push_back(block); } @@ -203,13 +198,18 @@ void Layout::load(const QJsonObject& json) first = block; else if(!second) second = block; - else if(!second) + else qWarning()<<"border with id"<id()<<"is assigned to more than 2 blocks"; } } if(!first || !second) qWarning()<<"border with id"<id()<<"is assigned to less than than 2 blocks"; border->setBlocks(std::pair, std::weak_ptr>(first, second)); + + for(std::shared_ptr& item : *items_->getItems()) + border->informOfItem(item); + + connect(items_, &ItemStore::itemAdded, border.get(), &BlockBorder::informOfItem); } for(size_t i = 0; i < blocks_.size(); ++i) diff --git a/src/trainOverlord/layout.h b/src/trainOverlord/layout.h index fcb8ab3..7bbe6fe 100644 --- a/src/trainOverlord/layout.h +++ b/src/trainOverlord/layout.h @@ -6,6 +6,7 @@ #include #include "block.h" +#include "overlorditemstore.h" #include "blockborder.h" #include "microcontroller.h" #include "itemstore.h" @@ -18,13 +19,15 @@ private: private: std::vector> blocks_; std::vector> borders_; - std::vector, std::weak_ptr>> trainLimbo_; + std::vector>> limbo_; - void removeTrainFromAllBlocks(std::shared_ptr train); - void registerTrainInLimbo(std::shared_ptr train, std::shared_ptr); + void removeTagFromAllBlocks(const NfcUid& tag); + void registerTagInLimbo(const NfcUid& tag, std::shared_ptr); + + OverlordItemStore *items_; public: - explicit Layout(QObject *parent = nullptr); + explicit Layout(OverlordItemStore *items, QObject *parent = nullptr); void addBlock(std::shared_ptr block); void addBorder(std::shared_ptr border); void store(QJsonObject& json); @@ -33,11 +36,7 @@ public: std::shared_ptr getBlock(uint32_t id); public slots: - void trainArrivedAtReader(uint8_t reader, std::shared_ptr train, int tagType); - void itemAdded(std::weak_ptr item); - -signals: - void trainArrivedAtBorder(std::weak_ptr, std::weak_ptr train, int tagType); + void tagArrivedAtReader(uint8_t reader, NfcUid tag); }; #endif // BLOCKSTORE_H diff --git a/src/trainOverlord/overlorditemstore.cpp b/src/trainOverlord/overlorditemstore.cpp index 9222d9a..4e3c0f3 100644 --- a/src/trainOverlord/overlorditemstore.cpp +++ b/src/trainOverlord/overlorditemstore.cpp @@ -6,19 +6,15 @@ OverlordItemStore::OverlordItemStore(QObject *parent): ItemStore(parent) { } -void OverlordItemStore::gotNfcTag(NfcUid uid) +std::shared_ptr OverlordItemStore::getTrainThatOwns(const NfcUid& uid) { for(std::shared_ptr item : items_) { std::shared_ptr train = std::dynamic_pointer_cast(item); if(!train) continue; - int owns = train->ownsTag(uid); - if(owns == Train::TAG_FRONT || owns == Train::TAG_BACK) - { - qDebug()<<"Train"<getTrainId()<<"arrived at reader"<ownsTag(uid)) + return train; } + return std::shared_ptr(); } diff --git a/src/trainOverlord/overlorditemstore.h b/src/trainOverlord/overlorditemstore.h index 42123c3..92f3954 100644 --- a/src/trainOverlord/overlorditemstore.h +++ b/src/trainOverlord/overlorditemstore.h @@ -7,10 +7,5 @@ class OverlordItemStore: public ItemStore Q_OBJECT public: OverlordItemStore(QObject *parent = nullptr); - -public slots: - void gotNfcTag(NfcUid); - -signals: - void trainArrivedAtReader(uint8_t reader, std::shared_ptr train, int tagType); + std::shared_ptr getTrainThatOwns(const NfcUid& uid); }; diff --git a/src/trainOverlord/trainoverlord.cpp b/src/trainOverlord/trainoverlord.cpp index eee419a..5202293 100644 --- a/src/trainOverlord/trainoverlord.cpp +++ b/src/trainOverlord/trainoverlord.cpp @@ -129,13 +129,10 @@ int main(int argc, char *argv[]) } OverlordItemStore items; - Layout layout; - - QObject::connect(&items, &OverlordItemStore::itemAdded, &layout, &Layout::itemAdded); - QObject::connect(&items, &OverlordItemStore::trainArrivedAtReader, &layout, &Layout::trainArrivedAtReader); + Layout layout(&items); Microcontroller micro(µSocket); - QObject::connect(µ, &Microcontroller::gotTag, &items, &OverlordItemStore::gotNfcTag); + QObject::connect(µ, &Microcontroller::gotTag, &layout, &Layout::tagArrivedAtReader); QObject::connect(µ, &Microcontroller::gotItemList, &items, &OverlordItemStore::addItems); QObject::connect(µ, &Microcontroller::itemChanged, &items, &OverlordItemStore::itemStateChanged);