// 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(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(key.ascii()); kout.flush(); koutsem.v(Guard::enter().vault()); } } }