⌨️ main.rs (Input Server)
هذا الملف يحتوي على الكود الرئيسي لخادم الإدخال (Input Server) المسؤول عن قراءة أحداث لوحة المفاتيح عبر استدعاءات النظام (Syscalls) وإرسالها إلى الخوادم أو التطبيقات الأخرى.
📋 نظرة عامة على الكود
يقوم الخادم بتنفيذ حلقة لا نهائية تقرأ باستمرار الأحداث المتعلقة بالـ Keyboard عبر استدعاء SYS_GET_KEY_EVENT. عند استلام حدث يمثل ضغطة زر (Key Press) ومفتاحاً قابلاً للطباعة (Printable)، يتم تحويله وإرساله أو طباعته على الشاشة عبر SYS_DRAW_CHAR_FB.
🛠️ الكود المصدري
rust
#![no_std]
#![no_main]
extern crate qos_api;
use qos_api::*;
#[no_mangle]
pub extern "C" fn _start() -> ! {
// تسجيل الخدمة كخادم إدخال
// قريباً: syscall_3(SYS_REGISTER_SERVICE, ...);
loop {
// قراءة حدث لوحة المفاتيح من النواة
let event = syscall_1(SYS_GET_KEY_EVENT, 0);
if event != 0 {
// تفكيك الحدث (يعتمد على تصميم هيكل الحدث في النواة)
let is_press = (event >> 31) & 1 == 1;
let keycode = (event & 0xFF) as u8;
if is_press {
// تحويل الـ keycode إلى حرف ASCII (مبسط)
let ch = keycode_to_ascii(keycode);
if ch != 0 {
// إرسال الحرف للشاشة مباشرة (مؤقتاً للتبسيط)
syscall_3(SYS_DRAW_CHAR_FB, ch as u64, 0xFFFFFF, 0); // لون أبيض
}
}
}
// إعطاء فرصة للعمليات الأخرى (Yield)
syscall_0(SYS_YIELD);
}
}
fn keycode_to_ascii(code: u8) -> u8 {
// خريطة مبسطة جداً للـ Scancodes (QWERTY)
match code {
0x1E => b'a',
0x30 => b'b',
0x2E => b'c',
0x20 => b'd',
0x12 => b'e',
0x21 => b'f',
0x22 => b'g',
0x23 => b'h',
0x17 => b'i',
0x24 => b'j',
0x25 => b'k',
0x26 => b'l',
0x32 => b'm',
0x31 => b'n',
0x18 => b'o',
0x19 => b'p',
0x10 => b'q',
0x13 => b'r',
0x1F => b's',
0x14 => b't',
0x16 => b'u',
0x2F => b'v',
0x11 => b'w',
0x2D => b'x',
0x15 => b'y',
0x2C => b'z',
0x39 => b' ', // مسافة
0x1C => b'\n', // إدخال (Enter)
_ => 0,
}
}🔍 شرح العمليات
- SYS_GET_KEY_EVENT: استدعاء نظام يُرجع الحدث الأخير للوحة المفاتيح. إذا لم يوجد حدث يُرجع 0.
- البت رقم 31 (is_press): يستخدم البت الأخير لتحديد ما إذا كان الزر قد ضُغط أم أُفلت.
- الطباعة المباشرة (SYS_DRAW_CHAR_FB): في هذه المرحلة، يتم إرسال الحرف مباشرة لخادم الشاشة أو النواة ليتم رسمه باستخدام الـ Framebuffer.