Skip to content
Snippets Groups Projects
Commit 7c074c1f authored by Constantin Christmann's avatar Constantin Christmann
Browse files

Upload of initial contribution from Vector.

parent 6403a38a
No related branches found
No related tags found
No related merge requests found
Showing
with 5102 additions and 0 deletions
# VAF API
## Communication
In the following, the basic API methods for *data elements* and *operations* of a module interface
are presented in dependence of the role, i.e., consumer or provider.
Each *data element* with name `{DataElementName}` and type `{DataElementType}` of a module interface
of consumer type makes the following interface methods available to the consumer module interface:
``` C++
vaf::Result<vaf::ConstDataPtr<const {DataElementType}>> GetAllocated_{DataElementName}()
{DataElementType} Get_{DataElementName}()
void RegisterDataElementHandler_{DataElementName}(std::string owner, std::function<void(const vaf::ConstDataPtr<const {DataElementType}>)>&& f)
```
`GetAllocated_{DataElementName}()` differs from `Get_{DataElementName}()`. In the former case, a
``vaf::Result`` with a contained `vaf::ConstDataPtr` or a `vaf::Error` is returned if no *data
element* has been received yet. Currently, `vaf::ConstDataPtr` contains a `std::unique_ptr` of
datatype `const {DataElementType}`, but further extensions are easily possible if needed to support
other middlewares. In the latter case, a copy is returned from the Non-Allocatee API if a value is
present, and if no data element has been received yet, a default value is returned.
The associated call sequence is shown below on the example of a SIL Kit consumer module.
When a data element is received, the generic receive handler stores the value of the data element in
`cached_{DataElementName}_` from where it is accessible via a `vaf::ConstDataPtr` of type `
DataElementType`. It also calls the registered *data element* handlers.
The process of registering the *data element* handlers is shown in (Registration of *data element*
callback handler methods). The process of the respective getters is shown in (Allocate API) and
(Non-Allocate API).
<img src="./figures/arch-consumer_get_register_api.svg" alt="arch-consumer_get_register_api" width="800"/><br>
On the other hand, each *data element* with name `{DataElementName}` and type `{DataElementType}` of
a module interface of provider type makes the following interface methods available to the provider
module interface:
``` C++
vaf::Result<vaf::DataPtr<{DataElementType}>> Allocate_{DataElementName}()
vaf::Result<void> SetAllocated_{DataElementName}(data: vaf::DataPtr<{DataElementType}>&&)
vaf::Result<void> Set_{DataElementName}(const {data: DataElementType}&)
```
Here, one can distinguish between an *Allocatee API* and a *Non-Allocatee API*. With the Allocatee
API, a `vaf::DataPtr` of a specific datatype must be instantiated first before the actual data value
can be assigned. The `SetAllocated_{DataElementName}()` method then takes the allocated
`vaf::DataPtr` to pass it over to the middleware provider module. The specific middleware module,
again, is then responsible for the processing of the released `vaf::DataPtr`. It can either make a
copy of it and send it out, or, implement a zero-copy mechanism, which is currently prepared but not
supported.
The associated call sequence is shown below in the case of a SIL Kit provider module
for both, the Allocate API and Non-Allocate API case.
<img src="./figures/arch-provider_allocate_set_api.svg" alt="arch-provider_allocate_set_api" width="580"/><br>
Similar for *operations*. An *operation* with name `{OperationName}` and parameters
`{OperationParameters}` provides the following interface method in the case of a consumer module
interface:
- `vaf::Future<{OperationOutput}> {OperationName}({OperationParameters})`
This is just the *operation* call, which returns a `vaf::Future` of type `{OperationOutput}` with
common future semantics. The associated call sequence is presented below in the case of a
SIL Kit consumer module.
<img src="./figures/arch-consumer_operation_api.svg" alt="arch-consumer_operation_api" width="420"/><br>
And last, an *operation* with name `{OperationName}` and parameters `{OperationParameters}` provides
the following interface method in the case of a provider module interface:
- ` void RegisterOperationHandler_{OperationName}(std::function<{OperationOutput}({OperationParameters})>&& f)`
This is the registration of a specific *operation* implementation that must be specified by the
user. The associated call sequence is shown below in (Registration of the *operation* handler
method). The sequence of *operation* response to *operation* request in the case of a SIL Kit
provider module is illustrated in (Operation response on request).
<img src="./figures/arch-provider_operation_api.svg" alt="arch-provider_operation_api" width="800"/><br>
# Configuration
A code-based approach in Python is used to configure applications in the Vehicle Application
Framework (VAF). By default, there are two types of configuration levels, the foundation level
(using `vafmodel`) and the abstraction level (using `vafpy`). The user is encouraged to use the
abstraction level of the vafpy package, as this hides a lot of work that needs to be done to make
the internal runtime function. If more advanced features are needed, the vafmodel API still can be
used for customization.
## Abstraction level (vafpy)
The following section describes the classes in the vafpy package that are used to build a VAF
executable. To simplify the diagrams, only the vafpy-based parameters are shown in the method
descriptions. Each vafpy class supports full instantiation without the use of a convenience
function. For this, the constructor supports optional vafmodel-based parameters to instantiate the
classes. To allow advanced modifications, each vafpy object allows access to its internal
vafmodel instance.
The following figure shows a simplified overview of the Configuration as Code (CaC)
architecture.
<img src="./figures/cac-overview.svg" alt="cac-overview" width="280"/><br>
### Executable
Each VAF application consists of at least one executable. The executable contains an executor that
is responsible for scheduling the tasks of added application modules. The period of the executor and
the name of the executable are set in the constructor of this class.
Application modules can be added to an executable using the `add_application_module()` method. The
interfaces of the application modules must be bound to an appropriate counterpart. The executable
API provides several methods to bind interfaces to supported platforms.
<img src="./figures/cac-cd_executable.svg" alt="cac-cd_executable" width="700"/><br>
### Application Module
An application module is the entity in which the business logic is implemented by the user. Each
application module has a unique name in its namespace and can be added to multiple executables. To
communicate with other modules, module interfaces are used. Those can be added to the application
module as either provided or consumed interfaces. Consumed interfaces can be marked as optional,
which allows the application module to start before the a corresponding provider is available.
Tasks are used to execute the business logic functionality. They can be added to the application
module either individually or as a task chain. The latter ensures that the tasks are executed in a
specific order.
<img src="./figures/cac-cd_app_module.svg" alt="cac-cd_app_module" width="460"/><br>
### Module Interface
A module interface is an interface description. It contains data elements and operations; the name
must be unique in the specified namespace. Module interfaces can be reused across multiple
application modules. Custom datatypes for data elements and operations can be defined using the
classes in the `vafpy.datatypes` module.
<img src="./figures/cac-cd_module_interface.svg" alt="cac-cd_module_interface" width="380"/><br>
### Task
Tasks defined in the CaC result in method stubs that are generated in the application module code.
Their names must be unique for each executable. The period parameter defines the period cycle in
which the method is called. The `referred_offset` parameter allows the user to specify a task order
to be used when tasks have the same period.
<img src="./figures/cac-cd_task.svg" alt="cac-cd_task" width="410"/><br>
### Datatypes
If custom datatypes are needed in module interfaces, they can be created in the CaC. The supported
datatypes are shown in the following figure. A `TypeRef` is implemented as a `using` statement in
the generated C++ code.
<img src="./figures/cac-cd_datatypes.svg" alt="cac-cd_datatypes" width="900"/><br>
# Platform support
## Model import
### VSS import (vafvssimport)
The `vafvssimport` package allows to import a VSS-based data catalogue into module interfaces and
datatypes of the internal Vehicle Application Framework (VAF) model. The importer requires the JSON
data export from VSS.
Each branch of the tree-like VSS model is converted to a nested module interface. The
parent branches are used as namespace for the current interface. All child elements of a branch are
represented as data elements of that interface. If these elements are branches by themselves, they
are imported as structs, while leaves result in primitive types.
With this structure, the user is able to either access individual leafs of the VSS
catalogue by using one of the nested interfaces, or complete branches by working with the structs of
interfaces that sit higher in the hierarchy.
VSS supports restrictions on input values of parameters. For numeric datatypes, a range can be
specified, while string parameters support a list of allowed values. The numeric ranges are imported
into the VAF model as is, while the allowed string values are converted to enums for better
usability. VSS allows a maximum size to be specified for array types. Parameters with this attribute
set are imported as fixed-size arrays, while those without are imported as vectors.
# Code generation (vafgeneration)
The Vehicle Application Framework (VAF) relies heavily on generated code and configuration files.
This section lists all the generators and the corresponding generated files. They are implemented in
the Python package `vafgeneration`.
## Convenience Modules
This section contains all Python modules that do not directly generate files, but provide
convenience functionality to either the caller or the code generator.
### generation
Contains helper functions relevant to the following generator modules.
### vaf_generate_application_module
Module that calls the generators needed for application module projects.
### vaf_generate_common
Contains helper functions relevant to the following generator modules. Implements the 3-way merge
strategy.
### vaf_generate_project
Module that calls the generators needed for integration projects.
## Code generators
Modules that actually generate code and similar required files are listed below.
### vaf_application_communication
Generates C++ source code and CMake files for the communication module, which allows
executable-internal communication between application modules.
Generated files:
``` text
<project>/src-gen/libs/platform_vaf
├── <module_name>
| ├── include/application_communication
| | └── <interface_name>.h
| ├── src/application_communication
| | └── <interface_name>.cpp
│ └── CMakeLists.txt
└── CMakeLists.txt
```
### vaf_application_module
Generates C++ source code and CMake files for application module projects. This includes base
classes as well as business logic and unit test stubs. Each module is built as a separate library.
Generated files:
``` text
<project>
├── src-gen/libs/application_module_base
│ ├── <module_name>
│ | ├── src/<name>/<space>
│ | | └── <module_name>_base.cpp
│ | ├── include/<name>/<space>
│ | | └── <module_name>_base.h
│ | └── CMakeLists.txt
│ └── CMakeLists.txt
├── src/application_modules/<module_name>/implementation
│ ├── src
│ | └── <module_name>.cpp
│ ├── include/<name>/<space>
│ | └── <module_name>.h
│ ├── test
│ | ├── unittest
│ | | ├── src
| │ | | ├── main.cpp
| │ | | ├── test.cpp
| │ | | └── <name>/<space>
| | │ | | └── <module_name>_base.cpp
│ | | ├── include/<name>/<space>
| │ | | └── <module_name>_base.h
│ | | └── CMakeLists.txt
│ | └── CMakeLists.txt
| └── CMakeLists.txt
└── test-gen/mocks/interfaces
├── include/<name>/<space>
| └── <interface_name>_mock.h
└── CMakeLists.txt
```
### vaf_cac_support
Generates a Python file containing classes and attributes that allow imported model artifacts to be
used on Configuration as Code (CaC) level. This includes the VSS support as well as interface
project exports.
Generated files:
``` text
<project>
├── model
│ └── vss.py
└── export
└── interfaces.py
```
### vaf_cmake_common
This generator is responsible for creating CMake files that add subdirectories as well as the CMake
file for the `vaf_data_types` target.
Generated files:
``` text
<project>
├── src-gen
| ├── executables
| │ └── CMakeLists.txt
| ├── libs
| | ├── data_types
| | │ └── CMakeLists.txt
| │ └── CMakeLists.txt
│ └── CMakeLists.txt
├── src
| ├── executables
| │ └── CMakeLists.txt
│ └── CMakeLists.txt
└── test-gen
├── mocks
│ └── CMakeLists.txt
└── CMakeLists.txt
```
### vaf_conan
Based on the dependencies used in the project, a Conan dependency list with the required Conan
packages is generated. This generator is executed for app-module and integration projects.
Generated files:
``` text
<project>/src-gen
└── conan_deps.list
```
### vaf_controller
Generates source code and CMake files for the controller and executable entry point. Also creates
stubs for the user controller.
Generated files:
``` text
<project>
├── src-gen/executables/<executable_name>
| ├── include
| | └── executable_controller
| | └── executable_controller.cpp
| ├── src
| | ├── executable_controller
| | | └── executable_controller.cpp
| | └── main.cpp
│ └── CMakeLists.txt
└── src/executables/<executable_name>
├── include
| └── user_controller.h
├── src
| └── user_controller.cpp
└── CMakeLists.txt
```
### vaf_core_support
Generates source code, CMake, and configuration files to initialize executable-level core
functionality.
Generated files:
``` text
<project>
└── src-gen/libs/core_support
├── config/<executable_name>/etc
| └── logging_config.json
├── src
| └── initialization.cpp
└── CMakeLists.txt
```
### vaf_interface
Generates header and CMake files to support the module interfaces configured in CaC.
Generated files:
``` text
<project>
├── src-gen/libs/interfaces
│ ├── include/<name>/<space>
│ | ├── <interface_name>.h
│ | └── internal/methods
| | └── <method_name>.h
│ └── CMakeLists.txt
└── test-gen/mocks/interfaces
├── include/<name>/<space>
| └── <interface_name>_mock.h
└── CMakeLists.txt
```
### vaf_protobuf_serdes
Creates `.proto` files for the configured datatypes and platform interfaces. These are used to
serialize data when using SIL Kit as communication platform. It also provides helper functions
(transformers) to easily convert between VAF datatypes and protobuf.
Generated files:
``` text
<project>/src-gen/libs/protobuf_serdes
├── proto
│ ├── protobuf_<namespace>.proto
│ └── CMakeLists.txt
└── transformer
├── include/protobuf
| └── <name>/<space>
| └── protobuf_transformer.h
└── CMakeLists.txt
```
### vaf_silkit
Generates the C++ source code and CMake files for platform provider and consumer modules that
communicate with SIL Kit. Each module is built as a separate library. This generator is only used in
integration projects.
Generated files:
``` text
<project>/src-gen/libs/platform_silkit
├── platform_consumer_modules
│ ├── <consumer_module>
│ | ├── src
│ | | └── <consumer_module>.cpp
│ | ├── include
│ | | └── <consumer_module>.h
│ | └── CMakeLists.txt
│ └── CMakeLists.txt
└── platform_provider_modules
├── <provider_module>
| ├── src
| | └── <provider_module>.cpp
| ├── include
| | └── <provider_module>.h
| └── CMakeLists.txt
└── CMakeLists.txt
```
### vaf_std_data_types
Generates header files for all used VAF datatypes. Uses primitive types and the C++ standard
library.
Generated files:
``` text
<project>/src-gen/libs/datatypes/include/<name>/<space>
└── impl_type_<typename>.h
```
# VAF software library (vafcpp)
The vafcpp library is the core library and static code part of the Vehicle Application Framework
(VAF). It covers abstraction of required primitives such as future, promise, data pointer, error,
and logging. Beyond that, it contains the basic framework for the execution of application and
platform communication modules. The execution framework is mainly divided into an executor (see
[executor.h](../../SwLibraries//vaf_core_library/lib/include/vaf/executor.h)) and an executable
controller class (see
[executable_controller_base.h](../../SwLibraries/vaf_core_library/lib/include/vaf/executable_controller_base.h)).
An instance of the executable controller class is created in the main function of every VAF
executable, where it acts as entry point for execution. An instance of the executor class, which
manages the periodic execution of the tasks of application and communication modules, is a direct
member of this executable controller. All tasks that shall be scheduled by an executor are
accessible via so-called task handles. All tasks of one module are linked to a corresponding module
executor. The overall structure of the executor and executable controller is given below:
<img src="./figures/arch-executor-module.svg" alt="arch-module-if" width="800"/><br>
## Executor
The executor ensures periodic task execution (see
[executor.h](../../SwLibraries/vaf_core_library/lib/include/vaf/executor.h)). The period can be
configured with the *ExecutorPeriod* parameter in the executable configuration. Tasks are processed
while considering module dependencies. That is, if an application module A depends from application
module B, the tasks of module B are always executed before the ones of module A in one time slot.
Since the executor works with time slots, it maps the tasks deterministically into the same slot. To
avoid situations, where many tasks are mapped to the same time slot, it is possible to configure
tasks with an offset.
## Runtime monitoring
Each task can have a budget assigned to it. The executor will monitor the execution time of a
task and log any violation of its budget. Also the runtime of the executor time slot is monitored
and if tasks in one slot exceed their budget, a warning is logged.
**Example**
``` mermaid
%%{init: { 'logLevel': 'debug', 'theme': 'neutral' } }%%
classDiagram
ApplicationModule1 --> CommunicationModule
CommunicationModule --> ApplicationModule2
CommunicationModule --> ApplicationModule3
ApplicationModule1: task1() @ 20ms
ApplicationModule2: task2() @ 40ms
ApplicationModule3: task3() @ 40ms
```
Consider the example with three application modules with one task each and an executor period of
20ms (see figure below).
``` mermaid
%%{init: { 'logLevel': 'debug', 'theme': 'neutral' } }%%
timeline
20ms: task1
40ms: task1 & task2 & task3
60ms: task1
80ms: task1 & task2 & task3
100ms: task1
120ms: task1 & task2 & task3
```
Every second cycle, the executor has to execute all three tasks in one time slot. For a better load
distribution, one can add an offset of 1 (cycle) to task3 as depicted in the next figure.
``` mermaid
%%{init: { 'logLevel': 'debug', 'theme': 'neutral' } }%%
timeline
20ms: task1
40ms: task1 & task2
60ms: task1 & task3
80ms: task1 & task2
100ms: task1 & task3
120ms: task1 & task2
```
## Future/Promise
The abstraction of *Future* and *Promise* primitives is encapsulated by the `vaf::Future` and
`vaf::Promise` namespaces respectively. For details see
[future.h](../../SwLibraries/vaf_core_library/lib/include/vaf/future.h).
## Data pointer
Two types of data pointers are used in VAF. First one is `vaf::DataPtr`, a data pointer type where
the data can be changed. Second one is `vaf::ConstDataPtr`, where the data is fixed. The underlying
type of a `vaf::DataPtr` or a `vaf::ConstDataPtr` is not fixed. For the `vaf::DataPtr` case the
underlying type can be a platform-specific type, for example `std::unique_ptr`. Same holds for the
`vaf::ConstDataPtr` case, which also maps to `std::unique_ptr` for example. See
[data_ptr.h](../../SwLibraries/vaf_core_library/lib/include/vaf/data_ptr.h) for the details.
## Error
The abstraction of error codes, i.e., `vaf::Error`, is implemented in
[error_domain.h](../../SwLibraries/vaf_core_library/lib/include/vaf/error_domain.h).
### Error reporting
Modules can report errors via `ReportError(ErrorCode error_code, std::string msg, bool critical = false)`. See
[controller_interface.h](../../SwLibraries/vaf_core_library/lib/include/vaf/controller_interface.h).
If `critical` is set to *true*, the state of the module changes to *not operational*. Errors are
further propagated to other modules that depend on the module in question.
## ExecutableController
The executable controller manages the states of the application and communication modules (see
[executable_controller_base.h](../../SwLibraries/vaf_core_library/lib/include/vaf/executable_controller_base.h)).
The following state machine defines the *states and *state transitions* of a module:
``` mermaid
%%{init: { 'logLevel': 'debug', 'theme': 'neutral' } }%%
stateDiagram
[*] --> NotInitialized
NotOperational --> Shutdown: DeInit()
Shutdown --> [*]
NotInitialized --> NotOperational : Init()
NotOperational --> Starting: Start()
Starting --> Operational: ReportOperational()
Operational --> NotOperational: ReportError(..., "..." true) or Stop()
Starting --> NotOperational: ReportError(..., "..." true) or Stop()
```
The following methods trigger a ***state transition***:
- Init()
- Called at startup.
- DeInit()
- Called at shutdown.
- Start()
- Called when all required modules are operational.
- Will enable executor tasks.
- Stop()
- Called when the module reports an error or before shutdown.
- Will disable executor tasks and receive handlers.
- ReportOperational()
- Called by the module, if starting was successful or an error was recovered.
- Will enable receive handler.
- ReportError(..., "..." true)
- Called if the module detects an error (makes the module unusable for other modules).
- Will disable executor tasks and receive handlers.
- Will call OnError() on all modules that depend on the module.
The following sequence diagram shows the ***startup*** of communication and application modules by
the executable controller:
``` mermaid
%%{init: { 'logLevel': 'debug', 'theme': 'neutral' } }%%
sequenceDiagram
Controller ->> PlatformModule: Init()
Controller ->> Controller: change state of MM to NotOperational
Controller ->> ApplicationModule: Init()
Controller ->> Controller: change state of AM to NotOperational
Controller ->> PlatformModule: Start()
Controller ->> Controller: change state of MM to Starting
PlatformModule ->> Controller: ReportOperational()
Controller ->> Controller: change state of MM to Operational
Controller ->> ApplicationModule: Start()
Controller ->> Controller: change state of AM to Starting
ApplicationModule ->> Controller: ReportOperational()
Controller ->> Controller: change state of AM to Operational
```
The following sequence diagram shows the ***shutdown*** of platform and application modules by
the executable controller:
``` mermaid
%%{init: { 'logLevel': 'debug', 'theme': 'neutral' } }%%
sequenceDiagram
Controller ->> ApplicationModule: Stop()
Controller ->> Controller: change state of AM to NotOperational
Controller ->> PlatformModule: Stop()
Controller ->> Controller: change state of MM to NotOperational
Controller ->> ApplicationModule: DeInit()
Controller ->> Controller: change state of AM to Shutdown
Controller ->> PlatformModule: DeInit()
Controller ->> Controller: change state of MM to Shutdown
```
The following sequence diagram shows the ***normal operation*** of platform and application
modules in interaction with the executable controller:
``` mermaid
%%{init: { 'logLevel': 'debug', 'theme': 'neutral' } }%%
sequenceDiagram
PlatformModule ->> Controller: ReportError(kConnectionLost, true)
Controller ->> Controller: change state of MM to NotOperational
Controller ->> PlatformModule: Stop()
Controller ->> ApplicationModule: OnError(error)
opt is error critical
ApplicationModule ->> Controller: ReportError(kRequiredModuleNotOperational, true)
Controller ->> Controller: change state of AM to NotOperational
Controller ->> ApplicationModule: Stop()
end
Controller ->> PlatformModule: Start()
PlatformModule ->> Controller: ReportOperational()
Controller ->> Controller: change state of MM to Operational
opt is ApplicationModule not operational
Controller ->> ApplicationModule: Start()
end
```
## Logging
Logging functionality is encapsulated by the `vaf::Logger` namespace. For details see
[logging.h](../../SwLibraries/vaf_core_library/lib/include/vaf/logging.h).
# Testing
## Unit tests (GoogleTest)
The Vehicle Application Framework (VAF) assist with GoogleTest-based unit testing of application
modules by generating test skeletons and mocks for all used interfaces. The idea is that the writer
of a unit test can mock any input/output of the interfaces to produce test cases that verify the
actual application code without having to connect to real or simulated external test communication
partners. The generated test project builds together with generated test-specific base code, which
vastly simplifies the writing of the unit test.
Unit tests are activated by default but can be disabled with the following flag that needs to be
passed to the preset stage:
```
vaf make preset -d -DVAF_BUILD_TESTS=OFF
```
The test code, which can be edited and extended by the user is located in the file:
`<app-module project directory>/implementation/test/unittest/src/tests.cpp`
One example skeleton test case is generated for reference. It is up to the user to adapt it and add
further tests. Writing a test case consists of 4 steps:
1. Test case creation.
```
TEST_F(AppModule1UnitTest, Test_1) {
```
2. Create mock objects of interfaces as used by the application.
```
auto HvacStatusConsumerMock = std::make_shared<demo::HvacStatusConsumerMock>();
auto DataExchangeProviderMock = std::make_shared<demo::DataExchangeInterfaceProviderMock>();
```
3. Write expected outcome of the test, i.e., what you want to test.
```
EXPECT_CALL(*DataExchangeProviderMock, RegisterOperationHandler_MyFunction(_)).Times(1);
```
4. Create an application module object using above created interface mocks.
```
auto AppModule1 = std::make_shared<demo::AppModule1>( demo::AppModule1 ::ConstructorToken {
HvacStatusConsumerMock,
DataExchangeProviderMock});
}
```
## SIL tests (SIL Kit)
Software In the Loop (SIL) testing is supported using [Vector SIL
Kit](https://github.com/vectorgrp/sil-kit). Any interface modeled in Configuration as Code (CaC) can
be selected to be routed via SIL Kit. SIL Kit uses a registry application, which acts as a message
broker. In other words, all messages must go through that router. The connection to SIL Kit in the
VAF is configured using CaC and is done similar to other interface connections. Only difference, one
has to connect to the SIL Kit registry by specifying the registry URI and instance name of the
communication interface. Providers and consumers that want to connect should configure the same
instance name and URI.
CaC snippet connecting an interface to an application module using SIL Kit:
``` python
demo_app.connect_consumed_interface_to_silkit(
Appmodule1, # The application module
Appmodule1.ConsumedInterfaces.VelocityServiceConsumer, # The connected interface
"Silkit_VelocityService", # Instance name used to identify the interface in SIL Kit registry
"silkit://192.168.128.129:8500" # URI of the running SIL Kit registry to connect to
)
demo_app.connect_provided_interface_to_silkit(
Appmodule2, # The application module
Appmodule2.ProvidedInterfaces.VelocityServiceProvider, # The connected interface
"Silkit_VelocityService", # Instance name used to identify the interface in SIL Kit registry
"silkit://192.168.128.129:8500" # URI of the running SIL Kit registry to connect to
)
```
VAF utilizes [Protobuf](https://protobuf.dev/) to serialize the data such that communication
partners on any type of platform easily can serialize or deserialize the payload. Proto files are
generated for all defined datatypes and interfaces. These proto files are then compiled using the
protoc compiler. Further, transformers get generated for each type to enable easy translation
between protobuf types and VAF types.
# Glossary
```{glossary}
ADAS
Advanced Driver-Assistance System
API
Application Programming Interface
ASIL
Automotive Safety Integrity Level
CaC
Configuration as Code
E/E Architecture
Electrical and Electronic Architecture
ECU
Electronic Control Unit
FOSS
Free and Open Source Software
HAL
Hardware Abstraction Layer
HPC
High-Performance Computing
IDL
Interface Definition Language
IFEX
Interface Exchange Framework
IPC
Inter-Process Communication
IT
Information Technology
IVI
In-Vehicle Infotainment
JSON
JavaScript Object Notation
OEM
Original Equipment Manufacturer
OS
Operating System
POSIX
Portable Operating System Interface
QoS
Quality of Service
RPC
Remote Procedure Call
SDK
Software Development Kit
SDV
Software-Defined Vehicle
SIL
Software In the Loop
SHM
Shared Memory
SOME/IP
Scalable Service-Oriented Middleware over IP
TCP/IP
Transmission Control Protocol/Internet Protocol
UDP
User Datagram Protocol
UDS
Unix Domain Sockets
VAF
Vehicle Application Framework
VISS
Vehicle Information Service Specification
VSS
Vehicle Signal Specification
XML
Extensible Markup Language
YAML
YAML Ain't Markup Language
```
<svg width="4184" height="1213" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" overflow="hidden"><defs><clipPath id="clip0"><rect x="56" y="923" width="4184" height="1213"/></clipPath><image width="170" height="215" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKoAAADXCAMAAAC9FDqvAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAA/UExURQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALMlgi8AAAAUdFJOUwAIECAwOEBIWGB4j5efr7e/z9ffW4FgUgAAAAlwSFlzAAAywAAAMsABKGRa2wAAAkRJREFUeF7t3e1O40AMRuEpW9gCBUK393+tq+5ahI+mHRvO2JHe82sUaernTxJVipJ26uZuXNt/E2NtHv4cR3bY2WB/k/3EuF42NtrZzvaPLGh9tu1Di1kPtntsIevYc+qtiDWJGrFmUQPWNKrfOlMnuFeb85bXOlPtANadzZlzWjOpTmsq1WfNpbqsyVSPNZvqsKZT+60Z1NePl9heawZ1uglZU6gtZM2hhqxJ1Ig1ixqwplH91jyq25pI/WK1w0tlUj9bn+zwQqlUnzWX6rImUz3WbKrDmk7tt+ZTu60FqL3WCtROawlqn7UGtctahNpjrULtsJahXrfWoV61FqK2XzPm1GdrJeoVaynqZWst6kVrMeolazXqBWs56rK1HnXRWpC6ZK1IXbCWpJ631qSetWZQA52sK6EeH9dDPW7XQ90PpG5tTrBpIHVjc4KNpH7zOamh1HsbFGsote1tUqix1PZ7b4/cdDf/iR1M9ff+bizqTyUqkahEohKJSiQqkahEohKJSiQqkahEohKJSiQqkahEohKJSiQqkahEohKJSiQqkahEohKJSiQqkahEohKJSiQqkahEohKJSiQqkahEohKJSiQqkahEohKJSiQqkahEohKJSiQqkahEohKJSiQqkahEohKJSiQqkahEohKJSiQqkahEohKJSiQqkahEohKJSiQqkahEohKJSnSeam89r9X5d7AXT1SiVVG/98GJgb20Z1uV77HtbFW+29YmWxbv9H2jzcMKzqzD/f+bl/rZWvsL4/NjXTHhNkkAAAAASUVORK5CYII=" preserveAspectRatio="none" id="img1"></image></defs><g clip-path="url(#clip0)" transform="translate(-56 -923)"><rect x="2851.5" y="950.5" width="1386" height="807" stroke="#000000" stroke-width="4.58333" stroke-miterlimit="8" fill="none"/><rect x="2817.5" y="981.5" width="1387" height="807" stroke="#000000" stroke-width="4.58333" stroke-miterlimit="8" fill="#FFFFFF"/><text font-family="Verdana,Verdana_MSFontService,sans-serif" font-weight="400" font-size="41" transform="matrix(1 0 0 1 3944.75 1048)">Executable</text><rect x="2872.5" y="1121.5" width="864" height="145" stroke="#B70032" stroke-width="4.58333" stroke-miterlimit="8" fill="none"/><rect x="3780" y="1121" width="364" height="617" fill="#B70032"/><text fill="#FFFFFF" font-family="Verdana,Verdana_MSFontService,sans-serif" font-weight="400" font-size="41" transform="matrix(1 0 0 1 3886.73 1418)">Control</text><text fill="#FFFFFF" font-family="Verdana,Verdana_MSFontService,sans-serif" font-weight="400" font-size="41" transform="matrix(1 0 0 1 3885.29 1467)">module</text><path d="M0 0 25.2961 0 25.2961 62.6794 50.5921 62.6794" stroke="#028FC3" stroke-width="4.58333" stroke-miterlimit="8" fill="none" fill-rule="evenodd" transform="matrix(1 0 0 -1 2970.5 1226.18)"/><path d="M3073.5 1163.5 3249.75 1163.5 3249.75 1200.41" stroke="#028FC3" stroke-width="4.58333" stroke-miterlimit="8" fill="none" fill-rule="evenodd"/><text font-family="Verdana,Verdana_MSFontService,sans-serif" font-weight="400" font-size="41" transform="matrix(1 0 0 1 3306.39 1041)">Application </text><text font-family="Verdana,Verdana_MSFontService,sans-serif" font-weight="400" font-size="41" transform="matrix(1 0 0 1 3306.39 1090)">modules</text><rect x="2817.5" y="1823.5" width="65" height="65" stroke="#000000" stroke-width="4.58333" stroke-miterlimit="8" fill="none"/><text font-family="Verdana,Verdana_MSFontService,sans-serif" font-weight="400" font-size="41" transform="matrix(1 0 0 1 2931.36 1872)">Domain of middleware stack</text><rect x="2817" y="1901" width="65" height="65" fill="#B70032"/><text font-family="Verdana,Verdana_MSFontService,sans-serif" font-weight="400" font-size="41" transform="matrix(1 0 0 1 2934.56 1949)">Domain of Framework</text><rect x="2817" y="2056" width="65" height="65" fill="#028FC3"/><text font-family="Verdana,Verdana_MSFontService,sans-serif" font-weight="400" font-size="41" transform="matrix(1 0 0 1 2923.1 2102)">Domain of developer</text><text font-family="Verdana,Verdana_MSFontService,sans-serif" font-weight="400" font-size="41" transform="matrix(1 0 0 1 2926.77 2026)">Shared between Framework and developer</text><path d="M2944.5 1251.5 2944.5 1345.79" stroke="#028FC3" stroke-width="4.58333" stroke-miterlimit="8" fill="none" fill-rule="evenodd"/><path d="M3249.5 1251.72 3249.5 1334.22 3604.8 1334.22 3604.8 1251.5" stroke="#028FC3" stroke-width="4.58333" stroke-miterlimit="8" fill="none" fill-rule="evenodd"/><rect x="2872" y="1307" width="864" height="431" fill="#B70032"/><text fill="#FFFFFF" font-family="Verdana,Verdana_MSFontService,sans-serif" font-weight="400" font-size="41" transform="matrix(1 0 0 1 3068.02 1361)">Middleware abstraction module</text><rect x="2905.5" y="1438.5" width="795" height="118" stroke="#000000" stroke-width="4.58333" stroke-miterlimit="8" fill="#FFFFFF"/><text font-family="Verdana,Verdana_MSFontService,sans-serif" font-weight="400" font-size="41" transform="matrix(1 0 0 1 3087.36 1489)">Middleware interface </text><text font-family="Verdana,Verdana_MSFontService,sans-serif" font-weight="400" font-size="41" transform="matrix(1 0 0 1 2970.19 1538)">(e.g., </text><text font-family="Verdana,Verdana_MSFontService,sans-serif" font-weight="400" font-size="41" transform="matrix(1 0 0 1 3098.52 1538)">ara</text><text font-family="Verdana,Verdana_MSFontService,sans-serif" font-weight="400" font-size="41" transform="matrix(1 0 0 1 3165.55 1538)">::com proxy/skeleton)</text><rect x="2905.5" y="1587.5" width="795" height="119" stroke="#000000" stroke-width="4.58333" stroke-miterlimit="8" fill="#FFFFFF"/><text font-family="Verdana,Verdana_MSFontService,sans-serif" font-weight="400" font-size="41" transform="matrix(1 0 0 1 3021.46 1663)">IPC (e.g., via UDS or SHM)</text><rect x="3223" y="1199" width="52" height="51.9999" fill="#028FC3"/><rect x="3021" y="1137" width="52.0002" height="51.9999" fill="#028FC3"/><rect x="3578" y="1199" width="52" height="51.9999" fill="#028FC3"/><rect x="2918" y="1199" width="52" height="51.9999" fill="#028FC3"/><path d="M3089.93 1099.21 3099.25 1091.66 3107.82 1086.28 3117.58 1081.28 3123.03 1078.92 3128.86 1076.67 3135.11 1074.55 3141.83 1072.55 3149.02 1070.69 3156.66 1068.96 3164.72 1067.35 3173.18 1065.84 3191.14 1063.13 3210.32 1060.75 3230.48 1058.63 3251.36 1056.72 3272.72 1054.93 3294.32 1053.22 3294.68 1057.78 3273.09 1059.5 3273.1 1059.5 3251.75 1061.28 3251.77 1061.28 3230.91 1063.2 3230.94 1063.19 3210.82 1065.3 3210.87 1065.3 3191.74 1067.67 3191.8 1067.67 3173.9 1070.37 3173.96 1070.36 3165.55 1071.86 3165.6 1071.85 3157.59 1073.45 3157.64 1073.44 3150.06 1075.16 3150.13 1075.14 3143.02 1076.98 3143.09 1076.96 3136.46 1078.93 3136.54 1078.9 3130.37 1081 3130.46 1080.97 3124.72 1083.18 3124.81 1083.14 3119.47 1085.46 3119.6 1085.39 3110 1090.31 3110.17 1090.22 3101.8 1095.47 3102.03 1095.31 3092.81 1102.77ZM3104.05 1108.01 3074.5 1116.5 3085.44 1087.76Z" fill="#343739"/><rect x="2817.5" y="1979.5" width="65" height="65" stroke="#B70032" stroke-width="4.58333" stroke-miterlimit="8" fill="none"/><path d="M3522.71 1060.22 3530.18 1060.89 3537.64 1061.79 3545.01 1063.11 3552.21 1065.09 3559.14 1067.95 3565.69 1071.92 3571.7 1077.16 3574.54 1080.38 3577.17 1083.96 3579.62 1087.94 3581.91 1092.31 3585.98 1101.97 3589.55 1112.85 3592.69 1124.72 3595.5 1137.38 3598.06 1150.64 3598.9 1155.52 3594.38 1156.3 3593.55 1151.44 3593.55 1151.49 3591 1138.28 3591.02 1138.34 3588.23 1125.76 3588.25 1125.85 3585.13 1114.09 3585.17 1114.22 3581.65 1103.49 3581.72 1103.67 3577.72 1094.18 3577.8 1094.35 3575.59 1090.14 3575.67 1090.27 3573.31 1086.45 3573.42 1086.6 3570.9 1083.18 3571.03 1083.34 3568.36 1080.3 3568.57 1080.51 3562.83 1075.5 3563.15 1075.74 3556.91 1071.96 3557.22 1072.12 3550.59 1069.38 3550.86 1069.47 3543.9 1067.56 3544.1 1067.6 3536.9 1066.31 3537.03 1066.33 3529.67 1065.45 3529.74 1065.46 3522.29 1064.78ZM3609.42 1149.08 3600.5 1178.5 3582.31 1153.71Z" fill="#343739"/><rect x="619.5" y="1692.5" width="1628" height="259" stroke="#000000" stroke-width="6.875" stroke-miterlimit="8" fill="none"/><text font-family="Verdana,Verdana_MSFontService,sans-serif" font-weight="400" font-size="55" transform="matrix(1 0 0 1 652.414 1763)">Data model </text><text fill="#B70032" font-family="Wingdings 3,Wingdings 3_MSFontService,sans-serif" font-weight="400" font-size="34" transform="matrix(1 0 0 1 652.414 1838)"></text><text font-family="Verdana,Verdana_MSFontService,sans-serif" font-weight="400" font-size="46" transform="matrix(1 0 0 1 743.394 1838)">The foundation</text><text fill="#B70032" font-family="Wingdings 3,Wingdings 3_MSFontService,sans-serif" font-weight="400" font-size="34" transform="matrix(1 0 0 1 652.414 1911)"></text><text font-family="Verdana,Verdana_MSFontService,sans-serif" font-weight="400" font-size="46" transform="matrix(1 0 0 1 743.394 1911)">Model packages for agnostic and middleware</text><text font-family="Verdana,Verdana_MSFontService,sans-serif" font-weight="400" font-size="46" transform="matrix(1 0 0 1 1781.52 1911)">-</text><text font-family="Verdana,Verdana_MSFontService,sans-serif" font-weight="400" font-size="46" transform="matrix(1 0 0 1 1802.14 1911)">related aspects</text><path d="M243 2006.5 328.317 1957 328.317 1983.67 2537.68 1983.67 2537.68 1957 2623 2006.5 2537.68 2056 2537.68 2029.33 328.317 2029.33 328.317 2056Z" fill="#B70032" fill-rule="evenodd"/><text font-family="Verdana,Verdana_MSFontService,sans-serif" font-weight="400" font-size="46" transform="matrix(1 0 0 1 1187.43 2096)">Tooling and workflow</text><rect x="619.5" y="1387.5" width="883" height="260" stroke="#000000" stroke-width="6.875" stroke-miterlimit="8" fill="none"/><text font-family="Verdana,Verdana_MSFontService,sans-serif" font-weight="400" font-size="55" transform="matrix(1 0 0 1 652.415 1459)">Configuration as Code </text><text fill="#B70032" font-family="Wingdings 3,Wingdings 3_MSFontService,sans-serif" font-weight="400" font-size="34" transform="matrix(1 0 0 1 652.415 1534)"></text><text font-family="Verdana,Verdana_MSFontService,sans-serif" font-weight="400" font-size="46" transform="matrix(1 0 0 1 743.394 1534)">Model abstraction</text><text fill="#B70032" font-family="Wingdings 3,Wingdings 3_MSFontService,sans-serif" font-weight="400" font-size="34" transform="matrix(1 0 0 1 652.415 1607)"></text><text font-family="Verdana,Verdana_MSFontService,sans-serif" font-weight="400" font-size="46" transform="matrix(1 0 0 1 743.394 1607)">Text</text><text font-family="Verdana,Verdana_MSFontService,sans-serif" font-weight="400" font-size="46" transform="matrix(1 0 0 1 844.227 1607)">-</text><text font-family="Verdana,Verdana_MSFontService,sans-serif" font-weight="400" font-size="46" transform="matrix(1 0 0 1 864.852 1607)">based user front</text><text font-family="Verdana,Verdana_MSFontService,sans-serif" font-weight="400" font-size="46" transform="matrix(1 0 0 1 1244.7 1607)">-</text><text font-family="Verdana,Verdana_MSFontService,sans-serif" font-weight="400" font-size="46" transform="matrix(1 0 0 1 1265.32 1607)">end</text><rect x="241.5" y="1083.5" width="779" height="259" stroke="#000000" stroke-width="6.875" stroke-miterlimit="8" fill="none"/><text font-family="Verdana,Verdana_MSFontService,sans-serif" font-weight="400" font-size="55" transform="matrix(1 0 0 1 273.865 1154)">Model import</text><text fill="#B70032" font-family="Wingdings 3,Wingdings 3_MSFontService,sans-serif" font-weight="400" font-size="34" transform="matrix(1 0 0 1 273.865 1229)"></text><text font-family="Verdana,Verdana_MSFontService,sans-serif" font-weight="400" font-size="46" transform="matrix(1 0 0 1 364.844 1229)">Import from COVESA VSS</text><text fill="#B70032" font-family="Wingdings 3,Wingdings 3_MSFontService,sans-serif" font-weight="400" font-size="34" transform="matrix(1 0 0 1 273.865 1302)"></text><text font-family="Verdana,Verdana_MSFontService,sans-serif" font-weight="400" font-size="46" transform="matrix(1 0 0 1 364.844 1302)">Others ...</text><path d="M303.79 1381.4 305.239 1415.91 305.237 1415.88 307.151 1449.86 307.148 1449.81 308.425 1466.45 308.421 1466.4 309.989 1482.71 309.983 1482.66 311.899 1498.57 311.89 1498.5 314.213 1513.96 314.199 1513.88 316.987 1528.82 316.967 1528.72 320.278 1543.07 320.249 1542.96 324.141 1556.65 324.101 1556.52 328.632 1569.5 328.575 1569.35 333.803 1581.54 333.724 1581.37 339.708 1592.72 339.601 1592.54 346.399 1602.96 346.259 1602.77 353.929 1612.22 353.755 1612.03 362.335 1620.46 362.148 1620.29 371.6 1627.74 371.412 1627.6 381.677 1634.14 381.497 1634.03 392.519 1639.72 392.352 1639.64 404.071 1644.54 403.921 1644.48 416.279 1648.66 416.148 1648.62 429.087 1652.15 428.973 1652.12 442.435 1655.06 442.338 1655.04 456.265 1657.46 456.184 1657.45 470.518 1659.41 470.451 1659.4 485.133 1660.97 485.079 1660.96 500.053 1662.21 499.995 1662.2 530.581 1663.97 530.541 1663.97 538.693 1664.29 538.51 1668.87 530.337 1668.55 499.702 1666.78 484.673 1665.53 469.93 1663.95 455.522 1661.98 441.506 1659.55 427.938 1656.59 414.876 1653.03 402.377 1648.8 390.5 1643.83 379.305 1638.06 368.854 1631.41 359.213 1623.81 350.451 1615.21 342.625 1605.57 335.704 1594.95 329.627 1583.43 324.331 1571.08 319.751 1557.97 315.825 1544.15 312.49 1529.7 309.686 1514.68 307.352 1499.15 305.429 1483.18 303.857 1466.82 302.577 1450.14 300.66 1416.12 299.21 1381.6ZM534.572 1652.66 561.5 1667.5 533.472 1680.14Z" fill="#343739"/><rect x="1844.5" y="1083.5" width="591" height="259" stroke="#000000" stroke-width="6.875" stroke-miterlimit="8" fill="none"/><text font-family="Verdana,Verdana_MSFontService,sans-serif" font-weight="400" font-size="55" transform="matrix(1 0 0 1 1877.34 1154)">User library</text><text fill="#B70032" font-family="Wingdings 3,Wingdings 3_MSFontService,sans-serif" font-weight="400" font-size="34" transform="matrix(1 0 0 1 1877.34 1229)"></text><text font-family="Verdana,Verdana_MSFontService,sans-serif" font-weight="400" font-size="46" transform="matrix(1 0 0 1 1968.32 1229)">Runtime aspects</text><text fill="#B70032" font-family="Wingdings 3,Wingdings 3_MSFontService,sans-serif" font-weight="400" font-size="34" transform="matrix(1 0 0 1 1877.34 1302)"></text><text font-family="Verdana,Verdana_MSFontService,sans-serif" font-weight="400" font-size="46" transform="matrix(1 0 0 1 1968.32 1302)">Log, err, states, …</text><rect x="1553.5" y="1387.5" width="882" height="260" stroke="#000000" stroke-width="6.875" stroke-miterlimit="8" fill="none"/><text font-family="Verdana,Verdana_MSFontService,sans-serif" font-weight="400" font-size="55" transform="matrix(1 0 0 1 1585.76 1459)">Generators</text><text fill="#B70032" font-family="Wingdings 3,Wingdings 3_MSFontService,sans-serif" font-weight="400" font-size="34" transform="matrix(1 0 0 1 1585.76 1534)"></text><text font-family="Verdana,Verdana_MSFontService,sans-serif" font-weight="400" font-size="46" transform="matrix(1 0 0 1 1676.74 1534)">API for com and persistency</text><text fill="#B70032" font-family="Wingdings 3,Wingdings 3_MSFontService,sans-serif" font-weight="400" font-size="34" transform="matrix(1 0 0 1 1585.76 1607)"></text><text font-family="Verdana,Verdana_MSFontService,sans-serif" font-weight="400" font-size="46" transform="matrix(1 0 0 1 1676.74 1607)">Build environment, testing</text><use width="100%" height="100%" xlink:href="#img1" fill="none" transform="translate(1345 923)"></use><text font-family="Verdana,Verdana_MSFontService,sans-serif" font-weight="400" font-size="46" transform="matrix(1 0 0 1 305.869 1927)">Project </text><text font-family="Verdana,Verdana_MSFontService,sans-serif" font-weight="400" font-size="46" transform="matrix(1 0 0 1 482.901 1927)">init</text><text font-family="Verdana,Verdana_MSFontService,sans-serif" font-weight="400" font-size="46" transform="matrix(1 0 0 1 2272.14 1925)">Build and test</text><text font-family="Verdana,Verdana_MSFontService,sans-serif" font-weight="400" font-size="46" transform="matrix(1 0 0 1 180.843 1643)">Input</text><path d="M1101.6 1334.55 1100.7 1295.89 1100.22 1257.82 1100.26 1239.18 1100.56 1220.92 1101.17 1203.1 1102.14 1185.8 1103.53 1169.09 1105.38 1153.06 1107.76 1137.76 1110.71 1123.28 1114.29 1109.68 1118.56 1097.04 1123.58 1085.43 1129.41 1074.94 1136.08 1065.63 1143.55 1057.46 1151.76 1050.39 1160.65 1044.34 1170.15 1039.22 1180.2 1034.97 1190.75 1031.49 1201.74 1028.72 1213.12 1026.56 1224.84 1024.95 1236.85 1023.79 1249.12 1023.02 1276.53 1022.34 1276.64 1026.93 1249.27 1027.6 1249.36 1027.59 1237.18 1028.36 1237.25 1028.36 1225.33 1029.51 1225.42 1029.49 1213.8 1031.1 1213.92 1031.08 1202.66 1033.21 1202.79 1033.18 1191.95 1035.92 1192.1 1035.87 1181.72 1039.29 1181.9 1039.22 1172.03 1043.4 1172.23 1043.31 1162.93 1048.31 1163.13 1048.19 1154.45 1054.11 1154.66 1053.95 1146.65 1060.85 1146.84 1060.66 1139.55 1068.62 1139.72 1068.41 1133.21 1077.5 1133.35 1077.28 1127.64 1087.56 1127.74 1087.36 1122.8 1098.77 1122.87 1098.6 1118.66 1111.07 1118.7 1110.92 1115.16 1124.38 1115.19 1124.25 1112.26 1138.62 1112.28 1138.52 1109.92 1153.72 1109.93 1153.63 1108.09 1169.58 1108.09 1169.51 1106.71 1186.15 1106.72 1186.09 1105.75 1203.33 1105.75 1203.28 1105.14 1221.05 1105.14 1221.01 1104.84 1239.24 1104.84 1239.21 1104.8 1257.81 1104.8 1257.78 1105.29 1295.82 1105.29 1295.8 1106.18 1334.45ZM1271.92 1010.91 1299.5 1024.5 1272.08 1038.41Z" fill="#343739"/><path d="M-1.42595 287.143-1.79315 271.392-2.28024 233.319-2.23869 214.68-1.93766 196.416-1.32494 178.598-0.348118 161.298 1.04549 144.593 2.909 128.555 5.29617 113.257 8.26165 98.7734 11.8615 85.1754 16.1534 72.5361 21.1978 60.9293 27.0555 50.4345 33.7624 41.1212 41.2737 32.9608 49.5261 25.8886 58.4563 19.8332 68.0017 14.7186 78.1025 10.4654 88.7022 6.99261 99.7467 4.21899 111.184 2.06395 122.964 0.447843 135.035-0.708065 147.358-1.48235 172.487-2.19063 197.991-2.29165 198.009 2.29165 172.533 2.39256 172.588 2.39167 147.527 3.09805 147.606 3.09445 135.36 3.8639 135.434 3.85797 123.447 5.00584 123.54 4.99501 111.864 6.59698 111.977 6.57862 100.663 8.71037 100.797 8.68099 89.897 11.4182 90.0523 11.3733 79.6188 14.7917 79.7946 14.726 69.879 18.9012 70.072 18.8091 60.7261 23.8169 60.9299 23.6936 52.2054 29.6095 52.4105 29.4529 44.3592 36.3527 44.5541 36.1646 37.2278 44.124 37.4014 43.9112 30.8519 53.0059 30.9934 52.7836 25.2553 63.0639 25.356 62.8604 20.3947 74.2761 20.4629 74.0995 16.2267 86.5747 16.2721 86.4243 12.709 99.8834 12.7388 99.7565 9.79719 114.124 9.81636 114.017 7.44444 129.217 7.45653 129.128 5.60248 145.085 5.60987 145.011 4.2219 161.649 4.22619 161.588 3.25253 178.831 3.25482 178.78 2.64367 196.553 2.64472 196.512 2.34429 214.74 2.3446 214.707 2.30312 233.312 2.30294 233.278 2.78965 271.322 2.78921 271.298 3.15613 287.036ZM14.5045 282.187 1.39921 310-12.988 282.828Z" fill="#343739" transform="matrix(-1 0 0 1 1762.5 1024.5)"/><text font-family="Verdana,Verdana_MSFontService,sans-serif" font-weight="400" font-size="46" transform="matrix(1 0 0 1 1050.48 1005)">yields</text><text font-family="Verdana,Verdana_MSFontService,sans-serif" font-weight="400" font-size="46" transform="matrix(1 0 0 1 1687.81 1005)">uses</text><text font-family="Verdana,Verdana_MSFontService,sans-serif" font-weight="400" font-size="46" transform="matrix(1 0 0 1 1172.66 1193)">Data exchange format </text><text font-family="Verdana,Verdana_MSFontService,sans-serif" font-weight="400" font-size="46" transform="matrix(1 0 0 1 1226.24 1248)">(model database)</text><path d="M2476.55 1151.46 2758.66 1296.31 2756.57 1300.39 2474.45 1155.54ZM2759.82 1284.02 2778 1308.82 2747.26 1308.49Z"/><path d="M1.04672-2.03865 283.16 142.81 281.067 146.887-1.04672 2.03865ZM284.317 130.523 302.5 155.315 271.756 154.987Z" transform="matrix(1 0 0 -1 2475.5 1520.82)"/><text font-family="Verdana,Verdana_MSFontService,sans-serif" font-weight="400" font-size="46" transform="matrix(1 0 0 1 2561.59 1106)">Static </text><text font-family="Verdana,Verdana_MSFontService,sans-serif" font-weight="400" font-size="46" transform="matrix(1 0 0 1 2573.62 1161)">code</text><text font-family="Verdana,Verdana_MSFontService,sans-serif" font-weight="400" font-size="46" transform="matrix(1 0 0 1 2507.76 1580)">Generated </text><text font-family="Verdana,Verdana_MSFontService,sans-serif" font-weight="400" font-size="46" transform="matrix(1 0 0 1 2574.22 1635)">code</text></g></svg>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.0//EN'
'http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd'>
<svg fill-opacity="1" xmlns:xlink="http://www.w3.org/1999/xlink" color-rendering="auto" color-interpolation="auto" text-rendering="auto" stroke="black" stroke-linecap="square" width="2000" stroke-miterlimit="10" shape-rendering="auto" stroke-opacity="1" fill="black" stroke-dasharray="none" font-weight="normal" stroke-width="1" viewBox="740 640 2000 670" height="670" xmlns="http://www.w3.org/2000/svg" font-family="'Dialog'" font-style="normal" stroke-linejoin="miter" font-size="12px" stroke-dashoffset="0" image-rendering="auto"
><!--Generated by the Batik Graphics2D SVG Generator--><defs id="genericDefs"
/><g
><defs id="defs1"
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath1"
><path d="M0 0 L2147483647 0 L2147483647 2147483647 L0 2147483647 L0 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath2"
><path d="M0 0 L0 80 L640 80 L640 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath3"
><path d="M0 0 L0 130 L990 130 L990 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath4"
><path d="M0 0 L0 270 L990 270 L990 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath5"
><path d="M0 0 L0 70 L30 70 L30 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath6"
><path d="M0 0 L0 140 L370 140 L370 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath7"
><path d="M0 0 L0 140 L60 140 L60 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath8"
><path d="M0 0 L0 140 L360 140 L360 0 Z"
/></clipPath
></defs
><g fill="rgb(255,165,0)" fill-opacity="0.4902" transform="translate(2080,660)" stroke-opacity="0.4902" stroke="rgb(255,165,0)"
><rect x="0.5" width="638.5" height="78.5" y="0.5" clip-path="url(#clipPath2)" stroke="none"
/></g
><g transform="translate(2080,660)"
><rect fill="none" x="0.5" width="638.5" height="78.5" y="0.5" clip-path="url(#clipPath2)"
/><text x="274" font-size="14px" y="18.1094" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none" xml:space="preserve"
>«Generated»</text
><text x="86" font-size="14px" y="34.2188" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none" xml:space="preserve"
>{ModuleInterfaceNamespace}::{ModuleInterfaceName}Consumer</text
><path fill="none" d="M1 40.2188 L639 40.2188" clip-path="url(#clipPath2)"
/></g
><g fill="rgb(255,165,0)" fill-opacity="0.4902" transform="translate(1420,660)" stroke-opacity="0.4902" stroke="rgb(255,165,0)"
><rect x="0.5" width="638.5" height="78.5" y="0.5" clip-path="url(#clipPath2)" stroke="none"
/></g
><g transform="translate(1420,660)"
><rect fill="none" x="0.5" width="638.5" height="78.5" y="0.5" clip-path="url(#clipPath2)"
/><text x="274" font-size="14px" y="18.1094" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none" xml:space="preserve"
>«Generated»</text
><text x="92" font-size="14px" y="34.2188" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none" xml:space="preserve"
>{ModuleInterfaceNamespace}::{ModuleInterfaceName}Provider</text
><path fill="none" d="M1 40.2188 L639 40.2188" clip-path="url(#clipPath2)"
/></g
><g fill="rgb(255,255,0)" fill-opacity="0.4902" transform="translate(760,660)" stroke-opacity="0.4902" stroke="rgb(255,255,0)"
><rect x="0.5" width="638.5" height="78.5" y="0.5" clip-path="url(#clipPath2)" stroke="none"
/></g
><g transform="translate(760,660)"
><rect fill="none" x="0.5" width="638.5" height="78.5" y="0.5" clip-path="url(#clipPath2)"
/><text x="280" font-size="14px" y="18.1094" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none" xml:space="preserve"
>«Interface»</text
><text x="247" font-size="14px" y="34.2188" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none" xml:space="preserve"
>vaf::ControlInterface</text
><path fill="none" d="M1 40.2188 L639 40.2188" clip-path="url(#clipPath2)"
/></g
><g fill="rgb(255,0,0)" fill-opacity="0.4902" transform="translate(1240,1160)" stroke-opacity="0.4902" stroke="rgb(255,0,0)"
><rect x="0.5" width="988.5" height="128.5" y="0.5" clip-path="url(#clipPath3)" stroke="none"
/></g
><g transform="translate(1240,1160)"
><rect fill="none" x="0.5" width="988.5" height="128.5" y="0.5" clip-path="url(#clipPath3)"
/><text x="427" font-size="14px" y="18.1094" clip-path="url(#clipPath3)" font-family="sans-serif" stroke="none" xml:space="preserve"
>«Stubs Generated»</text
><text x="281" font-size="14px" y="34.2188" clip-path="url(#clipPath3)" font-family="sans-serif" stroke="none" xml:space="preserve"
>{ApplicationModuleNamespace}::{ApplicationModuleName}</text
><path fill="none" d="M1 40.2188 L989 40.2188" clip-path="url(#clipPath3)"
/><path fill="none" d="M1 61.3281 L989 61.3281" clip-path="url(#clipPath3)"
/><text x="5" font-size="14px" y="76.4375" clip-path="url(#clipPath3)" font-family="sans-serif" stroke="none" xml:space="preserve"
>+/{TaskName}_Task()</text
><text x="5" font-size="14px" y="92.5469" clip-path="url(#clipPath3)" font-family="sans-serif" stroke="none" xml:space="preserve"
>...</text
></g
><g fill="rgb(255,165,0)" fill-opacity="0.4902" transform="translate(1240,850)" stroke-opacity="0.4902" stroke="rgb(255,165,0)"
><rect x="0.5" width="988.5" height="268.5" y="0.5" clip-path="url(#clipPath4)" stroke="none"
/></g
><g transform="translate(1240,850)"
><rect fill="none" x="0.5" width="988.5" height="268.5" y="0.5" clip-path="url(#clipPath4)"
/><text x="449" font-size="14px" y="18.1094" clip-path="url(#clipPath4)" font-family="sans-serif" stroke="none" xml:space="preserve"
>«Generated»</text
><text x="264" font-size="14px" y="34.2188" clip-path="url(#clipPath4)" font-family="sans-serif" stroke="none" xml:space="preserve"
>{ApplicationModuleNamespace}::{ApplicationModuleName}Base</text
><path fill="none" d="M1 40.2188 L989 40.2188" clip-path="url(#clipPath4)"
/><text x="5" font-size="14px" y="55.3281" clip-path="url(#clipPath4)" font-family="sans-serif" stroke="none" xml:space="preserve"
>#executor_: vaf::ModuleExecutor&amp;</text
><text x="5" font-size="14px" y="71.4375" clip-path="url(#clipPath4)" font-family="sans-serif" stroke="none" xml:space="preserve"
>#{ConsumerInstanceName}_: std::shared_ptr&lt;{ModuleInterfaceNamespace}::{ModuleInterfaceName}Consumer&gt;</text
><text x="5" font-size="14px" y="87.5469" clip-path="url(#clipPath4)" font-family="sans-serif" stroke="none" xml:space="preserve"
>...</text
><text x="5" font-size="14px" y="103.6562" clip-path="url(#clipPath4)" font-family="sans-serif" stroke="none" xml:space="preserve"
>#{ProviderInstanceName}_: std::shared_ptr&lt;{ModuleInterfaceNamespace}::{ModuleInterfaceName}Provider&gt;</text
><text x="5" font-size="14px" y="119.7656" clip-path="url(#clipPath4)" font-family="sans-serif" stroke="none" xml:space="preserve"
>... </text
><path fill="none" d="M1 125.7656 L989 125.7656" clip-path="url(#clipPath4)"
/><text x="5" font-size="14px" y="140.875" clip-path="url(#clipPath4)" font-family="sans-serif" stroke="none" xml:space="preserve"
>+/Init(): vaf::Result&lt;void&gt;</text
><text x="5" font-size="14px" y="156.9844" clip-path="url(#clipPath4)" font-family="sans-serif" stroke="none" xml:space="preserve"
>+/Start()</text
><text x="5" font-size="14px" y="173.0938" clip-path="url(#clipPath4)" font-family="sans-serif" stroke="none" xml:space="preserve"
>+/Stop()</text
><text x="5" font-size="14px" y="189.2031" clip-path="url(#clipPath4)" font-family="sans-serif" stroke="none" xml:space="preserve"
>+/DeInit()</text
><text x="5" font-size="14px" y="205.3125" clip-path="url(#clipPath4)" font-family="sans-serif" stroke="none" xml:space="preserve"
>+/OnError(error: const vaf::Error&amp;)</text
><text x="5" font-size="14px" y="221.4219" clip-path="url(#clipPath4)" font-family="sans-serif" font-style="italic" stroke="none" xml:space="preserve"
>+{TaskName}_Task()</text
><text x="5" font-size="14px" y="237.5312" clip-path="url(#clipPath4)" font-family="sans-serif" stroke="none" xml:space="preserve"
>...</text
></g
><g transform="translate(1730,1110)"
><path fill="none" d="M10.5 10.5 L10.5 50.5" clip-path="url(#clipPath5)"
/><path fill="white" d="M4 21.7583 L10.5 10.5 L17 21.7583 L4 21.7583" clip-path="url(#clipPath5)" stroke="none"
/><path fill="none" d="M4 21.7583 L10.5 10.5 L17 21.7583 L4 21.7583" clip-path="url(#clipPath5)"
/></g
><g transform="translate(2060,730)"
><path fill="none" d="M350.5 10.5 L10.5 120.5" clip-path="url(#clipPath6)"
/><path fill="none" d="M337.7875 7.7812 L350.5 10.5 L341.7892 20.1499" clip-path="url(#clipPath6)"
/><text x="164.8989" font-size="14px" y="61" clip-path="url(#clipPath6)" font-family="sans-serif" stroke="none" xml:space="preserve"
>uses</text
></g
><g transform="translate(1720,730)"
><path fill="none" d="M10.5 10.5 L10.5 120.5" clip-path="url(#clipPath7)"
/><path fill="none" d="M4 21.7583 L10.5 10.5 L17 21.7583" clip-path="url(#clipPath7)"
/><text x="14" font-size="14px" y="65" clip-path="url(#clipPath7)" font-family="sans-serif" stroke="none" xml:space="preserve"
>uses</text
></g
><g transform="translate(1070,730)"
><path fill="none" d="M10.5 10.5 L340.5 120.5" clip-path="url(#clipPath8)"
/><path fill="white" d="M19.1251 20.2266 L10.5 10.5 L23.2361 7.8938 L19.1251 20.2266" clip-path="url(#clipPath8)" stroke="none"
/><path fill="none" d="M19.1251 20.2266 L10.5 10.5 L23.2361 7.8938 L19.1251 20.2266" clip-path="url(#clipPath8)"
/></g
></g
></svg
>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<diagram program="umlet" version="13.3">
<zoom_level>6</zoom_level>
<element>
<id>UMLClass</id>
<coordinates>
<x>744</x>
<y>510</y>
<w>594</w>
<h>162</h>
</coordinates>
<panel_attributes>&lt;&lt;Generated&gt;&gt;
{ApplicationModuleNamespace}::{ApplicationModuleName}Base
--
#executor_: vaf::ModuleExecutor&amp;
#{ConsumerInstanceName}_: std::shared_ptr&lt;{ModuleInterfaceNamespace}::{ModuleInterfaceName}Consumer&gt;
...
#{ProviderInstanceName}_: std::shared_ptr&lt;{ModuleInterfaceNamespace}::{ModuleInterfaceName}Provider&gt;
...
--
+/Init(): vaf::Result&lt;void&gt;
+/Start()
+/Stop()
+/DeInit()
+/OnError(error: const vaf::Error&amp;)
/+{TaskName}_Task()/
...
bg=orange</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>642</x>
<y>438</y>
<w>216</w>
<h>84</h>
</coordinates>
<panel_attributes>lt=&lt;&lt;-</panel_attributes>
<additional_attributes>10.0;10.0;340.0;120.0</additional_attributes>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>1032</x>
<y>438</y>
<w>36</w>
<h>84</h>
</coordinates>
<panel_attributes>lt=&lt;-
uses
</panel_attributes>
<additional_attributes>10.0;10.0;10.0;120.0</additional_attributes>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>1236</x>
<y>438</y>
<w>222</w>
<h>84</h>
</coordinates>
<panel_attributes>lt=&lt;-
uses
</panel_attributes>
<additional_attributes>350.0;10.0;10.0;120.0</additional_attributes>
</element>
<element>
<id>UMLClass</id>
<coordinates>
<x>744</x>
<y>696</y>
<w>594</w>
<h>78</h>
</coordinates>
<panel_attributes>&lt;&lt;Stubs Generated&gt;&gt;
{ApplicationModuleNamespace}::{ApplicationModuleName}
--
--
+/{TaskName}_Task()
...
bg=red</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>1038</x>
<y>666</y>
<w>18</w>
<h>42</h>
</coordinates>
<panel_attributes>lt=&lt;&lt;-</panel_attributes>
<additional_attributes>10.0;10.0;10.0;50.0</additional_attributes>
</element>
<element>
<id>UMLClass</id>
<coordinates>
<x>456</x>
<y>396</y>
<w>384</w>
<h>48</h>
</coordinates>
<panel_attributes>&lt;&lt;Interface&gt;&gt;
vaf::ControlInterface
--
bg=yellow</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLClass</id>
<coordinates>
<x>852</x>
<y>396</y>
<w>384</w>
<h>48</h>
</coordinates>
<panel_attributes>&lt;&lt;Generated&gt;&gt;
{ModuleInterfaceNamespace}::{ModuleInterfaceName}Provider
--
bg=orange</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLClass</id>
<coordinates>
<x>1248</x>
<y>396</y>
<w>384</w>
<h>48</h>
</coordinates>
<panel_attributes>&lt;&lt;Generated&gt;&gt;
{ModuleInterfaceNamespace}::{ModuleInterfaceName}Consumer
--
bg=orange</panel_attributes>
<additional_attributes/>
</element>
</diagram>
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment