50 lines
1.3 KiB
C++
50 lines
1.3 KiB
C++
// vim: set noet ts=4 sw=4:
|
|
|
|
#include "./kappl.h"
|
|
#include "../../syscall/stub.h"
|
|
|
|
#include "../../device/textstream.h"
|
|
extern TextStream kout;
|
|
#include "../../interrupt/guard.h"
|
|
extern Semaphore koutsem;
|
|
|
|
void KeyboardApplication::action() { // NOLINT
|
|
const unsigned line = 10 + 2;
|
|
for (unsigned column = 0;; ++column) {
|
|
Key key;
|
|
{
|
|
Guarded g = Guard::enter();
|
|
g.vault().keys_sem.p(g.vault());
|
|
assert(g.vault().keys.consume(key) && "No key but sem returned!");
|
|
}
|
|
if (key.valid()) {
|
|
if (column >= CGA::COLUMNS - 1) {
|
|
column = 0;
|
|
koutsem.p(Guard::enter().vault());
|
|
for (unsigned offset = 0; offset < 3; offset++) {
|
|
for (unsigned column = 0; column < CGA::COLUMNS; ++column) {
|
|
CGA::show(column, line + offset, ' ');
|
|
}
|
|
}
|
|
koutsem.v(Guard::enter().vault());
|
|
}
|
|
koutsem.p(Guard::enter().vault());
|
|
kout.setPos(column, line);
|
|
kout << static_cast<char>(key.ascii());
|
|
kout.flush();
|
|
koutsem.v(Guard::enter().vault());
|
|
}
|
|
for (unsigned offset = 0; offset < 3; offset++) {
|
|
{
|
|
Guarded g = Guard::enter();
|
|
g.vault().bellringer.sleep(g.vault(), 10);
|
|
koutsem.p(g.vault());
|
|
}
|
|
kout.setPos(column, line + offset);
|
|
kout << static_cast<char>(key.ascii());
|
|
kout.flush();
|
|
koutsem.v(Guard::enter().vault());
|
|
}
|
|
}
|
|
}
|