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] - Blame information for rev 3

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

Line No. Rev Author Line
1 3 sergeykhbr
#include "ConsoleWidget.h"
2
#include "moc_ConsoleWidget.h"
3
 
4
#include <QtCore/QDate>
5
#include <QtGui/QPainter>
6
#include <QtWidgets/QScrollBar>
7
#include <memory>
8
 
9
namespace debugger {
10
 
11
static const char CONSOLE_ENTRY[] = "riscv# ";
12
 
13
ConsoleWidget::ConsoleWidget(IGui *igui, QWidget *parent)
14
    : QPlainTextEdit(parent) {
15
    igui_ = igui;
16
 
17
    RISCV_mutex_init(&mutexOutput_);
18
    sizeConv_ = 1024;
19
    wcsConv_ = new wchar_t[sizeConv_];
20
    mbsConv_ = new char[sizeConv_];
21
 
22
    clear();
23
    fontMainText_ = QFont("Courier");
24
    fontMainText_.setStyleHint(QFont::Monospace);
25
    fontMainText_.setPointSize(9);
26
    fontMainText_.setFixedPitch(true);
27
    setFont(fontMainText_);
28
 
29
    fontRISCV_ = fontMainText_;
30
    fontRISCV_.setBold(true);
31
 
32
    ensureCursorVisible();
33
 
34
    QTextCursor cursor = textCursor();
35
    QTextCharFormat charFormat = cursor.charFormat();
36
    charFormat.setFont(fontRISCV_);
37
    cursor.setCharFormat(charFormat);
38
 
39
    cursor.insertText(tr(
40
    "**********************************************************\n"
41
    "  RISC-V debugger\n"
42
    "  Author: Sergey Khabarov - sergeykhbr@gmail.com\n"
43
    "  Copyright 2017 GNSS Sensor Ltd. All right reserved.\n"
44
    "**********************************************************\n"));
45
 
46
    cursor.insertText(tr(CONSOLE_ENTRY));
47
    cursorMinPos_ = cursor.selectionStart();
48
 
49
    charFormat.setFont(fontMainText_);
50
    cursor.setCharFormat(charFormat);
51
    setTextCursor(cursor);
52
    setWindowTitle(tr("simconsole"));
53
 
54
    cursorPos_.make_list(2);
55
    cursorPos_[0u].make_int64(0);
56
    cursorPos_[1].make_int64(0);
57
 
58
    connect(this, SIGNAL(signalNewData()), this, SLOT(slotUpdateByData()));
59
 
60
    const char *autoobj = (*igui_->getpConfig())["AutoComplete"].to_string();
61
    iauto_ = static_cast<IAutoComplete *>(
62
        RISCV_get_service_iface(autoobj, IFACE_AUTO_COMPLETE));
63
 
64
    RISCV_add_default_output(static_cast<IRawListener *>(this));
65
}
66
 
67
ConsoleWidget::~ConsoleWidget() {
68
    igui_->removeFromQueue(static_cast<IGuiCmdHandler *>(this));
69
    RISCV_remove_default_output(static_cast<IRawListener *>(this));
70
    RISCV_mutex_destroy(&mutexOutput_);
71
    delete [] wcsConv_;
72
    delete [] mbsConv_;
73
}
74
 
75
void ConsoleWidget::handleResponse(AttributeType *req, AttributeType *resp) {
76
    if (resp->is_nil() || resp->is_invalid()) {
77
        return;
78
    }
79
    RISCV_mutex_lock(&mutexOutput_);
80
    strOutput_ += QString(resp->to_config()) + "\n";
81
    RISCV_mutex_unlock(&mutexOutput_);
82
    emit signalNewData();
83
}
84
 
85
void ConsoleWidget::keyPressEvent(QKeyEvent *e) {
86
    AttributeType cmd;
87
    QTextCursor cursor = textCursor();
88
    uint32_t vt_key = static_cast<uint32_t>(e->nativeVirtualKey());
89
    char vt_char = static_cast<char>(vt_key);
90
    if (vt_char >= 'A' && vt_char <= 'Z' && e->modifiers() == Qt::NoModifier) {
91
        vt_key -= static_cast<uint32_t>('A');
92
        vt_key += static_cast<uint32_t>('a');
93
    }
94
    //printf("vt_key = %08x\n", vt_key);
95
    bool cmd_ready = iauto_->processKey(vt_key, &cmd, &cursorPos_);
96
 
97
    moveCursor(QTextCursor::End);
98
    cursor = textCursor();
99
    cursor.setPosition(cursorMinPos_, QTextCursor::KeepAnchor);
100
    cursor.insertText(cmd.to_string());
101
    if (cursorPos_[0u].to_int()) {
102
        cursor.movePosition(QTextCursor::Left,
103
                QTextCursor::MoveAnchor, cursorPos_[0u].to_int());
104
        setTextCursor(cursor);
105
    }
106
 
107
    if (!cmd_ready) {
108
        return;
109
    }
110
    cursor.movePosition(QTextCursor::End);
111
    cursor.insertText(tr("\r"));
112
 
113
    QTextCharFormat charFormat = cursor.charFormat();
114
    cursor.insertText(tr(CONSOLE_ENTRY));
115
    cursorMinPos_ = cursor.selectionStart();
116
    verticalScrollBar()->setValue(verticalScrollBar()->maximum());
117
 
118
    igui_->registerCommand(
119
        static_cast<IGuiCmdHandler *>(this), &cmd, false);
120
}
121
 
122
void ConsoleWidget::slotUpdateByData() {
123
    if (strOutput_.size() == 0) {
124
        return;
125
    }
126
    // Keep current line value:
127
    QTextCursor cursor = textCursor();
128
    cursor.movePosition(QTextCursor::End);
129
    cursor.movePosition(QTextCursor::StartOfLine, QTextCursor::KeepAnchor);
130
    QString cur_line = cursor.selectedText();
131
    // Insert raw string:
132
    RISCV_mutex_lock(&mutexOutput_);
133
    cursor.insertText(strOutput_);
134
    cursorMinPos_ += strOutput_.size();
135
    strOutput_.clear();
136
    RISCV_mutex_unlock(&mutexOutput_);
137
 
138
    // Restore line:
139
    cursor.movePosition(QTextCursor::End);
140
    cursor.insertText(cur_line);
141
    // Restore cursor position:
142
    cursor.movePosition(QTextCursor::End);
143
    cursor.movePosition(QTextCursor::Left,
144
           QTextCursor::MoveAnchor, cursorPos_[0u].to_int());
145
    setTextCursor(cursor);
146
 
147
    verticalScrollBar()->setValue(verticalScrollBar()->maximum());
148
}
149
 
150
void ConsoleWidget::updateData(const char *buf, int bufsz) {
151
    RISCV_mutex_lock(&mutexOutput_);
152
    strOutput_ += QString(buf);
153
    RISCV_mutex_unlock(&mutexOutput_);
154
    emit signalNewData();
155
}
156
 
157
}  // namespace debugger

powered by: WebSVN 2.1.0

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