Skip to content

← العودة إلى خادم الإدخال

⌨️ 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,
    }
}

🔍 شرح العمليات ​

  1. SYS_GET_KEY_EVENT: استدعاء نظام يُرجع الحدث الأخير للوحة المفاتيح. إذا لم يوجد حدث يُرجع 0.
  2. البت رقم 31 (is_press): يستخدم البت الأخير لتحديد ما إذا كان الزر قد ضُغط أم أُفلت.
  3. الطباعة المباشرة (SYS_DRAW_CHAR_FB): في هذه المرحلة، يتم إرسال الحرف مباشرة لخادم الشاشة أو النواة ليتم رسمه باستخدام الـ Framebuffer.

تم تطويره بحب بواسطة مجتمع Qtoom.