diff --git a/PeripheralWidget.pri b/PeripheralWidget.pri new file mode 100644 --- /dev/null +++ b/PeripheralWidget.pri @@ -0,0 +1,9 @@ + +PERIPHERAL_WDGT_SOURCES =\ + src/peripheralwidget.cpp \ + src/registerwidget.cpp + +PERIPHERAL_WDGT_HEADERS += \ + src/peripheralwidget.h \ + src/registerwidget.h + diff --git a/PeripheralWidget.pro b/PeripheralWidget.pro --- a/PeripheralWidget.pro +++ b/PeripheralWidget.pro @@ -10,13 +10,18 @@ greaterThan(QT_MAJOR_VERSION, 4): QT += TARGET = PeripheralWidget TEMPLATE = app +MOC_DIR = moc +OBJECTS_DIR = obj +DESTDIR = bin +include(PeripheralWidget.pri) + +INCLUDEPATH += src -SOURCES += main.cpp\ - mainwindow.cpp \ - peripheralwidget.cpp \ - registerwidget.cpp +SOURCES += test/main.cpp \ + test/mainwindow.cpp \ + $$PERIPHERAL_WDGT_SOURCES -HEADERS += mainwindow.h \ - peripheralwidget.h \ - registerwidget.h +HEADERS += test/mainwindow.h \ + $$PERIPHERAL_WDGT_HEADERS + diff --git a/peripheralwidget.cpp b/src/peripheralwidget.cpp rename from peripheralwidget.cpp rename to src/peripheralwidget.cpp --- a/peripheralwidget.cpp +++ b/src/peripheralwidget.cpp @@ -1,21 +1,18 @@ #include "peripheralwidget.h" -peripheralWidget::peripheralWidget(const QString &name, QWidget *parent) : +peripheralWidget::peripheralWidget(const QString &name, qint32 baseAddress, QWidget *parent) : QWidget(parent) { p_name = name; p_timer = new QTimer(this); p_timer->setInterval(500); - for(int i=0;i<10;i++) - { - registersWdgts.append(new registerWidget(QString("REG%1").arg(i),i*4)); - registersWdgts.at(i)->setValue((i<<24)+(i<<8)+i); - connect(registersWdgts.at(i),SIGNAL(repaint()),this,SLOT(repaint())); - } + p_baseAddress = baseAddress; + p_header = p_name + QString(" @0x%1").arg((uint)p_baseAddress,8,16); setAttribute(Qt::WA_AlwaysShowToolTips); setMouseTracking(true); setFocusPolicy(Qt::StrongFocus); selectedReg = -1; + registersWdgts.clear(); connect(p_timer,SIGNAL(timeout()),this,SLOT(blinkCursor())); setFont(QFont("Utopia", 14,QFont::Bold)); } @@ -27,11 +24,21 @@ void peripheralWidget::blinkCursor() repaint(); } +void peripheralWidget::addRegister(const QString &name, qint32 address) +{ + /*TODO Should regs by address*/ + registersWdgts.append(new registerWidget(name,address)); + connect(registersWdgts.last(),SIGNAL(repaint()),this,SLOT(repaint())); +} + void peripheralWidget::mousePressEvent(QMouseEvent *event) { p_timer->stop(); if(selectedReg!=-1) + { registersWdgts.at(selectedReg)->leave(); + selectedReg = -1; + } for(int i=0; icontains(event->pos())) @@ -67,6 +74,13 @@ void peripheralWidget::keyPressEvent(QKe case Qt::Key_Down: registersWdgts.at(selectedReg)->clear(registersWdgts.at(selectedReg)->cursorIndex()); break; + case Qt::Key_W: + emit writeRegSig(registersWdgts.at(selectedReg)->address(),registersWdgts.at(selectedReg)->value()); + break; + case Qt::Key_R: + qint32 value; + value = emit readRegSig(registersWdgts.at(selectedReg)->address()); + break; default: break; } @@ -108,17 +122,26 @@ void peripheralWidget::keyPressEvent(QKe void peripheralWidget::paintEvent(QPaintEvent *event) { Q_UNUSED(event) + QPainter painter(this); QPoint offset=QPoint(0,0); - int nameWidth = fontMetrics().width(p_name); - painter.drawText((this->minimumWidth()/2)-nameWidth,4,fontMetrics().width(p_name),fontMetrics().height()+4,Qt::AlignCenter,p_name); + int nameWidth = fontMetrics().width(p_header); + if(registersWdgts.count()==0) + { + setMinimumSize(2*nameWidth+10,fontMetrics().height()+10); + } + painter.drawText((this->minimumWidth()/2)-nameWidth,4,fontMetrics().width(p_header),fontMetrics().height()+4,Qt::AlignCenter,p_header); offset+=QPoint(0,fontMetrics().height()+8); for(int i=0;ipaint(&painter,offset); } - setMinimumSize(registersWdgts.first()->boundingRect().width(),offset.y()); + if(registersWdgts.count()>0) + { + setMinimumSize(registersWdgts.first()->boundingRect().width(),offset.y()); + } updateGeometry(); + } void peripheralWidget::up() diff --git a/peripheralwidget.h b/src/peripheralwidget.h rename from peripheralwidget.h rename to src/peripheralwidget.h --- a/peripheralwidget.h +++ b/src/peripheralwidget.h @@ -12,12 +12,14 @@ class peripheralWidget : public QWidget { Q_OBJECT public: - explicit peripheralWidget(const QString& name, QWidget *parent = 0); + explicit peripheralWidget(const QString& name,qint32 baseAddress, QWidget *parent = 0); signals: - + void writeRegSig(qint32 address,qint32 value); + qint32 readRegSig(qint32 address); public slots: void blinkCursor(); + void addRegister(const QString& name,qint32 address); protected: void mousePressEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event); @@ -29,6 +31,8 @@ private: void up(); void down(); QString p_name; + QString p_header; + qint32 p_baseAddress; QList registersWdgts; int selectedReg; QTimer* p_timer; diff --git a/registerwidget.cpp b/src/registerwidget.cpp rename from registerwidget.cpp rename to src/registerwidget.cpp --- a/registerwidget.cpp +++ b/src/registerwidget.cpp @@ -59,6 +59,16 @@ uint registerWidget::cursorIndex(int xPo } } +qint32 registerWidget::address() +{ + return p_address; +} + +qint32 registerWidget::value() +{ + return p_value; +} + void registerWidget::setValue(qint32 value) { this->p_value = value; diff --git a/registerwidget.h b/src/registerwidget.h rename from registerwidget.h rename to src/registerwidget.h --- a/registerwidget.h +++ b/src/registerwidget.h @@ -101,6 +101,8 @@ public: QRect boundingRect(); uint cursorIndex(); uint cursorIndex(int xPos); + qint32 address(); + qint32 value(); signals: void cursorUp(int pos); void cursorDown(int pos); diff --git a/main.cpp b/test/main.cpp rename from main.cpp rename to test/main.cpp diff --git a/mainwindow.cpp b/test/mainwindow.cpp rename from mainwindow.cpp rename to test/mainwindow.cpp --- a/mainwindow.cpp +++ b/test/mainwindow.cpp @@ -3,7 +3,11 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { - this->setCentralWidget(new peripheralWidget("UART1",this)); + qint32 baseAddress = 0x8000100; + testWidget = new peripheralWidget("UART1",baseAddress,this); + for(int i=0;i<10;i++) + testWidget->addRegister(QString("REG%1").arg((uint)i),baseAddress+(i*4)); + this->setCentralWidget(testWidget); } MainWindow::~MainWindow() diff --git a/mainwindow.h b/test/mainwindow.h rename from mainwindow.h rename to test/mainwindow.h --- a/mainwindow.h +++ b/test/mainwindow.h @@ -11,6 +11,8 @@ class MainWindow : public QMainWindow public: MainWindow(QWidget *parent = 0); ~MainWindow(); + + peripheralWidget* testWidget; }; #endif // MAINWINDOW_H