commit
ab1dd41525
6 changed files with 996 additions and 0 deletions
@ -0,0 +1,2 @@ |
|||
*.user |
|||
|
@ -0,0 +1,35 @@ |
|||
QT += core gui |
|||
|
|||
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets |
|||
|
|||
CONFIG += c++11 |
|||
|
|||
# The following define makes your compiler emit warnings if you use |
|||
# any Qt feature that has been marked 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 |
|||
|
|||
# You can also make your code fail to compile if it uses deprecated APIs. |
|||
# In order to do so, uncomment the following line. |
|||
# You can also select to disable deprecated APIs only up to a certain version of Qt. |
|||
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 |
|||
|
|||
SOURCES += \ |
|||
main.cpp \ |
|||
mainwindow.cpp \ |
|||
/home/hasis/Desktop/pcie/pcie_driver/api/api.cpp |
|||
|
|||
HEADERS += \ |
|||
mainwindow.h \ |
|||
/home/hasis/Desktop/pcie/pcie_driver/api/api.h |
|||
|
|||
FORMS += \ |
|||
mainwindow.ui |
|||
|
|||
INCLUDEPATH += /home/hasis/Desktop/pcie/pcie_driver/api/ |
|||
|
|||
# Default rules for deployment. |
|||
qnx: target.path = /tmp/$${TARGET}/bin |
|||
else: unix:!android: target.path = /opt/$${TARGET}/bin |
|||
!isEmpty(target.path): INSTALLS += target |
@ -0,0 +1,11 @@ |
|||
#include "mainwindow.h" |
|||
|
|||
#include <QApplication> |
|||
|
|||
int main(int argc, char *argv[]) |
|||
{ |
|||
QApplication a(argc, argv); |
|||
MainWindow w; |
|||
w.show(); |
|||
return a.exec(); |
|||
} |
@ -0,0 +1,437 @@ |
|||
#include "mainwindow.h" |
|||
#include "ui_mainwindow.h" |
|||
|
|||
#include <QDebug> |
|||
#include <QFileDialog> |
|||
#include <QtConcurrent/QtConcurrent> |
|||
#include <QMessageBox> |
|||
|
|||
#define MESSAGE_BOX(M) \ |
|||
emit showMessage(M) |
|||
|
|||
|
|||
MainWindow::MainWindow(QWidget *parent) |
|||
: QMainWindow(parent) |
|||
, ui(new Ui::MainWindow) |
|||
{ |
|||
ui->setupUi(this); |
|||
|
|||
_settings = new QSettings("Hasis", "HwTester"); |
|||
|
|||
_usd = new UltraSoundDevice(); |
|||
|
|||
this->setFixedSize(this->width(),this->height()); |
|||
|
|||
ui->prg_binUpload->setVisible(false); |
|||
ui->prg_fpgaProgram->setVisible(false); |
|||
|
|||
ui->tb_binFile->setReadOnly(true); |
|||
ui->tb_fpgaBit->setReadOnly(true); |
|||
|
|||
ui->tb_binFile->setText(_settings->value(BIN_FILE_PATH).value<QString>()); |
|||
ui->tb_binOffset->setText(_settings->value(BIN_OFFSET).value<QString>()); |
|||
ui->cb_binBarNum->setCurrentIndex(_settings->value(BIN_BAR_INDEX).value<int>()); |
|||
ui->rbtn_reg->setChecked(_settings->value(REG_ACCESS_SEL).value<bool>()); |
|||
ui->rbtn_offset->setChecked(!_settings->value(REG_ACCESS_SEL).value<bool>()); |
|||
ui->tb_fpgaBit->setText(_settings->value(FPGA_FILE_PATH).value<QString>()); |
|||
|
|||
connect(this, &MainWindow::updateBlockProgressValue, this, &MainWindow::newBlockProgressValue); |
|||
connect(this, &MainWindow::updateFpgaProgressValue, this, &MainWindow::newFpgaProgressValue); |
|||
connect(this, &MainWindow::updateBlockProgressVisibility, this, &MainWindow::newBlockProgressVisibility); |
|||
connect(this, &MainWindow::updateFpgaProgressVisibility, this, &MainWindow::newFpgaProgressVisibility); |
|||
connect(this, &MainWindow::showMessage, this, &MainWindow::newMessage); |
|||
} |
|||
|
|||
/*************************************************************************************************/ |
|||
MainWindow::~MainWindow() |
|||
{ |
|||
delete ui; |
|||
|
|||
delete _settings; |
|||
|
|||
delete _usd; |
|||
} |
|||
|
|||
/*************************************************************************************************/ |
|||
void MainWindow::on_btn_browse_clicked() |
|||
{ |
|||
QFileDialog fileDialog; |
|||
fileDialog.setNameFilters({"SRAM binary file (*.bin)"}); |
|||
auto result = fileDialog.exec(); |
|||
|
|||
if(result) |
|||
{ |
|||
auto selectedPath = fileDialog.selectedFiles()[0]; |
|||
ui->tb_binFile->setText(selectedPath); |
|||
_settings->setValue(BIN_FILE_PATH, selectedPath); |
|||
} |
|||
} |
|||
|
|||
/*************************************************************************************************/ |
|||
void MainWindow::on_btn_binUpload_clicked() |
|||
{ |
|||
auto bar = ui->cb_binBarNum->currentText().toUInt(); |
|||
|
|||
auto offset = ui->tb_binOffset->text().toUInt(Q_NULLPTR, 16); |
|||
if(offset == 0 && ui->tb_binOffset->text() != "0") |
|||
{ |
|||
MESSAGE_BOX("Invalid input format for offset"); |
|||
return; |
|||
} |
|||
_settings->setValue(BIN_OFFSET, offset); |
|||
_settings->setValue(BIN_BAR_INDEX, ui->cb_binBarNum->currentIndex()); |
|||
|
|||
auto path = ui->tb_binFile->text(); |
|||
|
|||
QtConcurrent::run(this, &MainWindow::binaryFileUploader, bar, offset, path); |
|||
} |
|||
|
|||
/*************************************************************************************************/ |
|||
void MainWindow::on_btn_binVerify_clicked() |
|||
{ |
|||
auto bar = ui->cb_binBarNum->currentText().toUInt(); |
|||
|
|||
auto offset = ui->tb_binOffset->text().toUInt(Q_NULLPTR, 16); |
|||
if(offset == 0 && ui->tb_binOffset->text() != "0") |
|||
{ |
|||
MESSAGE_BOX("Invalid input format for offset"); |
|||
return; |
|||
} |
|||
_settings->setValue(BIN_OFFSET, offset); |
|||
_settings->setValue(BIN_BAR_INDEX, ui->cb_binBarNum->currentIndex()); |
|||
|
|||
auto path = ui->tb_binFile->text(); |
|||
|
|||
QtConcurrent::run(this, &MainWindow::binaryFileVerifier, bar, offset, path); |
|||
} |
|||
|
|||
/*************************************************************************************************/ |
|||
void MainWindow::binaryFileUploader(quint32 bar, quint32 offset, QString path) |
|||
{ |
|||
QFile file(path); |
|||
|
|||
if (!file.open(QFile::ReadOnly)) |
|||
{ |
|||
MESSAGE_BOX("Could not open binary file, aborting operation"); |
|||
return; |
|||
} |
|||
|
|||
emit updateBlockProgressVisibility(true); |
|||
emit updateBlockProgressValue(0); |
|||
|
|||
const auto actualSize = file.size(); |
|||
auto readSize = 0; |
|||
while(readSize < actualSize) |
|||
{ |
|||
QByteArray chunk = file.read(4); |
|||
auto value = byteArrayTo32LittleEndian(chunk); |
|||
try |
|||
{ |
|||
_usd->writeWord(offset + readSize, bar, value); |
|||
} catch (myexception e) |
|||
{ |
|||
MESSAGE_BOX(e.what()); |
|||
|
|||
emit updateBlockProgressVisibility(false); |
|||
|
|||
file.close(); |
|||
|
|||
return; |
|||
} |
|||
readSize += 4; |
|||
|
|||
auto percentage = (readSize * 100 / actualSize); |
|||
emit updateBlockProgressValue(percentage); |
|||
} |
|||
|
|||
MESSAGE_BOX("Binary file upload finished with success"); |
|||
|
|||
emit updateBlockProgressVisibility(false); |
|||
|
|||
file.close(); |
|||
} |
|||
|
|||
/*************************************************************************************************/ |
|||
void MainWindow::binaryFileVerifier(quint32 bar, quint32 offset, QString path) |
|||
{ |
|||
QFile file(path); |
|||
|
|||
if (!file.open(QFile::ReadOnly)) |
|||
{ |
|||
MESSAGE_BOX("Could not open binary file, aborting operation"); |
|||
return; |
|||
} |
|||
|
|||
emit updateBlockProgressVisibility(true); |
|||
emit updateBlockProgressValue(0); |
|||
|
|||
const auto actualSize = file.size(); |
|||
auto readSize = 0; |
|||
while(readSize < actualSize) |
|||
{ |
|||
QByteArray chunk = file.read(4); |
|||
auto value = byteArrayTo32LittleEndian(chunk); |
|||
try |
|||
{ |
|||
auto data = _usd->readWord(offset + readSize, bar); |
|||
if(data != value) |
|||
{ |
|||
auto message = QString("Error in data @ offset 0x%1, expected 0x%2 saw 0x%3") |
|||
.arg(QString::number(offset + readSize)) |
|||
.arg(QString::number(value, 16)) |
|||
.arg(QString::number(data, 16)); |
|||
MESSAGE_BOX(message); |
|||
|
|||
emit updateBlockProgressVisibility(false); |
|||
|
|||
file.close(); |
|||
|
|||
return; |
|||
} |
|||
} |
|||
catch (myexception e) |
|||
{ |
|||
MESSAGE_BOX(e.what()); |
|||
|
|||
emit updateBlockProgressVisibility(false); |
|||
|
|||
file.close(); |
|||
|
|||
return; |
|||
} |
|||
readSize += 4; |
|||
|
|||
auto percentage = (readSize * 100 / actualSize); |
|||
emit updateBlockProgressValue(percentage); |
|||
} |
|||
|
|||
MESSAGE_BOX("Binary verified with success"); |
|||
|
|||
emit updateBlockProgressVisibility(false); |
|||
|
|||
file.close(); |
|||
} |
|||
|
|||
/*************************************************************************************************/ |
|||
void MainWindow::fpgaProgrammer(quint32 bar, quint32 offset, QString path) |
|||
{ |
|||
QFile file(path); |
|||
|
|||
if (!file.open(QFile::ReadOnly)) |
|||
{ |
|||
MESSAGE_BOX("Could not open bit file, aborting operation"); |
|||
return; |
|||
} |
|||
|
|||
emit updateFpgaProgressValue(0); |
|||
emit updateFpgaProgressVisibility(true); |
|||
|
|||
const auto actualSize = file.size(); |
|||
auto readSize = 0; |
|||
while(readSize < actualSize) |
|||
{ |
|||
QByteArray chunk = file.read(4); |
|||
auto value = byteArrayTo32BigEndian(chunk); |
|||
try |
|||
{ |
|||
_usd->writeWord(offset, bar, value); |
|||
auto temp = _usd->readWord(offset + 4, bar); |
|||
while ((temp & 0x01) == 0x01) |
|||
{ |
|||
temp = _usd->readWord(offset + 4, bar); |
|||
} |
|||
|
|||
if((temp & 0x08) == 0x08) |
|||
{ |
|||
throw(myexception("init_fail flag raised")); |
|||
} |
|||
|
|||
if((temp & 0x10) == 0x10) |
|||
{ |
|||
throw(myexception("time_out flag raised")); |
|||
} |
|||
} |
|||
catch (myexception e) |
|||
{ |
|||
MESSAGE_BOX(e.what()); |
|||
|
|||
emit updateFpgaProgressVisibility(false); |
|||
|
|||
file.close(); |
|||
|
|||
return; |
|||
} |
|||
readSize += 4; |
|||
|
|||
auto percentage = (readSize * 100 / actualSize); |
|||
emit updateFpgaProgressValue(percentage); |
|||
} |
|||
|
|||
auto temp = _usd->readWord(offset + 4, bar); |
|||
if((temp & 0x02) == 0x02) |
|||
{ |
|||
MESSAGE_BOX("FPGA programming finished with success"); |
|||
} |
|||
else if((temp & 0x04) == 0x04) |
|||
{ |
|||
MESSAGE_BOX("FPGA programming failed"); |
|||
} |
|||
|
|||
emit updateFpgaProgressVisibility(false); |
|||
|
|||
file.close(); |
|||
} |
|||
|
|||
/*************************************************************************************************/ |
|||
quint32 MainWindow::byteArrayTo32LittleEndian(QByteArray data) |
|||
{ |
|||
quint32 temp = 0; |
|||
|
|||
temp = (data[0] & 0x000000FF) | |
|||
((data[1] << 8) & 0x0000FF00) | |
|||
((data[2] << 16) & 0x00FF0000) | |
|||
((data[3] << 24) & 0xFF000000); |
|||
|
|||
return temp; |
|||
} |
|||
|
|||
/*************************************************************************************************/ |
|||
quint32 MainWindow::byteArrayTo32BigEndian(QByteArray data) |
|||
{ |
|||
quint32 temp = 0; |
|||
|
|||
temp = (data[3] & 0x000000FF) | |
|||
((data[2] << 8) & 0x0000FF00) | |
|||
((data[1] << 16) & 0x00FF0000) | |
|||
((data[0] << 24) & 0xFF000000); |
|||
|
|||
return temp; |
|||
} |
|||
|
|||
/*************************************************************************************************/ |
|||
void MainWindow::on_rbtn_reg_toggled(bool checked) |
|||
{ |
|||
if(checked) |
|||
{ |
|||
_settings->setValue(REG_ACCESS_SEL, true); |
|||
ui->l_regIndicator->setText("Register number: (Dec)"); |
|||
} |
|||
} |
|||
|
|||
/*************************************************************************************************/ |
|||
void MainWindow::on_rbtn_offset_toggled(bool checked) |
|||
{ |
|||
if(checked) |
|||
{ |
|||
_settings->setValue(REG_ACCESS_SEL, false); |
|||
ui->l_regIndicator->setText("Register offset: (Hex)"); |
|||
} |
|||
} |
|||
|
|||
/*************************************************************************************************/ |
|||
void MainWindow::on_btn_readReg_clicked() |
|||
{ |
|||
auto bar = ui->cb_regBarNum->currentText().toUInt(); |
|||
|
|||
quint32 offset = 0; |
|||
if(ui->rbtn_reg->isChecked()) |
|||
offset = ui->tb_regIndicator->text().toUInt(Q_NULLPTR, 10) * 4; |
|||
else |
|||
offset = ui->tb_regIndicator->text().toUInt(Q_NULLPTR, 16); |
|||
|
|||
if(offset == 0 && ui->tb_regIndicator->text() != "0") |
|||
{ |
|||
MESSAGE_BOX("Invalid input format for offset"); |
|||
return; |
|||
} |
|||
|
|||
auto value = _usd->readWord(offset, bar); |
|||
|
|||
ui->lcd_regvalue->setDigitCount(8); |
|||
ui->lcd_regvalue->display(QString::number(value, 16)); |
|||
} |
|||
|
|||
/*************************************************************************************************/ |
|||
void MainWindow::on_btn_writeReg_clicked() |
|||
{ |
|||
auto bar = ui->cb_regBarNum->currentText().toUInt(); |
|||
|
|||
quint32 offset = 0; |
|||
if(ui->rbtn_reg->isChecked()) |
|||
offset = ui->tb_regIndicator->text().toUInt(Q_NULLPTR, 10) * 4; |
|||
else |
|||
offset = ui->tb_regIndicator->text().toUInt(Q_NULLPTR, 16); |
|||
|
|||
if(offset == 0 && ui->tb_regIndicator->text() != "0") |
|||
{ |
|||
MESSAGE_BOX("Invalid input format for offset"); |
|||
return; |
|||
} |
|||
|
|||
auto value = ui->tb_regValue->text().toUInt(Q_NULLPTR, 16); |
|||
if(value == 0 && ui->tb_regValue->text() != "0") |
|||
{ |
|||
MESSAGE_BOX("Invalid input format for write value"); |
|||
return; |
|||
} |
|||
|
|||
_usd->writeWord(offset, bar, value); |
|||
} |
|||
|
|||
/*************************************************************************************************/ |
|||
void MainWindow::newBlockProgressValue(int percentage) |
|||
{ |
|||
ui->prg_binUpload->setValue(percentage); |
|||
} |
|||
|
|||
/*************************************************************************************************/ |
|||
void MainWindow::newFpgaProgressValue(int percentage) |
|||
{ |
|||
ui->prg_fpgaProgram->setValue(percentage); |
|||
} |
|||
|
|||
/*************************************************************************************************/ |
|||
void MainWindow::newBlockProgressVisibility(bool show) |
|||
{ |
|||
ui->prg_binUpload->setVisible(show); |
|||
} |
|||
|
|||
/*************************************************************************************************/ |
|||
void MainWindow::newFpgaProgressVisibility(bool show) |
|||
{ |
|||
ui->prg_fpgaProgram->setVisible(show); |
|||
} |
|||
|
|||
/*************************************************************************************************/ |
|||
void MainWindow::on_btn_fpgaBrowse_clicked() |
|||
{ |
|||
QFileDialog fileDialog; |
|||
fileDialog.setNameFilters({"FPGA program file (*.bit)"}); |
|||
auto result = fileDialog.exec(); |
|||
|
|||
if(result) |
|||
{ |
|||
auto selectedPath = fileDialog.selectedFiles()[0]; |
|||
ui->tb_fpgaBit->setText(selectedPath); |
|||
_settings->setValue(FPGA_FILE_PATH, selectedPath); |
|||
} |
|||
} |
|||
|
|||
/*************************************************************************************************/ |
|||
void MainWindow::on_btn_fpgaProgram_clicked() |
|||
{ |
|||
auto bar = 1; |
|||
auto offset = 1000; |
|||
|
|||
auto path = ui->tb_fpgaBit->text(); |
|||
|
|||
QtConcurrent::run(this, &MainWindow::fpgaProgrammer, bar, offset, path); |
|||
} |
|||
|
|||
/*************************************************************************************************/ |
|||
void MainWindow::newMessage(QString message) |
|||
{ |
|||
QMessageBox msgBox; |
|||
msgBox.setText(message); |
|||
msgBox.exec(); |
|||
} |
@ -0,0 +1,79 @@ |
|||
#ifndef MAINWINDOW_H |
|||
#define MAINWINDOW_H |
|||
|
|||
#include <QMainWindow> |
|||
#include <QSettings> |
|||
|
|||
#include "api.h" |
|||
|
|||
#define BIN_FILE_PATH "binFilePath" |
|||
#define FPGA_FILE_PATH "fpgaFilePath" |
|||
#define BIN_OFFSET "binOffset" |
|||
#define BIN_BAR_INDEX "binBarIndex" |
|||
#define REG_ACCESS_SEL "regAccessType" |
|||
|
|||
|
|||
QT_BEGIN_NAMESPACE |
|||
namespace Ui { class MainWindow; } |
|||
QT_END_NAMESPACE |
|||
|
|||
class MainWindow : public QMainWindow |
|||
{ |
|||
Q_OBJECT |
|||
|
|||
public: |
|||
MainWindow(QWidget *parent = nullptr); |
|||
~MainWindow(); |
|||
|
|||
private slots: |
|||
void on_btn_browse_clicked(); |
|||
|
|||
void on_btn_binUpload_clicked(); |
|||
|
|||
void on_btn_binVerify_clicked(); |
|||
|
|||
void on_rbtn_reg_toggled(bool checked); |
|||
|
|||
void on_rbtn_offset_toggled(bool checked); |
|||
|
|||
void on_btn_readReg_clicked(); |
|||
|
|||
void on_btn_writeReg_clicked(); |
|||
|
|||
void newBlockProgressValue(int percentage); |
|||
|
|||
void newFpgaProgressValue(int percentage); |
|||
|
|||
void newBlockProgressVisibility(bool show); |
|||
|
|||
void newFpgaProgressVisibility(bool show); |
|||
|
|||
void on_btn_fpgaBrowse_clicked(); |
|||
|
|||
void on_btn_fpgaProgram_clicked(); |
|||
|
|||
void newMessage(QString message); |
|||
|
|||
|
|||
private: |
|||
Ui::MainWindow *ui; |
|||
|
|||
QSettings* _settings; |
|||
|
|||
UltraSoundDevice* _usd; |
|||
|
|||
void binaryFileUploader(quint32 bar, quint32 offset, QString path); |
|||
void binaryFileVerifier(quint32 bar, quint32 offset, QString path); |
|||
void fpgaProgrammer(quint32 bar, quint32 offset, QString path); |
|||
quint32 byteArrayTo32LittleEndian(QByteArray data); |
|||
quint32 byteArrayTo32BigEndian(QByteArray data); |
|||
|
|||
signals: |
|||
void updateBlockProgressValue(int percentage); |
|||
void updateFpgaProgressValue(int percentage); |
|||
void updateBlockProgressVisibility(bool show); |
|||
void updateFpgaProgressVisibility(bool show); |
|||
void showMessage(QString message); |
|||
|
|||
}; |
|||
#endif // MAINWINDOW_H
|
@ -0,0 +1,432 @@ |
|||
<?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>800</width> |
|||
<height>487</height> |
|||
</rect> |
|||
</property> |
|||
<property name="sizePolicy"> |
|||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed"> |
|||
<horstretch>0</horstretch> |
|||
<verstretch>0</verstretch> |
|||
</sizepolicy> |
|||
</property> |
|||
<property name="windowTitle"> |
|||
<string>HW TESTER</string> |
|||
</property> |
|||
<widget class="QWidget" name="centralwidget"> |
|||
<widget class="QWidget" name="layoutWidget"> |
|||
<property name="geometry"> |
|||
<rect> |
|||
<x>10</x> |
|||
<y>0</y> |
|||
<width>781</width> |
|||
<height>461</height> |
|||
</rect> |
|||
</property> |
|||
<layout class="QVBoxLayout" name="verticalLayout_4"> |
|||
<item> |
|||
<widget class="QGroupBox" name="groupBox"> |
|||
<property name="title"> |
|||
<string>Block operation</string> |
|||
</property> |
|||
<widget class="QWidget" name="layoutWidget_2"> |
|||
<property name="geometry"> |
|||
<rect> |
|||
<x>10</x> |
|||
<y>30</y> |
|||
<width>761</width> |
|||
<height>27</height> |
|||
</rect> |
|||
</property> |
|||
<layout class="QHBoxLayout" name="horizontalLayout"> |
|||
<item> |
|||
<widget class="QLabel" name="label"> |
|||
<property name="text"> |
|||
<string>File to Upload:</string> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item> |
|||
<widget class="QLineEdit" name="tb_binFile"/> |
|||
</item> |
|||
<item> |
|||
<widget class="QPushButton" name="btn_browse"> |
|||
<property name="text"> |
|||
<string>Browse...</string> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
</layout> |
|||
</widget> |
|||
<widget class="QLabel" name="tb_binBarNum"> |
|||
<property name="geometry"> |
|||
<rect> |
|||
<x>17</x> |
|||
<y>70</y> |
|||
<width>27</width> |
|||
<height>25</height> |
|||
</rect> |
|||
</property> |
|||
<property name="text"> |
|||
<string>Bar:</string> |
|||
</property> |
|||
</widget> |
|||
<widget class="QComboBox" name="cb_binBarNum"> |
|||
<property name="geometry"> |
|||
<rect> |
|||
<x>70</x> |
|||
<y>70</y> |
|||
<width>41</width> |
|||
<height>25</height> |
|||
</rect> |
|||
</property> |
|||
<item> |
|||
<property name="text"> |
|||
<string>0</string> |
|||
</property> |
|||
</item> |
|||
<item> |
|||
<property name="text"> |
|||
<string>1</string> |
|||
</property> |
|||
</item> |
|||
<item> |
|||
<property name="text"> |
|||
<string>2</string> |
|||
</property> |
|||
</item> |
|||
</widget> |
|||
<widget class="QLineEdit" name="tb_binOffset"> |
|||
<property name="geometry"> |
|||
<rect> |
|||
<x>90</x> |
|||
<y>100</y> |
|||
<width>91</width> |
|||
<height>25</height> |
|||
</rect> |
|||
</property> |
|||
</widget> |
|||
<widget class="QLabel" name="label_2"> |
|||
<property name="geometry"> |
|||
<rect> |
|||
<x>20</x> |
|||
<y>100</y> |
|||
<width>71</width> |
|||
<height>25</height> |
|||
</rect> |
|||
</property> |
|||
<property name="text"> |
|||
<string>Offset: 0x</string> |
|||
</property> |
|||
</widget> |
|||
<widget class="QProgressBar" name="prg_binUpload"> |
|||
<property name="geometry"> |
|||
<rect> |
|||
<x>250</x> |
|||
<y>100</y> |
|||
<width>361</width> |
|||
<height>25</height> |
|||
</rect> |
|||
</property> |
|||
<property name="sizePolicy"> |
|||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed"> |
|||
<horstretch>1</horstretch> |
|||
<verstretch>0</verstretch> |
|||
</sizepolicy> |
|||
</property> |
|||
<property name="value"> |
|||
<number>24</number> |
|||
</property> |
|||
</widget> |
|||
<widget class="QWidget" name="layoutWidget"> |
|||
<property name="geometry"> |
|||
<rect> |
|||
<x>690</x> |
|||
<y>70</y> |
|||
<width>82</width> |
|||
<height>58</height> |
|||
</rect> |
|||
</property> |
|||
<layout class="QVBoxLayout" name="verticalLayout"> |
|||
<item> |
|||
<widget class="QPushButton" name="btn_binVerify"> |
|||
<property name="text"> |
|||
<string>Verify</string> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item> |
|||
<widget class="QPushButton" name="btn_binUpload"> |
|||
<property name="text"> |
|||
<string>Upload</string> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
</layout> |
|||
</widget> |
|||
</widget> |
|||
</item> |
|||
<item> |
|||
<widget class="Line" name="line"> |
|||
<property name="orientation"> |
|||
<enum>Qt::Horizontal</enum> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item> |
|||
<widget class="QGroupBox" name="groupBox_2"> |
|||
<property name="title"> |
|||
<string>Register operation</string> |
|||
</property> |
|||
<widget class="QGroupBox" name="groupBox_3"> |
|||
<property name="geometry"> |
|||
<rect> |
|||
<x>610</x> |
|||
<y>30</y> |
|||
<width>161</width> |
|||
<height>80</height> |
|||
</rect> |
|||
</property> |
|||
<property name="title"> |
|||
<string>Access registers by:</string> |
|||
</property> |
|||
<widget class="QRadioButton" name="rbtn_offset"> |
|||
<property name="geometry"> |
|||
<rect> |
|||
<x>10</x> |
|||
<y>50</y> |
|||
<width>131</width> |
|||
<height>23</height> |
|||
</rect> |
|||
</property> |
|||
<property name="text"> |
|||
<string>Register offset</string> |
|||
</property> |
|||
</widget> |
|||
<widget class="QRadioButton" name="rbtn_reg"> |
|||
<property name="geometry"> |
|||
<rect> |
|||
<x>10</x> |
|||
<y>30</y> |
|||
<width>141</width> |
|||
<height>23</height> |
|||
</rect> |
|||
</property> |
|||
<property name="text"> |
|||
<string>Register number</string> |
|||
</property> |
|||
</widget> |
|||
</widget> |
|||
<widget class="QWidget" name="layoutWidget"> |
|||
<property name="geometry"> |
|||
<rect> |
|||
<x>12</x> |
|||
<y>32</y> |
|||
<width>181</width> |
|||
<height>91</height> |
|||
</rect> |
|||
</property> |
|||
<layout class="QVBoxLayout" name="verticalLayout_3"> |
|||
<item> |
|||
<widget class="QLabel" name="l_regIndicator"> |
|||
<property name="text"> |
|||
<string>:</string> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item> |
|||
<widget class="QLabel" name="label_4"> |
|||
<property name="text"> |
|||
<string>Value: (Hex)</string> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<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>Read result: (Hex)</string> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
</layout> |
|||
</widget> |
|||
<widget class="QWidget" name="layoutWidget"> |
|||
<property name="geometry"> |
|||
<rect> |
|||
<x>200</x> |
|||
<y>30</y> |
|||
<width>232</width> |
|||
<height>95</height> |
|||
</rect> |
|||
</property> |
|||
<layout class="QVBoxLayout" name="verticalLayout_2"> |
|||
<item> |
|||
<layout class="QHBoxLayout" name="horizontalLayout_4"> |
|||
<item> |
|||
<widget class="QLineEdit" name="tb_regIndicator"/> |
|||
</item> |
|||
<item> |
|||
<widget class="QLabel" name="tb_binBarNum_2"> |
|||
<property name="text"> |
|||
<string>Bar:</string> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item> |
|||
<widget class="QComboBox" name="cb_regBarNum"> |
|||
<item> |
|||
<property name="text"> |
|||
<string>0</string> |
|||
</property> |
|||
</item> |
|||
<item> |
|||
<property name="text"> |
|||
<string>1</string> |
|||
</property> |
|||
</item> |
|||
<item> |
|||
<property name="text"> |
|||
<string>2</string> |
|||
</property> |
|||
</item> |
|||
</widget> |
|||
</item> |
|||
</layout> |
|||
</item> |
|||
<item> |
|||
<layout class="QHBoxLayout" name="horizontalLayout_3"> |
|||
<item> |
|||
<widget class="QLineEdit" name="tb_regValue"/> |
|||
</item> |
|||
<item> |
|||
<widget class="QPushButton" name="btn_writeReg"> |
|||
<property name="text"> |
|||
<string>Write</string> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
</layout> |
|||
</item> |
|||
<item> |
|||
<layout class="QHBoxLayout" name="horizontalLayout_2"> |
|||
<item> |
|||
<widget class="QLCDNumber" name="lcd_regvalue"/> |
|||
</item> |
|||
<item> |
|||
<widget class="QPushButton" name="btn_readReg"> |
|||
<property name="sizePolicy"> |
|||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed"> |
|||
<horstretch>0</horstretch> |
|||
<verstretch>0</verstretch> |
|||
</sizepolicy> |
|||
</property> |
|||
<property name="text"> |
|||
<string>Read</string> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
</layout> |
|||
</item> |
|||
</layout> |
|||
</widget> |
|||
</widget> |
|||
</item> |
|||
<item> |
|||
<widget class="Line" name="line_2"> |
|||
<property name="orientation"> |
|||
<enum>Qt::Horizontal</enum> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item> |
|||
<widget class="QGroupBox" name="groupBox_4"> |
|||
<property name="title"> |
|||
<string>FPGA Program:</string> |
|||
</property> |
|||
<widget class="QWidget" name="layoutWidget"> |
|||
<property name="geometry"> |
|||
<rect> |
|||
<x>10</x> |
|||
<y>30</y> |
|||
<width>761</width> |
|||
<height>27</height> |
|||
</rect> |
|||
</property> |
|||
<layout class="QHBoxLayout" name="horizontalLayout_5"> |
|||
<item> |
|||
<widget class="QLabel" name="label_5"> |
|||
<property name="text"> |
|||
<string>Bit file:</string> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item> |
|||
<widget class="QLineEdit" name="tb_fpgaBit"/> |
|||
</item> |
|||
<item> |
|||
<widget class="QPushButton" name="btn_fpgaBrowse"> |
|||
<property name="text"> |
|||
<string>Browse...</string> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
</layout> |
|||
</widget> |
|||
<widget class="QPushButton" name="btn_fpgaProgram"> |
|||
<property name="geometry"> |
|||
<rect> |
|||
<x>690</x> |
|||
<y>71</y> |
|||
<width>80</width> |
|||
<height>25</height> |
|||
</rect> |
|||
</property> |
|||
<property name="text"> |
|||
<string>Program</string> |
|||
</property> |
|||
</widget> |
|||
<widget class="QProgressBar" name="prg_fpgaProgram"> |
|||
<property name="geometry"> |
|||
<rect> |
|||
<x>11</x> |
|||
<y>71</y> |
|||
<width>671</width> |
|||
<height>25</height> |
|||
</rect> |
|||
</property> |
|||
<property name="value"> |
|||
<number>24</number> |
|||
</property> |
|||
</widget> |
|||
</widget> |
|||
</item> |
|||
</layout> |
|||
</widget> |
|||
</widget> |
|||
<widget class="QMenuBar" name="menubar"> |
|||
<property name="geometry"> |
|||
<rect> |
|||
<x>0</x> |
|||
<y>0</y> |
|||
<width>800</width> |
|||
<height>22</height> |
|||
</rect> |
|||
</property> |
|||
</widget> |
|||
<widget class="QStatusBar" name="statusbar"/> |
|||
</widget> |
|||
<resources/> |
|||
<connections/> |
|||
</ui> |
Loading…
Reference in new issue