Project Plano Intro
Tags: flutter, ubuntu, automotive, toyota
Published: 2021-08-07 04:03:53

This is my 2019 Toyota Hilux, a brilliant ute with a less than brilliant head unit installed from factory. The software has been used in Australian vehicles for a good number of years now and is really showing it’s age, in particular the UI performance.

The first option was to install an aftermarket CarPlay head unit from a brand like Alpine or Sony, but the outrageous prices for rather outdated hardware (1024x768px is considered HD!) and software extension limitations from Apple/Google ruled this out. Why not build one from scratch? I figure this would be a very interesting learning experience and some people might get a kick out of following along, so why not? A first for me though, I've made the [Github](https://github.com/alexmills/plano) project public!

## The Display

![Touchscreen display from angle](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6ruwbbrriwtfzel0diph.jpg)

I wanted the display to be retina-level resolution with multi-touch laminated glass and to be a similar size to the ‘tablet’ unit installed from factory. I purchased this [9-Inch 2K Waveshare](https://www.waveshare.com/9inch-2560x1600-monitor.htm) monitor which uses HDMI for video and two USB ports for power/touch. The body is brushed aluminum and black glass which matches perfect while the size is damn near the same as the existing unit but with two more inches of display.

![Display Dashboard Sizing Mockup](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f212cpf9suojiw52jh25.jpg)

The IO is on the side of the display but with some 90-degree connectors, the visual impact should be very small. I’m on the lookout for a second-hand genuine head unit to use as the display mount and controller case, to keep the look as factory as possible. 

With the physical size and working resolution decided upon, I can start to describe the base layout of the UI that I’ve been building in my head for a while now.

![Infotainment core layout mockup](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xl9spxq6hzgd7zk1muza.jpg)

My design for the interface is based on 3 core principals: It should be **Fast**, it should be **Clear**, and it should be **Safe**. This is software that needs to be operated while operating a reasonable heavy vehicle without increasing the overall danger of driving. As much as possible of the UI interaction will be handled via the steering wheel controls and clearing marked buttons and switches.

## Controller and Software

The controller needs to have strong graphic performance to drive the high-res monitor so the current decision is between the rPi 4 and Nvida Jetson Nano. The Pi does have the ecosystem advantage when it comes to additional modules like Audio DACs and GPS receivers.

The original goal was to use GTK3+ but following the Flutter event where Ubuntu announced strong support and [Toyota Connected](https://twitter.com/toyotaconnected/status/1367497041304256515) committed to using it in future projects, it seemed the obvious way to go.

Whereas Toyota uses [Automotive Grade Linux](https://www.automotivelinux.org/) in their vehicles, the support for Flutter is still in [early development](https://jira.automotivelinux.org/browse/SPEC-3852) and a little out of scope for this project currently. Ultimately the end goal would be for Plano to run on AGL to demonstrate it's vehicle readiness. For the moment, I'll be using Snaps with Ubuntu Core to make development and device deployment as 'standard' as possible.

## What's Next

I'm currently designing a bunch of the screens and building the overall design language for the UI. I'll post some mockups in the near future. Learning flutter and slowing building the project when time allows. I have hardware delivered and on the way, including a donor head unit I'll use for component mounting.

Apologies for the word dump, just wanted to get the overall project plan out of the way so the next articles will be more focused and relevant.