آموزش LVGL, توصیه شده

ورودی‌های سیستم گرافیکی LVGL | قسمت هشتم آموزش سیستم گرافیکی LVGL

ورودی‌های سیستم گرافیکی LVGL | قسمت هشتم آموزش سیستم گرافیکی LVGL

در قسمت هفتم از آموزش LVGL به نحوه کار با Simulator و دانلود فایل‌های موردنیاز برای آن پرداختیم. در این قسمت قصد داریم که ورودی‌های سیستم گرافیکی LVGL یعنی inputها، انواع interfaceهای مختلف، بخش تیک سیستم گرافیکی (tick interface)، بخش task handler و بخش LOG را آموزش ‌دهیم. پس تا پایان این قسمت همراه سیسوگ باشید.

Input device interface

ابتدا می‌خواهیم بررسی کنیم که inputها چی هستند و برای سیستم گرافیکی چه فایده‌ای دارند. به‌طورکلی، Inputها دیوایس‌های جانبی هستند که به سیستم گرافیکی متصل می‌شوند و ما توسط این Inputها، می‌توانیم به سیستم گرافیکی فرمان دهیم، یک گزینه را جابه‌جا کنیم و یا می‌توانیم یک سری اطلاعات به سیستم خود بدهیم؛ به عبارت بهتر می‌توان گفت: inputها واسطه بین کاربر و سیستم گرافیکی هستند.

در سیستم گرافیکی LVGL ،inputها در چهار دسته تقسیم می‌شوند:

  • موس و صفحه تاچ
  • کیبورد و کی پد
  • انکودر: برای انتخاب وجابه‌جایی بین منوها
  • کلیدها: همان buttonهای تنها در بردها هستند که به نحوه‌های مختلف یا به‌صورت up و down یا left و right یا enter هستند.

lv_indev_drv_t

inputها با استراکچر lv_indev_drv_t مشخص می‌شوند. به عبارتی، این استراکچر برای معرفی یک دیوایس ورودی به سیستم گرافیکی می‌باشد. این استراکچر حاوی نوع دیوایس، توابع خواندن دیوایس ورودی و اطلاعات تایمر خواندن داده‌ها و درایور صفحه‌نمایش می‌باشد. کلاً استراکچر بزرگی هست؛ چون شامل چهارتا مورد موس و صفحه تاچ، کیبورد و کی پد، انکودر و کلیدها می‌باشد.

Touchpad و mouse

به‌عنوان‌مثال، برای معرفی این ورودی باید به صورت کد زیر عمل کنیم:

 

نکته✅

ما می‌توانیم هم‌زمان، چند تا دیوایس ورودی برای سیستم خود تعریف کنیم و سیستم گرافیکی هیچ محدودیتی در این زمینه ندارد.

استراکچر lv_indev_data_t

اگر شما بخواهید یک سری دیتا (اطلاعات) از طریق تابع call back به سیستم گرافیکی خود بدهید، به یک استراکچر به نام lv_indev_data_t احتیاج دارید که این استراکچر عمومی هست؛ یعنی هم مربوط به همه‌ی ورودی‌ها می‌باشد.

به‌طورکلی، این استراکچر نگهدارنده اطلاعات مربوط به دیواس ورودی می‌باشد. به مثال زیر توجه کنید:

lv_point_t نیز خودش یک استراکچر است که در ادامه درباره آن توضیح می دهیم.

استراکچر lv_point_t

این استراکچر حاوی مختصات X و Y است؛ یعنی اگر شما بخواهید به سسیتم گرافیکی‌تان، یک مختصات را معرفی کنید، باید از استراکچر lv_point_t استفاده کنید.

به‌طورکلی، این استراکچر حاوی اطلاعات مربوط به مکان لمس شده است. به مثال زیر توجه کنید:

نکته✅

نحوه درایور کردن همه موس‌ها و کیبوردها به این شکل هست که یا Polling هستند یا به‌صورت اینتراپتی (Interrupt). عیبی که Polling دارد، این است که برای سیستم، سربار دارد، درصورتی‌که در حالت اینتراپتی، این سربار وجود ندارد و دلیل آن هم خواندن پشت سر هم آن ورودی هستش.

نمونه کد تابع خواندن تاچ

Keypad و keyboard

در Keypad و keyboard شما باید آبجکت‌هایی که قرار است با Keypad یا keyboard تغییر کنند یا جابه جا شوند را داخل group قرار دهید.

استراکچر lv_group_t

دراین‌خصوص، شما باید ابتدا یک group از جنس lv_group_t تعریف کنید که lv_group_t خودش یک استراکچر هست. مانند کد زیر شما باید ابتدا یک group تشکیل دهید و آن را بزارید رو حالت default. (وقتی رو حالت default بزارید، هر چی که تو صفحتون هست جز این گروه قرار می‌گیرد.) سپس دیوایس ورودی خود را تعریف کنید.

توجه: تابع خواندن KEYPAD و keyboard یکسان هستند.

انکودر (Encoder)

انکودر نیز مانند KEYPAD و keyboard به این صورت است که شما نیاز دارید که یک group ایجاد کنید و آن را روی group خود، ست کنید.

تنها تفاوتی که انکودر با KEYPAD و keyboard دارد این است که ورودی از نوع انکودر می‌شود.

تابع خواندن انکودر

تابع خواندن انکودر مانند تابع‌های قبلی است. فقط در اینجا شما باید خروجی تفاضل کانتر انکودرتون به ورودی دیتا بدهید.

نکته✅

تایمر کانترها قابلیت اتصال انکودر را دارند؛ یعنی وقتی که شما تایمر کانتر خود را داخل stm فعال می‌کنید، هر step ای که داخل انکودرتان بدید مقدار این تایمر کانتر افزایش یا کاهش می‌یابد و در صورت فعال سازی وقفه، با هر تغییر یک وقفه به وجود می آید.

Tick interface

Tick interface یک بخش عمومی در تمام سخت‌افزارها و سیستم‌های گرافیکی است. کار Tick interface در سیستم گرافیکی LVGL، این است که زمان‌سنجی کند و این فرایند را توسط وقفه‌های یک میلی ثانیه‌ای انجام می‌دهد.

lv_tick_inc(tick_period)

ویژگی‌های این تابع عبارت‌اند از:

  • این تابع باید به‌صورت مداوم با زمان‌بندی میلی‌ثانیه فراخوانی شود.
  • اصولاً این تابع باید به‌صورت یک میلی‌ثانیه یک‌بار اجرا شود.
  • وجود آن برای عملکرد سیستم اجباری است.
  • محل قرارگیری پیشنهادی در system_tick یاtaskها می‌باشد.
  • سطح اولویت بالایی باید داشته باشد.

1: super Loop

lv_task_handler()

ویژگی‌های این تابع عبارت‌اند از:

  • این تابع باید به‌صورت مداوم فراخوانی شود.
  • زمان اجرای آن از 5 میلی ثانیه باید بالاتر باشد.
  • مکان پیشنهادی در حلقة اصلی برنامه است.

LOG

این تابع بررسی و نمایش وضعیت و اخطارها و خطاهای سیستم می‌باشد.

LV_LOG_LEVEL_TRACE

LV_LOG_LEVEL_WARN

LV_LOG_LEVEL_ERROR

LV_LOG_LEVEL_USER

LV_LOG_LEVEL_NONE

نکته✅

  • برای فعل سازی LOG باید LV_USE_LOG درh فعال شود.
  • اگر بخواهید از دستور printf برای LOG کردن استفاده کنید باید LV_LOG_PRINTF در h فعال شود.

به عنوان مثال توسط در کد وقفه‌ی زیر وقتی کلید شما لمس می‌شود سیستم عبارت “Clicked” را LOG می کند و در صورت تغییر وضعیت کلید عبارت “Toggled” LOG می‌شود.

نکته✅

از ویژگی LOG برای بررسی و مانیتوریگ و اشکال یابی سیستم استفاده می‌شود.

انتشار مطالب با ذکر نام و آدرس وب سایت سیسوگ، بلامانع است.

شما نیز میتوانید یکی از نویسندگان سیسوگ باشید.   همکاری با سیسوگ

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *