Как Android управляет спорткаром

# Из нашей практики
Декабрь 2016 г
SimbirSoftMobile

Можно бесконечно спорить о преимуществах и недостатках iOS и Android, но, когда речь идет о глубокой кастомизации платформы и взаимодействии с нестандартными периферийными устройствами, предпочтение отдается платформе Android.

Делюсь с вами историей создания панели управления спорткаром. Вот как это было.

Заказчик планировал представить обновленную версию своего спорткара на Женевском автосалоне 2016, и нам предстояло разработать новую панель управления за полтора месяца. Столь короткий срок объяснялся тем, что предыдущие подрядчики не смогли справиться с задачей, поэтому исполнителя сменили, а сроки остались. Существуют разные универсальные системы, подходящие для этой цели, но времени на разработку и интеграцию было мало, поэтому мы начали разрабатывать с "нуля".

Исходные данные

Два планшета, устанавливаемые в приборную панель. На экране первого должны отображаться стандартные параметры автомобиля: скорость, расход, запас хода и др., а на экране второго - консоль управления: навигация, режимы работы, музыкальный плеер. Взаимодействие с "железом" осуществлялось через устройство заказчика, основанное на Arduino, и подключаемое к CAN шине. Параллельно с разработкой софта, заказчик отливал форму для панели приборов, куда встраивал планшеты.

Наши действия

Согласно дизайну, мы отобразили панель приборов для трех режимов работы: Race, Sport, Wet, каждый из них отличался собственным расположением элементов и цветовой схемой. Большинство элементов представляли собой триггеры (не пристегнутый ремень, ошибки и т.д.), которым мы обеспечили плавное включение и выключение. Дальше - больше. Нам предстояла разработка динамических элементов, таких как стрелка спидометра.

SimbirSoftMobile

После анализа задачи и предварительных тестов на производительность, мы решили не использовать графические движки и делать анимацию на родной функциональности Android. Это было верное решение - после реализации всего функционала отрисовка шла со стандартной скоростью 60 FPS.

Для отображения триггеров мы использовали простое и эффективное решение - сохранили в памяти два изображения, полученные из исходного Ai (Adobe Illustrator) файла: полное изображение со всеми элементами в неактивной фазе и изображение с включенными элементами. Для работы достаточно было указать регион с триггером и плавно менять одно изображение на другое в этой области. Мы могли не контролировать, как дизайнер сделал наложение одних компонентов на другие и прочие художественные изыски, а при изменении дизайна не требовалось снова сохранять отдельные иконки.

Это решение также помогло отобразить элементы типа уровня топлива, состоящее из нескольких секций, а также отображать наклоненные элементы без пересечения с соседними контролами.

С отображением стрелки спидометра было сложнее. В нативном режиме сложно сделать удобное наложение цветов, как это делается на шейдерах. Неприятным сюрпризом оказалось наличие артефактов при отрисовке спидометра. На различных версиях Андроид (>5) они проявлялись по-разному. Пришлось потрудиться, подбирая параметры, чтобы скрыть их или сделать незаметными на конкретных устройствах.

Лайфхаки:

  1. все данные по интерфейсу и отладочная информация были записаны в json файл, который периодически обновлялся и считывался без перезагрузки приложения.
  2. Непосредственно в приложении был создан примитивный редактор, который позволял просматривать активные области, а также модифицировать их и сохранять. Это избавило от необходимости вводить координаты вручную, что актуально при разработке консоли со множеством элементов управления.
SimbirSoftMobile

Следующим вызовом стало отображение приложения на экране Андроид без возможности отключения. К счастью, начиная с 5-й версии, в Андроид появилась возможность создания родных "киоск" приложений, предназначенных как раз для такого случая. В этом режиме стандартный выход из приложения не работает и приходится предусматривать специальную кнопку выхода для тестового режима.

Подключение к Arduino производилось через USB кабель, так что планшет выполнял роль USB хоста. Считывание информации обрабатывалось как данные с последовательного порта. Arduino у заказчика имел иной идентификатор устройства и, если у нас плата определялась корректно, то у заказчика она просто игнорировалась. Это несколько затрудняло работу.

Далее мы создали консоль управления автомобилем. Здесь пришлось отобрать тот функционал, который реально разработать в сжатые сроки. Сюда мы включили переходы по экранам, проигрывание музыки из памяти с возможностью выбора композиции и перелистывания и навигацию с использованием Google Maps.

При разработке консоли мы расширили функционал, добавив обработку событий нажатия на экран и дополнительную анимацию. Ранее разработанный фреймворк помог легко это реализовать. Проигрывание музыки мы разработали с помощью стандартного Android API.

В результате автомобиль приобрел современную панель управления, а наш клиент продемонстрировал “обновку” потенциальным покупателям и посетителям Женевского автосалона 2016. Наш опыт показывает, что Android планшеты могут использоваться для интеграции со сложными системами для управления и отображения информации.