Меню

andipanda.dev

CaRadio: як я адаптував сенсорне керування CarPlay

У попередній статті я розповів, як експериментував із FastCarPlay та LIVI, а потім доопрацював процедуру ініціалізації Carlinkit, щоб досягти стабільного підключення телефона.

Але успішне підключення CarPlay — це лише частина завдання. Щоб користуватися системою в автомобілі, потрібне ще й зручне керування.

У моєму випадку основним пристроєм введення був сенсорний екран. І саме з його підтримкою довелося розбиратися на наступному етапі розробки.

Перші експерименти із сенсорним керуванням

FastCarPlay уже мав підтримку сенсорного введення. Однак у початковому вигляді проект був значною мірою орієнтований на керування з клавіатури.

Для розробки та перевірки роботи CarPlay це цілком відповідний варіант. Але мені хотілося отримати повноцінну автомобільну магнітолу, якою можна користуватися безпосередньо через екран, без клавіатури та миші.

Під час перших експериментів я зіткнувся з нестабільною роботою сенсорного керування на своєму обладнанні.

Наскільки пам'ятаю, після кількох дотиків або спроби виконати свайп CarPlay переставав реагувати на дотики. При цьому сама програма продовжувала працювати.

Зараз я вже не можу точно сказати, що спричиняло таку поведінку. Можливо, проблема була пов'язана з особливостями моєї конфігурації, обладнанням або обробкою подій введення.

Тому робити висновки про причини несправності в оригінальному проекті було б неправильно.

До того ж я все одно збирався створювати власний інтерфейс магнітоли, а отже, обробку керування рано чи пізно довелося б адаптувати під CaRadio.

Від клавіатури до сенсорного екрана

FastCarPlay використовував SDL — бібліотеку, з якою я почав знайомитися після повернення до проекту.

Одна з її переваг полягає в тому, що вона дозволяє отримувати події від різних пристроїв введення та обробляти їх безпосередньо в програмі.

Для моєї магнітоли це було зручно.

Я міг використовувати мишу під час розробки на комп'ютері, а на Raspberry Pi працювати із сенсорним екраном. При цьому основна логіка керування могла залишатися спільною.

Але для CarPlay недостатньо просто визначити, що користувач торкнувся дисплея.

Потрібно розуміти, де саме відбувся дотик, коли палець торкнувся екрана, чи переміщувався він і в який момент був відпущений.

Усі ці дії необхідно перетворити на команди, зрозумілі системі CarPlay.

Натискання, переміщення та свайпи

Сенсорне керування складається не лише з одиночних натискань.

Наприклад, щоб відкрити програму, достатньо торкнутися відповідного значка. А щоб прокрутити список або переміститися по карті, уже потрібна обробка руху пальця.

Тому в CaRadio я передбачив обробку кількох типів подій: початок дотику, переміщення та відпускання пальця.

У випадку звичайного натискання програма отримує координати точки, у якій користувач торкнувся екрана, і передає відповідну подію далі.

Під час переміщення пальця необхідно передавати зміну координат, щоб CarPlay міг реагувати на жест.

Коли палець відривається від дисплея, надсилається подія завершення дотику.

На перший погляд усе досить просто. Але для коректної роботи важливо враховувати послідовність цих подій і не змішувати їх із керуванням власним інтерфейсом магнітоли.

Окремо я зберіг можливість використовувати мишу. Це корисно під час розробки та перевірки програми без підключеного сенсорного дисплея.

Координати екрана та CarPlay

Ще одне завдання — правильно передавати координати дотиків.

Дисплей магнітоли має власну роздільну здатність, а зображення CarPlay обробляється у своїй системі координат.

Якщо просто передавати координати сенсорного екрана без перетворення, натискання може потрапити не туди, куди очікує користувач.

Тому в CaRadio координати перераховуються з урахуванням розмірів вікна програми та масштабу зображення CarPlay.

Це дозволяє відокремити фізичну роздільну здатність дисплея від координат, які використовуються для керування.

Такий підхід особливо корисний під час розробки, коли програма може запускатися у вікні іншого розміру, ніж екран автомобільної магнітоли.

Як повернутися з CarPlay до CaRadio

Коли CarPlay займає весь екран, виникає ще одне питання: як повернутися до власного інтерфейсу магнітоли?

Можна було б використовувати окрему фізичну кнопку. Але мені хотілося, щоб основні дії були доступні безпосередньо із сенсорного екрана.

Тому я передбачив спеціальну область у лівому верхньому куті дисплея.

Коли користувач торкається цієї області, подія обробляється самою CaRadio і не передається в CarPlay як звичайне натискання.

Після цього можна відкрити головний екран магнітоли й отримати доступ до інших функцій програми.

При цьому решта екрана продовжує використовуватися для керування CarPlay.

Таким чином, один і той самий пристрій введення обслуговує два різні завдання: керування телефоном через CarPlay і керування самою магнітолою.

Чому я вирішив зробити це самостійно

Моя мета не полягала в тому, щоб повністю переписати керування FastCarPlay або довести, що початкова реалізація була неправильною.

Мені було потрібне рішення, яке відповідало б конкретній конструкції CaRadio.

Я хотів самостійно контролювати обробку подій, розуміти, куди передається кожен дотик, і мати можливість додавати власні елементи керування.

Крім того, такий підхід добре відповідає моєму загальному принципу розробки: за можливості використовувати прості та зрозумілі рішення без зайвих програмних шарів.

Звичайно, самостійна реалізація теж потребує часу на налагодження.

Але в результаті я отримав керування, яке можна розвивати разом з іншими функціями магнітоли, не обмежуючись можливостями початкового інтерфейсу.

Кілька слів про FastCarPlay

Тут хочу окремо подякувати автору FastCarPlay.

Саме завдяки його роботі мені вдалося повернутися до ідеї власної магнітоли з CarPlay і довести її до результату, яким я користуюся в автомобілі.

Якби не цей проект, цілком можливо, я досі продовжував би шукати відповідне рішення або взагалі відмовився від свого задуму.

Тому описані зміни — не спроба зробити FastCarPlay «правильнішим» або «кращим». Я лише адаптував наявну реалізацію під власне обладнання та завдання.

Відкриті проекти цінні саме тим, що дозволяють не починати щоразу з нуля, а вивчати готові рішення та розвивати їх у власному напрямку.

Що в підсумку

У результаті сенсорне керування стало частиною CaRadio, а не просто додатковою можливістю для взаємодії з CarPlay.

Тепер програма може обробляти натискання та переміщення пальця, перетворювати координати під зображення CarPlay і відокремлювати керування телефоном від керування самою магнітолою.

Для мене це був ще один крок від експериментального запуску CarPlay на Raspberry Pi до системи, якою справді зручно користуватися в автомобілі.

Але зображення та керування — лише частина мультимедійної системи.

Окремим завданням стала робота зі звуком: його отримання, відтворення та інтеграція з іншими функціями магнітоли.

Про це розповім у наступній статті.