aboutsummaryrefslogtreecommitdiffstats
path: root/docs/0-waltham-overview.md
blob: 78f2596622762c95aa61d43b3f3b7414668f7bc5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
**Table of Content**

1. TOC
{:toc}

## Context

In today's world, the information for drivers is becoming excessive. For
example, safety information to let the driver notice the obstacles on the road,
telematics information about car accident or traffic jam, media information
from connected phones etc. In the future, it is expected that the
more displays will be available in the car and show more information.

TFT (Thin-Film transistor) Cluster will have more information, other than
engine speed and a map, with a Head-Up-Display projected onto the windshield
will bring driver to new world.  With the constant bombardment of information
drivers will have a hard time making sure their eyes on the road, avoiding
needless distractions.

As we need more comprehensive Human Machine Interfaces, which displays the
information that the driver needs on appropriate device and on time with
a comprehensive user interface, a screen-sharing, remoting mechanism between
multiple ECUs (Electronic Control Unit) will be necessary. For that, a protocol
working over the network has been devised that could solve this problem.

## Waltham protocol

[Waltham protocol](https://github.com/waltham/waltham) is a IPC library similar
to [Wayland](https://wayland.freedesktop.org), developed with networking in
mind. It operates over TCP sockets, while the wayland protocol only
works locally over a UNIX socket. It retains wayland-esque paradigm, making use
of XMLs to describe the protocol, and it follows an object-oriented design with
an asynchronous architecture.

It was developed by Collabora Ltd., along with ADIT, a joint venture company
owned by Robert Bosch Car Multimedia GmbH and DENSO corporation. It supports
surface sharing via network, but sharing function itself is not implemented in
Waltham.  Please refer [Waltham
documentation](https://waltham.github.io/waltham/) for more details.

### Major differences from Wayland to Waltham
- Waltham uses TCP sockets for reliable communication
- Waltham cannot send file descriptors
- Waltham API is minimal and symmetric between server and client sides
- Waltham does not provide an event loop implementation
- The registry implementation is left out of the library, only the interface is
  provided
- No multi-threading support for sharing objects between threads

![image](./images/Diffrence_between_Wayland_and_Waltham.jpg)

### Requirements in automotive industry
In order to use Waltham in automotive industry, the automotive specific
requirements must be covered.

The below shows very high level requirements. You can find the further
requirements at [**Waltham Requirements**](https://confluence.automotivelinux.org/display/UIGRA/Waltham+backend+requirements).

1. Shall be able to support fast/reliable remoting among multiple ECUs
2. Shall be able to support input handling
3. Shall be able to share dedicated application
4. Shall be able to share complete display output depending on additional
   communication

* Surface sharing is not part of Waltham protocol, each system needs to
implement the most efficient way for surface sharing.  On AGL, we implemented
[Waltham client and Receiver](1-waltham-client-and-receiver.md) to enable
surface sharing along with GStreamer encoder/decoder. It uses UDP for remoting,
which is faster than TCP. Input events communicates with Waltham
protocol.

### Links
* [Announcement of Waltham](https://lists.freedesktop.org/archives/wayland-devel/2016-October/031413.html)
* [Bi-weekly meeting minutes](https://wiki.automotivelinux.org/eg-ui-graphics)
* [UI and Graphics wiki](https://confluence.automotivelinux.org/display/UIGRA/UI+and+Graphics+Home)
* [Waltham source codes](https://gerrit.automotivelinux.org/gerrit/gitweb?p=src/weston-ivi-plugins.git;a=tree;h=refs/heads/master;hb=refs/heads/master)