Как написать getch () в NACHOS (Java)? - PullRequest
0 голосов
/ 09 июля 2019

Итак, я учусь создавать свои собственные SerialConsole в начос (Java).Я научился использовать Semaphore.P() и Semaphore.V() для ожидания ввода пользователя.Все идет хорошо, пока я не попытался сделать функцию типа getch() в C * conio.h.

. Проблема в том, что всякий раз, когда я вызываю Semaphore.P (), даже если вызывается Semaphore.V (), он всегда будет ждать нажатия клавиши Enter, прежде чем возобновить работу программы.Я хотел, чтобы программа возобновлялась всякий раз, когда я нажимал клавишу.

Ниже приведен код, который я пробовал.

Console.java

public class Console {
    private SerialConsole console;
    private Semaphore sem = new Semaphore(0);
    private Runnable send, recv;
    private char tempChar;

    public Console() {
        console = Machine.console();
        send = new Runnable() {

            @Override
            public void run() {
                sem.V();
            }
        };
        recv = new Runnable() {

            @Override
            public void run() {
                tempChar = (char) console.readByte();
                sem.V();
            }
        };
        console.setInterruptHandlers(recv, send);
    }

    public String nextLine() {
        String result = "";

        do {
            sem.P();
            if (tempChar != '\n') result += tempChar;
        } while(tempChar != '\n');

        return result;
    }

    public char getch() {
        sem.P();
        return tempChar;
    }
}

Main.java

public class Main {
    private Console console;

    public Main() {
        console = new Console();
        char c = console.getch();
        System.out.println(c);
    }
}

Что-то, что я пропустил, или есть какой-нибудь способ программно нажать клавишу Enter или что-то еще?

PS: java.awt.Robot нельзя использовать внутри проекта nachos.

Буду признателен за любую помощь.

...