Streams (of data) are the fundamental mechanism for transferring values through the Pilot™ system. A stream represents a value in time that comes from one of the set configuration items. To be of any use, a stream in the system should have a source and one or more sinks. A source could be a value coming from a BLE connection or a read CAN message and normally you would only have one source of information so that you don't get a confusing combination of information from different devices. To output information, a config item of some sort needs to "sink" the stream of data and output it somehow. It is safe to have multiple sinks for a single source as you still know where the data originated so there is no confusion. A stream value is stored internally as a 32-bit signed integer along with a Filter identifier.

For example, a simple set-up may have:

[BLE Wearable Chest Strap]  ⇒  BLE wireless ⇒  BLE HR Module ⇒  Source[HR] ⇒  Pilot subsystem ⇒  CAN Bus Module ⇒  Sink[HR] ⇒  Physical CAN


[BLE Wearable Chest Strap] ⇒  BLE wireless ⇒  BLE HR Module ⇒  Source[HR] ⇒  Pilot subsystem ⇒  Serial Module ⇒  Sink[HR] ⇒  Physical Serial


Every stream contains a filter number. For simple configurations, the filter number of a stream is by default zero and the user can ignore the concept of filters and still have a very flexible system. For more advanced configurations, filters can be very powerful.

Filters allow multiple streams with the same stream identifier to be used but still be able to route them appropriately. For example, it would be difficult to predefine how many heart rate sources there are in a system. Creating stream types called HeartRate1, HeartRate2 etc would be difficult to manage. Instead, every stream has a filter. The filter allows us to say there are x modules emitting heart rate and have each emit using their own filter. In this way, output modules can decide which of the filters they output. You could have one serial port filtering for Filter 1 and another for Filter 2 or a CAN message that emits, for example, eight different heart rates in a single package.

There are many ways to exchange data and the Streams, Advanced Concepts page describes functions in more detail.

Stream Names

Each module that outputs a stream gives it an identifier. Identifiers make it possible to configure other modules to manipulate the stream. Most identifiers are predefined (such as for heart rate) but streams can also be used for custom data. The names of streams are not used in the Pilot, so any stream can be used for any purpose. There is an option to define custom streams.