njkh… סליחה, מחליפים שפה במקלדת לעתים קרובות ומשתגעים מהטעויות שזה גורר? הנה פרויקט משולב של תוכנה, אמבדד והדפסה בתלת-ממד, שמראה בצורה בולטת וברורה לאיזו שפה המחשב מכוון בכל רגע נתון.
לפני הכול, הבהרה קטנה למי שלא מבין מה הקטע: כן, אני יודע שיש אינדיקטור שפה ב-Taskbar, ושאפשר להחליף את השפה בלחיצה על Alt+Shift וכו'. אבל כשעובדים באינטנסיביות על מסמך, זה לא נוח וגם מסיח את הדעת להציץ כל הזמן לפינה כדי לבדוק מה השפה. כשמקלידים הרבה ומהר, זו גם לא אופציה "להקיש משהו, לראות מה יוצא ומקסימום לתקן". מעבר לזה, יש יישומים שמחליפים בעצמם את השפה כשעוברים ממקום למקום במסמך, כך שזה לא לגמרי בשליטתנו, ומה שהכי גרוע – משום מה, צירוף המקשים להחלפה לא תמיד תופס! ותאמינו לי, כשצריך לעבור מעברית לאנגלית ולהיפך חמש או שש פעמים בדקה, כל הדברים האלה יחד נהיים מעיקים מאוד.
לפני כחמש שנים יצרתי פרויקט פדל להחלפת שפות. הוא עבד, אבל מהסיבות שהוזכרו בפסקה הקודמת, לא באמת פתר את הבעיה. הבנתי שמה שהכי חשוב זה לאו דווקא להחליף את השפה בקלות, אלא לקבל אינדיקציה בולטת וברורה מאוד למצב המקלדת בכל רגע נתון. ניתן לכתוב תוכנה שתיתן אינדיקציה כזו ישירות על המסך, אבל היא תסתיר ותפריע לעבודה השוטפת, אז החלטתי להוציא את האינדיקציה אל העולם הממשי, בתור גאדג'ט חיצוני למחשב. זה מצריך שלושה אלמנטים:
אלמנט ראשון: זיהוי השפה הנוכחית במחשב
זהו החלק הכי קל, בזכות גוגל ו-Stackoverflow כמובן. בחיפוש קליל מצאתי את הפקודות בשפת פייתון שצריך להריץ כדי לזהות את שפת המקלדת הנוכחית ב-Windows 10, ולא קשה לשלב אותן בתוכנית כך שירוצו, נניח, עשר פעמים בשנייה – ניחשתי שזה מספיק מהר כדי שהמשתמש יקבל מידע עדכני לשימוש שוטף. לא בעיה לשנות את המספר הזה בהמשך אם יתעורר צורך.
המידע הגולמי שמתקבל ממערכת ההפעלה לגבי שפת המקלדת הוא מספר שרירותי. בשביל פרויקט קטן ופרטי כמו זה, מספיק לדעת איזה מספר מייצג איזו מקלדת אצלי במחשב. אני קיבלתי את הערך 67699721 למקלדת אנגלית ואת הערך -264436723 לעברית.
אלמנט שני: שליחת המידע אל מחוץ למחשב
בעבר כבר הראיתי איך אפשר לשלוח בייטים דרך חיבור סריאלי – COM PORT ב-Windows – באמצעות שפת פייתון. הפוסט ההוא דיבר על תקשורת עם לוח ארדואינו, אך כמובן שכל דבר שמתחבר למחשב ומזוהה כ-COM PORT יעבוד באותו אופן. במקרה הנוכחי, כדי לשמור על הפשטות, התקשורת תהיה חד-סטרית ומינימליסטית מאד: קוד הפייתון ישלח את התו "E" כשהוא יזהה מקלדת אנגלית, ו-"H" כשיזהה מקלדת עברית. זהו. הבדיקה מתבצעת עשר פעמים בשנייה בכל מקרה, כך שהקוד לא צריך להתחבר במיוחד ל"אירועי מקלדת". מצד שני, ברוב הבדיקות לא יהיה שינוי בשפה, ובמקרים כאלה אפשר לשלוח את המידע בתדירות נמוכה יותר.
אבל… מי יפעיל את תוכנית הפייתון הזו, ואיך היא תדע לזהות מי מחיבורי ה-COM PORT הקיימים הוא גאדג'ט האינדיקטור? הרי כל לוח ארדואינו, או התקן אחר שמתחבר בתקשורת UART דרך USB, מזדהה כ-COM PORT, וכל עוד אנחנו משתמשים במודולי תקשורת פשוטים ונפוצים, איננו יכולים להוסיף להם מזהה חד-משמעי במערכת. גם לא כדאי לתת לגאדג'ט יכולת תקשורת דו-סטרית לצורך אימות הזהות שלו, כי אם תוכנית הפייתון תנסה להתחבר לכל COM PORT שהיא רואה ולבדוק מי הוא, זה עלול לשבש התנהגות של תוכניות אחרות.
גם כאן, בחרתי לעשות לעצמי חיים קלים. אני זקוק לגאדג'ט הזה רק בזמן סוג מאוד ספציפי של עבודה, אז פשוט אפעיל את התוכנית רק כשאתחיל לעבוד. הגאדג'ט יכול להיות מנותק פיזית מהמחשב עד אז, והתוכנית תנטר את רשימת ה-COM PORT העדכנית ותחכה עד שתזהה חיבור חדש – שיהיה, כמעט בוודאות, החיבור הנכון.
אלמנט שלישי: הצגת המידע למשתמש
מרגע שיש לנו פלט UART ידוע מהמחשב שמייצג את שפת המקלדת, אפשר לעבד ולעשות איתו מה שרוצים – עם מספיק השקעה, אפילו לשנות את צבע התאורה הראשית של החדר, או להפעיל מנוע גדול עם זרוע שתכה בגונג. אני הלכתי על משהו צנוע יותר: מתקן קטן, מודפס בתלת-ממד, ש"מתלבש" על החלק העליון של מסגרת המסך כמו מצלמת רשת, ומאיר חלקים שונים של עצמו בצבעים שונים כדי לציין את השפות השונות.
מיקרו-בקר מדגם PIC12F1840 מטפל בקלט ממודול ה-UART ומפעיל שני לדים שמחוברים במהופך זה לזה, כך שבכל רגע נתון רק אחד מהם (לכל היותר) יכול להאיר. הלדים, אחד כחול ואחד לבן, קבועים בתוך כיסויים שהודפסו בתלת ממד מ-PLA לבן, עם האות "ע" מוטבעת באחד מהם, ו-"E" בשני. ניסויים מקדימים הראו שהאור מהלד ניכר בבירור דרך הפלסטיק, בלי לסנוור.
הכול ביחד
כדי שהגאדג'ט יעבוד כראוי, נדרשו מספר ליטושים – גם פיזיים, של שוליים דוקרים בחלקים המודפסים, וגם בתוכנה. למשל, כיוון שאני לא תמיד מסתכל ישירות על הגאדג'ט, או אפילו על המסך שהוא יושב עליו (כי אני עובד עם שני מסכים), רציתי שהשינוי יהיה יותר בולט לעין, אז הוספתי הבהוב קצר להחלפת הצבע. כמו כן, הוספתי כיבוי של שני הלדים אם לא מתקבל קלט חדש במשך שלוש שניות, כך שאם יש איזו תקלה בתוכנה או בחיבור, אני אדע את זה ולא פשוט אניח שהשפה לא השתנתה.
האינדיקטור עובד היטב מהבחינה הטכנית, אבל יש עוד מה לשפר מבחינת הנדסת האנוש. כפי שאתם בוודאי יודעים (אני מקווה), היכולת שלנו להבדיל בין צבעים שונים מוגבלת למרכז שדה הראייה. לכן, כשאני מסתכל על מסך אחר ולא יודע מראש באיזו שפה אני עובד, אני רואה רק שיש אור בגאדג'ט, ולא מסוגל לזהות אם הוא כחול או לבן. פתרונות אפשריים הם להרחיק את האלמנטים עם הלדים זה מזה, כך שההבדל יהיה משמעותי גם במרחב ולא רק בצבע, או להוסיף צליל ייחודי לכל שפה – מה שמחייב זהירות רבה, כדי שהצלילים לא ישגעו אותי עוד יותר מאשר שפה שגויה במקלדת.