added userinput handler
This commit is contained in:
@@ -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";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
};
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user