From 5ca6d25c7cb5ca687f52ec4a0d3bbade9808893f Mon Sep 17 00:00:00 2001 From: ChUrl Date: Mon, 11 Jul 2022 22:51:03 +0200 Subject: [PATCH] change keyboard demo to event listener --- c_os/devices/Keyboard.cc | 5 +++-- c_os/kernel/Globals.cc | 4 +++- c_os/kernel/Globals.h | 8 ++++++-- c_os/kernel/threads/Scheduler.cc | 30 ++++++++++++++++++++++++++++-- c_os/kernel/threads/Scheduler.h | 5 +++++ c_os/lib/Semaphore.cc | 3 +-- c_os/main.cc | 5 +++-- c_os/user/demo/KeyboardDemo.cc | 6 ++++-- c_os/user/demo/KeyboardDemo.h | 6 +++++- 9 files changed, 58 insertions(+), 14 deletions(-) diff --git a/c_os/devices/Keyboard.cc b/c_os/devices/Keyboard.cc index effc0d2..08647a4 100755 --- a/c_os/devices/Keyboard.cc +++ b/c_os/devices/Keyboard.cc @@ -340,10 +340,11 @@ void Keyboard::trigger() { // NOTE: My keyboard has no delete key... if (key.ctrl_left() && key.alt_left() && (char)key == 'r') { this->reboot(); - } - else if ((char)key == 'k' || (char)key == 'j') { + } else if ((char)key == 'k' || (char)key == 'j') { scroll_mode(key); } + + kevman.broadcast(key); } // TODO: Where to place this? diff --git a/c_os/kernel/Globals.cc b/c_os/kernel/Globals.cc index 528ef87..76a4ae3 100755 --- a/c_os/kernel/Globals.cc +++ b/c_os/kernel/Globals.cc @@ -18,9 +18,11 @@ VESA vesa; // VESA-Treiber PIC pic; // Interrupt-Controller IntDispatcher intdis; // Unterbrechungsverteilung PIT pit(10000); -Keyboard kb; // Tastatur PCSPK pcspk; // PC-Lautsprecher +Keyboard kb; // Tastatur +KeyEventManager kevman; + // BumpAllocator allocator; LinkedListAllocator allocator; // TreeAllocator allocator; diff --git a/c_os/kernel/Globals.h b/c_os/kernel/Globals.h index b2105cd..5190a9c 100755 --- a/c_os/kernel/Globals.h +++ b/c_os/kernel/Globals.h @@ -23,6 +23,7 @@ #include "kernel/interrupts/IntDispatcher.h" #include "kernel/interrupts/PIC.h" #include "kernel/threads/Scheduler.h" +#include "user/KeyEventManager.h" extern CPU cpu; // CPU-spezifische Funktionen extern CGA_Stream kout; // Ausgabe-Strom fuer Kernel @@ -32,8 +33,11 @@ extern VESA vesa; // VESA-Treiber extern PIC pic; // Interrupt-Controller extern IntDispatcher intdis; // Unterbrechungsverteilung extern PIT pit; // Zeitgeber -extern Keyboard kb; // Tastatur -extern PCSPK pcspk; // PC-Lautsprecher + +extern PCSPK pcspk; // PC-Lautsprecher + +extern Keyboard kb; // Tastatur +extern KeyEventManager kevman; // extern BumpAllocator allocator; extern LinkedListAllocator allocator; diff --git a/c_os/kernel/threads/Scheduler.cc b/c_os/kernel/threads/Scheduler.cc index 1115fa8..31a2c0e 100644 --- a/c_os/kernel/threads/Scheduler.cc +++ b/c_os/kernel/threads/Scheduler.cc @@ -202,6 +202,32 @@ void Scheduler::deblock(Thread* that) { /* hier muss Code eingefuegt werden */ cpu.disable_int(); - this->readyQueue.enqueue(that); - cpu.enable_int(); + this->readyQueue.enqueue(this->get_active()); + this->dispatch(*that); // Prefer deblocked } + +// NOTE: Don't need these, input blocked threads are managed inside event manager +// These blocking functions are mainly for KeyEvents +// void Scheduler::block() { +// if (this->readyQueue.isEmpty()) { +// // Something went seriously wrong +// return; +// } + +// cpu.disable_int(); +// this->blockQueue.enqueue(this->get_active()); +// Thread& next = *(Thread*)this->readyQueue.dequeue(); +// this->dispatch(next); +// } + +// void Scheduler::deblock(Thread* that) { +// if (this->blockQueue.isEmpty()) { +// // Something went seriously wrong +// return; +// } + +// cpu.disable_int(); +// this->readyQueue.enqueue(this->get_active()); +// this->blockQueue.remove(that); +// this->dispatch(*that); // Prefer deblocked +// } diff --git a/c_os/kernel/threads/Scheduler.h b/c_os/kernel/threads/Scheduler.h index 13b6122..7cd5772 100644 --- a/c_os/kernel/threads/Scheduler.h +++ b/c_os/kernel/threads/Scheduler.h @@ -21,6 +21,7 @@ private: Scheduler(const Scheduler& copy) = delete; // Verhindere Kopieren Queue readyQueue; // auf die CPU wartende Threads + Queue blockQueue; // Scheduler wird evt. von einer Unterbrechung vom Zeitgeber gerufen, // bevor er initialisiert wurde @@ -55,8 +56,12 @@ public: // Thread umschalten; wird aus der ISR des PITs gerufen void preempt(); + // TODO: Merge this with usual block/deblock void block(); void deblock(Thread* that); + + // void block(); + // void deblock(Thread* that); }; #endif diff --git a/c_os/lib/Semaphore.cc b/c_os/lib/Semaphore.cc index daba814..bc4a556 100644 --- a/c_os/lib/Semaphore.cc +++ b/c_os/lib/Semaphore.cc @@ -13,7 +13,7 @@ void Semaphore::p() { // Block and manage thread in semaphore queue until it's woken up by v() again this->waitQueue.enqueue(scheduler.get_active()); this->lock.release(); - scheduler.block(); // Moves to next thread + scheduler.block(); // Moves to next thread } } @@ -30,5 +30,4 @@ void Semaphore::v() { this->counter = this->counter + 1; this->lock.release(); } - } diff --git a/c_os/main.cc b/c_os/main.cc index 4a35f0b..1d87e1c 100755 --- a/c_os/main.cc +++ b/c_os/main.cc @@ -65,14 +65,14 @@ int main() { // Demos // scheduler.ready(new TextDemo()); // scheduler.ready(new PCSPKdemo(&PCSPK::aerodynamic)); - // scheduler.ready(new KeyboardDemo()); + scheduler.ready(new KeyboardDemo()); // scheduler.ready(new HeapDemo()); // scheduler.ready(new VBEdemo()); // scheduler.ready(new BlueScreenDemo()); // scheduler.ready(new PreemptiveThreadDemo()); // Scheduler starten (schedule() erzeugt den Idle-Thread) - scheduler.ready(new MainMenu()); + // scheduler.ready(new MainMenu()); scheduler.schedule(); // NOTE: Enforced ToDo's (needed) @@ -98,6 +98,7 @@ int main() { // TODO: Cleanup: Remove I added this... Notes, just leave explanations // TODO: Remove Math "lib" or do something with it // TODO: Cleanup imports: Only import stuff in implementation when only needed there + // TODO: Switch cpu_disableint() to semaphore etc (I can't do this in the scheduler right?) // Scheduler doesn't return return 0; diff --git a/c_os/user/demo/KeyboardDemo.cc b/c_os/user/demo/KeyboardDemo.cc index a58b465..c392d73 100755 --- a/c_os/user/demo/KeyboardDemo.cc +++ b/c_os/user/demo/KeyboardDemo.cc @@ -8,8 +8,8 @@ * Autor: Michael Schoettner, HHU, 26.10.2018 * *****************************************************************************/ -#include "lib/Input.h" #include "user/demo/KeyboardDemo.h" +#include "lib/Input.h" void KeyboardDemo::run() { @@ -18,7 +18,9 @@ void KeyboardDemo::run() { kout << "Keyboard Demo: " << endl; while (true) { - kout << getch(); + kout << listener.waitForKeyEvent(); + + // kout << getch(); kout.flush(); } } diff --git a/c_os/user/demo/KeyboardDemo.h b/c_os/user/demo/KeyboardDemo.h index 7c65668..bbccc8c 100755 --- a/c_os/user/demo/KeyboardDemo.h +++ b/c_os/user/demo/KeyboardDemo.h @@ -13,14 +13,18 @@ #include "kernel/Globals.h" #include "kernel/threads/Thread.h" +#include "user/KeyEventListener.h" class KeyboardDemo : public Thread { private: KeyboardDemo(const KeyboardDemo& copy) = delete; + KeyEventListener listener; + public: - KeyboardDemo() { + KeyboardDemo() : listener(*this) { kout << "Initialized KeyboardDemo" << endl; + kevman.subscribe(listener); } void run() override;