# HG changeset patch # User jeandet # Date 2013-12-30 16:22:24 # Node ID aca341872bcb9af55cf0e05dc05271d0465ade00 # Parent 905c8a8cbf07514cad40cb67038e641181695607 WIP diff --git a/PeripheralWidget.pro b/PeripheralWidget.pro --- a/PeripheralWidget.pro +++ b/PeripheralWidget.pro @@ -14,7 +14,9 @@ TEMPLATE = app SOURCES += main.cpp\ mainwindow.cpp \ - peripheralwidget.cpp + peripheralwidget.cpp \ + registerwidget.cpp HEADERS += mainwindow.h \ - peripheralwidget.h + peripheralwidget.h \ + registerwidget.h diff --git a/mainwindow.cpp b/mainwindow.cpp --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -3,6 +3,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { + this->setCentralWidget(new peripheralWidget("UART1",this)); } MainWindow::~MainWindow() diff --git a/mainwindow.h b/mainwindow.h --- a/mainwindow.h +++ b/mainwindow.h @@ -2,6 +2,7 @@ #define MAINWINDOW_H #include +#include "peripheralwidget.h" class MainWindow : public QMainWindow { diff --git a/peripheralwidget.cpp b/peripheralwidget.cpp --- a/peripheralwidget.cpp +++ b/peripheralwidget.cpp @@ -1,6 +1,14 @@ #include "peripheralwidget.h" -peripheralWidget::peripheralWidget(QWidget *parent) : - QGroupBox(parent) +peripheralWidget::peripheralWidget(const QString &name, QWidget *parent) : + QGroupBox(name,parent) { + mainLayout = new QVBoxLayout(this); + for(int i=0;i<10;i++) + { + registersWdgts.append(new registerWidget(QString("REG%1").arg(i),i*8)); + registersWdgts.at(i)->setValue(-1); + mainLayout->addWidget(registersWdgts.at(i)); + } + setLayout(mainLayout); } diff --git a/peripheralwidget.h b/peripheralwidget.h --- a/peripheralwidget.h +++ b/peripheralwidget.h @@ -4,17 +4,23 @@ #include #include #include +#include +#include "registerwidget.h" class peripheralWidget : public QGroupBox { Q_OBJECT public: - explicit peripheralWidget(QWidget *parent = 0); + explicit peripheralWidget(const QString& name, QWidget *parent = 0); signals: public slots: +private: + QVBoxLayout* mainLayout; + QList registersWdgts; + }; #endif // PERIPHERALWIDGET_H diff --git a/registerwidget.cpp b/registerwidget.cpp new file mode 100644 --- /dev/null +++ b/registerwidget.cpp @@ -0,0 +1,48 @@ +#include "registerwidget.h" +#include +#include + +registerWidget::registerWidget(const QString &name, qint32 address, QWidget *parent) : + QWidget(parent) +{ + p_address = address; + p_value = 0; + p_addressEl = new regWidgetElement(QString("0x%1").arg(p_address,8,16).replace(" ","0"),QFont("Utopia", 12),4,4); + p_fieldsEl = new bitfieldsElement(QString("%1").arg(p_value,32,2).replace(" ","0"),QFont("Utopia", 12),4,4); + p_nameEl = new regWidgetElement(name,QFont("Utopia", 12,QFont::Bold),4,4); + p_xMargins = 4; + p_yMargins = 4; + updateBoundingRect(); +} + +registerWidget::~registerWidget() +{ + delete p_addressEl; + delete p_fieldsEl; + delete p_nameEl; +} + +void registerWidget::paintEvent(QPaintEvent *event) +{ + Q_UNUSED(event) + QPainter painter(this); + painter.translate(p_addressEl->paint(&painter)); + painter.translate(p_fieldsEl->paint(&painter)); + p_nameEl->paint(&painter); + setMinimumSize(p_boundingRect); + updateGeometry(); +} + +void registerWidget::setValue(qint32 value) +{ + this->p_value = value; + this->p_fieldsEl->setValue(QString("%1").arg(p_value,32,2).replace(" ","0")); + this->repaint(); +} + +void registerWidget::updateBoundingRect() +{ + p_boundingRect.setHeight(p_fieldsEl->boundingRect().height()+(p_yMargins*2)); + p_boundingRect.setWidth(p_fieldsEl->boundingRect().width()+p_addressEl->boundingRect().width()+p_nameEl->boundingRect().width()+(p_xMargins*2)); +} + diff --git a/registerwidget.h b/registerwidget.h new file mode 100644 --- /dev/null +++ b/registerwidget.h @@ -0,0 +1,137 @@ +#ifndef REGISTERWIDGET_H +#define REGISTERWIDGET_H +#include +#include + +class regWidgetElement +{ +public: + regWidgetElement(const QString& value,QFont font,int xMargin,int yMargin) + { + p_valueStr = value; + p_font = font; + p_xMargins = xMargin; + p_yMargins = yMargin; + updateBoundingRect(); + } + void setValue(const QString& value) + { + p_valueStr = value; + updateBoundingRect(); + } + void setFont(QFont font) + { + p_font = font; + updateBoundingRect(); + } + QSize boundingRect(){return p_boundingRec;} + QString value(){return p_valueStr;} + const QChar at ( int position ) const{return p_valueStr.at(position);} + QFont font(){return p_font;} + int xMargin(){return p_xMargins;} + int yMargin(){return p_yMargins;} + QFontMetrics fontMetrics(){return QFontMetrics(p_font);} + QPoint paint(QPainter* painter) + { + painter->setFont(p_font); + painter->drawText(0,QFontMetrics(p_font).ascent()+p_yMargins,p_valueStr); + return QPoint(p_boundingRec.width(),0); + } + void updateBoundingRect() + { + p_boundingRec.setHeight(QFontMetrics(p_font).boundingRect(p_valueStr).height()+(p_yMargins*2)); + p_boundingRec.setWidth(QFontMetrics(p_font).boundingRect(p_valueStr).width()+(p_xMargins*2)); + } + +protected: + QString p_valueStr; + QFont p_font; + QSize p_boundingRec; + int p_xMargins; + int p_yMargins; +}; + +class bitfieldsElement: public regWidgetElement +{ + struct bitAttribute + { + bool rw; + int descIndex; + }; +public: + bitfieldsElement(const QString& value,QFont font,int xMargin,int yMargin) + :regWidgetElement(value,font,xMargin,yMargin) + { + for(int i=0;i<32;i++) + { + attributes[i].rw = false; + } + updateBoundingRect(); + } + QPoint paint(QPainter* painter) + { + painter->fillRect(4,4,p_boundingRec.width(),p_boundingRec.height(),Qt::darkGray); + painter->fillRect(0,0,p_boundingRec.width(),p_boundingRec.height(),Qt::white); + painter->setFont(p_font); + int xpos=p_xMargins,dx=QFontMetrics(p_font).width("0")+2; + for(int i=0;i<(32/4);i++) + { + for(int l = 0;l<4;l++) + { + if(attributes[(i*4)+l].rw==false) + painter->fillRect(xpos-1,0,dx,p_boundingRec.height(),Qt::lightGray); + else + painter->fillRect(xpos-1,0,dx,p_boundingRec.height(),Qt::white); + painter->drawText(xpos,QFontMetrics(p_font).ascent()+p_yMargins,p_valueStr.at((i*4)+l)); + xpos+=dx; + } + if(i==3) + painter->drawLine(xpos+(p_xMargins/2),p_boundingRec.height()-6,xpos+(p_xMargins/2),p_boundingRec.height()+6); + else if(i<7) + painter->drawLine(xpos+(p_xMargins/2),p_boundingRec.height()-2,xpos+(p_xMargins/2),p_boundingRec.height()+2); + xpos+=p_xMargins; + } + painter->drawRect(0,0,p_boundingRec.width(),p_boundingRec.height()); + return QPoint(p_boundingRec.width()+4+p_xMargins,0); + } + + void updateBoundingRect() + { + p_boundingRec.setHeight(QFontMetrics(p_font).boundingRect(p_valueStr).height()+(p_yMargins*2)); + int width = (((4*(QFontMetrics(p_font).width("0") + 2)) + p_xMargins) * 8) + (p_xMargins); + p_boundingRec.setWidth(width); + } +private: + struct bitAttribute attributes[32]; +}; + + +class registerWidget : public QWidget +{ + Q_OBJECT +public: + explicit registerWidget(const QString& name,qint32 address,QWidget *parent = 0); + ~registerWidget(); + +signals: + void cursorUp(int pos); + void cursorDown(int pos); + +protected: + void paintEvent(QPaintEvent* event); + +public slots: + void setValue(qint32 value); + +private: + void updateBoundingRect(); + qint32 p_address; + qint32 p_value; + QSize p_boundingRect; + int p_xMargins; + int p_yMargins; + regWidgetElement* p_addressEl,*p_nameEl; + bitfieldsElement* p_fieldsEl; +}; + +#endif // REGISTERWIDGET_H