aboutsummaryrefslogtreecommitdiff
path: root/qtmips_cli/chariohandler.cpp
diff options
context:
space:
mode:
authorPavel Pisa <pisa@cmp.felk.cvut.cz>2020-04-23 16:35:50 +0200
committerPavel Pisa <pisa@cmp.felk.cvut.cz>2020-04-23 16:35:50 +0200
commit597c9271608c3d30ce193b96be3fe82966e4cc1d (patch)
treed5a0569bf937b39702d25bee27f2fa8f37bac766 /qtmips_cli/chariohandler.cpp
parent27b38375203880cbc991eaac1d97c927346fa7e0 (diff)
downloadqtmips-597c9271608c3d30ce193b96be3fe82966e4cc1d.tar.gz
qtmips-597c9271608c3d30ce193b96be3fe82966e4cc1d.tar.bz2
qtmips-597c9271608c3d30ce193b96be3fe82966e4cc1d.zip
qtmips_cli: add option to connect serial port input and output to file.
New options --serial-in, --serin <FNAME> File connected to the serial port input. --serial-out, --serout <FNAME> File connected to the serial port output. to provide support for B35APO subject task to write conversion of the random binary number to hexadecimal output to serial port. See the task with automatic check using qtmips_cli seminaries/qtmips/print-hex-to-uart in the repository https://gitlab.fel.cvut.cz/b35apo/stud-support/ Signed-off-by: Pavel Pisa <pisa@cmp.felk.cvut.cz>
Diffstat (limited to 'qtmips_cli/chariohandler.cpp')
-rw-r--r--qtmips_cli/chariohandler.cpp159
1 files changed, 159 insertions, 0 deletions
diff --git a/qtmips_cli/chariohandler.cpp b/qtmips_cli/chariohandler.cpp
new file mode 100644
index 0000000..6d9c6e1
--- /dev/null
+++ b/qtmips_cli/chariohandler.cpp
@@ -0,0 +1,159 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*******************************************************************************
+ * QtMips - MIPS 32-bit Architecture Subset Simulator
+ *
+ * Implemented to support following courses:
+ *
+ * B35APO - Computer Architectures
+ * https://cw.fel.cvut.cz/wiki/courses/b35apo
+ *
+ * B4M35PAP - Advanced Computer Architectures
+ * https://cw.fel.cvut.cz/wiki/courses/b4m35pap/start
+ *
+ * Copyright (c) 2017-2019 Karel Koci<cynerd@email.cz>
+ * Copyright (c) 2019 Pavel Pisa <pisa@cmp.felk.cvut.cz>
+ *
+ * Faculty of Electrical Engineering (http://www.fel.cvut.cz)
+ * Czech Technical University (http://www.cvut.cz/)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ ******************************************************************************/
+
+#include <chariohandler.h>
+
+CharIOHandler::CharIOHandler(QIODevice *iodev, QObject *parent) :
+ QIODevice(parent), fd_list() {
+ this->iodev = iodev;
+ if (!iodev->parent())
+ iodev->setParent(this);
+ fd_specific = false;
+ if (iodev->isOpen())
+ Super::open(iodev->openMode());
+ connect(iodev, &Super::aboutToClose, this, &CharIOHandler::aboutToClose);
+ connect(iodev, &Super::bytesWritten, this, &CharIOHandler::bytesWritten);
+ connect(iodev, &Super::channelBytesWritten, this, &CharIOHandler::channelBytesWritten);
+ connect(iodev, &Super::channelReadyRead, this, &CharIOHandler::channelReadyRead);
+ connect(iodev, &Super::readChannelFinished, this, &CharIOHandler::readChannelFinished);
+ connect(iodev, &Super::readyRead, this, &CharIOHandler::readyRead);
+}
+
+CharIOHandler::~CharIOHandler() {
+ if (iodev->parent() == this)
+ delete iodev;
+}
+
+void CharIOHandler::writeByte(unsigned int data) {
+ char ch = (char)data;
+ write(&ch, 1);
+}
+
+void CharIOHandler::writeByte(int fd, unsigned int data) {
+ if(!fd_specific || fd_list.contains(fd))
+ writeByte(data);
+}
+
+void CharIOHandler::readBytePoll(int fd, unsigned int &data, bool &available) {
+ char ch;
+ qint64 res;
+ if(!fd_specific || fd_list.contains(fd)) {
+ if (bytesAvailable() > 0) {
+ res = read(&ch, 1);
+ if (res > 0) {
+ data = ch & 0xff;
+ available = true;
+ }
+ }
+ }
+}
+
+void CharIOHandler::insertFd(const int &fd) {
+ fd_list.insert(fd);
+}
+
+void CharIOHandler::removeFd(const int &fd) {
+ fd_list.remove(fd);
+}
+
+bool CharIOHandler::isSequential() const {
+ return iodev->isSequential();
+}
+
+bool CharIOHandler::open(OpenMode mode) {
+ if (!iodev->open(mode)) {
+
+ return false;
+ }
+ Super::open(mode);
+ return true;
+}
+
+void CharIOHandler::close() {
+ Super::close();
+ iodev->close();
+}
+
+qint64 CharIOHandler::pos() const {
+ return iodev->pos();
+}
+
+qint64 CharIOHandler::size() const {
+ return iodev->size();
+}
+
+bool CharIOHandler::seek(qint64 pos) {
+ return iodev->seek(pos);
+}
+
+bool CharIOHandler::atEnd() const {
+ return iodev->atEnd();
+}
+
+bool CharIOHandler::reset() {
+ return iodev->reset();
+}
+
+qint64 CharIOHandler::bytesAvailable() const {
+ return iodev->bytesAvailable() + Super::bytesAvailable();
+}
+
+qint64 CharIOHandler::bytesToWrite() const {
+ return iodev->bytesToWrite() + Super::bytesToWrite();
+}
+
+bool CharIOHandler::canReadLine() const {
+ return iodev->canReadLine();
+}
+
+bool CharIOHandler::waitForReadyRead(int msecs) {
+ return iodev->waitForReadyRead(msecs);
+}
+
+bool CharIOHandler::waitForBytesWritten(int msecs) {
+ return iodev->waitForBytesWritten(msecs);
+}
+
+qint64 CharIOHandler::readData(char *data, qint64 maxSize) {
+ return iodev->read(data, maxSize);
+}
+
+qint64 CharIOHandler::readLineData(char *data, qint64 maxSize) {
+ return iodev->readLine(data, maxSize);
+}
+
+qint64 CharIOHandler::writeData(const char *data, qint64 maxSize) {
+ return iodev->write(data, maxSize);
+}