added userinput handler

This commit is contained in:
black
2025-07-08 21:42:59 +02:00
parent 09d2b178d6
commit 0c9abcd7e4
2 changed files with 82 additions and 3 deletions

View File

@@ -20,7 +20,7 @@ Manager &Manager::getInstance() {
return instance;
}
int Manager::run() {
[[noreturn]] void Manager::run() {
if (!m_programFile.is_open()) {
std::cerr << "Bitte zuerst die init() Methode aufrufen!" << "\n" << std::flush;
}
@@ -29,6 +29,8 @@ int Manager::run() {
m_programFile.clear();
m_programFile.seekg(0);
bool runAll = false;
// Bearbeite jede Zeile des Quellcodes in der ALU
std::string line;
while (std::getline(m_programFile, line)) {
@@ -36,8 +38,18 @@ int Manager::run() {
// Sollte die aktuelle Zeile leer sein, überspringe die ALU
if (lineVector.empty()) continue;
Alu::calculate(lineVector);
// Frage nach und reagiere auf Nutzereingaben
if (!runAll) {
std::cout << "\n" << "Bearbeitete Codezeile: \033[34m" << line << "\033[0m";
runAll = handleUserInput();
}
}
return 0;
// Beende das Program erst, wenn der Nutzer das tut
std::cout <<
"\nDer Quellcode ist nun \033[33mfertig\033[0m bearbeitet. Sie können noch auf den RAM und die Register zugreifen.";
while (true) handleExitInput();
}
void Manager::setStreamPosition(const std::streampos pos) {
@@ -66,6 +78,12 @@ void Manager::init(const std::string &program_path) {
std::cerr << "bad (schwerwiegender Fehler): " << m_programFile.bad() << "\n" << std::flush;
return;
}
std::cout << "\033[32m=== Herzlich willkommen beim RISC-V Emulator! ===\033[0m\n";
std::cout << "Nachfolgend wird nun die angegebene Quellcodedatei eingelesen und von der ALU bearbeitet.\n"
"\033[33mNach\033[0m jeder bearbeiteten Codezeile wird \033[34mdiese\033[0m ausgegeben und Sie werden "
"nach dem \033[32mnächsten Schritt\033[0m gefragt. Tätigen Sie Ihre Eingabe und bestätigen Sie mit "
"\033[32mENTER\033[0m.\nAnforderungen und Hinweise entnehmen Sie bitte der README.\n\n";
}
std::streampos Manager::getNextStreamLineOffset() {
@@ -86,3 +104,52 @@ std::string Manager::gotoNextStreamLine() {
getline(m_programFile, line);
return line;
}
bool Manager::handleUserInput() {
std::cout <<
"\nOptionen: (\033[32ms\033[0m) Programm durchlaufen lassen, (\033[32ml\033[0m) nächste Zeile, (\033[32me\033[0m) beenden, "
"(\033[32mm\033[0m) Memory Dump, (\033[32mr\033[0m) Register Dump\n";
char input = '\0';
while (true) {
std::cout << "Eingabe: ";
std::cin >> input;
input = std::tolower(input);
if (input == 's') {
return true; // runAll = true
} else if (input == 'l') {
return false; // nur nächste Zeile
} else if (input == 'e') {
std::cout << "Programm wird beendet.\n";
exit(0); // oder andere Beendigung
} else if (input == 'm') {
//Memory::dump();
} else if (input == 'r') {
//Register::getInstance().dump();
} else {
std::cout << "Ungültige Eingabe. Bitte erneut versuchen.\n";
}
}
}
void Manager::handleExitInput() {
std::cout <<
"\nOptionen: (\033[32me\033[0m) beenden, (\033[32mm\033[0m) Memory Dump, (\033[32mr\033[0m) Register Dump\n";
char input = '\0';
while (true) {
std::cout << "Eingabe: ";
std::cin >> input;
input = std::tolower(input);
if (input == 'e') {
std::cout << "Programm wird beendet.\n";
exit(0); // oder andere Beendigung
} else if (input == 'm') {
//Memory::dump();
} else if (input == 'r') {
//Register::getInstance().dump();
} else {
std::cout << "Ungültige Eingabe. Bitte erneut versuchen.\n";
}
}
}

View File

@@ -45,7 +45,7 @@ public:
*
* @return Der Exitcode des Emulators
*/
int run();
[[noreturn]] void run();
/**
* Setzt die Position des Streams (virtuellen Lesekopfes) auf die angegebene Position
@@ -79,6 +79,18 @@ public:
* Bewegt das offset (Zeilennummer/"program counter") um 1 Zeile nach vorne
*/
std::string gotoNextStreamLine();
/**
* Behandelt die verschiedenen Nutzereingaben
*
* @return Ob das restliche Program im Sprint ausgeführt werden soll
*/
static bool handleUserInput();
/**
* Behandelt die Nutzereingaben am Ende des Programmes
*/
static void handleExitInput();
};