Как Android управляет спорткаром
Можно бесконечно спорить о преимуществах и недостатках iOS и Android, но, когда речь идет о глубокой кастомизации платформы и взаимодействии с нестандартными периферийными устройствами, предпочтение отдается платформе Android.
Делюсь с вами историей создания панели управления спорткаром. Вот как это было.
Заказчик планировал представить обновленную версию своего спорткара на Женевском автосалоне 2016, и нам предстояло разработать новую панель управления за полтора месяца. Столь короткий срок объяснялся тем, что предыдущие подрядчики не смогли справиться с задачей, поэтому исполнителя сменили, а сроки остались. Существуют разные универсальные системы, подходящие для этой цели, но времени на разработку и интеграцию было мало, поэтому мы начали разрабатывать с "нуля".
Исходные данные
Два планшета, устанавливаемые в приборную панель. На экране первого должны отображаться стандартные параметры автомобиля: скорость, расход, запас хода и др., а на экране второго - консоль управления: навигация, режимы работы, музыкальный плеер. Взаимодействие с "железом" осуществлялось через устройство заказчика, основанное на Arduino, и подключаемое к CAN шине. Параллельно с разработкой софта, заказчик отливал форму для панели приборов, куда встраивал планшеты.
Наши действия
Согласно дизайну, мы отобразили панель приборов для трех режимов работы: Race, Sport, Wet, каждый из них отличался собственным расположением элементов и цветовой схемой. Большинство элементов представляли собой триггеры (не пристегнутый ремень, ошибки и т.д.), которым мы обеспечили плавное включение и выключение. Дальше - больше. Нам предстояла разработка динамических элементов, таких как стрелка спидометра.
После анализа задачи и предварительных тестов на производительность, мы решили не использовать графические движки и делать анимацию на родной функциональности Android. Это было верное решение - после реализации всего функционала отрисовка шла со стандартной скоростью 60 FPS.
Для отображения триггеров мы использовали простое и эффективное решение - сохранили в памяти два изображения, полученные из исходного Ai (Adobe Illustrator) файла: полное изображение со всеми элементами в неактивной фазе и изображение с включенными элементами. Для работы достаточно было указать регион с триггером и плавно менять одно изображение на другое в этой области. Мы могли не контролировать, как дизайнер сделал наложение одних компонентов на другие и прочие художественные изыски, а при изменении дизайна не требовалось снова сохранять отдельные иконки.
Это решение также помогло отобразить элементы типа уровня топлива, состоящее из нескольких секций, а также отображать наклоненные элементы без пересечения с соседними контролами.
С отображением стрелки спидометра было сложнее. В нативном режиме сложно сделать удобное наложение цветов, как это делается на шейдерах. Неприятным сюрпризом оказалось наличие артефактов при отрисовке спидометра. На различных версиях Андроид (>5) они проявлялись по-разному. Пришлось потрудиться, подбирая параметры, чтобы скрыть их или сделать незаметными на конкретных устройствах.
Лайфхаки:
- все данные по интерфейсу и отладочная информация были записаны в json файл, который периодически обновлялся и считывался без перезагрузки приложения.
- Непосредственно в приложении был создан примитивный редактор, который позволял просматривать активные области, а также модифицировать их и сохранять. Это избавило от необходимости вводить координаты вручную, что актуально при разработке консоли со множеством элементов управления.
Следующим вызовом стало отображение приложения на экране Андроид без возможности отключения. К счастью, начиная с 5-й версии, в Андроид появилась возможность создания родных "киоск" приложений, предназначенных как раз для такого случая. В этом режиме стандартный выход из приложения не работает и приходится предусматривать специальную кнопку выхода для тестового режима.
Подключение к Arduino производилось через USB кабель, так что планшет выполнял роль USB хоста. Считывание информации обрабатывалось как данные с последовательного порта. Arduino у заказчика имел иной идентификатор устройства и, если у нас плата определялась корректно, то у заказчика она просто игнорировалась. Это несколько затрудняло работу.
Далее мы создали консоль управления автомобилем. Здесь пришлось отобрать тот функционал, который реально разработать в сжатые сроки. Сюда мы включили переходы по экранам, проигрывание музыки из памяти с возможностью выбора композиции и перелистывания и навигацию с использованием Google Maps.
При разработке консоли мы расширили функционал, добавив обработку событий нажатия на экран и дополнительную анимацию. Ранее разработанный фреймворк помог легко это реализовать. Проигрывание музыки мы разработали с помощью стандартного Android API.
В результате автомобиль приобрел современную панель управления, а наш клиент продемонстрировал “обновку” потенциальным покупателям и посетителям Женевского автосалона 2016. Наш опыт показывает, что Android планшеты могут использоваться для интеграции со сложными системами для управления и отображения информации.