From 1889bd9353b309ea54f3543f5d609015fec5b73c Mon Sep 17 00:00:00 2001 From: Pavel Pisa Date: Mon, 25 Feb 2019 14:57:00 +0100 Subject: Simple serial port receive implementation. Simple polled mode serial port input implemented for serial port peripheral and for read and readv system calls. When end of input character reserve is reached for read/readv, newline is automatically appended. Signed-off-by: Pavel Pisa --- qtmips_gui/mainwindow.cpp | 2 ++ qtmips_gui/terminaldock.cpp | 17 +++++++++++++++++ qtmips_gui/terminaldock.h | 4 ++++ 3 files changed, 23 insertions(+) (limited to 'qtmips_gui') diff --git a/qtmips_gui/mainwindow.cpp b/qtmips_gui/mainwindow.cpp index 253ab03..01321cf 100644 --- a/qtmips_gui/mainwindow.cpp +++ b/qtmips_gui/mainwindow.cpp @@ -154,6 +154,8 @@ void MainWindow::create_core(const machine::MachineConfig &config) { osemu::OsSyscallExceptionHandler *osemu_handler = new osemu::OsSyscallExceptionHandler; machine->register_exception_handler(machine::EXCAUSE_SYSCALL, osemu_handler); connect(osemu_handler, SIGNAL(char_written(int,uint)), terminal, SLOT(tx_byte(int,uint))); + connect(osemu_handler, SIGNAL(rx_byte_pool(int,uint&,bool&)), + terminal, SLOT(rx_byte_pool(int,uint&,bool&))); #endif // Connect machine signals and slots diff --git a/qtmips_gui/terminaldock.cpp b/qtmips_gui/terminaldock.cpp index 4b394a6..bb26952 100644 --- a/qtmips_gui/terminaldock.cpp +++ b/qtmips_gui/terminaldock.cpp @@ -49,6 +49,11 @@ TerminalDock::TerminalDock(QWidget *parent, QSettings *settings) : QDockWidget(p terminal_text->setMinimumSize(30, 30); layout_box->addWidget(terminal_text); append_cursor = new QTextCursor(terminal_text->document()); + layout_bottom_box = new QHBoxLayout(); + layout_bottom_box->addWidget(new QLabel("Input:")); + input_edit = new QLineEdit(); + layout_bottom_box->addWidget(input_edit); + layout_box->addLayout(layout_bottom_box); setObjectName("Terminal"); setWindowTitle("Terminal"); @@ -62,6 +67,8 @@ void TerminalDock::setup(const machine::SerialPort *ser_port) { if (ser_port == nullptr) return; connect(ser_port, SIGNAL(tx_byte(uint)), this, SLOT(tx_byte(uint))); + connect(ser_port, SIGNAL(rx_byte_pool(int,uint&,bool&)), + this, SLOT(rx_byte_pool(int,uint&,bool&))); } void TerminalDock::tx_byte(unsigned int data) { @@ -76,3 +83,13 @@ void TerminalDock::tx_byte(int fd, unsigned int data) (void)fd; tx_byte(data); } + +void TerminalDock::rx_byte_pool(int fd, unsigned int &data, bool &available) { + QString str = input_edit->text(); + available = false; + if (str.count() > 0) { + data = str[0].toLatin1(); + input_edit->setText(str.remove(0, 1)); + available = true; + } +} diff --git a/qtmips_gui/terminaldock.h b/qtmips_gui/terminaldock.h index 7154e81..27dc617 100644 --- a/qtmips_gui/terminaldock.h +++ b/qtmips_gui/terminaldock.h @@ -39,6 +39,7 @@ #include #include #include +#include #include #include #include "qtmipsmachine.h" @@ -54,13 +55,16 @@ public: public slots: void tx_byte(unsigned int data); void tx_byte(int fd, unsigned int data); + void rx_byte_pool(int fd, unsigned int &data, bool &available); private: QVBoxLayout *layout_box; + QHBoxLayout *layout_bottom_box; QWidget *top_widget, *top_form; QFormLayout *layout_top_form; QTextEdit *terminal_text; QTextCursor *append_cursor; + QLineEdit *input_edit; }; #endif // TERMINALDOCK_H -- cgit v1.2.3