OpenCores
URL https://opencores.org/ocsvn/riscv_vhdl/riscv_vhdl/trunk

Subversion Repositories riscv_vhdl

[/] [riscv_vhdl/] [trunk/] [debugger/] [src/] [gui_plugin/] [ControlWidget/] [ConsoleWidget.cpp] - Rev 2

Go to most recent revision | Compare with Previous | Blame | View Log

#include "ConsoleWidget.h"
#include "moc_ConsoleWidget.h"
 
#include <QtCore/QDate>
#include <QtGui/QPainter>
#include <QtWidgets/QScrollBar>
#include <memory>
 
namespace debugger {
 
static const char CONSOLE_ENTRY[] = "riscv# ";
 
ConsoleWidget::ConsoleWidget(IGui *igui, QWidget *parent) 
    : QPlainTextEdit(parent) {
    igui_ = igui;
 
    RISCV_mutex_init(&mutexOutput_);
    sizeConv_ = 1024;
    wcsConv_ = new wchar_t[sizeConv_];
    mbsConv_ = new char[sizeConv_];
 
    clear();
    fontMainText_ = QFont("Courier");
    fontMainText_.setStyleHint(QFont::Monospace);
    fontMainText_.setPointSize(9);
    fontMainText_.setFixedPitch(true);
    setFont(fontMainText_);
 
    fontRISCV_ = fontMainText_;
    fontRISCV_.setBold(true);
 
    ensureCursorVisible();
 
 
    QTextCursor cursor = textCursor();
    QTextCharFormat charFormat = cursor.charFormat();
    charFormat.setFont(fontRISCV_);
    cursor.setCharFormat(charFormat);
    cursor.insertText(tr(CONSOLE_ENTRY));
    cursorMinPos_ = cursor.selectionStart();
 
    charFormat.setFont(fontMainText_);
    cursor.setCharFormat(charFormat);
    setTextCursor(cursor);
    setWindowTitle(tr("simconsole"));
 
    cursorPos_.make_list(2);
    cursorPos_[0u].make_int64(0);
    cursorPos_[1].make_int64(0);
 
    connect(this, SIGNAL(signalNewData()), this, SLOT(slotUpdateByData()));
}
 
ConsoleWidget::~ConsoleWidget() {
    igui_->removeFromQueue(static_cast<IGuiCmdHandler *>(this));
    RISCV_remove_default_output(static_cast<IRawListener *>(this));
    RISCV_mutex_destroy(&mutexOutput_);
    delete [] wcsConv_;
    delete [] mbsConv_;
}
 
void ConsoleWidget::handleResponse(AttributeType *req, AttributeType *resp) {
    if (resp->is_nil() || resp->is_invalid()) {
        return;
    }
    RISCV_mutex_lock(&mutexOutput_);
    strOutput_ += QString(resp->to_config()) + "\n";
    RISCV_mutex_unlock(&mutexOutput_);
    emit signalNewData();
}
 
void ConsoleWidget::keyPressEvent(QKeyEvent *e) {
    AttributeType cmd;
    QTextCursor cursor = textCursor();
    uint32_t vt_key = static_cast<uint32_t>(e->nativeVirtualKey());
    char vt_char = static_cast<char>(vt_key);
    if (vt_char >= 'A' && vt_char <= 'Z' && e->modifiers() == Qt::NoModifier) {
        vt_key -= static_cast<uint32_t>('A');
        vt_key += static_cast<uint32_t>('a');
    }
    //printf("vt_key = %08x\n", vt_key);
    bool cmd_ready = iauto_->processKey(vt_key, &cmd, &cursorPos_);
 
    moveCursor(QTextCursor::End);
    cursor = textCursor();
    cursor.setPosition(cursorMinPos_, QTextCursor::KeepAnchor);
    cursor.insertText(cmd.to_string());
    if (cursorPos_[0u].to_int()) {
        cursor.movePosition(QTextCursor::Left, 
                QTextCursor::MoveAnchor, cursorPos_[0u].to_int());
        setTextCursor(cursor);
    }
 
    if (!cmd_ready) {
        return;
    }
    cursor.movePosition(QTextCursor::End);
    cursor.insertText(tr("\r"));
 
    QTextCharFormat charFormat = cursor.charFormat();
    cursor.insertText(tr(CONSOLE_ENTRY));
    cursorMinPos_ = cursor.selectionStart();
    verticalScrollBar()->setValue(verticalScrollBar()->maximum());
 
    igui_->registerCommand(
        static_cast<IGuiCmdHandler *>(this), &cmd, false);
}
 
void ConsoleWidget::slotPostInit(AttributeType *cfg) {
    const char *autoobj = (*cfg)["AutoComplete"].to_string();
    iauto_ = static_cast<IAutoComplete *>(
        RISCV_get_service_iface(autoobj, IFACE_AUTO_COMPLETE));
 
    RISCV_add_default_output(static_cast<IRawListener *>(this));
}
 
void ConsoleWidget::slotUpdateByData() {
    if (strOutput_.size() == 0) {
        return;
    }
    // Keep current line value:
    QTextCursor cursor = textCursor();
    cursor.movePosition(QTextCursor::End);
    cursor.movePosition(QTextCursor::StartOfLine, QTextCursor::KeepAnchor);
    QString cur_line = cursor.selectedText();
    // Insert raw string:
    RISCV_mutex_lock(&mutexOutput_);
    cursor.insertText(strOutput_);
    cursorMinPos_ += strOutput_.size();
    strOutput_.clear();
    RISCV_mutex_unlock(&mutexOutput_);
 
    // Restore line:
    cursor.movePosition(QTextCursor::End);
    cursor.insertText(cur_line);
    // Restore cursor position:
    cursor.movePosition(QTextCursor::End);
    cursor.movePosition(QTextCursor::Left, 
           QTextCursor::MoveAnchor, cursorPos_[0u].to_int());
    setTextCursor(cursor);
 
    verticalScrollBar()->setValue(verticalScrollBar()->maximum());
}
 
void ConsoleWidget::updateData(const char *buf, int bufsz) {
    RISCV_mutex_lock(&mutexOutput_);
    strOutput_ += QString(buf);
    RISCV_mutex_unlock(&mutexOutput_);
    emit signalNewData();
}
 
}  // namespace debugger
 

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.