inital commit
This commit is contained in:
		
						commit
						fede535b95
					
				
					 32 changed files with 2357 additions and 0 deletions
				
			
		
							
								
								
									
										18
									
								
								src/auxitem.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								src/auxitem.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,18 @@ | ||||||
|  | #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); | ||||||
|  | } | ||||||
							
								
								
									
										20
									
								
								src/auxitem.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								src/auxitem.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,20 @@ | ||||||
|  | #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); | ||||||
|  | }; | ||||||
							
								
								
									
										18
									
								
								src/items/auxitem.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								src/items/auxitem.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,18 @@ | ||||||
|  | #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); | ||||||
|  | } | ||||||
							
								
								
									
										20
									
								
								src/items/auxitem.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								src/items/auxitem.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,20 @@ | ||||||
|  | #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); | ||||||
|  | }; | ||||||
							
								
								
									
										62
									
								
								src/items/item.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								src/items/item.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,62 @@ | ||||||
|  | #include "item.h" | ||||||
|  | #include "../microcontroller.h" | ||||||
|  | 
 | ||||||
|  | #include <QJsonArray> | ||||||
|  | 
 | ||||||
|  | ItemData::ItemData(uint32_t itemIdIn, QString name, uint8_t value): name_(name), value_(value), itemId_(itemIdIn) | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | QString ItemData::getName() const | ||||||
|  | { | ||||||
|  |     return name_; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void ItemData::setName(QString name) | ||||||
|  | { | ||||||
|  |     name_ = name; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | uint8_t ItemData::getValue() const | ||||||
|  | { | ||||||
|  |     return value_; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | uint32_t ItemData::id() const | ||||||
|  | { | ||||||
|  |     return  itemId_; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | //item
 | ||||||
|  | 
 | ||||||
|  | Item::Item(uint32_t itemIdIn, QString name, uint8_t value,  QObject *parent): QObject(parent), ItemData (itemIdIn, name, value) | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | Item::Item(const ItemData& itemData,  QObject *parent): QObject(parent), ItemData(itemData) | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | Item::~Item() | ||||||
|  | { | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void Item::setFunction(uint8_t function, bool on) | ||||||
|  | { | ||||||
|  |     functionChanged(function, on); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void Item::setValue(uint8_t value) | ||||||
|  | { | ||||||
|  |     value_ = value; | ||||||
|  |     valueChanged(value_); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void Item::informValue(uint8_t value) | ||||||
|  | { | ||||||
|  |     Item::setValue(value); | ||||||
|  | } | ||||||
							
								
								
									
										58
									
								
								src/items/item.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								src/items/item.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,58 @@ | ||||||
|  | #pragma once | ||||||
|  | #include <QObject> | ||||||
|  | #include <vector> | ||||||
|  | #include <QRandomGenerator> | ||||||
|  | #include <QSettings> | ||||||
|  | #include <QJsonObject> | ||||||
|  | #include <memory> | ||||||
|  | 
 | ||||||
|  | class Actor; | ||||||
|  | 
 | ||||||
|  | class ItemData | ||||||
|  | { | ||||||
|  | protected: | ||||||
|  |     QString name_; | ||||||
|  |     uint8_t value_; | ||||||
|  |     uint32_t itemId_; | ||||||
|  | 
 | ||||||
|  | public: | ||||||
|  | 
 | ||||||
|  |     ItemData(uint32_t itemIdIn = QRandomGenerator::global()->generate(), QString name = "Item", uint8_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_; } | ||||||
|  | 
 | ||||||
|  |     uint32_t id() const; | ||||||
|  | 
 | ||||||
|  |     void setName(QString name); | ||||||
|  |     uint8_t getValue() const; | ||||||
|  |     virtual QString getName() const; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class Item: public QObject, public ItemData | ||||||
|  | { | ||||||
|  |     Q_OBJECT | ||||||
|  | private: | ||||||
|  | 
 | ||||||
|  | signals: | ||||||
|  | 
 | ||||||
|  |     void valueChanged(uint8_t value); | ||||||
|  |     void functionChanged(uint8_t function, bool on); | ||||||
|  | 
 | ||||||
|  | public slots: | ||||||
|  | 
 | ||||||
|  |     virtual void setValue(uint8_t value); | ||||||
|  |     virtual void setFunction(uint8_t funciton, bool value); | ||||||
|  | 
 | ||||||
|  | public: | ||||||
|  | 
 | ||||||
|  |     Item(uint32_t itemIdIn = QRandomGenerator::global()->generate(), QString name = "Item", uint8_t value = 0,  QObject *parent = nullptr); | ||||||
|  |     Item(const ItemData& itemData,  QObject *parent = nullptr); | ||||||
|  | 
 | ||||||
|  |     virtual ~Item(); | ||||||
|  | 
 | ||||||
|  |     void informValue(uint8_t value); | ||||||
|  | 
 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
							
								
								
									
										59
									
								
								src/items/itemstore.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								src/items/itemstore.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,59 @@ | ||||||
|  | #include "itemstore.h" | ||||||
|  | #include <QJsonArray> | ||||||
|  | 
 | ||||||
|  | ItemStore::ItemStore(QObject *parent): QObject(parent) | ||||||
|  | { | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void ItemStore::addItem(std::shared_ptr<Item> 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>(item)); | ||||||
|  |         itemAdded(std::weak_ptr<Item>(items_.back())); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void ItemStore::addItems(const std::vector<std::shared_ptr<Item>>& itemIn) | ||||||
|  | { | ||||||
|  |     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; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 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()); | ||||||
|  |          } | ||||||
|  | 
 | ||||||
|  |      } | ||||||
|  | 
 | ||||||
|  | } | ||||||
							
								
								
									
										34
									
								
								src/items/itemstore.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								src/items/itemstore.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,34 @@ | ||||||
|  | #pragma once | ||||||
|  | #include <vector> | ||||||
|  | #include <memory> | ||||||
|  | #include "item.h" | ||||||
|  | 
 | ||||||
|  | #include <QJsonObject> | ||||||
|  | 
 | ||||||
|  | class ItemStore: public QObject | ||||||
|  | { | ||||||
|  |     Q_OBJECT | ||||||
|  | private: | ||||||
|  |     std::vector< std::shared_ptr<Item> > items_; | ||||||
|  | 
 | ||||||
|  | public: | ||||||
|  | 
 | ||||||
|  |     ItemStore(QObject *parent = nullptr); | ||||||
|  |     virtual ~ItemStore(){} | ||||||
|  | 
 | ||||||
|  |     inline std::vector< std::shared_ptr<Item> >* getItems(){ return &items_; } | ||||||
|  | 
 | ||||||
|  |     void clear(); | ||||||
|  | 
 | ||||||
|  | signals: | ||||||
|  | 
 | ||||||
|  |     void itemDeleted(ItemData item); | ||||||
|  |     void itemAdded(std::weak_ptr<Item> Item); | ||||||
|  | 
 | ||||||
|  | public slots: | ||||||
|  | 
 | ||||||
|  |     void removeItem(const ItemData& item); | ||||||
|  |     void addItem(std::shared_ptr<Item> item); | ||||||
|  |     void addItems(const std::vector<std::shared_ptr<Item>>& itemsIn); | ||||||
|  |     void itemStateChanged(const ItemData& item); | ||||||
|  | }; | ||||||
							
								
								
									
										32
									
								
								src/items/train.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								src/items/train.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,32 @@ | ||||||
|  | #include "train.h" | ||||||
|  | 
 | ||||||
|  | Train::Train(uint8_t id, uint8_t address, uint8_t functionMask): | ||||||
|  |   functionMask_(functionMask), | ||||||
|  |   train_id_(id) | ||||||
|  | { | ||||||
|  |     itemId_ = address; | ||||||
|  |     name_ = QString("Train ")+QString::number(id); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | Microcontroller *Train::micro = nullptr; | ||||||
|  | 
 | ||||||
|  | void Train::setFunction(uint8_t funciton, bool value) | ||||||
|  | { | ||||||
|  |     Item::setFunction(funciton, value); | ||||||
|  |     if(micro) | ||||||
|  |         micro->itemSetFunction(train_id_, funciton, value); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void Train::setValue(uint8_t value) | ||||||
|  | { | ||||||
|  |     Item::setValue(value); | ||||||
|  |     if(micro) | ||||||
|  |         micro->itemSetSpeed(train_id_, value); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void Train::reverse() | ||||||
|  | { | ||||||
|  |     if(micro) | ||||||
|  |         micro->itemReverse(train_id_); | ||||||
|  | } | ||||||
|  | 
 | ||||||
							
								
								
									
										25
									
								
								src/items/train.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								src/items/train.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,25 @@ | ||||||
|  | #ifndef TRAIN_H | ||||||
|  | #define TRAIN_H | ||||||
|  | 
 | ||||||
|  | #include "item.h" | ||||||
|  | #include "../microcontroller.h" | ||||||
|  | 
 | ||||||
|  | class Train : public Item | ||||||
|  | { | ||||||
|  |     Q_OBJECT | ||||||
|  |     uint8_t functionMask_; | ||||||
|  |     uint8_t train_id_; | ||||||
|  | public: | ||||||
|  |     static Microcontroller *micro; | ||||||
|  | 
 | ||||||
|  |     Train(uint8_t id = 0, uint8_t address = 0, uint8_t functionMask = 0); | ||||||
|  | 
 | ||||||
|  |     uint8_t getFunctionMask() {return functionMask_;} | ||||||
|  | 
 | ||||||
|  | public slots: | ||||||
|  |     void reverse(); | ||||||
|  |     virtual void setFunction(uint8_t function, bool on); | ||||||
|  |     virtual void setValue(uint8_t value); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | #endif // TRAIN_H
 | ||||||
							
								
								
									
										106
									
								
								src/main.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										106
									
								
								src/main.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,106 @@ | ||||||
|  | #include <QtWidgets/QApplication> | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <QDebug> | ||||||
|  | #include <QTcpSocket> | ||||||
|  | #include <QMessageBox> | ||||||
|  | #include <QtSerialPort/QtSerialPort> | ||||||
|  | #include <QtSerialPort/QSerialPortInfo> | ||||||
|  | #include <QCommandLineParser> | ||||||
|  | 
 | ||||||
|  | #include "microcontroller.h" | ||||||
|  | #include "ui/mainwindow.h" | ||||||
|  | #include "items/itemstore.h" | ||||||
|  | #include "items/train.h" | ||||||
|  | 
 | ||||||
|  | #define BAUD  QSerialPort::Baud38400 | ||||||
|  | 
 | ||||||
|  | int main(int argc, char *argv[]) | ||||||
|  | { | ||||||
|  |     QApplication a(argc, argv); | ||||||
|  | 
 | ||||||
|  |     //set info
 | ||||||
|  |     QCoreApplication::setOrganizationName("UVOS"); | ||||||
|  |     QCoreApplication::setOrganizationDomain("uvos.xyz"); | ||||||
|  |     QCoreApplication::setApplicationName("traincontrollerui"); | ||||||
|  |     QCoreApplication::setApplicationVersion("0.1"); | ||||||
|  | 
 | ||||||
|  |     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); | ||||||
|  | 
 | ||||||
|  |     QIODevice* masterIODevice = nullptr; | ||||||
|  | 
 | ||||||
|  |     if(parser.isSet(tcpOption)) | ||||||
|  |     { | ||||||
|  |         QTcpSocket* microSocket = new QTcpSocket; | ||||||
|  | 
 | ||||||
|  |         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 "<<host.toStdString()<<':'<<port<<'\n'; | ||||||
|  |         microSocket->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(!microPort->open(QIODevice::ReadWrite)) | ||||||
|  |         { | ||||||
|  |             QMessageBox::critical(nullptr, "Error", QString("Can not open serial port ")+microPort->portName()); | ||||||
|  |             std::cout<<"Can not open serial port "<<microPort->portName().toStdString()<<". Continueing in demo mode"<<'\n'; | ||||||
|  |             return 1; | ||||||
|  |         } | ||||||
|  |         masterIODevice = microPort; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     Microcontroller micro(masterIODevice); | ||||||
|  |     micro.setPower(true); | ||||||
|  | 
 | ||||||
|  |     Train::micro = µ | ||||||
|  | 
 | ||||||
|  |     ItemStore items; | ||||||
|  | 
 | ||||||
|  |     QObject::connect(µ, &Microcontroller::gotItemList, &items, &ItemStore::addItems); | ||||||
|  | 
 | ||||||
|  |     //mainwindow
 | ||||||
|  |     MainWindow w(µ, &items); | ||||||
|  | 
 | ||||||
|  |     w.show(); | ||||||
|  | 
 | ||||||
|  |     int retVal = a.exec(); | ||||||
|  |     micro.setPower(false); | ||||||
|  | 
 | ||||||
|  |     if(masterIODevice) | ||||||
|  |         delete masterIODevice; | ||||||
|  |     return retVal; | ||||||
|  | } | ||||||
|  | 
 | ||||||
							
								
								
									
										14
									
								
								src/mainobject.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								src/mainobject.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,14 @@ | ||||||
|  | #include "mainobject.h" | ||||||
|  | 
 | ||||||
|  | MainObject::MainObject(QIODevice* ioDevice) : | ||||||
|  |     masterIODevice(ioDevice), | ||||||
|  |     micro(masterIODevice) | ||||||
|  | { | ||||||
|  |     //connect item store
 | ||||||
|  |     QObject::connect(µ, &Microcontroller::gotItemList, &items, &ItemStore::addItems); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | MainObject::~MainObject() | ||||||
|  | { | ||||||
|  | } | ||||||
|  | 
 | ||||||
							
								
								
									
										47
									
								
								src/mainobject.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								src/mainobject.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,47 @@ | ||||||
|  | #ifndef MAINOBJECT_H | ||||||
|  | #define MAINOBJECT_H | ||||||
|  | 
 | ||||||
|  | #include <QObject> | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <QDir> | ||||||
|  | #include <QDebug> | ||||||
|  | #include <QString> | ||||||
|  | #include <QTcpSocket> | ||||||
|  | #include <QFileInfo> | ||||||
|  | #include <QJsonDocument> | ||||||
|  | #include <QStandardPaths> | ||||||
|  | #include <memory> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifndef Q_OS_ANDROID | ||||||
|  | #include <QtSerialPort/QtSerialPort> | ||||||
|  | #include <QtSerialPort/QSerialPortInfo> | ||||||
|  | #include <QCommandLineParser> | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #include "microcontroller.h" | ||||||
|  | #include "ui/mainwindow.h" | ||||||
|  | #include "items/itemstore.h" | ||||||
|  | #include "items/auxitem.h" | ||||||
|  | 
 | ||||||
|  | class MainObject : public QObject | ||||||
|  | { | ||||||
|  |     Q_OBJECT | ||||||
|  | public: | ||||||
|  | 
 | ||||||
|  |     //io
 | ||||||
|  |     QIODevice * const masterIODevice = nullptr; | ||||||
|  | 
 | ||||||
|  |     Microcontroller micro; | ||||||
|  | 
 | ||||||
|  |     const QString settingsPath; | ||||||
|  | 
 | ||||||
|  |     //items
 | ||||||
|  |     ItemStore items; | ||||||
|  | 
 | ||||||
|  | public: | ||||||
|  |     explicit MainObject(QIODevice* ioDevice); | ||||||
|  |     ~MainObject(); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | #endif // MAINOBJECT_H
 | ||||||
							
								
								
									
										166
									
								
								src/microcontroller.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										166
									
								
								src/microcontroller.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,166 @@ | ||||||
|  | #include "microcontroller.h" | ||||||
|  | 
 | ||||||
|  | #include <chrono> | ||||||
|  | #include <thread> | ||||||
|  | #include "items/train.h" | ||||||
|  | 
 | ||||||
|  | void Microcontroller::itemSetSpeed(uint8_t id, uint8_t speed) | ||||||
|  | { | ||||||
|  |     qDebug()<<__func__; | ||||||
|  |     std::stringstream ss; | ||||||
|  |     ss<<"train "<<(unsigned)id<<" speed "<<(unsigned)speed<<'\n'; | ||||||
|  |     write(ss.str().c_str()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void Microcontroller::itemReverse(uint8_t id) | ||||||
|  | { | ||||||
|  |     std::stringstream ss; | ||||||
|  |     ss<<"train "<<(unsigned)id<<" reverse\n"; | ||||||
|  |     write(ss.str().c_str()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void Microcontroller::itemSetFunction(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()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void Microcontroller::setPower(bool on) | ||||||
|  | { | ||||||
|  |     write(on ? "power on\n" : "power off\n"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void Microcontroller::estop() | ||||||
|  | { | ||||||
|  |     write("stop\n"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void Microcontroller::write(const QByteArray& buffer) | ||||||
|  | { | ||||||
|  |     qDebug()<<buffer; | ||||||
|  |     if(_port != nullptr) | ||||||
|  |     { | ||||||
|  |         _port->write(buffer); | ||||||
|  |         _port->waitForBytesWritten(1000); | ||||||
|  |     } | ||||||
|  |     std::this_thread::sleep_for(std::chrono::milliseconds(40)); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void Microcontroller::write(char* buffer, const size_t length) | ||||||
|  | { | ||||||
|  |     qDebug()<<buffer; | ||||||
|  |     if(_port != nullptr) | ||||||
|  |     { | ||||||
|  |         _port->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; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void Microcontroller::requestState() | ||||||
|  | { | ||||||
|  |    write("train list\n"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | //housekeeping
 | ||||||
|  | 
 | ||||||
|  | Microcontroller::Microcontroller(QIODevice* port) | ||||||
|  | { | ||||||
|  |     setIODevice(port); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | Microcontroller::Microcontroller() | ||||||
|  | { | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | Microcontroller::~Microcontroller() | ||||||
|  | { | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void Microcontroller::setIODevice(QIODevice *port) | ||||||
|  | { | ||||||
|  |     _port = port; | ||||||
|  |     QObject::connect(_port, &QIODevice::readyRead, this, &Microcontroller::isReadyRead); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | std::shared_ptr<Item> Microcontroller::processTrainLine(const QString& buffer) | ||||||
|  | { | ||||||
|  |     QStringList bufferList = buffer.split(' '); | ||||||
|  |     if(bufferList.size() >= 9 && buffer.startsWith("NUMBER:")) | ||||||
|  |     { | ||||||
|  |         return std::shared_ptr<Item>(new Train(bufferList[1].toInt(), bufferList[3].toInt(), bufferList[12].toInt())); | ||||||
|  |     } | ||||||
|  |     return  nullptr; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void Microcontroller::processList(const QString& buffer) | ||||||
|  | { | ||||||
|  |     QStringList bufferList = buffer.split(' '); | ||||||
|  |     if(bufferList.size() >= 13 && buffer.startsWith("NUMBER:")) | ||||||
|  |     { | ||||||
|  |         itemList.push_back(processTrainLine(buffer)); | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         listMode = false; | ||||||
|  |         if(!itemList.empty()) | ||||||
|  |         { | ||||||
|  |             qDebug()<<"got item list " << itemList.size(); | ||||||
|  |             gotItemList(itemList); | ||||||
|  |             itemList.clear(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void Microcontroller::processItemState(const QString& buffer) | ||||||
|  | { | ||||||
|  |     itemChanged(static_cast<ItemData>(*processTrainLine(buffer))); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | void Microcontroller::processMicroReturn() | ||||||
|  | { | ||||||
|  |     if(listMode) | ||||||
|  |         processList(_buffer); | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         if(_buffer.startsWith("Trains:")) | ||||||
|  |         { | ||||||
|  |             listMode = true; | ||||||
|  |             itemList.clear(); | ||||||
|  |         } | ||||||
|  |         else if(_buffer.startsWith("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(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										78
									
								
								src/microcontroller.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								src/microcontroller.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,78 @@ | ||||||
|  | #ifndef MICROCONTROLLER_H | ||||||
|  | #define MICROCONTROLLER_H | ||||||
|  | 
 | ||||||
|  | #include <iostream> | ||||||
|  | 
 | ||||||
|  | #include <QObject> | ||||||
|  | #include <QColor> | ||||||
|  | #include <QIODevice> | ||||||
|  | #include <QString> | ||||||
|  | #include <QRunnable> | ||||||
|  | #include <QDebug> | ||||||
|  | #include <QEventLoop> | ||||||
|  | #include <QTimer> | ||||||
|  | #include <QAbstractButton> | ||||||
|  | #include <vector> | ||||||
|  | #include <memory> | ||||||
|  | #include <sstream> | ||||||
|  | #include "items/item.h" | ||||||
|  | 
 | ||||||
|  | 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: | ||||||
|  | 
 | ||||||
|  |     bool listMode = false; | ||||||
|  | 
 | ||||||
|  |     //uint8_t _auxState = 0;
 | ||||||
|  | 
 | ||||||
|  |     QIODevice* _port = nullptr; | ||||||
|  | 
 | ||||||
|  |     std::vector< std::shared_ptr<Item> > itemList; | ||||||
|  | 
 | ||||||
|  |     QScopedPointer<QEventLoop> loop; | ||||||
|  |     QString _buffer; | ||||||
|  | 
 | ||||||
|  |     void processMicroReturn(); | ||||||
|  |     void processList(const QString& buffer); | ||||||
|  |     void processItemState(const QString& buffer); | ||||||
|  |     std::shared_ptr<Item> processTrainLine(const QString& 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); | ||||||
|  | 
 | ||||||
|  | public slots: | ||||||
|  |     void requestState(); | ||||||
|  | 
 | ||||||
|  |     void itemSetSpeed(uint8_t id, uint8_t speed); | ||||||
|  |     void itemReverse(uint8_t id); | ||||||
|  |     void itemSetFunction(uint8_t id, uint8_t function, bool on); | ||||||
|  |     void estop(); | ||||||
|  |     void setPower(bool on); | ||||||
|  | 
 | ||||||
|  | private slots: | ||||||
|  |     void isReadyRead(); | ||||||
|  | 
 | ||||||
|  | signals: | ||||||
|  |     void textRecived(const QString string); | ||||||
|  |     void itemChanged(ItemData relay); | ||||||
|  |     void auxStateChanged(int value); | ||||||
|  |     void gotItemList(std::vector< std::shared_ptr<Item> >&); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | #endif // MICROCONTROLLER_H
 | ||||||
							
								
								
									
										142
									
								
								src/ui/alarmsettingsdialog.ui.orig
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										142
									
								
								src/ui/alarmsettingsdialog.ui.orig
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,142 @@ | ||||||
|  | <?xml version="1.0" encoding="UTF-8"?> | ||||||
|  | <ui version="4.0"> | ||||||
|  |  <class>AlarmSettingsDialog</class> | ||||||
|  |  <widget class="QDialog" name="AlarmSettingsDialog"> | ||||||
|  |   <property name="geometry"> | ||||||
|  |    <rect> | ||||||
|  |     <x>0</x> | ||||||
|  |     <y>0</y> | ||||||
|  |     <width>423</width> | ||||||
|  |     <height>281</height> | ||||||
|  |    </rect> | ||||||
|  |   </property> | ||||||
|  |   <property name="windowTitle"> | ||||||
|  |    <string>Dialog</string> | ||||||
|  |   </property> | ||||||
|  |   <layout class="QVBoxLayout" name="verticalLayout"> | ||||||
|  |    <item> | ||||||
|  |     <widget class="QLabel" name="label"> | ||||||
|  |      <property name="text"> | ||||||
|  |       <string>Sound File:</string> | ||||||
|  |      </property> | ||||||
|  |     </widget> | ||||||
|  |    </item> | ||||||
|  |    <item> | ||||||
|  |     <layout class="QHBoxLayout" name="horizontalLayout"> | ||||||
|  |      <property name="leftMargin"> | ||||||
|  |       <number>0</number> | ||||||
|  |      </property> | ||||||
|  |      <property name="topMargin"> | ||||||
|  |       <number>0</number> | ||||||
|  |      </property> | ||||||
|  |      <item> | ||||||
|  |       <widget class="QLineEdit" name="lineEdit"> | ||||||
|  |        <property name="enabled"> | ||||||
|  |         <bool>false</bool> | ||||||
|  |        </property> | ||||||
|  |       </widget> | ||||||
|  |      </item> | ||||||
|  |      <item> | ||||||
|  |       <widget class="QPushButton" name="pushButton"> | ||||||
|  |        <property name="text"> | ||||||
|  |         <string>Change</string> | ||||||
|  |        </property> | ||||||
|  |       </widget> | ||||||
|  |      </item> | ||||||
|  |     </layout> | ||||||
|  |    </item> | ||||||
|  |    <item> | ||||||
|  |     <layout class="QHBoxLayout" name="horizontalLayout_2"> | ||||||
|  |      <property name="topMargin"> | ||||||
|  |       <number>0</number> | ||||||
|  |      </property> | ||||||
|  |      <item> | ||||||
|  |       <widget class="QLabel" name="label_2"> | ||||||
|  |        <property name="text"> | ||||||
|  |         <string>Sunrise</string> | ||||||
|  |        </property> | ||||||
|  |       </widget> | ||||||
|  |      </item> | ||||||
|  |      <item> | ||||||
|  |       <spacer name="horizontalSpacer"> | ||||||
|  |        <property name="orientation"> | ||||||
|  |         <enum>Qt::Horizontal</enum> | ||||||
|  |        </property> | ||||||
|  |        <property name="sizeHint" stdset="0"> | ||||||
|  |         <size> | ||||||
|  |          <width>40</width> | ||||||
|  |          <height>20</height> | ||||||
|  |         </size> | ||||||
|  |        </property> | ||||||
|  |       </spacer> | ||||||
|  |      </item> | ||||||
|  |      <item> | ||||||
|  |       <widget class="QCheckBox" name="checkBox"> | ||||||
|  |        <property name="text"> | ||||||
|  |         <string>Enable</string> | ||||||
|  |        </property> | ||||||
|  |       </widget> | ||||||
|  |      </item> | ||||||
|  |     </layout> | ||||||
|  |    </item> | ||||||
|  |    <item> | ||||||
|  |     <spacer name="verticalSpacer"> | ||||||
|  |      <property name="orientation"> | ||||||
|  |       <enum>Qt::Vertical</enum> | ||||||
|  |      </property> | ||||||
|  |      <property name="sizeHint" stdset="0"> | ||||||
|  |       <size> | ||||||
|  |        <width>20</width> | ||||||
|  |        <height>40</height> | ||||||
|  |       </size> | ||||||
|  |      </property> | ||||||
|  |     </spacer> | ||||||
|  |    </item> | ||||||
|  |    <item> | ||||||
|  |     <widget class="QDialogButtonBox" name="buttonBox"> | ||||||
|  |      <property name="orientation"> | ||||||
|  |       <enum>Qt::Horizontal</enum> | ||||||
|  |      </property> | ||||||
|  |      <property name="standardButtons"> | ||||||
|  |       <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> | ||||||
|  |      </property> | ||||||
|  |     </widget> | ||||||
|  |    </item> | ||||||
|  |   </layout> | ||||||
|  |  </widget> | ||||||
|  |  <resources/> | ||||||
|  |  <connections> | ||||||
|  |   <connection> | ||||||
|  |    <sender>buttonBox</sender> | ||||||
|  |    <signal>accepted()</signal> | ||||||
|  |    <receiver>AlarmSettingsDialog</receiver> | ||||||
|  |    <slot>accept()</slot> | ||||||
|  |    <hints> | ||||||
|  |     <hint type="sourcelabel"> | ||||||
|  |      <x>248</x> | ||||||
|  |      <y>254</y> | ||||||
|  |     </hint> | ||||||
|  |     <hint type="destinationlabel"> | ||||||
|  |      <x>157</x> | ||||||
|  |      <y>274</y> | ||||||
|  |     </hint> | ||||||
|  |    </hints> | ||||||
|  |   </connection> | ||||||
|  |   <connection> | ||||||
|  |    <sender>buttonBox</sender> | ||||||
|  |    <signal>rejected()</signal> | ||||||
|  |    <receiver>AlarmSettingsDialog</receiver> | ||||||
|  |    <slot>reject()</slot> | ||||||
|  |    <hints> | ||||||
|  |     <hint type="sourcelabel"> | ||||||
|  |      <x>316</x> | ||||||
|  |      <y>260</y> | ||||||
|  |     </hint> | ||||||
|  |     <hint type="destinationlabel"> | ||||||
|  |      <x>286</x> | ||||||
|  |      <y>274</y> | ||||||
|  |     </hint> | ||||||
|  |    </hints> | ||||||
|  |   </connection> | ||||||
|  |  </connections> | ||||||
|  | </ui> | ||||||
							
								
								
									
										30
									
								
								src/ui/itemcreationdialog.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								src/ui/itemcreationdialog.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,30 @@ | ||||||
|  | #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); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
							
								
								
									
										33
									
								
								src/ui/itemcreationdialog.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								src/ui/itemcreationdialog.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,33 @@ | ||||||
|  | #ifndef ITEMCREATIONDIALOG_H | ||||||
|  | #define ITEMCREATIONDIALOG_H | ||||||
|  | 
 | ||||||
|  | #include <QDialog> | ||||||
|  | #include <memory> | ||||||
|  | #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> item; | ||||||
|  | 
 | ||||||
|  | private slots: | ||||||
|  | 
 | ||||||
|  |     void itemTypeChanged(const QString& type); | ||||||
|  |     void itemNameChanged(const QString& name); | ||||||
|  | 
 | ||||||
|  | private: | ||||||
|  |     Ui::ItemCreationDialog *ui; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | #endif // ITEMCREATIONDIALOG_H
 | ||||||
							
								
								
									
										116
									
								
								src/ui/itemcreationdialog.ui
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										116
									
								
								src/ui/itemcreationdialog.ui
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,116 @@ | ||||||
|  | <?xml version="1.0" encoding="UTF-8"?> | ||||||
|  | <ui version="4.0"> | ||||||
|  |  <class>ItemCreationDialog</class> | ||||||
|  |  <widget class="QDialog" name="ItemCreationDialog"> | ||||||
|  |   <property name="geometry"> | ||||||
|  |    <rect> | ||||||
|  |     <x>0</x> | ||||||
|  |     <y>0</y> | ||||||
|  |     <width>400</width> | ||||||
|  |     <height>140</height> | ||||||
|  |    </rect> | ||||||
|  |   </property> | ||||||
|  |   <property name="windowTitle"> | ||||||
|  |    <string>Create Item</string> | ||||||
|  |   </property> | ||||||
|  |   <property name="windowIcon"> | ||||||
|  |    <iconset resource="../../resources.qrc"> | ||||||
|  |     <normaloff>:/images/UVOSicon.bmp</normaloff>:/images/UVOSicon.bmp</iconset> | ||||||
|  |   </property> | ||||||
|  |   <layout class="QVBoxLayout" name="verticalLayout_2"> | ||||||
|  |    <item> | ||||||
|  |     <layout class="QHBoxLayout" name="horizontalLayout"> | ||||||
|  |      <item> | ||||||
|  |       <widget class="QLabel" name="label"> | ||||||
|  |        <property name="text"> | ||||||
|  |         <string>Type</string> | ||||||
|  |        </property> | ||||||
|  |       </widget> | ||||||
|  |      </item> | ||||||
|  |      <item> | ||||||
|  |       <widget class="QComboBox" name="comboBox"> | ||||||
|  |        <item> | ||||||
|  |         <property name="text"> | ||||||
|  |          <string>Message</string> | ||||||
|  |         </property> | ||||||
|  |        </item> | ||||||
|  |        <item> | ||||||
|  |         <property name="text"> | ||||||
|  |          <string>System</string> | ||||||
|  |         </property> | ||||||
|  |        </item> | ||||||
|  |       </widget> | ||||||
|  |      </item> | ||||||
|  |     </layout> | ||||||
|  |    </item> | ||||||
|  |    <item> | ||||||
|  |     <layout class="QHBoxLayout" name="horizontalLayout_2"> | ||||||
|  |      <item> | ||||||
|  |       <widget class="QLabel" name="label_2"> | ||||||
|  |        <property name="text"> | ||||||
|  |         <string>Name</string> | ||||||
|  |        </property> | ||||||
|  |       </widget> | ||||||
|  |      </item> | ||||||
|  |      <item> | ||||||
|  |       <widget class="QLineEdit" name="lineEdit"> | ||||||
|  |        <property name="text"> | ||||||
|  |         <string>Item</string> | ||||||
|  |        </property> | ||||||
|  |       </widget> | ||||||
|  |      </item> | ||||||
|  |     </layout> | ||||||
|  |    </item> | ||||||
|  |    <item> | ||||||
|  |     <layout class="QVBoxLayout" name="verticalLayout"/> | ||||||
|  |    </item> | ||||||
|  |    <item> | ||||||
|  |     <widget class="QDialogButtonBox" name="buttonBox"> | ||||||
|  |      <property name="orientation"> | ||||||
|  |       <enum>Qt::Horizontal</enum> | ||||||
|  |      </property> | ||||||
|  |      <property name="standardButtons"> | ||||||
|  |       <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> | ||||||
|  |      </property> | ||||||
|  |     </widget> | ||||||
|  |    </item> | ||||||
|  |   </layout> | ||||||
|  |  </widget> | ||||||
|  |  <resources> | ||||||
|  |   <include location="../../resources.qrc"/> | ||||||
|  |  </resources> | ||||||
|  |  <connections> | ||||||
|  |   <connection> | ||||||
|  |    <sender>buttonBox</sender> | ||||||
|  |    <signal>accepted()</signal> | ||||||
|  |    <receiver>ItemCreationDialog</receiver> | ||||||
|  |    <slot>accept()</slot> | ||||||
|  |    <hints> | ||||||
|  |     <hint type="sourcelabel"> | ||||||
|  |      <x>248</x> | ||||||
|  |      <y>254</y> | ||||||
|  |     </hint> | ||||||
|  |     <hint type="destinationlabel"> | ||||||
|  |      <x>157</x> | ||||||
|  |      <y>274</y> | ||||||
|  |     </hint> | ||||||
|  |    </hints> | ||||||
|  |   </connection> | ||||||
|  |   <connection> | ||||||
|  |    <sender>buttonBox</sender> | ||||||
|  |    <signal>rejected()</signal> | ||||||
|  |    <receiver>ItemCreationDialog</receiver> | ||||||
|  |    <slot>reject()</slot> | ||||||
|  |    <hints> | ||||||
|  |     <hint type="sourcelabel"> | ||||||
|  |      <x>316</x> | ||||||
|  |      <y>260</y> | ||||||
|  |     </hint> | ||||||
|  |     <hint type="destinationlabel"> | ||||||
|  |      <x>286</x> | ||||||
|  |      <y>274</y> | ||||||
|  |     </hint> | ||||||
|  |    </hints> | ||||||
|  |   </connection> | ||||||
|  |  </connections> | ||||||
|  | </ui> | ||||||
							
								
								
									
										54
									
								
								src/ui/itemscrollbox.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								src/ui/itemscrollbox.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,54 @@ | ||||||
|  | #include "itemscrollbox.h" | ||||||
|  | #include "ui_relayscrollbox.h" | ||||||
|  | 
 | ||||||
|  | ItemScrollBox::ItemScrollBox(QWidget *parent) : | ||||||
|  |     QWidget(parent), | ||||||
|  |     ui(new Ui::RelayScrollBox) | ||||||
|  | { | ||||||
|  |     ui->setupUi(this); | ||||||
|  |     QScroller::grabGesture(ui->scrollArea, QScroller::TouchGesture); | ||||||
|  |     QScroller::grabGesture(ui->scrollArea, QScroller::LeftMouseButtonGesture); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | ItemScrollBox::~ItemScrollBox() | ||||||
|  | { | ||||||
|  |     delete ui; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void ItemScrollBox::addItem(std::weak_ptr<Item> item) | ||||||
|  | { | ||||||
|  |     static int lifetimeNum = 0; | ||||||
|  |     if(auto workItem  = item.lock()) | ||||||
|  |     { | ||||||
|  |         widgets_.push_back(new ItemWidget(item, this)); | ||||||
|  |         if(lifetimeNum == 0) | ||||||
|  |             widgets_.back()->setShortcuts(QKeySequence(Qt::Key_Q), QKeySequence(Qt::Key_A), QKeySequence(Qt::Key_Z)); | ||||||
|  |         else if(lifetimeNum == 1) | ||||||
|  |             widgets_.back()->setShortcuts(QKeySequence(Qt::Key_W), QKeySequence(Qt::Key_S), QKeySequence(Qt::Key_X)); | ||||||
|  |         else if(lifetimeNum == 2) | ||||||
|  |             widgets_.back()->setShortcuts(QKeySequence(Qt::Key_E), QKeySequence(Qt::Key_D), QKeySequence(Qt::Key_C)); | ||||||
|  |         else if(lifetimeNum == 3) | ||||||
|  |             widgets_.back()->setShortcuts(QKeySequence(Qt::Key_R), QKeySequence(Qt::Key_F), QKeySequence(Qt::Key_V)); | ||||||
|  |         else if(lifetimeNum == 4) | ||||||
|  |             widgets_.back()->setShortcuts(QKeySequence(Qt::Key_T), QKeySequence(Qt::Key_G), QKeySequence(Qt::Key_B)); | ||||||
|  |         ui->relayWidgetVbox->addWidget(widgets_.back()); | ||||||
|  |         connect(widgets_.back(), &ItemWidget::deleteRequest, this, &ItemScrollBox::deleteRequest); | ||||||
|  |         connect(widgets_.back(), &ItemWidget::deleteRequest, this, &ItemScrollBox::removeItem); | ||||||
|  |         lifetimeNum++; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 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); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
							
								
								
									
										44
									
								
								src/ui/itemscrollbox.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								src/ui/itemscrollbox.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,44 @@ | ||||||
|  | #ifndef RELAYSCROLLBOX_H | ||||||
|  | #define RELAYSCROLLBOX_H | ||||||
|  | 
 | ||||||
|  | #include <QWidget> | ||||||
|  | #include <vector> | ||||||
|  | #include <memory> | ||||||
|  | #include <QScroller> | ||||||
|  | #include "itemwidget.h" | ||||||
|  | #include "../items/item.h" | ||||||
|  | #include "../items/itemstore.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | namespace Ui { | ||||||
|  | class RelayScrollBox; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | class ItemScrollBox : public QWidget | ||||||
|  | { | ||||||
|  |     Q_OBJECT | ||||||
|  | private: | ||||||
|  |     std::vector< ItemWidget* > widgets_; | ||||||
|  | 
 | ||||||
|  | signals: | ||||||
|  |     void deleteRequest(const ItemData& item); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | public: | ||||||
|  |     explicit ItemScrollBox(QWidget *parent = nullptr); | ||||||
|  |     ~ItemScrollBox(); | ||||||
|  | 
 | ||||||
|  |     void setItemStore(ItemStore* itemStore); | ||||||
|  | 
 | ||||||
|  | public slots: | ||||||
|  | 
 | ||||||
|  |     void addItem(std::weak_ptr<Item> item); | ||||||
|  |     void removeItem(const ItemData& item); | ||||||
|  | 
 | ||||||
|  | private: | ||||||
|  |     Ui::RelayScrollBox *ui; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | #endif // RELAYSCROLLBOX_H
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
							
								
								
									
										176
									
								
								src/ui/itemsettingsdialog.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										176
									
								
								src/ui/itemsettingsdialog.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,176 @@ | ||||||
|  |  #include "itemsettingsdialog.h" | ||||||
|  | #include "ui_itemsettingsdialog.h" | ||||||
|  | #include<memory> | ||||||
|  | 
 | ||||||
|  | ItemSettingsDialog::ItemSettingsDialog(std::shared_ptr<Item> 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> relay = std::dynamic_pointer_cast<Relay>(item_)) | ||||||
|  |     { | ||||||
|  |         itemSpecificWidget_ = new RelayItemSettingsWidget(relay); | ||||||
|  |     } | ||||||
|  |     else if(std::shared_ptr<MessageItem> msgItem = std::dynamic_pointer_cast<MessageItem>(item_)) | ||||||
|  |     { | ||||||
|  |         itemSpecificWidget_ = new MessageItemSettingsWidget(msgItem); | ||||||
|  |     } | ||||||
|  |     else if(std::shared_ptr<SystemItem> sysItem = std::dynamic_pointer_cast<SystemItem>(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> actor = nullptr; | ||||||
|  | 
 | ||||||
|  |     if(ui->comboBox->currentText() == "Alarm") | ||||||
|  |     { | ||||||
|  |         std::shared_ptr<AlarmTime> alarm = std::shared_ptr<AlarmTime>(new AlarmTime); | ||||||
|  |         actor = alarm; | ||||||
|  |         dialog = new ActorSettingsDialog(alarm, this); | ||||||
|  |     } | ||||||
|  |     else if(ui->comboBox->currentText() == "Sensor") | ||||||
|  |     { | ||||||
|  |         std::shared_ptr<SensorActor> sensorActor = std::shared_ptr<SensorActor>(new SensorActor); | ||||||
|  |         actor = sensorActor; | ||||||
|  |         dialog = new ActorSettingsDialog(sensorActor, this); | ||||||
|  |     } | ||||||
|  |     else if(ui->comboBox->currentText() == "Timer" ) | ||||||
|  |     { | ||||||
|  |         std::shared_ptr<TimerActor> timerActor = std::shared_ptr<TimerActor>(new TimerActor); | ||||||
|  |         actor = timerActor; | ||||||
|  |         dialog = new ActorSettingsDialog(timerActor, this); | ||||||
|  |     } | ||||||
|  |     else if(ui->comboBox->currentText() == "Regulator") | ||||||
|  |     { | ||||||
|  |         std::shared_ptr<Regulator> regulator = std::shared_ptr<Regulator>(new Regulator); | ||||||
|  |         actor = regulator; | ||||||
|  |         dialog = new ActorSettingsDialog(regulator, this); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     else if(ui->comboBox->currentText() == "Polynomal") | ||||||
|  |     { | ||||||
|  |         std::shared_ptr<PolynomalActor> polynomalActor = std::shared_ptr<PolynomalActor>(new PolynomalActor); | ||||||
|  |         actor = polynomalActor; | ||||||
|  |         dialog = new ActorSettingsDialog(polynomalActor, this); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     else if(ui->comboBox->currentText() == "Multi Factor") | ||||||
|  |     { | ||||||
|  |         std::shared_ptr<MultiFactorActor> polynomalActor = std::shared_ptr<MultiFactorActor>(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> actor = item_->getActors()[ui->tableWidget->currentRow()]; | ||||||
|  | 
 | ||||||
|  |         std::shared_ptr<AlarmTime> alarmTime = std::dynamic_pointer_cast<AlarmTime>(actor); | ||||||
|  |         std::shared_ptr<Regulator> regulator = std::dynamic_pointer_cast<Regulator>(actor); | ||||||
|  |         std::shared_ptr<SensorActor> sensorActor = std::dynamic_pointer_cast<SensorActor>(actor); | ||||||
|  |         std::shared_ptr<TimerActor> timerActor = std::dynamic_pointer_cast<TimerActor>(actor); | ||||||
|  |         std::shared_ptr<PolynomalActor> polynomalActor = std::dynamic_pointer_cast<PolynomalActor>(actor); | ||||||
|  |         std::shared_ptr<MultiFactorActor> factorActor = std::dynamic_pointer_cast<MultiFactorActor>(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"); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										37
									
								
								src/ui/itemsettingsdialog.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								src/ui/itemsettingsdialog.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,37 @@ | ||||||
|  | #ifndef RELAYSETTINGSDIALOG_H | ||||||
|  | #define RELAYSETTINGSDIALOG_H | ||||||
|  | 
 | ||||||
|  | #include <QDialog> | ||||||
|  | #include <QSettings> | ||||||
|  | #include <memory> | ||||||
|  | #include "../items/item.h" | ||||||
|  | 
 | ||||||
|  | namespace Ui { | ||||||
|  | class ItemSettingsDialog; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | class ItemSettingsDialog : public QDialog | ||||||
|  | { | ||||||
|  |     Q_OBJECT | ||||||
|  |     std::shared_ptr<Item> item_; | ||||||
|  |     QWidget* itemSpecificWidget_ = nullptr; | ||||||
|  | 
 | ||||||
|  | private: | ||||||
|  |     void loadActorList(); | ||||||
|  | 
 | ||||||
|  | public: | ||||||
|  |     explicit ItemSettingsDialog(std::shared_ptr<Item> item, QWidget *parent = nullptr); | ||||||
|  |     ~ItemSettingsDialog(); | ||||||
|  | 
 | ||||||
|  | private slots: | ||||||
|  | 
 | ||||||
|  |     void removeActor(); | ||||||
|  |     void addActor(); | ||||||
|  |     void editActor(); | ||||||
|  |     void changeOverride(); | ||||||
|  | 
 | ||||||
|  | private: | ||||||
|  |     Ui::ItemSettingsDialog *ui; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | #endif // RELAYSETTINGSDIALOG_H
 | ||||||
							
								
								
									
										274
									
								
								src/ui/itemsettingsdialog.ui
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										274
									
								
								src/ui/itemsettingsdialog.ui
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,274 @@ | ||||||
|  | <?xml version="1.0" encoding="UTF-8"?> | ||||||
|  | <ui version="4.0"> | ||||||
|  |  <class>ItemSettingsDialog</class> | ||||||
|  |  <widget class="QDialog" name="ItemSettingsDialog"> | ||||||
|  |   <property name="geometry"> | ||||||
|  |    <rect> | ||||||
|  |     <x>0</x> | ||||||
|  |     <y>0</y> | ||||||
|  |     <width>577</width> | ||||||
|  |     <height>390</height> | ||||||
|  |    </rect> | ||||||
|  |   </property> | ||||||
|  |   <property name="windowTitle"> | ||||||
|  |    <string>Item Settings</string> | ||||||
|  |   </property> | ||||||
|  |   <property name="windowIcon"> | ||||||
|  |    <iconset resource="../../resources.qrc"> | ||||||
|  |     <normaloff>:/images/UVOSicon.bmp</normaloff>:/images/UVOSicon.bmp</iconset> | ||||||
|  |   </property> | ||||||
|  |   <layout class="QVBoxLayout" name="verticalLayout"> | ||||||
|  |    <item> | ||||||
|  |     <layout class="QFormLayout" name="formLayout"> | ||||||
|  |      <property name="fieldGrowthPolicy"> | ||||||
|  |       <enum>QFormLayout::AllNonFixedFieldsGrow</enum> | ||||||
|  |      </property> | ||||||
|  |      <property name="rightMargin"> | ||||||
|  |       <number>0</number> | ||||||
|  |      </property> | ||||||
|  |      <property name="bottomMargin"> | ||||||
|  |       <number>10</number> | ||||||
|  |      </property> | ||||||
|  |      <item row="1" column="0"> | ||||||
|  |       <widget class="QLabel" name="label"> | ||||||
|  |        <property name="text"> | ||||||
|  |         <string>Name:</string> | ||||||
|  |        </property> | ||||||
|  |        <property name="alignment"> | ||||||
|  |         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> | ||||||
|  |        </property> | ||||||
|  |       </widget> | ||||||
|  |      </item> | ||||||
|  |      <item row="1" column="1"> | ||||||
|  |       <widget class="QLabel" name="label_name"> | ||||||
|  |        <property name="sizePolicy"> | ||||||
|  |         <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> | ||||||
|  |          <horstretch>5</horstretch> | ||||||
|  |          <verstretch>0</verstretch> | ||||||
|  |         </sizepolicy> | ||||||
|  |        </property> | ||||||
|  |        <property name="layoutDirection"> | ||||||
|  |         <enum>Qt::LeftToRight</enum> | ||||||
|  |        </property> | ||||||
|  |        <property name="text"> | ||||||
|  |         <string>TextLabel</string> | ||||||
|  |        </property> | ||||||
|  |        <property name="alignment"> | ||||||
|  |         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> | ||||||
|  |        </property> | ||||||
|  |       </widget> | ||||||
|  |      </item> | ||||||
|  |     </layout> | ||||||
|  |    </item> | ||||||
|  |    <item> | ||||||
|  |     <layout class="QVBoxLayout" name="verticalLayout_2"/> | ||||||
|  |    </item> | ||||||
|  |    <item> | ||||||
|  |     <widget class="QCheckBox" name="checkBox_Override"> | ||||||
|  |      <property name="text"> | ||||||
|  |       <string>Override</string> | ||||||
|  |      </property> | ||||||
|  |     </widget> | ||||||
|  |    </item> | ||||||
|  |    <item> | ||||||
|  |     <widget class="QTableWidget" name="tableWidget"> | ||||||
|  |      <property name="frameShape"> | ||||||
|  |       <enum>QFrame::StyledPanel</enum> | ||||||
|  |      </property> | ||||||
|  |      <property name="verticalScrollBarPolicy"> | ||||||
|  |       <enum>Qt::ScrollBarAsNeeded</enum> | ||||||
|  |      </property> | ||||||
|  |      <property name="horizontalScrollBarPolicy"> | ||||||
|  |       <enum>Qt::ScrollBarAlwaysOff</enum> | ||||||
|  |      </property> | ||||||
|  |      <property name="autoScroll"> | ||||||
|  |       <bool>false</bool> | ||||||
|  |      </property> | ||||||
|  |      <property name="editTriggers"> | ||||||
|  |       <set>QAbstractItemView::NoEditTriggers</set> | ||||||
|  |      </property> | ||||||
|  |      <property name="tabKeyNavigation"> | ||||||
|  |       <bool>false</bool> | ||||||
|  |      </property> | ||||||
|  |      <property name="showDropIndicator" stdset="0"> | ||||||
|  |       <bool>false</bool> | ||||||
|  |      </property> | ||||||
|  |      <property name="dragDropOverwriteMode"> | ||||||
|  |       <bool>false</bool> | ||||||
|  |      </property> | ||||||
|  |      <property name="selectionBehavior"> | ||||||
|  |       <enum>QAbstractItemView::SelectRows</enum> | ||||||
|  |      </property> | ||||||
|  |      <property name="showGrid"> | ||||||
|  |       <bool>false</bool> | ||||||
|  |      </property> | ||||||
|  |      <property name="gridStyle"> | ||||||
|  |       <enum>Qt::SolidLine</enum> | ||||||
|  |      </property> | ||||||
|  |      <property name="cornerButtonEnabled"> | ||||||
|  |       <bool>false</bool> | ||||||
|  |      </property> | ||||||
|  |      <property name="rowCount"> | ||||||
|  |       <number>0</number> | ||||||
|  |      </property> | ||||||
|  |      <property name="columnCount"> | ||||||
|  |       <number>3</number> | ||||||
|  |      </property> | ||||||
|  |      <attribute name="horizontalHeaderVisible"> | ||||||
|  |       <bool>false</bool> | ||||||
|  |      </attribute> | ||||||
|  |      <attribute name="horizontalHeaderMinimumSectionSize"> | ||||||
|  |       <number>32</number> | ||||||
|  |      </attribute> | ||||||
|  |      <attribute name="horizontalHeaderHighlightSections"> | ||||||
|  |       <bool>true</bool> | ||||||
|  |      </attribute> | ||||||
|  |      <attribute name="verticalHeaderVisible"> | ||||||
|  |       <bool>false</bool> | ||||||
|  |      </attribute> | ||||||
|  |      <attribute name="verticalHeaderDefaultSectionSize"> | ||||||
|  |       <number>32</number> | ||||||
|  |      </attribute> | ||||||
|  |      <column/> | ||||||
|  |      <column/> | ||||||
|  |      <column/> | ||||||
|  |     </widget> | ||||||
|  |    </item> | ||||||
|  |    <item> | ||||||
|  |     <layout class="QHBoxLayout" name="horizontalLayout_2"> | ||||||
|  |      <property name="leftMargin"> | ||||||
|  |       <number>0</number> | ||||||
|  |      </property> | ||||||
|  |      <property name="topMargin"> | ||||||
|  |       <number>0</number> | ||||||
|  |      </property> | ||||||
|  |      <item> | ||||||
|  |       <widget class="QPushButton" name="pushButton_remove"> | ||||||
|  |        <property name="text"> | ||||||
|  |         <string>Remove</string> | ||||||
|  |        </property> | ||||||
|  |       </widget> | ||||||
|  |      </item> | ||||||
|  |      <item> | ||||||
|  |       <widget class="QPushButton" name="pushButton_edit"> | ||||||
|  |        <property name="text"> | ||||||
|  |         <string>Edit</string> | ||||||
|  |        </property> | ||||||
|  |       </widget> | ||||||
|  |      </item> | ||||||
|  |     </layout> | ||||||
|  |    </item> | ||||||
|  |    <item> | ||||||
|  |     <layout class="QHBoxLayout" name="horizontalLayout"> | ||||||
|  |      <item> | ||||||
|  |       <widget class="QLabel" name="label_3"> | ||||||
|  |        <property name="sizePolicy"> | ||||||
|  |         <sizepolicy hsizetype="Fixed" vsizetype="Preferred"> | ||||||
|  |          <horstretch>0</horstretch> | ||||||
|  |          <verstretch>0</verstretch> | ||||||
|  |         </sizepolicy> | ||||||
|  |        </property> | ||||||
|  |        <property name="text"> | ||||||
|  |         <string>Act on</string> | ||||||
|  |        </property> | ||||||
|  |       </widget> | ||||||
|  |      </item> | ||||||
|  |      <item> | ||||||
|  |       <widget class="QComboBox" name="comboBox"> | ||||||
|  |        <item> | ||||||
|  |         <property name="text"> | ||||||
|  |          <string>Sensor</string> | ||||||
|  |         </property> | ||||||
|  |        </item> | ||||||
|  |        <item> | ||||||
|  |         <property name="text"> | ||||||
|  |          <string>Polynomal</string> | ||||||
|  |         </property> | ||||||
|  |        </item> | ||||||
|  |        <item> | ||||||
|  |         <property name="text"> | ||||||
|  |          <string>Regulator</string> | ||||||
|  |         </property> | ||||||
|  |        </item> | ||||||
|  |        <item> | ||||||
|  |         <property name="text"> | ||||||
|  |          <string>Alarm</string> | ||||||
|  |         </property> | ||||||
|  |        </item> | ||||||
|  |        <item> | ||||||
|  |         <property name="text"> | ||||||
|  |          <string>Timer</string> | ||||||
|  |         </property> | ||||||
|  |        </item> | ||||||
|  |        <item> | ||||||
|  |         <property name="text"> | ||||||
|  |          <string>Multi Factor</string> | ||||||
|  |         </property> | ||||||
|  |        </item> | ||||||
|  |       </widget> | ||||||
|  |      </item> | ||||||
|  |      <item> | ||||||
|  |       <widget class="QPushButton" name="pushButton_add"> | ||||||
|  |        <property name="sizePolicy"> | ||||||
|  |         <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> | ||||||
|  |          <horstretch>0</horstretch> | ||||||
|  |          <verstretch>0</verstretch> | ||||||
|  |         </sizepolicy> | ||||||
|  |        </property> | ||||||
|  |        <property name="text"> | ||||||
|  |         <string>Add</string> | ||||||
|  |        </property> | ||||||
|  |       </widget> | ||||||
|  |      </item> | ||||||
|  |     </layout> | ||||||
|  |    </item> | ||||||
|  |    <item> | ||||||
|  |     <widget class="QDialogButtonBox" name="buttonBox"> | ||||||
|  |      <property name="orientation"> | ||||||
|  |       <enum>Qt::Horizontal</enum> | ||||||
|  |      </property> | ||||||
|  |      <property name="standardButtons"> | ||||||
|  |       <set>QDialogButtonBox::Ok</set> | ||||||
|  |      </property> | ||||||
|  |     </widget> | ||||||
|  |    </item> | ||||||
|  |   </layout> | ||||||
|  |  </widget> | ||||||
|  |  <resources> | ||||||
|  |   <include location="../../resources.qrc"/> | ||||||
|  |  </resources> | ||||||
|  |  <connections> | ||||||
|  |   <connection> | ||||||
|  |    <sender>buttonBox</sender> | ||||||
|  |    <signal>accepted()</signal> | ||||||
|  |    <receiver>ItemSettingsDialog</receiver> | ||||||
|  |    <slot>accept()</slot> | ||||||
|  |    <hints> | ||||||
|  |     <hint type="sourcelabel"> | ||||||
|  |      <x>248</x> | ||||||
|  |      <y>254</y> | ||||||
|  |     </hint> | ||||||
|  |     <hint type="destinationlabel"> | ||||||
|  |      <x>157</x> | ||||||
|  |      <y>274</y> | ||||||
|  |     </hint> | ||||||
|  |    </hints> | ||||||
|  |   </connection> | ||||||
|  |   <connection> | ||||||
|  |    <sender>buttonBox</sender> | ||||||
|  |    <signal>rejected()</signal> | ||||||
|  |    <receiver>ItemSettingsDialog</receiver> | ||||||
|  |    <slot>reject()</slot> | ||||||
|  |    <hints> | ||||||
|  |     <hint type="sourcelabel"> | ||||||
|  |      <x>316</x> | ||||||
|  |      <y>260</y> | ||||||
|  |     </hint> | ||||||
|  |     <hint type="destinationlabel"> | ||||||
|  |      <x>286</x> | ||||||
|  |      <y>274</y> | ||||||
|  |     </hint> | ||||||
|  |    </hints> | ||||||
|  |   </connection> | ||||||
|  |  </connections> | ||||||
|  | </ui> | ||||||
							
								
								
									
										170
									
								
								src/ui/itemwidget.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										170
									
								
								src/ui/itemwidget.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,170 @@ | ||||||
|  | #include "itemwidget.h" | ||||||
|  | #include "ui_itemwidget.h" | ||||||
|  | 
 | ||||||
|  | #include <QCheckBox> | ||||||
|  | #include <QDebug> | ||||||
|  | #include <QSlider> | ||||||
|  | #include "../items/train.h" | ||||||
|  | 
 | ||||||
|  | ItemWidget::ItemWidget(std::weak_ptr<Item> item, QWidget *parent) : | ||||||
|  |     QWidget(parent), | ||||||
|  |     item_(item), | ||||||
|  |     ui(new Ui::ItemWidget) | ||||||
|  | { | ||||||
|  |     ui->setupUi(this); | ||||||
|  | 
 | ||||||
|  |     if(auto workingRelay = item_.lock()) | ||||||
|  |     { | ||||||
|  |         ui->label->setText(workingRelay->getName()); | ||||||
|  | 
 | ||||||
|  |         connect(ui->slider, &QSlider::valueChanged, this, &ItemWidget::moveToValue); | ||||||
|  |         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); | ||||||
|  | 
 | ||||||
|  |         Train* train = dynamic_cast<Train*>(workingRelay.get()); | ||||||
|  |          if(!train) | ||||||
|  |          { | ||||||
|  |             ui->pushButton_reverse->hide(); | ||||||
|  |          } | ||||||
|  |          else | ||||||
|  |          { | ||||||
|  |             uint8_t functionMask = train->getFunctionMask(); | ||||||
|  |             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::moveToValue(int value) | ||||||
|  | { | ||||||
|  |     qDebug()<<__func__; | ||||||
|  |     ui->pushButton_reverse->setDisabled(value != 0); | ||||||
|  |     if(auto workingItem = item_.lock()) | ||||||
|  |         workingItem->setValue(value); | ||||||
|  |     else disable(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 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<Train*>(workingItem.get()); | ||||||
|  |         if(train && ui->slider->value() == 0) | ||||||
|  |             train->reverse(); | ||||||
|  |         else | ||||||
|  |             ui->slider->setValue(0); | ||||||
|  |     } | ||||||
|  |     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) | ||||||
|  | { | ||||||
|  |     if(auto workingRelay = item_.lock()) | ||||||
|  |     { | ||||||
|  |         if(relay == *workingRelay) | ||||||
|  |             return  true; | ||||||
|  |         else | ||||||
|  |             return false; | ||||||
|  |     } | ||||||
|  |     return true; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void ItemWidget::stepUp() | ||||||
|  | { | ||||||
|  |     ui->slider->setValue(ui->slider->value()+1); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void ItemWidget::stepDown() | ||||||
|  | { | ||||||
|  |     if(ui->slider->value() == 0) | ||||||
|  |         moveToValue(0); | ||||||
|  |     ui->slider->setValue(ui->slider->value()-1); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void ItemWidget::setShortcuts(QKeySequence up, QKeySequence down, QKeySequence rev) | ||||||
|  | { | ||||||
|  |     shortcuts_.clear(); | ||||||
|  |     shortcuts_.push_back(std::unique_ptr<QShortcut>(new  QShortcut(up, this))); | ||||||
|  |     connect(shortcuts_.back().get(), &QShortcut::activated, this, &ItemWidget::stepUp); | ||||||
|  |     shortcuts_.push_back(std::unique_ptr<QShortcut>(new  QShortcut(down, this))); | ||||||
|  |     connect(shortcuts_.back().get(), &QShortcut::activated, this, &ItemWidget::stepDown); | ||||||
|  |     shortcuts_.push_back(std::unique_ptr<QShortcut>(new  QShortcut(rev, this))); | ||||||
|  |     connect(shortcuts_.back().get(), &QShortcut::activated, this, &ItemWidget::reverse); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | std::weak_ptr<Item> ItemWidget::getItem() | ||||||
|  | { | ||||||
|  |     return item_; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void ItemWidget::stateChanged(int state) | ||||||
|  | { | ||||||
|  |     qDebug()<<"widget got state "<<state; | ||||||
|  |     ui->slider->blockSignals(true); | ||||||
|  |     ui->slider->setValue(state); | ||||||
|  |     ui->slider->blockSignals(false); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | ItemWidget::~ItemWidget() | ||||||
|  | { | ||||||
|  |     delete ui; | ||||||
|  | } | ||||||
							
								
								
									
										56
									
								
								src/ui/itemwidget.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								src/ui/itemwidget.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,56 @@ | ||||||
|  | #ifndef RELAYWIDGET_H | ||||||
|  | #define RELAYWIDGET_H | ||||||
|  | 
 | ||||||
|  | #include <QWidget> | ||||||
|  | #include <memory> | ||||||
|  | #include <QShortcut> | ||||||
|  | #include "itemsettingsdialog.h" | ||||||
|  | #include "../items/item.h" | ||||||
|  | 
 | ||||||
|  | namespace Ui { | ||||||
|  | class ItemWidget; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | class ItemWidget : public QWidget | ||||||
|  | { | ||||||
|  |     Q_OBJECT | ||||||
|  | private: | ||||||
|  |     std::weak_ptr<Item> item_; | ||||||
|  | 
 | ||||||
|  |     std::vector< std::unique_ptr<QShortcut> > shortcuts_; | ||||||
|  | 
 | ||||||
|  |     void disable(); | ||||||
|  | 
 | ||||||
|  | signals: | ||||||
|  | 
 | ||||||
|  |     void deleteRequest(const ItemData& item); | ||||||
|  | 
 | ||||||
|  | private slots: | ||||||
|  |     void moveToValue(int 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> item, QWidget *parent); | ||||||
|  |     std::weak_ptr<Item> 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; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | #endif // RELAYWIDGET_H
 | ||||||
							
								
								
									
										126
									
								
								src/ui/itemwidget.ui
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										126
									
								
								src/ui/itemwidget.ui
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,126 @@ | ||||||
|  | <?xml version="1.0" encoding="UTF-8"?> | ||||||
|  | <ui version="4.0"> | ||||||
|  |  <class>ItemWidget</class> | ||||||
|  |  <widget class="QWidget" name="ItemWidget"> | ||||||
|  |   <property name="geometry"> | ||||||
|  |    <rect> | ||||||
|  |     <x>0</x> | ||||||
|  |     <y>0</y> | ||||||
|  |     <width>264</width> | ||||||
|  |     <height>83</height> | ||||||
|  |    </rect> | ||||||
|  |   </property> | ||||||
|  |   <property name="sizePolicy"> | ||||||
|  |    <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> | ||||||
|  |     <horstretch>0</horstretch> | ||||||
|  |     <verstretch>0</verstretch> | ||||||
|  |    </sizepolicy> | ||||||
|  |   </property> | ||||||
|  |   <property name="windowTitle"> | ||||||
|  |    <string>Form</string> | ||||||
|  |   </property> | ||||||
|  |   <layout class="QVBoxLayout" name="verticalLayout_2"> | ||||||
|  |    <property name="spacing"> | ||||||
|  |     <number>0</number> | ||||||
|  |    </property> | ||||||
|  |    <property name="leftMargin"> | ||||||
|  |     <number>0</number> | ||||||
|  |    </property> | ||||||
|  |    <property name="topMargin"> | ||||||
|  |     <number>0</number> | ||||||
|  |    </property> | ||||||
|  |    <property name="rightMargin"> | ||||||
|  |     <number>0</number> | ||||||
|  |    </property> | ||||||
|  |    <property name="bottomMargin"> | ||||||
|  |     <number>0</number> | ||||||
|  |    </property> | ||||||
|  |    <item> | ||||||
|  |     <layout class="QHBoxLayout" name="horizontalLayout_3"> | ||||||
|  |      <property name="spacing"> | ||||||
|  |       <number>0</number> | ||||||
|  |      </property> | ||||||
|  |      <item> | ||||||
|  |       <widget class="QLabel" name="label"> | ||||||
|  |        <property name="text"> | ||||||
|  |         <string>TextLabel</string> | ||||||
|  |        </property> | ||||||
|  |       </widget> | ||||||
|  |      </item> | ||||||
|  |      <item> | ||||||
|  |       <layout class="QVBoxLayout" name="verticalLayout"> | ||||||
|  |        <item> | ||||||
|  |         <layout class="QHBoxLayout" name="horizontalLayout_2"> | ||||||
|  |          <item> | ||||||
|  |           <widget class="QSlider" name="slider"> | ||||||
|  |            <property name="maximum"> | ||||||
|  |             <number>14</number> | ||||||
|  |            </property> | ||||||
|  |            <property name="pageStep"> | ||||||
|  |             <number>1</number> | ||||||
|  |            </property> | ||||||
|  |            <property name="tracking"> | ||||||
|  |             <bool>true</bool> | ||||||
|  |            </property> | ||||||
|  |            <property name="orientation"> | ||||||
|  |             <enum>Qt::Horizontal</enum> | ||||||
|  |            </property> | ||||||
|  |           </widget> | ||||||
|  |          </item> | ||||||
|  |          <item> | ||||||
|  |           <widget class="QPushButton" name="pushButton_reverse"> | ||||||
|  |            <property name="text"> | ||||||
|  |             <string>Reverse</string> | ||||||
|  |            </property> | ||||||
|  |           </widget> | ||||||
|  |          </item> | ||||||
|  |         </layout> | ||||||
|  |        </item> | ||||||
|  |        <item> | ||||||
|  |         <layout class="QHBoxLayout" name="horizontalLayout"> | ||||||
|  |          <item> | ||||||
|  |           <widget class="QCheckBox" name="checkBox_f1"> | ||||||
|  |            <property name="text"> | ||||||
|  |             <string>F1</string> | ||||||
|  |            </property> | ||||||
|  |           </widget> | ||||||
|  |          </item> | ||||||
|  |          <item> | ||||||
|  |           <widget class="QCheckBox" name="checkBox_f2"> | ||||||
|  |            <property name="text"> | ||||||
|  |             <string>F2</string> | ||||||
|  |            </property> | ||||||
|  |           </widget> | ||||||
|  |          </item> | ||||||
|  |          <item> | ||||||
|  |           <widget class="QCheckBox" name="checkBox_f3"> | ||||||
|  |            <property name="text"> | ||||||
|  |             <string>F3</string> | ||||||
|  |            </property> | ||||||
|  |           </widget> | ||||||
|  |          </item> | ||||||
|  |          <item> | ||||||
|  |           <widget class="QCheckBox" name="checkBox_f4"> | ||||||
|  |            <property name="text"> | ||||||
|  |             <string>F4</string> | ||||||
|  |            </property> | ||||||
|  |           </widget> | ||||||
|  |          </item> | ||||||
|  |         </layout> | ||||||
|  |        </item> | ||||||
|  |       </layout> | ||||||
|  |      </item> | ||||||
|  |     </layout> | ||||||
|  |    </item> | ||||||
|  |    <item> | ||||||
|  |     <widget class="Line" name="line_2"> | ||||||
|  |      <property name="orientation"> | ||||||
|  |       <enum>Qt::Horizontal</enum> | ||||||
|  |      </property> | ||||||
|  |     </widget> | ||||||
|  |    </item> | ||||||
|  |   </layout> | ||||||
|  |  </widget> | ||||||
|  |  <resources/> | ||||||
|  |  <connections/> | ||||||
|  | </ui> | ||||||
							
								
								
									
										45
									
								
								src/ui/mainwindow.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								src/ui/mainwindow.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,45 @@ | ||||||
|  | #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), | ||||||
|  |     stopShort(QKeySequence(Qt::Key_Space), this), | ||||||
|  |     ui(new Ui::MainWindow), | ||||||
|  |     _micro(micro) | ||||||
|  | { | ||||||
|  |     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(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)); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     connect(ui->relayList, &ItemScrollBox::deleteRequest, items, &ItemStore::removeItem); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | MainWindow::~MainWindow() | ||||||
|  | { | ||||||
|  |     delete ui; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  | void MainWindow::showItemCreationDialog() | ||||||
|  | { | ||||||
|  |     ItemCreationDialog diag(this); | ||||||
|  |     diag.show(); | ||||||
|  |     if(diag.exec()) | ||||||
|  |     { | ||||||
|  |         createdItem(diag.item); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | */ | ||||||
							
								
								
									
										46
									
								
								src/ui/mainwindow.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								src/ui/mainwindow.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,46 @@ | ||||||
|  | #ifndef MAINWINDOW_H | ||||||
|  | #define MAINWINDOW_H | ||||||
|  | 
 | ||||||
|  | #include <QMainWindow> | ||||||
|  | #include <QColorDialog> | ||||||
|  | #include <QListWidgetItem> | ||||||
|  | #include <QTime> | ||||||
|  | #include <QShortcut> | ||||||
|  | #include <vector> | ||||||
|  | #include "../microcontroller.h" | ||||||
|  | #include "../items/itemstore.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class MainObject; | ||||||
|  | 
 | ||||||
|  | namespace Ui | ||||||
|  | { | ||||||
|  | class MainWindow; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | class MainWindow : public QMainWindow | ||||||
|  | { | ||||||
|  |     Q_OBJECT | ||||||
|  |     QShortcut stopShort; | ||||||
|  | 
 | ||||||
|  | public: | ||||||
|  |     explicit MainWindow(Microcontroller * const micro, ItemStore* items, QWidget *parent = nullptr); | ||||||
|  |     ~MainWindow(); | ||||||
|  | 
 | ||||||
|  | private: | ||||||
|  |     Ui::MainWindow *ui; | ||||||
|  | 
 | ||||||
|  |     Microcontroller *_micro; | ||||||
|  | 
 | ||||||
|  | signals: | ||||||
|  | 
 | ||||||
|  |     void createdItem(std::shared_ptr<Item> item); | ||||||
|  | 
 | ||||||
|  | private slots: | ||||||
|  | 
 | ||||||
|  |     //void showItemCreationDialog();
 | ||||||
|  | 
 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | #endif // MAINWINDOW_H
 | ||||||
|  | 
 | ||||||
							
								
								
									
										129
									
								
								src/ui/mainwindow.ui
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										129
									
								
								src/ui/mainwindow.ui
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,129 @@ | ||||||
|  | <?xml version="1.0" encoding="UTF-8"?> | ||||||
|  | <ui version="4.0"> | ||||||
|  |  <class>MainWindow</class> | ||||||
|  |  <widget class="QMainWindow" name="MainWindow"> | ||||||
|  |   <property name="geometry"> | ||||||
|  |    <rect> | ||||||
|  |     <x>0</x> | ||||||
|  |     <y>0</y> | ||||||
|  |     <width>844</width> | ||||||
|  |     <height>300</height> | ||||||
|  |    </rect> | ||||||
|  |   </property> | ||||||
|  |   <property name="sizePolicy"> | ||||||
|  |    <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred"> | ||||||
|  |     <horstretch>0</horstretch> | ||||||
|  |     <verstretch>50</verstretch> | ||||||
|  |    </sizepolicy> | ||||||
|  |   </property> | ||||||
|  |   <property name="minimumSize"> | ||||||
|  |    <size> | ||||||
|  |     <width>300</width> | ||||||
|  |     <height>300</height> | ||||||
|  |    </size> | ||||||
|  |   </property> | ||||||
|  |   <property name="windowTitle"> | ||||||
|  |    <string>Train Controller</string> | ||||||
|  |   </property> | ||||||
|  |   <property name="windowIcon"> | ||||||
|  |    <iconset> | ||||||
|  |     <normaloff>:/images/UVOSicon.bmp</normaloff>:/images/UVOSicon.bmp</iconset> | ||||||
|  |   </property> | ||||||
|  |   <widget class="QWidget" name="centralWidget"> | ||||||
|  |    <property name="sizePolicy"> | ||||||
|  |     <sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding"> | ||||||
|  |      <horstretch>0</horstretch> | ||||||
|  |      <verstretch>0</verstretch> | ||||||
|  |     </sizepolicy> | ||||||
|  |    </property> | ||||||
|  |    <property name="layoutDirection"> | ||||||
|  |     <enum>Qt::LeftToRight</enum> | ||||||
|  |    </property> | ||||||
|  |    <property name="autoFillBackground"> | ||||||
|  |     <bool>false</bool> | ||||||
|  |    </property> | ||||||
|  |    <layout class="QHBoxLayout" name="horizontalLayout_10" stretch="0"> | ||||||
|  |     <property name="spacing"> | ||||||
|  |      <number>0</number> | ||||||
|  |     </property> | ||||||
|  |     <property name="leftMargin"> | ||||||
|  |      <number>0</number> | ||||||
|  |     </property> | ||||||
|  |     <property name="topMargin"> | ||||||
|  |      <number>0</number> | ||||||
|  |     </property> | ||||||
|  |     <property name="rightMargin"> | ||||||
|  |      <number>0</number> | ||||||
|  |     </property> | ||||||
|  |     <property name="bottomMargin"> | ||||||
|  |      <number>0</number> | ||||||
|  |     </property> | ||||||
|  |     <item> | ||||||
|  |      <layout class="QVBoxLayout" name="verticalLayout_2" stretch="1,0"> | ||||||
|  |       <property name="spacing"> | ||||||
|  |        <number>0</number> | ||||||
|  |       </property> | ||||||
|  |       <property name="leftMargin"> | ||||||
|  |        <number>0</number> | ||||||
|  |       </property> | ||||||
|  |       <property name="topMargin"> | ||||||
|  |        <number>0</number> | ||||||
|  |       </property> | ||||||
|  |       <item> | ||||||
|  |        <widget class="ItemScrollBox" name="relayList" native="true"> | ||||||
|  |         <property name="sizePolicy"> | ||||||
|  |          <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> | ||||||
|  |           <horstretch>0</horstretch> | ||||||
|  |           <verstretch>0</verstretch> | ||||||
|  |          </sizepolicy> | ||||||
|  |         </property> | ||||||
|  |        </widget> | ||||||
|  |       </item> | ||||||
|  |       <item> | ||||||
|  |        <layout class="QHBoxLayout" name="horizontalLayout" stretch="0,0,0"> | ||||||
|  |         <property name="spacing"> | ||||||
|  |          <number>0</number> | ||||||
|  |         </property> | ||||||
|  |         <property name="topMargin"> | ||||||
|  |          <number>0</number> | ||||||
|  |         </property> | ||||||
|  |         <item> | ||||||
|  |          <widget class="QPushButton" name="pushButton_refesh"> | ||||||
|  |           <property name="text"> | ||||||
|  |            <string>Refesh</string> | ||||||
|  |           </property> | ||||||
|  |          </widget> | ||||||
|  |         </item> | ||||||
|  |         <item> | ||||||
|  |          <widget class="QPushButton" name="pushButton_stop"> | ||||||
|  |           <property name="text"> | ||||||
|  |            <string>Stop</string> | ||||||
|  |           </property> | ||||||
|  |          </widget> | ||||||
|  |         </item> | ||||||
|  |         <item> | ||||||
|  |          <widget class="QPushButton" name="pushButton_addItem"> | ||||||
|  |           <property name="text"> | ||||||
|  |            <string>Add Item</string> | ||||||
|  |           </property> | ||||||
|  |          </widget> | ||||||
|  |         </item> | ||||||
|  |        </layout> | ||||||
|  |       </item> | ||||||
|  |      </layout> | ||||||
|  |     </item> | ||||||
|  |    </layout> | ||||||
|  |   </widget> | ||||||
|  |  </widget> | ||||||
|  |  <layoutdefault spacing="6" margin="11"/> | ||||||
|  |  <customwidgets> | ||||||
|  |   <customwidget> | ||||||
|  |    <class>ItemScrollBox</class> | ||||||
|  |    <extends>QWidget</extends> | ||||||
|  |    <header>itemscrollbox.h</header> | ||||||
|  |    <container>1</container> | ||||||
|  |   </customwidget> | ||||||
|  |  </customwidgets> | ||||||
|  |  <resources/> | ||||||
|  |  <connections/> | ||||||
|  | </ui> | ||||||
							
								
								
									
										68
									
								
								src/ui/relayscrollbox.ui
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								src/ui/relayscrollbox.ui
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,68 @@ | ||||||
|  | <?xml version="1.0" encoding="UTF-8"?> | ||||||
|  | <ui version="4.0"> | ||||||
|  |  <class>RelayScrollBox</class> | ||||||
|  |  <widget class="QWidget" name="RelayScrollBox"> | ||||||
|  |   <property name="geometry"> | ||||||
|  |    <rect> | ||||||
|  |     <x>0</x> | ||||||
|  |     <y>0</y> | ||||||
|  |     <width>400</width> | ||||||
|  |     <height>300</height> | ||||||
|  |    </rect> | ||||||
|  |   </property> | ||||||
|  |   <property name="windowTitle"> | ||||||
|  |    <string>Form</string> | ||||||
|  |   </property> | ||||||
|  |   <layout class="QHBoxLayout" name="horizontalLayout"> | ||||||
|  |    <item> | ||||||
|  |     <widget class="QScrollArea" name="scrollArea"> | ||||||
|  |      <property name="frameShape"> | ||||||
|  |       <enum>QFrame::NoFrame</enum> | ||||||
|  |      </property> | ||||||
|  |      <property name="lineWidth"> | ||||||
|  |       <number>0</number> | ||||||
|  |      </property> | ||||||
|  |      <property name="verticalScrollBarPolicy"> | ||||||
|  |       <enum>Qt::ScrollBarAlwaysOff</enum> | ||||||
|  |      </property> | ||||||
|  |      <property name="horizontalScrollBarPolicy"> | ||||||
|  |       <enum>Qt::ScrollBarAlwaysOff</enum> | ||||||
|  |      </property> | ||||||
|  |      <property name="widgetResizable"> | ||||||
|  |       <bool>true</bool> | ||||||
|  |      </property> | ||||||
|  |      <widget class="QWidget" name="scrollAreaWidgetContents"> | ||||||
|  |       <property name="geometry"> | ||||||
|  |        <rect> | ||||||
|  |         <x>0</x> | ||||||
|  |         <y>0</y> | ||||||
|  |         <width>388</width> | ||||||
|  |         <height>288</height> | ||||||
|  |        </rect> | ||||||
|  |       </property> | ||||||
|  |       <layout class="QVBoxLayout" name="verticalLayout"> | ||||||
|  |        <item> | ||||||
|  |         <layout class="QVBoxLayout" name="relayWidgetVbox"/> | ||||||
|  |        </item> | ||||||
|  |        <item> | ||||||
|  |         <spacer name="verticalSpacer"> | ||||||
|  |          <property name="orientation"> | ||||||
|  |           <enum>Qt::Vertical</enum> | ||||||
|  |          </property> | ||||||
|  |          <property name="sizeHint" stdset="0"> | ||||||
|  |           <size> | ||||||
|  |            <width>20</width> | ||||||
|  |            <height>40</height> | ||||||
|  |           </size> | ||||||
|  |          </property> | ||||||
|  |         </spacer> | ||||||
|  |        </item> | ||||||
|  |       </layout> | ||||||
|  |      </widget> | ||||||
|  |     </widget> | ||||||
|  |    </item> | ||||||
|  |   </layout> | ||||||
|  |  </widget> | ||||||
|  |  <resources/> | ||||||
|  |  <connections/> | ||||||
|  | </ui> | ||||||
							
								
								
									
										54
									
								
								trainControllerUI.pro
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								trainControllerUI.pro
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,54 @@ | ||||||
|  | #------------------------------------------------- | ||||||
|  | # | ||||||
|  | # Project created by QtCreator 2017-06-01T22:31:38 | ||||||
|  | # | ||||||
|  | #------------------------------------------------- | ||||||
|  | 
 | ||||||
|  | QT       += core gui widgets network multimedia | ||||||
|  | 
 | ||||||
|  | QT += serialport | ||||||
|  | 
 | ||||||
|  | TARGET = traincontrollerui | ||||||
|  | TEMPLATE = app | ||||||
|  | 
 | ||||||
|  | INCLUDEPATH += /usr/include/libnl3/ | ||||||
|  | 
 | ||||||
|  | LIBS += -lnl-3 -lnl-genl-3 | ||||||
|  | 
 | ||||||
|  | # 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 | ||||||
|  | 
 | ||||||
|  | QMAKE_CXXFLAGS += -std=c++17 -O2 | ||||||
|  | 
 | ||||||
|  | SOURCES += \ | ||||||
|  |     src/items/train.cpp \ | ||||||
|  |     src/mainobject.cpp \ | ||||||
|  | 	src/ui/itemwidget.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/mainobject.h \ | ||||||
|  | 	src/ui/itemwidget.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/itemwidget.ui | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue