From e9146994cc5d5ad455f71ffaa88d17682d0301d7 Mon Sep 17 00:00:00 2001 From: Stephen Lawrence Date: Fri, 13 Mar 2026 18:36:54 +0000 Subject: [PATCH 1/9] doc site: create new Hugo doc site project using Hextra template The existing online documentation site that uses the Hugo HTML static generator and Learn template is located in /docs/docs-gen/ The project is migrating to use Hugo and the Hextra template for the doc site. The template move gives us the opportunity to update to a later Hugo version and start afresh. As a step towards that create a new Hugo project in the directory /docs/docs-site/ and enable the Hextra template. Signed-off-by: Stephen Lawrence --- docs/doc-site/archetypes/default.md | 5 +++++ docs/doc-site/go.mod | 5 +++++ docs/doc-site/go.sum | 2 ++ docs/doc-site/hugo.yaml | 8 ++++++++ 4 files changed, 20 insertions(+) create mode 100644 docs/doc-site/archetypes/default.md create mode 100644 docs/doc-site/go.mod create mode 100644 docs/doc-site/go.sum create mode 100644 docs/doc-site/hugo.yaml diff --git a/docs/doc-site/archetypes/default.md b/docs/doc-site/archetypes/default.md new file mode 100644 index 00000000..0d5eebd0 --- /dev/null +++ b/docs/doc-site/archetypes/default.md @@ -0,0 +1,5 @@ +--- +date: '{{ .Date }}' +draft: true +title: '{{ replace .File.ContentBaseName "-" " " | title }}' +--- diff --git a/docs/doc-site/go.mod b/docs/doc-site/go.mod new file mode 100644 index 00000000..e2d41709 --- /dev/null +++ b/docs/doc-site/go.mod @@ -0,0 +1,5 @@ +module github.com/COVESA/cdsp.git + +go 1.21.9 + +require github.com/imfing/hextra v0.12.1 // indirect diff --git a/docs/doc-site/go.sum b/docs/doc-site/go.sum new file mode 100644 index 00000000..a889b918 --- /dev/null +++ b/docs/doc-site/go.sum @@ -0,0 +1,2 @@ +github.com/imfing/hextra v0.12.1 h1:3t1n0bmJbDzSTVfht93UDcfF1BXMRjeFojA071ri2l8= +github.com/imfing/hextra v0.12.1/go.mod h1:vi+yhpq8YPp/aghvJlNKVnJKcPJ/VyAEcfC1BSV9ARo= diff --git a/docs/doc-site/hugo.yaml b/docs/doc-site/hugo.yaml new file mode 100644 index 00000000..19c3f5e9 --- /dev/null +++ b/docs/doc-site/hugo.yaml @@ -0,0 +1,8 @@ +baseURL: https://example.org/ +languageCode: en-us +title: My New Hugo Project + +# import hextra as module +module: + imports: + - path: github.com/imfing/hextra From d194ff376aba4a32d1ca95221018dbca69a0b73e Mon Sep 17 00:00:00 2001 From: Stephen Lawrence Date: Fri, 13 Mar 2026 20:03:55 +0000 Subject: [PATCH 2/9] doc site: populate new site with basic port of existing content Populate the new site in /docs/docs-site/ with draft content: * Configure hugo.yaml for CDSP and the Hextra template * Add the documentation from the previous site to docs-site/content/ and make some adjustments to the markdown. Mainly fixing links. Signed-off-by: Stephen Lawrence --- docs/doc-site/content/_index.md | 17 ++ docs/doc-site/content/about.md | 6 + docs/doc-site/content/docs/_index.md | 19 ++ docs/doc-site/content/docs/examples/_index.md | 69 ++++++ docs/doc-site/content/docs/manuals/_index.md | 16 ++ .../content/docs/manuals/apache-iotdb.md | 225 ++++++++++++++++++ .../content/docs/manuals/vissr-viss.md | 11 + docs/doc-site/content/docs/overview/_index.md | 19 ++ .../overview/cdsp-implementation-concept.md | 72 ++++++ .../docs/overview/cdsp-logical-concept.md | 148 ++++++++++++ .../content/docs/overview/cdsp-overview.md | 13 + .../docs/overview/covesa-and-beyond.md | 6 + docs/doc-site/hugo.yaml | 63 ++++- .../Apache-IoTDB-feature-summary.drawio.svg | 4 + .../Logical-Architecture-Overview.drawio.svg | 4 + .../images/cdsp-logical-concept.drawio.svg | 4 + 16 files changed, 694 insertions(+), 2 deletions(-) create mode 100644 docs/doc-site/content/_index.md create mode 100644 docs/doc-site/content/about.md create mode 100644 docs/doc-site/content/docs/_index.md create mode 100644 docs/doc-site/content/docs/examples/_index.md create mode 100644 docs/doc-site/content/docs/manuals/_index.md create mode 100644 docs/doc-site/content/docs/manuals/apache-iotdb.md create mode 100644 docs/doc-site/content/docs/manuals/vissr-viss.md create mode 100644 docs/doc-site/content/docs/overview/_index.md create mode 100644 docs/doc-site/content/docs/overview/cdsp-implementation-concept.md create mode 100644 docs/doc-site/content/docs/overview/cdsp-logical-concept.md create mode 100644 docs/doc-site/content/docs/overview/cdsp-overview.md create mode 100644 docs/doc-site/content/docs/overview/covesa-and-beyond.md create mode 100755 docs/doc-site/static/images/Apache-IoTDB-feature-summary.drawio.svg create mode 100644 docs/doc-site/static/images/Logical-Architecture-Overview.drawio.svg create mode 100755 docs/doc-site/static/images/cdsp-logical-concept.drawio.svg diff --git a/docs/doc-site/content/_index.md b/docs/doc-site/content/_index.md new file mode 100644 index 00000000..72f68d83 --- /dev/null +++ b/docs/doc-site/content/_index.md @@ -0,0 +1,17 @@ +--- +title: My Site +toc: false +--- + +This is the landing page. + +## Explore + +{{< cards >}} + {{< card link="docs" title="Docs" icon="book-open" >}} + {{< card link="about" title="About" icon="user" >}} +{{< /cards >}} + +## Documentation + +For more information, visit [Hextra](https://imfing.github.io/hextra). diff --git a/docs/doc-site/content/about.md b/docs/doc-site/content/about.md new file mode 100644 index 00000000..289d9c78 --- /dev/null +++ b/docs/doc-site/content/about.md @@ -0,0 +1,6 @@ +--- +title: About +type: about +--- + +This is the about page. diff --git a/docs/doc-site/content/docs/_index.md b/docs/doc-site/content/docs/_index.md new file mode 100644 index 00000000..9c1a2257 --- /dev/null +++ b/docs/doc-site/content/docs/_index.md @@ -0,0 +1,19 @@ +--- +title: "Central Data Service Playground" +--- +## Introduction +{{< cards >}} {{< card link="overview" title="Overview" icon="document-text" subtitle="Learn the basics and benefits of using the playground" >}} {{< /cards >}} + +## Browse by section + +### Manuals +This section contains user guides and reference manuals for the playground + +{{< cards >}} + {{< card link="manuals" title="Overview" icon="document-text" subtitle="Explore the available guides" >}} + {{< card link="apache-iotdb" title="Apache IoTDB data store" icon="document-text" subtitle="Apache IoTDB timeseries database guide" >}} + {{< card link="vissr-viss" title="VISSR (VISS data server)" icon="document-text" subtitle="VISSR (VISS data server) guide" >}} +{{< /cards >}} + +### Examples +{{< cards >}} {{< card link="examples" title="Examples" icon="document-text" subtitle="Learn how to use the playground by stepping through examples." >}} {{< /cards >}} \ No newline at end of file diff --git a/docs/doc-site/content/docs/examples/_index.md b/docs/doc-site/content/docs/examples/_index.md new file mode 100644 index 00000000..7b5cd876 --- /dev/null +++ b/docs/doc-site/content/docs/examples/_index.md @@ -0,0 +1,69 @@ +--- +title: "Playground examples" +weight: 30 +--- + +The following examples are intended to show how to use playground components and how they can be combined to build larger systems. + +They are grouped by categories to help discovery of appropriate examples from different viewpoints. + +Note: There is not a separate section for the VSS data model because the vast majority of the examples will be making use of it. + +## Getting started + +| Name | Relationship to the category | +|------|-------------| +| [Docker sanity test](https://github.com/COVESA/cdsp/tree/main/docker#deploy-with-docker-compose) | Simple sanity test for the Playground Docker deployment | +| [Hello-world](https://github.com/COVESA/cdsp/tree/main/examples/cdsp-hello-world) | Simple "hello-world" example| + +## Data Layer, Processing and Analysis +Topic examples: Data Reduction, Data Quality, Events, Data Streams etc. + +| Name | Relationship to the category | +|------|-------------| +| [vehicle-speed-downsample-iotdb](https://github.com/COVESA/cdsp/tree/main/examples/vehicle-speed-downsample-iotdb) | Accurately down-sample a timeseries of pre-recorded high frequency VSS `Vehicle.Speed` data using the IoTDB Data Quality Library| + +Tip: well you wait for more examples consider how you could use the [IoTDB data processing functions]({{< ref "apache-iotdb#data-processing-functions" >}} "IoTDB data processing"). + +## Knowledge Layer, Reasoning and Data Models +Topic examples: Knowledge Layer Connector, Data Layer Connector etc. + +## Feeders +Topic examples: Virtual signal platforms, VISSR etc. + +| Name | Relationship to the category | +|------|-------------| +| [RemotiveLabs feeder](https://github.com/COVESA/cdsp/tree/main/examples/remotivelabs-feeder) | Example bridge that streams vehicle data from the RemotiveLabs cloud platform into the IoTDB data store | +| [KUKSA CAN Provider feeder](https://github.com/COVESA/cdsp/tree/main/examples/kuksa-can-feeder) | Using the KUKSA CAN Provider as a feeder of CAN data translated to the VSS data model into the IoTDB data store | + +## COVESA Touchpoints +Topic examples: Low level vehicle abstraction, Mobile devices, Car2Cloud / Cloud etc. + +## COVESA Technologies +Topic examples: vsome/ip (SOME/IP), uServices, Vehicle API, VISS etc. + +| Name | Relationship to the category | +|------|-------------| +| [VISSR/VISS hello-world](https://covesa.github.io/vissr/build-system/hello-world/) | hello-world tutorial for making VISS requests using VISSR in the upstream VISSR project | +| [VISS transport examples](https://raw.githack.com/COVESA/vehicle-information-service-specification/main/spec/VISSv3.0_Transport.html) | Examples in the VISS Specification for making VISS requests and the responses for various transport protocols | + +## Databases +Topic examples: Apache IoTDB, MongoDB Realm, Redis/SQLite/memcache etc. + +| Name | Relationship to the category | +|------|-------------| +| [vehicle-speed-downsample-iotdb](https://github.com/COVESA/cdsp/tree/main/examples/vehicle-speed-downsample-iotdb) | Using the IoTDB [Data Quality Library ]({{< ref "apache-iotdb#data-processing-functions" >}} "IoTDB Data Quality Library") for advanced (VSS) timeseries data processing| +| [RemotiveLabs feeder](https://github.com/COVESA/cdsp/tree/main/examples/remotivelabs-feeder) | Example of streaming (writing) southbound (VSS) timeseries data into IoTDB | + +## Frameworks / Protocols +Topic examples: vsome/ip (SOME/IP), VISS, uServices/uProtocol/Capabilities, Vehicle API, MQTT, Kafka, Apache Zeppelin etc. + +| Name | Relationship to the category | +|------|-------------| +| VISS | Find examples in the COVESA Technologies section and or search for VISS/VISSR in this page | + +## Big data +Topic examples: Hadoop, Flink, Spark, Cloud DB, Nifi etc. + +## Other examples +Topics that do not fit into the groups above. \ No newline at end of file diff --git a/docs/doc-site/content/docs/manuals/_index.md b/docs/doc-site/content/docs/manuals/_index.md new file mode 100644 index 00000000..b167b6bc --- /dev/null +++ b/docs/doc-site/content/docs/manuals/_index.md @@ -0,0 +1,16 @@ +--- +title: "Manuals" +chapter: true +weight: 15 +--- + +# Introduction + +This section contains user guides and reference manuals for the playground + +{{< cards >}} + {{< card link="apache-iotdb" title="Apache IoTDB" icon="document-text" subtitle="Apache IoTDB reference manual" >}} + {{< card link="vissr-viss" title="VISS/VISSR" icon="document-text" subtitle="Reference manual for the VISSR data server that implements VISS" >}} +{{< /cards >}} + + diff --git a/docs/doc-site/content/docs/manuals/apache-iotdb.md b/docs/doc-site/content/docs/manuals/apache-iotdb.md new file mode 100644 index 00000000..f900399b --- /dev/null +++ b/docs/doc-site/content/docs/manuals/apache-iotdb.md @@ -0,0 +1,225 @@ +--- +title: "Apache IoTDB" +--- + +## Introduction +The playground uses Apache IoTDB to provide a highly functional data store. + +Description of Apache IoTDB from https://iotdb.apache.org/: + +*"Apache IoTDB (Database for Internet of Things) is an IoT native database with high performance for data management and analysis, deployable on the edge and the cloud. Due to its light-weight architecture, high performance and rich feature set together with its deep integration with Apache Hadoop, Spark and Flink, Apache IoTDB can meet the requirements of massive data storage, high-speed data ingestion and complex data analysis in the IoT industrial fields."* + +The IoTDB project [website](https://iotdb.apache.org/) has extensive documentation on the IoTDB server. In the guide below we focus on topics specific to the playground such as VSS data schemas and the connector for the VISSR VISS data server. + +Info: The intention is to add more information such as a guide for feeder integration as the project progresses. + +## Integrating VSS data into the IoTDB data model +The ["Background Knowledge"](https://iotdb.apache.org/UserGuide/latest/Background-knowledge/Data-Model-and-Terminology_apache.html) section of the IoTDB documentation introduces the IoTDB data model, data types, encoding and compression. + +In IoTDB terminology *measurement* is the key in a key/value pair. In VSS terms the leaf node name. The timeseries is the record of the measurement on the time axis. A timeseries is a series of time/value data points. + +The IoTDB data model supports hierarchical partitioning and like VSS uses a dot notation to separate the levels. This means if we simply appended a VSS leaf node name like `Vehicle.CurrentLocation.Longitude` as the measurement (key) name to the end of a IoTDB path such as `root.test2.dev1` IoTDB would treat the VSS path prefix `Vehicle.CurrentLocation.` as part of the IoTDB data model partitioning which could cause unwanted issues when scaling over millions of vehicles. + +We have separated those two concepts by quoting the VSS leaf node name using backticks when processing the name in IoTDB. As shown below: +``` +.`` +``` +In our example the full IoTDB measurement path would become ``root.test2.dev1.`Vehicle.CurrentLocation.Longitude` `` and in an IoTDB timeseries would look like this: +``` ++------------------------+---------------------------------------------------+ +| Time|root.test2.dev1.`Vehicle.CurrentLocation.Longitude`| ++------------------------+---------------------------------------------------+ +|2024-03-07T17:55:24.514Z| -42.4567| +|2024-04-10T17:48:12.117Z| -41.3567| +|2024-04-10T17:48:23.389Z| -39.3567| +|2024-04-10T17:48:49.630Z| -40.2578| ++------------------------+---------------------------------------------------+ + +``` + +## Seeding the database with VSS data +To illustrate the concepts lets seed a database with some simple timeseries VSS data. + +The typical steps are: +1. Create the database in the server. +2. Create a timeseries in the database populated with the VSS leaf nodes (keys) you are interested in. +3. Load the VSS data into the timeseries. + +Note: IoTDB has data type detection so creating a schema for the timeseries in step 2 is optional. However, the use of a schema has performance and meta-data benefits so is recommended. + +IoTDB has a very extensive collection of integrations, tools, clients and APIs that could be used to achieve this. + +### Example using the IoTDB CLI client +The following tutorial shows an example using the [IoTDB CLI client](https://iotdb.apache.org/UserGuide/latest/Tools-System/CLI.html), using two methods. Firstly, in interactive mode where you type the commands and then sending the same commands in batch command mode. + + +1. Connect to the CLI client from your host: +``` +$ bash /sbin/start-cli.sh -h +``` +2. Create database from CLI command line: +``` +IoTDB > create database root.test2 +``` +3. Create timeseries from CLI command line: +``` +IoTDB > CREATE ALIGNED TIMESERIES root.test2.dev1(`Vehicle.CurrentLocation.Longitude` FLOAT, `Vehicle.CurrentLocation.Latitude` FLOAT, `Vehicle.Cabin.Infotainment.HMI.DistanceUnit` TEXT) +``` +4. Add some data into the timeseries: +``` +IoTDB> insert into root.test2.dev1(`Vehicle.CurrentLocation.Longitude`, `Vehicle.CurrentLocation.Latitude`, `Vehicle.Cabin.Infotainment.HMI.DistanceUnit`) values(-42.4567, 22.1234, 'MILES') +``` +5. Display the data just added as a sanity check: +``` +IoTDB> select last * from root.test2.dev1 ++------------------------+-------------------------------------------------------------+--------+--------+ +| Time| Timeseries| Value|DataType| ++------------------------+-------------------------------------------------------------+--------+--------+ +|2024-03-07T17:55:24.514Z| root.test2.dev1.`Vehicle.CurrentLocation.Longitude`|-42.4567| FLOAT| +|2024-03-07T17:55:24.514Z|root.test2.dev1.`Vehicle.Cabin.Infotainment.HMI.DistanceUnit`| MILES| TEXT| +|2024-03-07T17:55:24.514Z| root.test2.dev1.`Vehicle.CurrentLocation.Latitude`| 22.1234| FLOAT| ++------------------------+-------------------------------------------------------------+--------+--------+ +``` +You have now seeded the database with some initial VSS data. + +The CLI client startup script accepts SQL commands using the `-e` parameter. We can therefore use this to codify the above in a bash script. So the VSS node names (keys) are passed correctly on the command line the backticks must be escaped. + +For example: +``` +# !/bin/bash + +host=127.0.0.1 +rpcPort=6667 +user=root +pass=root + +bash ./sbin/start-cli.sh -h ${host} -p ${rpcPort} -u ${user} -pw ${pass} -e "create database root.test2" + +bash ./sbin/start-cli.sh -h ${host} -p ${rpcPort} -u ${user} -pw ${pass} -e "CREATE ALIGNED TIMESERIES root.test2.dev1(\`Vehicle.CurrentLocation.Longitude\` FLOAT, \`Vehicle.CurrentLocation.Latitude\` FLOAT, \`Vehicle.Cabin.Infotainment.HMI.DistanceUnit\` TEXT)" + +bash ./sbin/start-cli.sh -h ${host} -p ${rpcPort} -u ${user} -pw ${pass} -e "insert into root.test2.dev1(\`Vehicle.CurrentLocation.Longitude\`, \`Vehicle.CurrentLocation.Latitude\`, \`Vehicle.Cabin.Infotainment.HMI.DistanceUnit\`) values(-42.4567, 22.1234, 'MILES')" + +bash ./sbin/start-cli.sh -h ${host} -p ${rpcPort} -u ${user} -pw ${pass} -e "select last * from root.test2.dev1" +``` + +Of course any of the programming language clients provided by IoTDB, e.g. go, python, C++, Rust, or integration into tools that support its SQL language, can also be used to achieve the same result. + +## Single node (Edge) vs Cluster +The upstream IoTDB project has both standalone single node and cluster deployments, to cover use case requirements from edge to cloud. + +At the time of writing the playground docker deployment deploys the single node IoTDB docker image, as it is most suitable for deployment at the edge in-vehicle, whilst still being able to represent the cloud. + +Of course if your cloud development requires higher performance then you can integrate the cluster version. + +## Data processing functions +### Built-in functions +IoTDB has an extensive collection of built-in data processing functions covering areas including: + +- Aggregate Functions, such as `SUM`. +- Arithmetic Functions, such as `SIN`. +- Comparison Functions, such as `ON_OFF`. +- String Processing Functions, such as `STRING_CONTAINS`. +- Data Type Conversion Function, such as `CAST`. +- Constant Timeseries Generating Functions, such as `CONST`. +- Selector Functions, such as `TOP_K`. +- Continuous Interval Functions, such as `ZERO_DURATION`. +- Variation Trend Calculation Functions, such as `TIME_DIFFERENCE`. +- Sampling Functions, such as `M4`. +- Change Points Function, such as `CHANGE_POINTS`. + +A full function list with examples can be found in the upstream [IoTDB Function reference manual](https://iotdb.apache.org/UserGuide/latest/SQL-Manual/Operator-and-Expression.html#_2-built-in-functions). + +### Data Quality Library functions +The IoTDB project also maintains a Data Quality Library which provides an additional collection of functions covering: +- Data Quality, such as `Completeness`. +- Data Profiling, such as `Sample`. +- Anomaly Detection, such as `Outlier`. +- Frequency Domain Analysis, such as `HighPass`. +- Data Matching, such as `Cov`. +- Data Repair, such as `TimestampRepair`. +- Series Discovery, such as `ConsecutiveSequences`. +- Machine Learning, such as `AR`. + +A full function list with examples can be found in the upstream [IoTDB UDF Data Quality Library reference manual](https://iotdb.apache.org/UserGuide/latest/SQL-Manual/UDF-Libraries_apache.html). + +#### Setup +In the upstream IoTDB project the library is an optional install. + +For your convenience it is included in the Playground IoTDB image for you. However to call the functions they must first be registered in the running IoTDB instance, which you only need to do once. The script `/iotdb/sbin/register-UDF.sh` is included in the IoTDB image to do this for you. + +Steps: + +1. Start the Playground if it is not already running. +2. From your host execute the following command to run the registration script in the IoTDB container image: + ``` + sudo docker exec -ti iotdb-service /iotdb/sbin/register-UDF.sh + ``` + + +### User Defined functions +IoTDB also allows you to integrate your own functions as User Defined Functions (UDF). The [UDF development section](https://iotdb.apache.org/UserGuide/latest/User-Manual/User-defined-function_apache.html) of the IoTDB documentation explains how to develop and register your own. + +## VISSR (VISS) integration +As part of the initial development of the playground the team extended VISSR to support connections to Apache IoTDB as a VISSR data store backend and upstreamed the support. + +### Connector scope + +The support is implemented by connector code in the VISSR service manager, which connects VISSR to an external Apache IoTDB server. This code uses the IoTDB Go client to maintain a connection session to the IoTDB server, which it then uses to get/set vehicle data from the database. + +As VISSR and the IoTDB server are separate processes VISSR needs to be told where to find the IoTDB server and which storage prefix to use to access the data. + +Development followed the patterns set by the existing VISSR support for Redis and SQLite. The administration of the Apache IoTDB server itself, including startup and shutdown, is out of scope of the connector and is handled externally to VISSR. In the case of the playground this is handled by the playground compose. + +### Runtime notes + +VISSR runtime assumptions: +1. IoTDB server lifecycle (e.g. startup and shutdown) is handled externally to VISSR. +2. Management (e.g. creation/deletion) of the IoTDB timeseries containing VSS data is handled externally to VISSR. +3. Configuration of the connector code is specified in the config file iotdb-config.json. If the config file is not found then build-time defaults are used. + +Handling of IoTDB server and timeseries management is placed outside of VISSR to allow flexible deployment through loosely coupled connections. + +### Database schema assumptions +The connector assumes a simple key/value pair schema for accessing VSS data in an IoTDB timeseries: + +1. VSS node names (keys) are backtick quoted when stored as measurement keys in the database e.g. `` `Vehicle.CurrentLocation.Longitude` ``. This is for reasons explained above in ["Integrating VSS data into the IoTDB data model"](#integrating-vss-data-into-the-iotdb-data-model) to avoid IoTDB interpreting the VSS tree path, in the example `Vehicle.CurrentLocation.`, as part of its storage path which also uses a dot notation. + +2. VSS data is stored using native (IoTDB) data types rather than strings. + +3. That the timeseries containing VSS nodes can be found using the prefix path specified in the config file. + +### Configuration +The connection code reads its runtime configuration from the JSON formatted file `iotdb-config.json` located in the vissv2server directory. You must specify all values. + +#### Configuration file format + +| Key name | Type | Description | +| --- | --- | --- +|`host`|String|Hostname or IP address of the IoTDB server| +|`port`|String|RPC port of the server. Default is 6667| +|`username`|String|Username to access the server. Default is root| +|`password`|String|Password to access the server. Default is root| +|`queryPrefixPath`|String|Timeseries prefix path of VSS data in the database| +|`queryTimeout(ms)`|Int| Query timeout in milliseconds| + + +Example `iotdb-config.json`: +``` +{ + "host": "iotdb-service", + "port": "6667", + "username": "root", + "password": "root", + "queryPrefixPath": "root.test2.dev1", + "queryTimeout(ms)": 5000 +} +``` +### Logging +The connector writes information, warning and error messages to the VISSR server log with the prefix ``IoTDB``. Grepping in the log for that prefix string can help you quickly identify connector messages. + +### VISSR Development notes +Please see the notes in the VISSR source commit messages and related Github pull requests for the history of the development of the Apache IoTDB connection code and its integration into the VISSR Service Manager component. + +Development followed the patterns set by the existing support for Redis and SQLite. + +The connection code was first developed with Apache IoTDB v1.2.2, using the upstream standalone pre-built image and Apache IoTDB Go Client v1.1.7. \ No newline at end of file diff --git a/docs/doc-site/content/docs/manuals/vissr-viss.md b/docs/doc-site/content/docs/manuals/vissr-viss.md new file mode 100644 index 00000000..90a3b3d8 --- /dev/null +++ b/docs/doc-site/content/docs/manuals/vissr-viss.md @@ -0,0 +1,11 @@ +--- +title: "VISSR (VISS data server)" +--- + +## Introduction +The playground uses the [VISSR](https://github.com/COVESA/vissr) project to provide its northbound VISS support, along with the other features it provides. + +The VISSR project [documentation site](https://covesa.github.io/vissr/) has extensive documentation on the VISSR components. So as the project progresses we will add information below focused on topics specific to the playground. + +## Apache IoTDB connector +Please see the [IoTDB guide]({{< ref "apache-iotdb" >}} "Apache IoTDB Guide") for details of the connector between VISSR and IoTDB. \ No newline at end of file diff --git a/docs/doc-site/content/docs/overview/_index.md b/docs/doc-site/content/docs/overview/_index.md new file mode 100644 index 00000000..66f73818 --- /dev/null +++ b/docs/doc-site/content/docs/overview/_index.md @@ -0,0 +1,19 @@ +--- +title: "Playground overview" +chapter: true +weight: 10 +--- + +# Introduction + +The Central Data Service Playground (CDSP) serves as a neutral, open playground for data services both within and outside the vehicle in the context of data-centric architectures. It enables investigation into the internals of these services and how they can be combined. Furthermore, the playground provides a means to publish and collaborate on such work in the open. + +The playground was first conceived by the COVESA Data Architecture team to meet their needs. They also recognized that there were the same needs in the wider community inside and outside COVESA. For example, to demonstrate how VSS data can be used with its eco-system for newcomers. + +# Foundational concepts + +{{< cards >}} + {{< card link="cdsp-logical-concept" title="Logical concept" icon="document-text" subtitle="Explore the logical concept for CDSP" >}} + {{< card link="cdsp-implementation-concept" title="Implementation concept" icon="document-text" subtitle="Explore how the logical concept has been implemented" >}} + {{< card link="covesa-and-beyond" title="COVESA eco-system and beyond" icon="document-text" subtitle="Explore how the playground fits into the wider eco-system" >}} +{{< /cards >}} diff --git a/docs/doc-site/content/docs/overview/cdsp-implementation-concept.md b/docs/doc-site/content/docs/overview/cdsp-implementation-concept.md new file mode 100644 index 00000000..15ea3c79 --- /dev/null +++ b/docs/doc-site/content/docs/overview/cdsp-implementation-concept.md @@ -0,0 +1,72 @@ +--- +title: "Implementation concept" +weight: 30 +--- + + +The prior section describing the logical concept should be read to understand the concepts to be implemented. + +As outlined in the logical description, as a starting point the Service is realized as a basic building block combining VISS Data Server with highly functional (VSS) Data Store. + +### VISS data server +The reference implementation for the COVESA VISS specification is developed in the [VISSR](https://github.com/COVESA/vissr) project. +The playground has included VISSR to provide its northbound VISS support. + +Alongside the VISS server the VISSR project provides clients, feeders and tooling. Further details can be found in the upstream [VISSR documentation site](https://covesa.github.io/vissr/). + +During initial development of the playground the upstream VISSR project supported using SQLite, Redis or memcached databases as its data store. + +### Highly functional (VSS) data store +As explained earlier in the [logical concept]({{< ref "cdsp-logical-concept.md/#components" >}} "data store logical description") the playground includes the use of highly functional VSS data stores to expand the available data processing possibilities. Two archetypes were considered: +1. Database server with timeseries capabilities +2. Application database + +The OSS Apache IoTDB project was selected for the database server archetype for reasons explained in the [section](#apache-iotdb) below. + +To enable access to VSS data stored in IoTDB using the VISS protocol the playground project extended VISSR to support IoTDB as one of its supported data store backends. That support was upstreamed and merged. + +For the application database archetype MongoDB Realm was selected. Support for it is currently a work in progress as part of the playground project backlog. + +#### Apache IoTDB + +The Apache IoTDB [project page](https://iotdb.apache.org/) describes IoTDB as: + +_"Apache IoTDB (Database for Internet of Things) is an IoT native database with high performance for data management and analysis, deployable on the edge and the cloud. Due to its light-weight architecture, high performance and rich feature set together with its deep integration with Apache Hadoop, Spark and Flink, Apache IoTDB can meet the requirements of massive data storage, high-speed data ingestion and complex data analysis in the IoT industrial fields."_ + +The diagram below summarizes some of the features that make it an attractive addition to the playground. + +{{< figure src="/images/Apache-IoTDB-feature-summary.drawio.svg" title="Summary of Apache IoTDB features" >}} + ++ The focus on timeseries IoT data delivering high throughput, with low latency are a good fit with the automotive domain. The availability of a single node (Edge) server build is critical for in-vehicle investigations and is supported by the existence of a cluster build for the cloud if needed. + ++ Its support for client server, event and streaming data architectures allows for flexible operation using a single solution. + ++ It also has very wide API support that greatly enhances the pluggability of the data store into other components, whilst supporting the playground project goal of loose coupling. + ++ Similarly the wide range of integrations into other tools and frameworks, particularly the Apache big data stack, simplifies the integration of VSS and associated data into data-centric workflows. + ++ IoTDB has a wide range of built-in timeseries data processing and analysis functions covering topics such as data quality, profiling, repair, anomaly detection and series discovery. For example, in-vehicle data analysis can be performed to derive some information or knowledge and then data reduced for further processing in the cloud. + ++ As well as Native APIs IoTDB also supports a SQL-like query language. This supports the describing of work in logical terms that affords some portability to other solutions. + +## Deployment +The project is currently targeting two deployment scenarios: +1. Easy to develop: make it easy to build, modify and trial by providing a containerized instance running on a host using [Docker containers](https://www.docker.com/). +2. Closer to production: the same base code should be deployable to systems closer to production, including on automotive hardware (or its simulation), e.g. [Yocto](https://www.yoctoproject.org/), container orchestration, [Service-orientated architecture (SOA)](https://en.wikipedia.org/wiki/Service-oriented_architecture) etc. + +Docker containers are chosen to facilitate the rapid integration and/or swapping of technology options. Be it internals of the playground itself, or connection to other components. For example, users can easily integrate the playground into their own [docker compose](https://docs.docker.com/compose/) containing other components. + +#### Status +The containerized docker deployment is available. Deployment on automotive hardware is currently not but is part of the project backlog. + +### Host based Docker + +The playground provides docker compose files to deploy the playground using docker images. The deployment contains three main services, for Apache IoTDB, VISSR and Redis. + +Please see the playground docker readme.md in the source tree for details. + +The service definitions are based on the upstream compose files from the IoTDB and VISSR projects. + +### Automotive hardware + +The project will provide information as hardware deployment progresses. \ No newline at end of file diff --git a/docs/doc-site/content/docs/overview/cdsp-logical-concept.md b/docs/doc-site/content/docs/overview/cdsp-logical-concept.md new file mode 100644 index 00000000..31f7cba2 --- /dev/null +++ b/docs/doc-site/content/docs/overview/cdsp-logical-concept.md @@ -0,0 +1,148 @@ +--- +title: "Logical concept" +weight: 20 +--- + +## Importance of maintaining a logical concept +COVESA is a grass roots OSS automotive alliance. From a communication and community perspective it is important to maintain descriptions of the logical concepts. Discussion at a logical level allows different parties to collaborate on common concepts, whilst making different implementation decisions, e.g. in product/technology selection or system architecture for example. That however does not mean we need spend months in philosophical discussions before moving to implementation. Instead logical concepts (why, what) can be developed alongside implementation. + +The Data Architecture team therefore intends to maintain concepts for both logical and implementation alongside each other for their projects using the playground. + +Of course it is perfectly normal that in _using_ the playground to develop an idea, example or pattern, that an architecture and components are chosen as part of the design. + +## Why _Central Data Service Playground_ ? + +### Problem +OEMs have presented various open questions and requirements in tackling growing software complexity. One representative list appears below. + +"Key questions for a End-to-End Data Architecture: +- How data can be shared between all touchpoints? +- How different domains of data share same tech +stack? +- How should a bidirectional sync work? +- Who is responsible for conflict management? +- Who takes care about permissions, roles, rights +and privacy? +- How the data model can be updated and synced? +- How subscriptions can be handled? +- How to handle historized and time series data ... +- ...on different touchpoints? +- How to handle multiple sync endpoints? +- How to handle unidirectional data streams? +- How (new) knowledge ... +- ... can be shared with others?" + +Source: [_"Building Bridges with a common Data Middleware"_, OEM, COVESA Autumn 2023 AMM](https://wiki.covesa.global/download/attachments/78840403/COVESA_DataMiddleware-PoC-Status_v2.pdf?version=1&modificationDate=1698737955726&api=v2) + +At the same time there has been a realization that some problems require open collaboration. + +### Goal +The playground was first conceived by the COVESA Data Architecture team to meet their needs in addressing these problems. They also recognized similar needs in the wider community inside and outside COVESA. For example, for COVESA to demonstrate how VSS data can be used with its eco-system for newcomers. + +The playground goals from the introductory overview: + +_The Central Data Service Playground (CDSP) serves as a neutral, open playground for data services both within and outside the vehicle in the context of data-centric architectures. It enables investigation into the internals of these services and how they can be combined. Furthermore, the playground provides a means to publish and collaborate on such work in the open._ + +The following sections address the Why, What and How in more detail. + +### Why _Central Data Service_? + ++ VSS is a mechanism of abstraction. The COVESA logical architecture for the VSS eco-system shown below places operation in the 'big ECUs', in zonal ECUs and above. Discussion of next-gen and data-centric architectures suggests investigation into data services in zone, domain and HPC controller scenarios and the cooperation between them. Hence _Central_. + +{{< figure src="/images/Logical-Architecture-Overview.drawio.svg" title="The COVESA Logical Architecture">}} + + ++ A repeating pattern of discussion in the COVESA Data Architecture team is the combination of VSS Data Server and VSS Data Store with advanced features and their connection southbound to feeders/native data and northbound to clients and off-board. Hence _Data Service_. + ++ The name Central Data Service is not an attempt to introduce a new category of component. It is used here simply as a useful synonym for what otherwise would be a longer descriptive phrase explaining combinations of VSS centric Data Server and Store and their location in the vehicle. + + ### Why _Playground_? Why not PoC? + ++ A PoC is often a snapshot in time and often specific in scope. Playground suggests greater flexibility. The central service, the Lego building block, is intended to be flexible and evolving. Similarly with what it is combined with to illustrate COVESA concepts and technology. + ++ The Playground could certainly be used to implement a PoC. + ++ Patterns such as view/controller, out of the box data servers, data stores linked to applications (e.g. SQLite) etc are well known. The Service could in part be defined by what's not known, by open questions in next-gen architectures such as data-centric architectures, that needs to be tackled down. The Playground is the means to doing that and illustrating the results. + +## What? + +### Requirements + +{{< figure src="/images/cdsp-logical-concept.drawio.svg" title="The data service core requirements" >}} + +At its core the service has requirements in three key areas: + +1. Data Models: the live data models - VSS as the abstracted view of the vehicle, along with other adjacent data models such as personal data. + +2. Persistence: history of the model and signals etc - historical and cached timeseries data. + +3. Application logic / APIs: standardized APIs for accessing the data such as the [Vehicle Information Service Specification (VISS)](https://github.com/COVESA/vehicle-information-service-specification) + or GraphQL. + +_Additional requirements:_ It is recognized that additional features, such as synchronization are absolutely desirable and have been a part of discussions in the Data Architecture team. Such features may also already be part of the feature set of the playground components. For example, both the Apache IoTDB and MongoDB Realm databases have sync capabilities. A base feature set is described as a starting point to help readers quickly grasp the concept. Additional features will be created or illustrated collectively based on interest and participation. + +### Components + +As a starting point the playground has been realized as a 'project of projects' to create the basic building block data service. Achieved by combining a VISS Data Protocol Server with highly functional VSS Data Stores. + +The VISS Protocol Server principally provides northbound get/set/sub application logic using the VISS protocol. Along with the secondary benefit of any additional features provided by the server. + +'Highly functional' in the context of the VSS Data Store means the flexible means to store, query, process and analysis timeseries data. An archetype would be a database server that can operate in-vehicle and the cloud. Such a component provides the possibility of using a variety of different architecture patterns, such as both client-server and event-driven, or data processing approaches. + +### Flexibility in use + +As well as the mentioned flexibility in implementation, flexibility in use is also intended: + ++ With some supporting documentation it can help meet the ongoing request from newcomers to the VSS eco-system as to how VSS can be used. + ++ The Data Architecture group has various topics it wishes to investigate related to data-centric architectures. Data layer topics such as sync, data reduction and data quality. Also separation of concerns and cooperation between data and knowledge layers. + ++ The playground can be used to investigate internals of data services. For example, connecting to medium and high speed data, or adding a protocol. + ++ External connections with other systems may also be a focus. For example, combining the service with other components to implement a particular touchpoint such as mobile. + +Further details can be found in the following sections. + +### The Playground in context + +To help understand its use lets quickly place the playground in context. + +**Big picture**: As stated above the COVESA logical architecture places its scope at Zonal ECUs and above as shown in the diagram. It is assumed that the playground would likely be deployed on a Zone, Domain or Central controller, with corresponding h/w capabilities. + +**Interaction between 'Large ECU'**: In the COVESA Data Architecture team it is recognized that zone/domain specific data services will need to synchronize and cooperate between themselves and/or with a central vehicle computer, e.g. Inter-controller sync/cooperation: + +![Cooperation between zonal data stores and central data service/store](https://raw.githubusercontent.com/slawr/vss-otaku/master/in-vehicle-storage/apache-iotdb/doc/zonal-vss-store-cooperation.drawio.svg "Cooperation between zonal data stores") +Source: [vss-otaku](https://github.com/slawr/vss-otaku) + +**In-vehicle southbound**: The playground can be integrated southbound to lower parts of the vehicle and its native data, through data feeders and connectors. This can include making connections to other systems such as Autosar etc. + +**Northbound**: connections will be made to clients, mobile, cloud and major in-vehicle domains such as IVI running Android/Apple etc. + +**Logical domains**: Connections may also be made to other logical data domains. For example, there is an [knowledge layer proposal](https://wiki.covesa.global/x/cYI8B) made in the COVESA Data Architecture team that discusses the separation of concerns and interaction between knowledge, information and raw data layers as illustrated below. The Playground here could be used to provide the data/information layer services in its investigation. + +![Knowledge layer proposal](https://covesa.atlassian.net/wiki/download/attachments/39065679/Knowledge-Layer-v3.png?api=v2?width=50pc "Deployment illustration from the proposal") + Source: [knowledge layer proposal](https://wiki.covesa.global/x/cYI8B) + +### Project success factors + +1. Newcomers to COVESA technology use the playground to accelerate their understanding of how the technology can be used. That could be a looking at a simple instance of how a VSS data server is combined with a VSS data store and queried using VISS. It could also be a more complex instance that combines components to illustrate a longer specific end to end use case, e.g. mobile to vehicle connection. + +2. Internal groups within COVESA naturally use the logical concepts and the playground implementation in combination with other components to develop and disseminate ideas. This especially applies to the Data Architecture and Infrastructure pillar. + +3. Supporting materials such as patterns, diagrams, cookbooks etc are adopted as useful assets within and outside COVESA, which in turn helps socialization. + +## How? + ++ Address two high level implementation needs, keeping in mind a path towards production where possible: + + - Easy to develop: make it easy to build, modify and trial by providing an instance running on a host, e.g. using Docker container(s). + + - Closer to production: the same base code should be deployable to systems closer to production, including on automotive hardware (or its simulation), e.g. Yocto, container orchestration, SOA etc. + ++ A path towards production can be supported by using production components, rather than overly simple substitutes, where it makes sense. For instance a particular scenario may use Kafka in a cloud connection. The point is not to pick a winning product in a particular category, but to recognize that using a production tool can represent a category that is known to scale. Detailed requirements for a specific production project and product selection for it, is rightly left to that project. + ++ A generic code base for the basic building blocks should allow flexible compilation to meet those needs on multiple architectures, e.g. x86, ARM and RISC-V. The target for how it is used being a matter of deployment at a high level. + ++ Follow the OSS mantra of adopt where you can, extend if needed, create where necessary. + ++ Promote flexible reconfiguration of components by favouring loose coupling over tight coupling. \ No newline at end of file diff --git a/docs/doc-site/content/docs/overview/cdsp-overview.md b/docs/doc-site/content/docs/overview/cdsp-overview.md new file mode 100644 index 00000000..e3d955e0 --- /dev/null +++ b/docs/doc-site/content/docs/overview/cdsp-overview.md @@ -0,0 +1,13 @@ +--- +title: "Introduction" +weight: 10 +--- +The Central Data Service Playground (CDSP) serves as a neutral, open playground for data services both within and outside the vehicle in the context of data-centric architectures. It enables investigation into the internals of these services and how they can be combined. Furthermore, the playground provides a means to publish and collaborate on such work in the open. + +The playground was first conceived by the COVESA Data Architecture team to meet their needs. They also recognized that there were the same needs in the wider community inside and outside COVESA. For example, to demonstrate how VSS data can be used with its eco-system for newcomers. + +Next steps: + +1. [Logical concept]({{< ref "cdsp-logical-concept.md" >}} "Explore the logical concept") +2. [Implementation concept]({{< ref "cdsp-implementation-concept.md" >}} "Explore the implementation concept") +3. [COVESA eco-system and beyond]({{< ref "covesa-and-beyond.md" >}} "How the playground fits into the wider eco-system") \ No newline at end of file diff --git a/docs/doc-site/content/docs/overview/covesa-and-beyond.md b/docs/doc-site/content/docs/overview/covesa-and-beyond.md new file mode 100644 index 00000000..04b492c6 --- /dev/null +++ b/docs/doc-site/content/docs/overview/covesa-and-beyond.md @@ -0,0 +1,6 @@ +--- +title: "Combining with wider eco-system" +weight: 40 +--- + +\ \ No newline at end of file diff --git a/docs/doc-site/hugo.yaml b/docs/doc-site/hugo.yaml index 19c3f5e9..6e7863d5 100644 --- a/docs/doc-site/hugo.yaml +++ b/docs/doc-site/hugo.yaml @@ -1,8 +1,67 @@ -baseURL: https://example.org/ +#baseURL: https://example.org/ languageCode: en-us -title: My New Hugo Project + +# Hugo configuration file +title: Central Data Service Playground (CDSP) # import hextra as module module: imports: - path: github.com/imfing/hextra + +markup: + # allow raw html + goldmark: + renderer: + unsafe: true + + # enable hextra syntax highlight + highlight: + noClasses: false + +menu: + main: + - name: Docs + pageRef: /docs + weight: 1 + - name: About + pageRef: /about + weight: 2 + - name: Contact ↗ + url: "https://github.com/COVESA/cdsp/blob/main/README.md#project-resources" + weight: 3 + - name: Search + weight: 4 + params: + type: search + - name: GitHub + weight: 5 + url: "https://github.com/COVESA/cdsp" + params: + icon: github + - name: Slack + weight: 6 + url: "https://covesacommunity.slack.com/archives/C06353TRF5F" + params: + icon: slack + - name: LinkedIn + weight: 7 + url: "https://www.linkedin.com/company/covesa-alliance/" + params: + icon: linkedin + +params: + navbar: + displayTitle: true + displayLogo: false + + footer: + displayCopyright: false + displayPoweredBy: true + + editURL: + enable: true + base: "https://github.com/COVESA/cdsp/edit/main/docs/doc-site/content" + + imageZoom: + enable: true diff --git a/docs/doc-site/static/images/Apache-IoTDB-feature-summary.drawio.svg b/docs/doc-site/static/images/Apache-IoTDB-feature-summary.drawio.svg new file mode 100755 index 00000000..aa5503cb --- /dev/null +++ b/docs/doc-site/static/images/Apache-IoTDB-feature-summary.drawio.svg @@ -0,0 +1,4 @@ + + + +
APIs
APIs
Integrations
Integrations
Data Processing
Data Processing
- C++
- Rust
- Go
- Python
- Thrift RPC
- REST / OpenAPI
- MQTT
- TsFile
- C#
- JAVA
- Node.js
- JDBC
- C++...
- Flink   (TsFile, IoTDB, SQL)
- Spark   (TsFile, IoTDB)
- Hadoop (TsFile)
- Kafka
- Nifi
- DBeaver
- Telegrapf
- Grafana


- Flink   (TsFile, IoTDB, SQL)...
Built-in processing and analysis:
- Data Quality
- Data Profiling
- Anomaly Detection
- Frequency Domain Analysis
- Data Repair
- Series Discovery
- Machine Learning
- Extensions via User Defined
  Functions
Built-in processing and analys...
Flexible
Flexible
- Designed for timeseries IoT
- Efficient data structure
- High throughput
- Low latency rich query
- Edge and cluster versions

- Client server and event data
  architectures
- Streaming

- Triggers, Continuous Query
- Data synchronisation



- Designed for timeseries IoT...
Text is not SVG - cannot display
\ No newline at end of file diff --git a/docs/doc-site/static/images/Logical-Architecture-Overview.drawio.svg b/docs/doc-site/static/images/Logical-Architecture-Overview.drawio.svg new file mode 100644 index 00000000..1b5ba78b --- /dev/null +++ b/docs/doc-site/static/images/Logical-Architecture-Overview.drawio.svg @@ -0,0 +1,4 @@ + + + +
Cloud2cloud
Cloud2cloud
Data Store
Data Store
HU
HU
Computing
Computing
ADAS
ADAS
TCU
TCU
e.g. Adaptive, QM Posix
e.g. Adaptive, QM Posix
e.g. QM Posix
e.g. QM Posix
e.g. Adaptive, QM Posix
e.g. Adaptive, QM Posix
e.g. QM Posix
e.g. QM Posix
COVESA Data Expert Group scope
COVESA Data Expert Group scope

Overview of COVESA Logical Architecture

Focus on functional integration and data architecture.
Diagram v1.2

Overview of COVESA Logical Architecture...
Wired, e.g ETH
Wired, e.g ETH
Internet
Internet
Internet
Internet
Wireless,e.g. BLE, Wifi
Wireless,e.g. BLE, Wifi
Wireless,e.g. 4G, 5G
Wireless,e.g. 4G, 5G
Zone ECU
Zone ECU
ECU
ECU
ECU
ECU
ECU
ECU
ECU
ECU
wired e.g CAN, LIN, FlexRay
wired e.g CAN, LIN, FlexRay
ECU
ECU
ECU
ECU
ECU
ECU
ECU
ECU
e.g. Classic, QM OSEK
e.g. Classic, QM OSEK
Zone ECU
Zone ECU
ECU
ECU
ECU
ECU
ECU
ECU
ECU
ECU
wired e.g CAN, LIN, FlexRay
wired e.g CAN, LIN, FlexRay
ECU
ECU
ECU
ECU
ECU
ECU
ECU
ECU
e.g. Classic, QM OSEK
e.g. Classic, QM OSEK
Zone ECU
Zone ECU
ECU
ECU
ECU
ECU
ECU
ECU
ECU
ECU
wired e.g CAN, LIN, FlexRay
wired e.g CAN, LIN, FlexRay
ECU
ECU
ECU
ECU
ECU
ECU
ECU
ECU
e.g. Classic, QM OSEK
e.g. Classic, QM OSEK
Zone ECU
Zone ECU
ECU
ECU
ECU
ECU
ECU
ECU
ECU
ECU
wired e.g CAN, LIN, FlexRay
wired e.g CAN, LIN, FlexRay
ECU
ECU
ECU
ECU
ECU
ECU
ECU
ECU
e.g. Classic, QM OSEK
e.g. Classic, QM OSEK
Text is not SVG - cannot display
\ No newline at end of file diff --git a/docs/doc-site/static/images/cdsp-logical-concept.drawio.svg b/docs/doc-site/static/images/cdsp-logical-concept.drawio.svg new file mode 100755 index 00000000..283688c8 --- /dev/null +++ b/docs/doc-site/static/images/cdsp-logical-concept.drawio.svg @@ -0,0 +1,4 @@ + + + +
Central Data Service Playground
Central Data Service Playground
Persistence
(history of model, signals etc)
Persistence...
Data Models
(live data models, VSS, ..)
Data Models...
Application Logic / APIs
(VISS, Native API etc.)
Application Logic / APIs...
Text is not SVG - cannot display
\ No newline at end of file From c682366caf1e68fdc579abf4394280d471bd6967 Mon Sep 17 00:00:00 2001 From: Stephen Lawrence Date: Wed, 18 Mar 2026 18:32:53 +0000 Subject: [PATCH 3/9] doc-site: add .gitignore for Hugo files Signed-off-by: Stephen Lawrence --- docs/doc-site/.gitignore | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 docs/doc-site/.gitignore diff --git a/docs/doc-site/.gitignore b/docs/doc-site/.gitignore new file mode 100644 index 00000000..c5ba23aa --- /dev/null +++ b/docs/doc-site/.gitignore @@ -0,0 +1,3 @@ +# Hugo +**/.hugo_build.lock +/public/ From a7c7ae66fea0b9b021b938d8b78277fbdbd5392e Mon Sep 17 00:00:00 2001 From: Stephen Lawrence Date: Thu, 19 Mar 2026 15:44:28 +0000 Subject: [PATCH 4/9] doc site: replace placeholder home page The Hugo template created a placeholder home page. Modify the content so it states something sensible for CDSP for people who end up here, although currently the docs root page is a better landing page. Signed-off-by: Stephen Lawrence --- docs/doc-site/content/_index.md | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/docs/doc-site/content/_index.md b/docs/doc-site/content/_index.md index 72f68d83..2615ac5c 100644 --- a/docs/doc-site/content/_index.md +++ b/docs/doc-site/content/_index.md @@ -1,17 +1,13 @@ --- -title: My Site +title: "Welcome" toc: false --- -This is the landing page. +Welcome to the documentation site for the COVESA Central Data Service Playground (CDSP) ## Explore {{< cards >}} - {{< card link="docs" title="Docs" icon="book-open" >}} + {{< card link="docs" title="Documentation" icon="book-open" >}} {{< card link="about" title="About" icon="user" >}} {{< /cards >}} - -## Documentation - -For more information, visit [Hextra](https://imfing.github.io/hextra). From c5b2a2b07a6beb86331bdd74387bd8fd9e7441f2 Mon Sep 17 00:00:00 2001 From: Stephen Lawrence Date: Thu, 19 Mar 2026 15:58:06 +0000 Subject: [PATCH 5/9] doc site: enable click-to-zoom for existing doc images Hextra v0.12 introduced click-to-zoom support for Markdown images [1]. Testing showed that click-to-zoom for markdown using the form {{< figure src= title= >}} was not working. However it does work for the markdown form ![](<file>). So convert image links to use the second working form. [1] https://imfing.github.io/hextra/blog/v0.12/#image-zoom Signed-off-by: Stephen Lawrence <stephen.lawrence@renesas.com> --- .../content/docs/overview/cdsp-implementation-concept.md | 2 +- docs/doc-site/content/docs/overview/cdsp-logical-concept.md | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/docs/doc-site/content/docs/overview/cdsp-implementation-concept.md b/docs/doc-site/content/docs/overview/cdsp-implementation-concept.md index 15ea3c79..5ea9e427 100644 --- a/docs/doc-site/content/docs/overview/cdsp-implementation-concept.md +++ b/docs/doc-site/content/docs/overview/cdsp-implementation-concept.md @@ -35,7 +35,7 @@ _"Apache IoTDB (Database for Internet of Things) is an IoT native database with The diagram below summarizes some of the features that make it an attractive addition to the playground. -{{< figure src="/images/Apache-IoTDB-feature-summary.drawio.svg" title="Summary of Apache IoTDB features" >}} +![Summary of Apache IoTDB features](/images/Apache-IoTDB-feature-summary.drawio.svg "Summary of Apache IoTDB features") + The focus on timeseries IoT data delivering high throughput, with low latency are a good fit with the automotive domain. The availability of a single node (Edge) server build is critical for in-vehicle investigations and is supported by the existence of a cluster build for the cloud if needed. diff --git a/docs/doc-site/content/docs/overview/cdsp-logical-concept.md b/docs/doc-site/content/docs/overview/cdsp-logical-concept.md index 31f7cba2..75c54e8d 100644 --- a/docs/doc-site/content/docs/overview/cdsp-logical-concept.md +++ b/docs/doc-site/content/docs/overview/cdsp-logical-concept.md @@ -49,8 +49,7 @@ The following sections address the Why, What and How in more detail. + VSS is a mechanism of abstraction. The COVESA logical architecture for the VSS eco-system shown below places operation in the 'big ECUs', in zonal ECUs and above. Discussion of next-gen and data-centric architectures suggests investigation into data services in zone, domain and HPC controller scenarios and the cooperation between them. Hence _Central_. -{{< figure src="/images/Logical-Architecture-Overview.drawio.svg" title="The COVESA Logical Architecture">}} - +![The COVESA Logical Architecture](/images/Logical-Architecture-Overview.drawio.svg "The COVESA Logical Architecture") + A repeating pattern of discussion in the COVESA Data Architecture team is the combination of VSS Data Server and VSS Data Store with advanced features and their connection southbound to feeders/native data and northbound to clients and off-board. Hence _Data Service_. @@ -68,7 +67,7 @@ The following sections address the Why, What and How in more detail. ### Requirements -{{< figure src="/images/cdsp-logical-concept.drawio.svg" title="The data service core requirements" >}} +![The data service core requirements](/images/cdsp-logical-concept.drawio.svg "The data service core requirements") At its core the service has requirements in three key areas: From 6f7b02302a38717201e352f4e3d96ff517bc38fd Mon Sep 17 00:00:00 2001 From: Stephen Lawrence <stephen.lawrence@renesas.com> Date: Thu, 19 Mar 2026 16:59:57 +0000 Subject: [PATCH 6/9] doc site: add github workflow for deploying Hugo site Add the Hextra example github workflow for building the new Hugo Hextra documentation site and deploying it to github pages. Signed-off-by: Stephen Lawrence <stephen.lawrence@renesas.com> --- .github/workflows/pages.yaml | 76 ++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 .github/workflows/pages.yaml diff --git a/.github/workflows/pages.yaml b/.github/workflows/pages.yaml new file mode 100644 index 00000000..f12e63af --- /dev/null +++ b/.github/workflows/pages.yaml @@ -0,0 +1,76 @@ +# Sample workflow for building and deploying a Hugo site to GitHub Pages +name: Deploy Hugo site to Pages + +on: + # Runs on pushes targeting the default branch + push: + branches: ["main"] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. +# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. +concurrency: + group: "pages" + cancel-in-progress: false + +# Default to bash +defaults: + run: + shell: bash + +jobs: + # Build job + build: + runs-on: ubuntu-latest + env: + HUGO_VERSION: 0.156.0 + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 # fetch all history for .GitInfo and .Lastmod + submodules: recursive + - name: Setup Go + uses: actions/setup-go@v5 + with: + go-version: '1.26' + - name: Setup Pages + id: pages + uses: actions/configure-pages@v4 + - name: Setup Hugo + run: | + wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.deb \ + && sudo dpkg -i ${{ runner.temp }}/hugo.deb + - name: Build with Hugo + env: + # For maximum backward compatibility with Hugo modules + HUGO_ENVIRONMENT: production + HUGO_ENV: production + run: | + hugo \ + --gc --minify \ + --baseURL "${{ steps.pages.outputs.base_url }}/" + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + path: ./public + + # Deployment job + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + needs: build + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 From 99d694787bbb3771a6a595a6e54ba9bd8db16abf Mon Sep 17 00:00:00 2001 From: Stephen Lawrence <stephen.lawrence@renesas.com> Date: Thu, 19 Mar 2026 19:19:41 +0000 Subject: [PATCH 7/9] doc site: adjust github workflow for our source tree setup Tell the Hugo build where to find the doc site source tree Signed-off-by: Stephen Lawrence <stephen.lawrence@renesas.com> --- .github/workflows/pages.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/pages.yaml b/.github/workflows/pages.yaml index f12e63af..fdf1e639 100644 --- a/.github/workflows/pages.yaml +++ b/.github/workflows/pages.yaml @@ -57,11 +57,12 @@ jobs: run: | hugo \ --gc --minify \ + -s ./docs/doc-site --baseURL "${{ steps.pages.outputs.base_url }}/" - name: Upload artifact uses: actions/upload-pages-artifact@v3 with: - path: ./public + path: ./docs/doc-site/public # Deployment job deploy: From cf5db9627411fe73c9e97789e3e71fb019fe7c05 Mon Sep 17 00:00:00 2001 From: Stephen Lawrence <stephen.lawrence@renesas.com> Date: Thu, 19 Mar 2026 19:38:35 +0000 Subject: [PATCH 8/9] doc site: remove content for old site in /docs/docs-gen Remove the content for the old doc site in /docs/docs-gen/ that used the Learn Hugo theme and old Hugo version. Signed-off-by: Stephen Lawrence <stephen.lawrence@renesas.com> --- .../Apache-IoTDB-feature-summary.drawio.svg | 4 - .../Logical-Architecture-Overview.drawio.svg | 4 - .../assets/cdsp-logical-concept.drawio.svg | 4 - docs/docs-gen/config.toml | 22 -- docs/docs-gen/content/_index.md | 20 -- docs/docs-gen/content/examples/_index.md | 69 ------ docs/docs-gen/content/manuals/_index.md | 9 - docs/docs-gen/content/manuals/apache-iotdb.md | 225 ----------------- docs/docs-gen/content/manuals/vissr-viss.md | 11 - docs/docs-gen/content/overview/_index.md | 9 - .../overview/cdsp-implementation-concept.md | 72 ------ .../content/overview/cdsp-logical-concept.md | 147 ------------ .../content/overview/cdsp-overview.md | 13 - .../content/overview/covesa-and-beyond.md | 6 - docs/docs-gen/data/units.yaml | 226 ------------------ docs/docs-gen/layouts/partials/favicon.html | 1 - docs/docs-gen/layouts/partials/logo.html | 3 - docs/docs-gen/static/images/cdsp.png | Bin 12903 -> 0 bytes docs/docs-gen/static/images/fav.png | Bin 1953 -> 0 bytes docs/docs-gen/themes/learn | 1 - 20 files changed, 846 deletions(-) delete mode 100755 docs/docs-gen/assets/Apache-IoTDB-feature-summary.drawio.svg delete mode 100755 docs/docs-gen/assets/Logical-Architecture-Overview.drawio.svg delete mode 100755 docs/docs-gen/assets/cdsp-logical-concept.drawio.svg delete mode 100644 docs/docs-gen/config.toml delete mode 100644 docs/docs-gen/content/_index.md delete mode 100644 docs/docs-gen/content/examples/_index.md delete mode 100644 docs/docs-gen/content/manuals/_index.md delete mode 100644 docs/docs-gen/content/manuals/apache-iotdb.md delete mode 100644 docs/docs-gen/content/manuals/vissr-viss.md delete mode 100644 docs/docs-gen/content/overview/_index.md delete mode 100644 docs/docs-gen/content/overview/cdsp-implementation-concept.md delete mode 100644 docs/docs-gen/content/overview/cdsp-logical-concept.md delete mode 100644 docs/docs-gen/content/overview/cdsp-overview.md delete mode 100644 docs/docs-gen/content/overview/covesa-and-beyond.md delete mode 100644 docs/docs-gen/data/units.yaml delete mode 100644 docs/docs-gen/layouts/partials/favicon.html delete mode 100644 docs/docs-gen/layouts/partials/logo.html delete mode 100644 docs/docs-gen/static/images/cdsp.png delete mode 100644 docs/docs-gen/static/images/fav.png delete mode 160000 docs/docs-gen/themes/learn diff --git a/docs/docs-gen/assets/Apache-IoTDB-feature-summary.drawio.svg b/docs/docs-gen/assets/Apache-IoTDB-feature-summary.drawio.svg deleted file mode 100755 index aa5503cb..00000000 --- a/docs/docs-gen/assets/Apache-IoTDB-feature-summary.drawio.svg +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Do not edit this file with editors other than draw.io --> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="800px" height="266px" viewBox="-0.5 -0.5 800 266" content="<mxfile host="app.diagrams.net" modified="2024-03-28T17:00:22.284Z" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:120.0) Gecko/20100101 Firefox/120.0" etag="ZaB_68glDb__Ekshpdpg" version="24.2.0" type="google"> <diagram id="R2lEEEUBdFMjLlhIrx00" name="Page-1"> <mxGraphModel grid="1" page="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0" extFonts="Permanent Marker^https://fonts.googleapis.com/css?family=Permanent+Marker"> <root> <mxCell id="0" /> <mxCell id="1" parent="0" /> <mxCell id="zAlIkeHamDvOXhHfMb-1-5" value="APIs" style="shape=step;perimeter=stepPerimeter;whiteSpace=wrap;html=1;fixedSize=1;size=10;fillColor=#F2931E;strokeColor=none;fontSize=17;fontColor=#FFFFFF;fontStyle=1;align=center;rounded=0;" vertex="1" parent="1"> <mxGeometry x="220" y="30" width="200" height="30" as="geometry" /> </mxCell> <mxCell id="zAlIkeHamDvOXhHfMb-1-6" value="Integrations" style="shape=step;perimeter=stepPerimeter;whiteSpace=wrap;html=1;fixedSize=1;size=10;fillColor=#AE4132;strokeColor=none;fontSize=17;fontColor=#FFFFFF;fontStyle=1;align=center;rounded=0;" vertex="1" parent="1"> <mxGeometry x="420" y="30" width="200" height="30" as="geometry" /> </mxCell> <mxCell id="zAlIkeHamDvOXhHfMb-1-7" value="Data Processing" style="shape=step;perimeter=stepPerimeter;whiteSpace=wrap;html=1;fixedSize=1;size=10;fillColor=#23445D;strokeColor=none;fontSize=17;fontColor=#FFFFFF;fontStyle=1;align=center;rounded=0;" vertex="1" parent="1"> <mxGeometry x="620" y="30" width="200" height="30" as="geometry" /> </mxCell> <mxCell id="zAlIkeHamDvOXhHfMb-1-8" value="- C++&lt;br&gt;- Rust&lt;br&gt;- Go&lt;br&gt;&lt;div&gt;- Python&lt;/div&gt;&lt;div&gt;- Thrift RPC&lt;/div&gt;&lt;div&gt;- REST / OpenAPI&lt;br&gt;- MQTT&lt;br&gt;- TsFile&lt;br&gt;&lt;/div&gt;- C#&lt;br&gt;- JAVA&lt;br&gt;- Node.js&lt;br&gt;- JDBC" style="shape=rect;fillColor=#FCE7CD;strokeColor=none;fontSize=12;html=1;whiteSpace=wrap;align=left;verticalAlign=top;spacing=5;rounded=0;" vertex="1" parent="1"> <mxGeometry x="220" y="70" width="190" height="190" as="geometry" /> </mxCell> <mxCell id="zAlIkeHamDvOXhHfMb-1-10" value="&lt;div align=&quot;left&quot;&gt;- Flink&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;&amp;nbsp; (TsFile, IoTDB, SQL)&lt;br&gt;&lt;/div&gt;&lt;div align=&quot;left&quot;&gt;- Spark &lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;&amp;nbsp; (TsFile, IoTDB)&lt;/div&gt;&lt;div align=&quot;left&quot;&gt;- Hadoop (TsFile)&lt;/div&gt;&lt;div align=&quot;left&quot;&gt;- Kafka&lt;/div&gt;&lt;div align=&quot;left&quot;&gt;- Nifi&lt;/div&gt;&lt;div align=&quot;left&quot;&gt;- DBeaver&lt;/div&gt;&lt;div align=&quot;left&quot;&gt;- Telegrapf&lt;/div&gt;&lt;div align=&quot;left&quot;&gt;- Grafana&lt;/div&gt;&lt;div align=&quot;left&quot;&gt;&lt;br&gt;&lt;br&gt;&lt;/div&gt;" style="shape=rect;fillColor=#FAD9D5;strokeColor=none;fontSize=12;html=1;whiteSpace=wrap;align=left;verticalAlign=top;spacing=5;rounded=0;" vertex="1" parent="1"> <mxGeometry x="420" y="70" width="190" height="190" as="geometry" /> </mxCell> <mxCell id="zAlIkeHamDvOXhHfMb-1-12" value="&lt;div&gt;Built-in processing and analysis:&lt;br&gt;&lt;/div&gt;&lt;div&gt;- Data Quality&lt;/div&gt;&lt;div&gt;- Data Profiling&lt;/div&gt;&lt;div&gt;- Anomaly Detection&lt;/div&gt;&lt;div&gt;- Frequency Domain Analysis&lt;/div&gt;&lt;div&gt;- Data Repair&lt;/div&gt;&lt;div&gt;- Series Discovery&lt;/div&gt;&lt;div&gt;- Machine Learning&lt;/div&gt;&lt;div&gt;- Extensions via User Defined&lt;/div&gt;&lt;div&gt;&amp;nbsp; Functions&lt;/div&gt;" style="shape=rect;fillColor=#BAC8D3;strokeColor=none;fontSize=12;html=1;whiteSpace=wrap;align=left;verticalAlign=top;spacing=5;rounded=0;" vertex="1" parent="1"> <mxGeometry x="620" y="69" width="190" height="190" as="geometry" /> </mxCell> <mxCell id="zAlIkeHamDvOXhHfMb-1-14" value="Flexible" style="shape=step;perimeter=stepPerimeter;whiteSpace=wrap;html=1;fixedSize=1;size=10;fillColor=#10739E;strokeColor=none;fontSize=17;fontColor=#FFFFFF;fontStyle=1;align=center;rounded=0;" vertex="1" parent="1"> <mxGeometry x="20" y="30" width="200" height="30" as="geometry" /> </mxCell> <mxCell id="zAlIkeHamDvOXhHfMb-1-15" value="&lt;div align=&quot;left&quot;&gt;&lt;div align=&quot;left&quot;&gt;- Designed for timeseries IoT&lt;br&gt;&lt;/div&gt;&lt;div align=&quot;left&quot;&gt;- Efficient data structure &lt;br&gt;&lt;/div&gt;&lt;div align=&quot;left&quot;&gt;- High throughput&lt;/div&gt;&lt;div align=&quot;left&quot;&gt;- Low latency rich query&lt;br&gt;&lt;/div&gt;- Edge and cluster versions&lt;br&gt;&lt;div align=&quot;left&quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;div align=&quot;left&quot;&gt;- Client server and event data&lt;br&gt;&amp;nbsp; architectures&lt;br&gt;&lt;/div&gt;&lt;div align=&quot;left&quot;&gt;- Streaming&lt;/div&gt;&lt;div align=&quot;left&quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div align=&quot;left&quot;&gt;- Triggers, Continuous Query&lt;/div&gt;&lt;div align=&quot;left&quot;&gt;- Data synchronisation&lt;/div&gt;&lt;div align=&quot;left&quot;&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/div&gt;" style="shape=rect;fillColor=#B1DDF0;strokeColor=none;fontSize=12;html=1;whiteSpace=wrap;align=left;verticalAlign=top;spacing=5;rounded=0;" vertex="1" parent="1"> <mxGeometry x="20" y="70" width="190" height="190" as="geometry" /> </mxCell> </root> </mxGraphModel> </diagram> </mxfile> " resource="https://app.diagrams.net/#G1SmfUgbnbc5ijZ9UTIpuJ94hgZQHiaRFj#%7B%22pageId%22%3A%22R2lEEEUBdFMjLlhIrx00%22%7D"><defs/><g><g><path d="M 200 0 L 390 0 L 400 15 L 390 30 L 200 30 L 210 15 Z" fill="#f2931e" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 15px; margin-left: 201px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: #FFFFFF; "><div style="display: inline-block; font-size: 17px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;">APIs</div></div></div></foreignObject><text x="300" y="20" fill="#FFFFFF" font-family="Helvetica" font-size="17px" text-anchor="middle" font-weight="bold">APIs</text></switch></g></g><g><path d="M 400 0 L 590 0 L 600 15 L 590 30 L 400 30 L 410 15 Z" fill="#ae4132" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 15px; margin-left: 401px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: #FFFFFF; "><div style="display: inline-block; font-size: 17px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;">Integrations</div></div></div></foreignObject><text x="500" y="20" fill="#FFFFFF" font-family="Helvetica" font-size="17px" text-anchor="middle" font-weight="bold">Integrations</text></switch></g></g><g><path d="M 600 0 L 790 0 L 800 15 L 790 30 L 600 30 L 610 15 Z" fill="#23445d" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 15px; margin-left: 601px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: #FFFFFF; "><div style="display: inline-block; font-size: 17px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;">Data Processing</div></div></div></foreignObject><text x="700" y="20" fill="#FFFFFF" font-family="Helvetica" font-size="17px" text-anchor="middle" font-weight="bold">Data Processing</text></switch></g></g><g><rect x="200" y="40" width="190" height="190" fill="#fce7cd" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 182px; height: 1px; padding-top: 50px; margin-left: 205px;"><div style="box-sizing: border-box; font-size: 0px; text-align: left;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">- C++<br />- Rust<br />- Go<br /><div>- Python</div><div>- Thrift RPC</div><div>- REST / OpenAPI<br />- MQTT<br />- TsFile<br /></div>- C#<br />- JAVA<br />- Node.js<br />- JDBC</div></div></div></foreignObject><text x="205" y="62" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">- C++...</text></switch></g></g><g><rect x="400" y="40" width="190" height="190" fill="#fad9d5" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 182px; height: 1px; padding-top: 50px; margin-left: 405px;"><div style="box-sizing: border-box; font-size: 0px; text-align: left;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><div align="left">- Flink<span style="white-space: pre;"> </span>  (TsFile, IoTDB, SQL)<br /></div><div align="left">- Spark <span style="white-space: pre;"> </span>  (TsFile, IoTDB)</div><div align="left">- Hadoop (TsFile)</div><div align="left">- Kafka</div><div align="left">- Nifi</div><div align="left">- DBeaver</div><div align="left">- Telegrapf</div><div align="left">- Grafana</div><div align="left"><br /><br /></div></div></div></div></foreignObject><text x="405" y="62" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">- Flink   (TsFile, IoTDB, SQL)...</text></switch></g></g><g><rect x="600" y="39" width="190" height="190" fill="#bac8d3" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 182px; height: 1px; padding-top: 49px; margin-left: 605px;"><div style="box-sizing: border-box; font-size: 0px; text-align: left;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><div>Built-in processing and analysis:<br /></div><div>- Data Quality</div><div>- Data Profiling</div><div>- Anomaly Detection</div><div>- Frequency Domain Analysis</div><div>- Data Repair</div><div>- Series Discovery</div><div>- Machine Learning</div><div>- Extensions via User Defined</div><div>  Functions</div></div></div></div></foreignObject><text x="605" y="61" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">Built-in processing and analys...</text></switch></g></g><g><path d="M 0 0 L 190 0 L 200 15 L 190 30 L 0 30 L 10 15 Z" fill="#10739e" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 15px; margin-left: 1px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: #FFFFFF; "><div style="display: inline-block; font-size: 17px; font-family: Helvetica; color: rgb(255, 255, 255); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;">Flexible</div></div></div></foreignObject><text x="100" y="20" fill="#FFFFFF" font-family="Helvetica" font-size="17px" text-anchor="middle" font-weight="bold">Flexible</text></switch></g></g><g><rect x="0" y="40" width="190" height="190" fill="#b1ddf0" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 182px; height: 1px; padding-top: 50px; margin-left: 5px;"><div style="box-sizing: border-box; font-size: 0px; text-align: left;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><div align="left"><div align="left">- Designed for timeseries IoT<br /></div><div align="left">- Efficient data structure <br /></div><div align="left">- High throughput</div><div align="left">- Low latency rich query<br /></div>- Edge and cluster versions<br /><div align="left"><br /></div></div><div align="left">- Client server and event data<br />  architectures<br /></div><div align="left">- Streaming</div><div align="left"><br /></div><div align="left">- Triggers, Continuous Query</div><div align="left">- Data synchronisation</div><div align="left"><br /><br /><br /></div></div></div></div></foreignObject><text x="5" y="62" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">- Designed for timeseries IoT...</text></switch></g></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg> \ No newline at end of file diff --git a/docs/docs-gen/assets/Logical-Architecture-Overview.drawio.svg b/docs/docs-gen/assets/Logical-Architecture-Overview.drawio.svg deleted file mode 100755 index 1b5ba78b..00000000 --- a/docs/docs-gen/assets/Logical-Architecture-Overview.drawio.svg +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Do not edit this file with editors other than draw.io --> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="915px" height="782px" viewBox="-0.5 -0.5 915 782" content="<mxfile host="app.diagrams.net" modified="2024-04-05T18:26:27.884Z" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:120.0) Gecko/20100101 Firefox/120.0" etag="Z92dzJvIMBi3dfKRI1jE" version="24.2.0" type="google"> <diagram name="Page-1" id="m6MxymNVx2oO-Yp29mNL"> <mxGraphModel grid="1" page="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" pageScale="1" pageWidth="1169" pageHeight="827" math="0" shadow="0"> <root> <mxCell id="0" /> <mxCell id="1" parent="0" /> <mxCell id="lbM4oX9S54B-aaULRCX6-146" value="" style="endArrow=none;dashed=1;html=1;dashPattern=1 3;strokeWidth=2;rounded=0;strokeColor=#4D9900;" edge="1" parent="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="100" y="541" as="sourcePoint" /> <mxPoint x="100" y="100" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-138" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0.02;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.5;entryY=0.02;entryDx=0;entryDy=0;entryPerimeter=0;endArrow=none;endFill=0;" edge="1" parent="1" source="lbM4oX9S54B-aaULRCX6-1" target="lbM4oX9S54B-aaULRCX6-2"> <mxGeometry relative="1" as="geometry"> <Array as="points"> <mxPoint x="825" y="121" /> <mxPoint x="615" y="121" /> </Array> </mxGeometry> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-1" value="" style="sketch=0;aspect=fixed;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=none;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;align=center;fillColor=#00188D;shape=mxgraph.mscae.enterprise.internet_hollow" vertex="1" parent="1"> <mxGeometry x="760" y="150" width="129.03" height="80" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-4" value="Cloud2cloud" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1"> <mxGeometry x="705.48" y="241" width="100" height="30" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-136" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=0.02;entryDx=0;entryDy=0;entryPerimeter=0;endArrow=none;endFill=0;" edge="1" parent="1" target="lbM4oX9S54B-aaULRCX6-2"> <mxGeometry relative="1" as="geometry"> <Array as="points"> <mxPoint x="316" y="181" /> <mxPoint x="615" y="181" /> </Array> <mxPoint x="316" y="271" as="sourcePoint" /> </mxGeometry> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-10" value="" style="group" connectable="0" vertex="1" parent="1"> <mxGeometry x="561" y="217" width="129.02999999999997" height="80" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-2" value="" style="sketch=0;aspect=fixed;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=none;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;align=center;fillColor=#00188D;shape=mxgraph.mscae.enterprise.internet_hollow" vertex="1" parent="lbM4oX9S54B-aaULRCX6-10"> <mxGeometry width="129.03" height="80" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-5" value="Data Store" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="lbM4oX9S54B-aaULRCX6-10"> <mxGeometry x="34.51999999999998" y="30" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-126" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="1" source="lbM4oX9S54B-aaULRCX6-13" target="lbM4oX9S54B-aaULRCX6-18"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-131" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="1" source="lbM4oX9S54B-aaULRCX6-13" target="lbM4oX9S54B-aaULRCX6-66"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-13" value="&lt;b&gt;HU&lt;/b&gt;" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> <mxGeometry x="184" y="420" width="110" height="50" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-129" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="1" source="lbM4oX9S54B-aaULRCX6-14" target="lbM4oX9S54B-aaULRCX6-66"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-132" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="1" source="lbM4oX9S54B-aaULRCX6-14" target="lbM4oX9S54B-aaULRCX6-86"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-14" value="&lt;b&gt;Computing&lt;/b&gt;" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> <mxGeometry x="362" y="420" width="108" height="50" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-130" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="1" source="lbM4oX9S54B-aaULRCX6-15" target="lbM4oX9S54B-aaULRCX6-107"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-15" value="&lt;b&gt;ADAS&lt;/b&gt;" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> <mxGeometry x="710" y="420" width="110.97" height="50" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-128" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;endArrow=none;endFill=0;" edge="1" parent="1" source="lbM4oX9S54B-aaULRCX6-16" target="lbM4oX9S54B-aaULRCX6-86"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-133" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="1" source="lbM4oX9S54B-aaULRCX6-16" target="lbM4oX9S54B-aaULRCX6-107"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-16" value="&lt;b&gt;TCU&lt;/b&gt;" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> <mxGeometry x="540" y="420" width="110" height="50" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-141" value="e.g. Adaptive, QM Posix" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=10;" vertex="1" parent="1"> <mxGeometry x="356" y="391" width="120" height="30" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-142" value="&lt;div&gt;e.g. QM Posix&lt;/div&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=10;" vertex="1" parent="1"> <mxGeometry x="534" y="391" width="120" height="30" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-143" value="e.g. Adaptive, QM Posix" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=10;" vertex="1" parent="1"> <mxGeometry x="705.48" y="391" width="120" height="30" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-144" value="&lt;div align=&quot;left&quot;&gt;e.g. QM Posix&lt;/div&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=10;" vertex="1" parent="1"> <mxGeometry x="184" y="390" width="120" height="30" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-148" value="" style="endArrow=none;dashed=1;html=1;dashPattern=1 3;strokeWidth=2;rounded=0;strokeColor=#4D9900;" edge="1" parent="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="100" y="97" as="sourcePoint" /> <mxPoint x="930" y="97" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-149" value="" style="endArrow=none;dashed=1;html=1;dashPattern=1 3;strokeWidth=2;rounded=0;strokeColor=#4D9900;" edge="1" parent="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="930" y="370" as="sourcePoint" /> <mxPoint x="930" y="91" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-152" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.75;entryY=1;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;endArrow=none;endFill=0;" edge="1" parent="1" source="lbM4oX9S54B-aaULRCX6-2" target="lbM4oX9S54B-aaULRCX6-142"> <mxGeometry relative="1" as="geometry"> <mxPoint x="624" y="301" as="sourcePoint" /> <Array as="points"> <mxPoint x="624" y="291" /> </Array> </mxGeometry> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-153" value="" style="endArrow=none;dashed=1;html=1;dashPattern=1 3;strokeWidth=2;rounded=0;strokeColor=#4D9900;" edge="1" parent="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="930" y="371" as="sourcePoint" /> <mxPoint x="680" y="371" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-154" value="" style="endArrow=none;dashed=1;html=1;dashPattern=1 3;strokeWidth=2;rounded=0;strokeColor=#4D9900;" edge="1" parent="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="680" y="491" as="sourcePoint" /> <mxPoint x="680" y="370" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-155" value="" style="endArrow=none;dashed=1;html=1;dashPattern=1 3;strokeWidth=2;rounded=0;strokeColor=#4D9900;" edge="1" parent="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="680" y="491" as="sourcePoint" /> <mxPoint x="950" y="491" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-156" value="" style="endArrow=none;dashed=1;html=1;dashPattern=1 3;strokeWidth=2;rounded=0;strokeColor=#4D9900;" edge="1" parent="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="950" y="491" as="sourcePoint" /> <mxPoint x="950" y="551" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-159" value="COVESA Data Expert Group scope" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=10;" vertex="1" parent="1"> <mxGeometry x="106" y="93" width="170" height="30" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-163" value="&lt;h2&gt;Overview of COVESA Logical Architecture&lt;br&gt;&lt;/h2&gt;&lt;p&gt;Focus on functional integration and data architecture.&lt;br&gt;Diagram v1.2&lt;/p&gt;" style="text;html=1;strokeColor=none;fillColor=none;spacing=5;spacingTop=-20;whiteSpace=wrap;overflow=hidden;rounded=0;" vertex="1" parent="1"> <mxGeometry x="96" y="10" width="884" height="70" as="geometry" /> </mxCell> <mxCell id="Y32u6Zx35F62YdrX8PYx-2" value="Wired, e.g ETH" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=10;" vertex="1" parent="1"> <mxGeometry x="280" y="480" width="90" height="30" as="geometry" /> </mxCell> <mxCell id="Y32u6Zx35F62YdrX8PYx-3" value="Internet" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=10;" vertex="1" parent="1"> <mxGeometry x="320" y="160" width="50" height="30" as="geometry" /> </mxCell> <mxCell id="Y32u6Zx35F62YdrX8PYx-4" value="Internet" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=10;" vertex="1" parent="1"> <mxGeometry x="620" y="100" width="50" height="30" as="geometry" /> </mxCell> <mxCell id="Y32u6Zx35F62YdrX8PYx-5" value="Wireless,e.g. BLE, Wifi" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=10;" vertex="1" parent="1"> <mxGeometry x="420" y="359" width="120" height="30" as="geometry" /> </mxCell> <mxCell id="Y32u6Zx35F62YdrX8PYx-6" value="Wireless,e.g. 4G, 5G" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=10;" vertex="1" parent="1"> <mxGeometry x="630" y="297" width="120" height="30" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-64" value="" style="group" connectable="0" vertex="1" parent="1"> <mxGeometry x="80" y="515" width="214" height="266" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-145" value="" style="endArrow=none;dashed=1;html=1;dashPattern=1 3;strokeWidth=2;rounded=0;strokeColor=#4D9900;entryX=0.692;entryY=1.2;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="lbM4oX9S54B-aaULRCX6-64" target="lbM4oX9S54B-aaULRCX6-125"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="20" y="33" as="sourcePoint" /> <mxPoint x="850" y="36" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-18" value="&lt;b&gt;Zone ECU&lt;/b&gt;" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="lbM4oX9S54B-aaULRCX6-64"> <mxGeometry x="40" y="26" width="90" height="30" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-22" value="ECU" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="lbM4oX9S54B-aaULRCX6-64"> <mxGeometry y="86" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-34" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="lbM4oX9S54B-aaULRCX6-64" source="lbM4oX9S54B-aaULRCX6-18" target="lbM4oX9S54B-aaULRCX6-22"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-23" value="ECU" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="lbM4oX9S54B-aaULRCX6-64"> <mxGeometry x="111" y="86" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-39" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="lbM4oX9S54B-aaULRCX6-64" source="lbM4oX9S54B-aaULRCX6-18" target="lbM4oX9S54B-aaULRCX6-23"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-36" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="lbM4oX9S54B-aaULRCX6-64" source="lbM4oX9S54B-aaULRCX6-25" target="lbM4oX9S54B-aaULRCX6-18"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-25" value="ECU" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="lbM4oX9S54B-aaULRCX6-64"> <mxGeometry y="136" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-26" value="ECU" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="lbM4oX9S54B-aaULRCX6-64"> <mxGeometry x="111" y="136" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-41" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="lbM4oX9S54B-aaULRCX6-64" source="lbM4oX9S54B-aaULRCX6-18" target="lbM4oX9S54B-aaULRCX6-26"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-37" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;endArrow=none;endFill=0;" edge="1" parent="lbM4oX9S54B-aaULRCX6-64" source="lbM4oX9S54B-aaULRCX6-27" target="lbM4oX9S54B-aaULRCX6-18"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-44" value="wired e.g CAN, LIN, FlexRay" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];rotation=90;fontSize=9;" connectable="0" vertex="1" parent="lbM4oX9S54B-aaULRCX6-37"> <mxGeometry x="-0.4" y="-1" relative="1" as="geometry"> <mxPoint x="9" y="-19" as="offset" /> </mxGeometry> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-27" value="ECU" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="lbM4oX9S54B-aaULRCX6-64"> <mxGeometry y="186" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-28" value="ECU" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="lbM4oX9S54B-aaULRCX6-64"> <mxGeometry x="110" y="186" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-40" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="lbM4oX9S54B-aaULRCX6-64" source="lbM4oX9S54B-aaULRCX6-18" target="lbM4oX9S54B-aaULRCX6-28"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-29" value="ECU" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="lbM4oX9S54B-aaULRCX6-64"> <mxGeometry y="236" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-32" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="lbM4oX9S54B-aaULRCX6-64" source="lbM4oX9S54B-aaULRCX6-18" target="lbM4oX9S54B-aaULRCX6-29"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-30" value="ECU" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="lbM4oX9S54B-aaULRCX6-64"> <mxGeometry x="110" y="236" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-42" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="lbM4oX9S54B-aaULRCX6-64" source="lbM4oX9S54B-aaULRCX6-18" target="lbM4oX9S54B-aaULRCX6-30"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-63" value="e.g. Classic, QM OSEK" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=10;" vertex="1" parent="lbM4oX9S54B-aaULRCX6-64"> <mxGeometry x="94" width="120" height="30" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-65" value="" style="group" connectable="0" vertex="1" parent="1"> <mxGeometry x="320" y="515" width="214" height="266" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-66" value="&lt;b&gt;Zone ECU&lt;/b&gt;" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="lbM4oX9S54B-aaULRCX6-65"> <mxGeometry x="40" y="26" width="90" height="30" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-67" value="ECU" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="lbM4oX9S54B-aaULRCX6-65"> <mxGeometry y="86" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-68" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="lbM4oX9S54B-aaULRCX6-65" source="lbM4oX9S54B-aaULRCX6-66" target="lbM4oX9S54B-aaULRCX6-67"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-69" value="ECU" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="lbM4oX9S54B-aaULRCX6-65"> <mxGeometry x="111" y="86" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-70" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="lbM4oX9S54B-aaULRCX6-65" source="lbM4oX9S54B-aaULRCX6-66" target="lbM4oX9S54B-aaULRCX6-69"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-71" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="lbM4oX9S54B-aaULRCX6-65" source="lbM4oX9S54B-aaULRCX6-72" target="lbM4oX9S54B-aaULRCX6-66"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-72" value="ECU" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="lbM4oX9S54B-aaULRCX6-65"> <mxGeometry y="136" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-73" value="ECU" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="lbM4oX9S54B-aaULRCX6-65"> <mxGeometry x="111" y="136" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-74" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="lbM4oX9S54B-aaULRCX6-65" source="lbM4oX9S54B-aaULRCX6-66" target="lbM4oX9S54B-aaULRCX6-73"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-75" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;endArrow=none;endFill=0;" edge="1" parent="lbM4oX9S54B-aaULRCX6-65" source="lbM4oX9S54B-aaULRCX6-77" target="lbM4oX9S54B-aaULRCX6-66"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-76" value="wired e.g CAN, LIN, FlexRay" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];rotation=90;fontSize=9;" connectable="0" vertex="1" parent="lbM4oX9S54B-aaULRCX6-75"> <mxGeometry x="-0.4" y="-1" relative="1" as="geometry"> <mxPoint x="9" y="-19" as="offset" /> </mxGeometry> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-77" value="ECU" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="lbM4oX9S54B-aaULRCX6-65"> <mxGeometry y="186" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-78" value="ECU" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="lbM4oX9S54B-aaULRCX6-65"> <mxGeometry x="110" y="186" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-79" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="lbM4oX9S54B-aaULRCX6-65" source="lbM4oX9S54B-aaULRCX6-66" target="lbM4oX9S54B-aaULRCX6-78"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-80" value="ECU" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="lbM4oX9S54B-aaULRCX6-65"> <mxGeometry y="236" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-81" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="lbM4oX9S54B-aaULRCX6-65" source="lbM4oX9S54B-aaULRCX6-66" target="lbM4oX9S54B-aaULRCX6-80"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-82" value="ECU" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="lbM4oX9S54B-aaULRCX6-65"> <mxGeometry x="110" y="236" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-83" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="lbM4oX9S54B-aaULRCX6-65" source="lbM4oX9S54B-aaULRCX6-66" target="lbM4oX9S54B-aaULRCX6-82"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-84" value="e.g. Classic, QM OSEK" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=10;" vertex="1" parent="lbM4oX9S54B-aaULRCX6-65"> <mxGeometry x="94" width="120" height="30" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-85" value="" style="group" connectable="0" vertex="1" parent="1"> <mxGeometry x="549.03" y="515" width="214" height="266" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-86" value="&lt;b&gt;Zone ECU&lt;/b&gt;" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="lbM4oX9S54B-aaULRCX6-85"> <mxGeometry x="40" y="26" width="90" height="30" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-87" value="ECU" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="lbM4oX9S54B-aaULRCX6-85"> <mxGeometry y="86" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-88" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="lbM4oX9S54B-aaULRCX6-85" source="lbM4oX9S54B-aaULRCX6-86" target="lbM4oX9S54B-aaULRCX6-87"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-89" value="ECU" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="lbM4oX9S54B-aaULRCX6-85"> <mxGeometry x="111" y="86" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-90" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="lbM4oX9S54B-aaULRCX6-85" source="lbM4oX9S54B-aaULRCX6-86" target="lbM4oX9S54B-aaULRCX6-89"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-91" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="lbM4oX9S54B-aaULRCX6-85" source="lbM4oX9S54B-aaULRCX6-92" target="lbM4oX9S54B-aaULRCX6-86"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-92" value="ECU" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="lbM4oX9S54B-aaULRCX6-85"> <mxGeometry y="136" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-93" value="ECU" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="lbM4oX9S54B-aaULRCX6-85"> <mxGeometry x="111" y="136" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-94" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="lbM4oX9S54B-aaULRCX6-85" source="lbM4oX9S54B-aaULRCX6-86" target="lbM4oX9S54B-aaULRCX6-93"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-95" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;endArrow=none;endFill=0;" edge="1" parent="lbM4oX9S54B-aaULRCX6-85" source="lbM4oX9S54B-aaULRCX6-97" target="lbM4oX9S54B-aaULRCX6-86"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-96" value="wired e.g CAN, LIN, FlexRay" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];rotation=90;fontSize=9;" connectable="0" vertex="1" parent="lbM4oX9S54B-aaULRCX6-95"> <mxGeometry x="-0.4" y="-1" relative="1" as="geometry"> <mxPoint x="9" y="-19" as="offset" /> </mxGeometry> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-97" value="ECU" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="lbM4oX9S54B-aaULRCX6-85"> <mxGeometry y="186" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-98" value="ECU" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="lbM4oX9S54B-aaULRCX6-85"> <mxGeometry x="110" y="186" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-99" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="lbM4oX9S54B-aaULRCX6-85" source="lbM4oX9S54B-aaULRCX6-86" target="lbM4oX9S54B-aaULRCX6-98"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-100" value="ECU" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="lbM4oX9S54B-aaULRCX6-85"> <mxGeometry y="236" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-101" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="lbM4oX9S54B-aaULRCX6-85" source="lbM4oX9S54B-aaULRCX6-86" target="lbM4oX9S54B-aaULRCX6-100"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-102" value="ECU" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="lbM4oX9S54B-aaULRCX6-85"> <mxGeometry x="110" y="236" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-103" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="lbM4oX9S54B-aaULRCX6-85" source="lbM4oX9S54B-aaULRCX6-86" target="lbM4oX9S54B-aaULRCX6-102"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-104" value="e.g. Classic, QM OSEK" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=10;" vertex="1" parent="lbM4oX9S54B-aaULRCX6-85"> <mxGeometry x="94" width="120" height="30" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-106" value="" style="group" connectable="0" vertex="1" parent="1"> <mxGeometry x="780" y="515" width="214" height="266" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-107" value="&lt;b&gt;Zone ECU&lt;/b&gt;" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="lbM4oX9S54B-aaULRCX6-106"> <mxGeometry x="40" y="26" width="90" height="30" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-108" value="ECU" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="lbM4oX9S54B-aaULRCX6-106"> <mxGeometry y="86" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-109" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="lbM4oX9S54B-aaULRCX6-106" source="lbM4oX9S54B-aaULRCX6-107" target="lbM4oX9S54B-aaULRCX6-108"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-110" value="ECU" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="lbM4oX9S54B-aaULRCX6-106"> <mxGeometry x="111" y="86" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-111" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="lbM4oX9S54B-aaULRCX6-106" source="lbM4oX9S54B-aaULRCX6-107" target="lbM4oX9S54B-aaULRCX6-110"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-112" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="lbM4oX9S54B-aaULRCX6-106" source="lbM4oX9S54B-aaULRCX6-113" target="lbM4oX9S54B-aaULRCX6-107"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-113" value="ECU" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="lbM4oX9S54B-aaULRCX6-106"> <mxGeometry y="136" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-114" value="ECU" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="lbM4oX9S54B-aaULRCX6-106"> <mxGeometry x="111" y="136" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-115" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="lbM4oX9S54B-aaULRCX6-106" source="lbM4oX9S54B-aaULRCX6-107" target="lbM4oX9S54B-aaULRCX6-114"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-116" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;endArrow=none;endFill=0;" edge="1" parent="lbM4oX9S54B-aaULRCX6-106" source="lbM4oX9S54B-aaULRCX6-118" target="lbM4oX9S54B-aaULRCX6-107"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-117" value="wired e.g CAN, LIN, FlexRay" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];rotation=90;fontSize=9;" connectable="0" vertex="1" parent="lbM4oX9S54B-aaULRCX6-116"> <mxGeometry x="-0.4" y="-1" relative="1" as="geometry"> <mxPoint x="9" y="-19" as="offset" /> </mxGeometry> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-118" value="ECU" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="lbM4oX9S54B-aaULRCX6-106"> <mxGeometry y="186" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-119" value="ECU" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="lbM4oX9S54B-aaULRCX6-106"> <mxGeometry x="110" y="186" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-120" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="lbM4oX9S54B-aaULRCX6-106" source="lbM4oX9S54B-aaULRCX6-107" target="lbM4oX9S54B-aaULRCX6-119"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-121" value="ECU" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="lbM4oX9S54B-aaULRCX6-106"> <mxGeometry y="236" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-122" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="lbM4oX9S54B-aaULRCX6-106" source="lbM4oX9S54B-aaULRCX6-107" target="lbM4oX9S54B-aaULRCX6-121"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-123" value="ECU" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="lbM4oX9S54B-aaULRCX6-106"> <mxGeometry x="110" y="236" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-124" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="lbM4oX9S54B-aaULRCX6-106" source="lbM4oX9S54B-aaULRCX6-107" target="lbM4oX9S54B-aaULRCX6-123"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="lbM4oX9S54B-aaULRCX6-125" value="e.g. Classic, QM OSEK" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=10;" vertex="1" parent="lbM4oX9S54B-aaULRCX6-106"> <mxGeometry x="94" width="120" height="30" as="geometry" /> </mxCell> <mxCell id="8C7zypBLF7NRb_o-B9A1-2" value="" style="sketch=0;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=none;fillColor=#505050;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;outlineConnect=0;align=center;shape=mxgraph.office.devices.ipad_mini;" vertex="1" parent="1"> <mxGeometry x="290" y="271" width="48.45" height="69" as="geometry" /> </mxCell> <mxCell id="8C7zypBLF7NRb_o-B9A1-7" value="" style="edgeStyle=elbowEdgeStyle;elbow=vertical;endArrow=none;html=1;curved=0;rounded=0;endSize=8;startSize=8;endFill=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="1" source="lbM4oX9S54B-aaULRCX6-13" target="8C7zypBLF7NRb_o-B9A1-2"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="240" y="421" as="sourcePoint" /> <mxPoint x="290" y="371" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="8C7zypBLF7NRb_o-B9A1-8" value="" style="edgeStyle=elbowEdgeStyle;elbow=vertical;endArrow=none;html=1;curved=0;rounded=0;endSize=8;startSize=8;exitX=0.5;exitY=0;exitDx=0;exitDy=0;endFill=0;" edge="1" parent="1" source="lbM4oX9S54B-aaULRCX6-16" target="8C7zypBLF7NRb_o-B9A1-2"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="550" y="440" as="sourcePoint" /> <mxPoint x="600" y="390" as="targetPoint" /> </mxGeometry> </mxCell> </root> </mxGraphModel> </diagram> </mxfile> " resource="https://app.diagrams.net/#G1qMDFxmVCFFBPZ30bI9sWoWestVIrg-1y#%7B%22pageId%22%3A%22m6MxymNVx2oO-Yp29mNL%22%7D"><defs/><g><g><path d="M 20 541 L 20 100" fill="none" stroke="#4d9900" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="2 6" pointer-events="stroke"/></g><g><path d="M 744.51 151.6 L 744.5 121 L 535 121 L 535 218.6 L 545.51 218.6" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/></g><g><rect x="680" y="150" width="129.03" height="80" fill="none" stroke="none" pointer-events="all"/><path d="M 698.61 230 C 689.02 228.12 681.85 220.02 681.05 210.19 C 680.01 203.86 681.84 197.39 686.04 192.57 C 690.24 187.75 696.36 185.1 702.71 185.34 C 706.43 178.41 714.43 175.02 721.93 177.18 C 721.36 165.15 729.49 154.46 741.16 151.94 C 751.52 150 761.78 155.83 765.51 165.79 C 773.33 161.16 783.23 162.27 789.86 168.51 C 796.5 174.2 799.62 183.03 798.06 191.68 C 804.91 195.18 809.04 202.46 808.57 210.19 C 808.87 220.04 801.82 228.56 792.16 230 Z M 792.16 227.93 C 800.51 226.21 806.51 218.8 806.52 210.19 C 806.97 202.69 802.79 195.69 796.01 192.59 C 797.55 184.16 794.64 175.53 788.32 169.81 C 781.71 163.93 771.99 163.35 764.74 168.38 C 761.26 157.83 750.74 151.65 740.26 154.01 C 729.47 157.65 722.61 168.34 723.73 179.77 C 716.18 176.63 707.52 179.98 703.99 187.41 C 699.02 186.64 693.98 188.15 690.02 191.59 C 686.06 195.03 683.52 200.1 682.97 205.66 C 681.85 216.04 688.55 225.64 698.61 228.06 Z" fill="#00188d" stroke="none" pointer-events="all"/></g><g><rect x="625.48" y="241" width="100" height="30" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 256px; margin-left: 626px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Cloud2cloud</div></div></div></foreignObject><text x="675" y="260" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Cloud2cloud</text></switch></g></g><g><path d="M 236 271 L 236 181 L 535 181 L 535 218.6 L 545.51 218.6" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/></g><g/><g><rect x="481" y="217" width="129.03" height="80" fill="none" stroke="none" pointer-events="all"/><path d="M 499.61 297 C 490.02 295.12 482.85 287.02 482.05 277.19 C 481.01 270.86 482.84 264.39 487.04 259.57 C 491.24 254.75 497.36 252.1 503.71 252.34 C 507.43 245.41 515.43 242.02 522.93 244.18 C 522.36 232.15 530.49 221.46 542.16 218.94 C 552.52 217 562.78 222.83 566.51 232.79 C 574.33 228.16 584.23 229.27 590.86 235.51 C 597.5 241.2 600.62 250.03 599.06 258.68 C 605.91 262.18 610.04 269.46 609.57 277.19 C 609.87 287.04 602.82 295.56 593.16 297 Z M 593.16 294.93 C 601.51 293.21 607.51 285.8 607.52 277.19 C 607.97 269.69 603.79 262.69 597.01 259.59 C 598.55 251.16 595.64 242.53 589.32 236.81 C 582.71 230.93 572.99 230.35 565.74 235.38 C 562.26 224.83 551.74 218.65 541.26 221.01 C 530.47 224.65 523.61 235.34 524.73 246.77 C 517.18 243.63 508.52 246.98 504.99 254.41 C 500.02 253.64 494.98 255.15 491.02 258.59 C 487.06 262.03 484.52 267.1 483.97 272.66 C 482.85 283.04 489.55 292.64 499.61 295.06 Z" fill="#00188d" stroke="none" pointer-events="all"/></g><g><rect x="515.52" y="247" width="60" height="30" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 262px; margin-left: 517px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Data Store</div></div></div></foreignObject><text x="546" y="266" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Data Store</text></switch></g></g><g><path d="M 159 470 L 159 505.5 L 85 505.5 L 85 541" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/></g><g><path d="M 159 470 L 159 505.5 L 325 505.5 L 325 541" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/></g><g><rect x="104" y="420" width="110" height="50" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 108px; height: 1px; padding-top: 445px; margin-left: 105px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>HU</b></div></div></div></foreignObject><text x="159" y="449" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">HU</text></switch></g></g><g><path d="M 336 470 L 336 505.5 L 325 505.5 L 325 541" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/></g><g><path d="M 336 470 L 336 505.5 L 554 505.5 L 554.03 541" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/></g><g><rect x="282" y="420" width="108" height="50" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 106px; height: 1px; padding-top: 445px; margin-left: 283px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Computing</b></div></div></div></foreignObject><text x="336" y="449" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Computing</text></switch></g></g><g><path d="M 685.49 470 L 685.5 505.5 L 785 505.5 L 785 541" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/></g><g><rect x="630" y="420" width="110.97" height="50" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 109px; height: 1px; padding-top: 445px; margin-left: 631px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>ADAS</b></div></div></div></foreignObject><text x="685" y="449" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ADAS</text></switch></g></g><g><path d="M 515 470 L 515 505.5 L 554 505.5 L 554 541" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/></g><g><path d="M 515 470 L 515 505.5 L 785 505.5 L 785 541" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/></g><g><rect x="460" y="420" width="110" height="50" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 108px; height: 1px; padding-top: 445px; margin-left: 461px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>TCU</b></div></div></div></foreignObject><text x="515" y="449" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">TCU</text></switch></g></g><g><rect x="276" y="391" width="120" height="30" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 118px; height: 1px; padding-top: 406px; margin-left: 278px;"><div style="box-sizing: border-box; font-size: 0px; text-align: left;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">e.g. Adaptive, QM Posix</div></div></div></foreignObject><text x="278" y="409" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="10px">e.g. Adaptive, QM Posix</text></switch></g></g><g><rect x="454" y="391" width="120" height="30" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 118px; height: 1px; padding-top: 406px; margin-left: 456px;"><div style="box-sizing: border-box; font-size: 0px; text-align: left;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><div>e.g. QM Posix</div></div></div></div></foreignObject><text x="456" y="409" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="10px">e.g. QM Posix</text></switch></g></g><g><rect x="625.48" y="391" width="120" height="30" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 118px; height: 1px; padding-top: 406px; margin-left: 627px;"><div style="box-sizing: border-box; font-size: 0px; text-align: left;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">e.g. Adaptive, QM Posix</div></div></div></foreignObject><text x="627" y="409" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="10px">e.g. Adaptive, QM Posix</text></switch></g></g><g><rect x="104" y="390" width="120" height="30" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 118px; height: 1px; padding-top: 405px; margin-left: 106px;"><div style="box-sizing: border-box; font-size: 0px; text-align: left;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><div align="left">e.g. QM Posix</div></div></div></div></foreignObject><text x="106" y="408" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="10px">e.g. QM Posix</text></switch></g></g><g><path d="M 20 97 L 850 97" fill="none" stroke="#4d9900" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="2 6" pointer-events="stroke"/></g><g><path d="M 850 370 L 850 91" fill="none" stroke="#4d9900" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="2 6" pointer-events="stroke"/></g><g><path d="M 545.51 297 L 545.5 291 L 544 291 L 544 421" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/></g><g><path d="M 850 371 L 600 371" fill="none" stroke="#4d9900" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="2 6" pointer-events="stroke"/></g><g><path d="M 600 491 L 600 370" fill="none" stroke="#4d9900" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="2 6" pointer-events="stroke"/></g><g><path d="M 600 491 L 870 491" fill="none" stroke="#4d9900" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="2 6" pointer-events="stroke"/></g><g><path d="M 870 491 L 870 551" fill="none" stroke="#4d9900" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="2 6" pointer-events="stroke"/></g><g><rect x="26" y="93" width="170" height="30" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 168px; height: 1px; padding-top: 108px; margin-left: 28px;"><div style="box-sizing: border-box; font-size: 0px; text-align: left;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">COVESA Data Expert Group scope</div></div></div></foreignObject><text x="28" y="111" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="10px">COVESA Data Expert Group scope</text></switch></g></g><g><rect x="16" y="10" width="884" height="70" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 876px; height: 1px; padding-top: 0px; margin-left: 21px;"><div style="box-sizing: border-box; font-size: 0px; text-align: left; max-height: 80px; overflow: hidden;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><h2>Overview of COVESA Logical Architecture<br /></h2><p>Focus on functional integration and data architecture.<br />Diagram v1.2</p></div></div></div></foreignObject><text x="21" y="12" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">Overview of COVESA Logical Architecture...</text></switch></g></g><g><rect x="200" y="480" width="90" height="30" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 88px; height: 1px; padding-top: 495px; margin-left: 202px;"><div style="box-sizing: border-box; font-size: 0px; text-align: left;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Wired, e.g ETH</div></div></div></foreignObject><text x="202" y="498" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="10px">Wired, e.g ETH</text></switch></g></g><g><rect x="240" y="160" width="50" height="30" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 48px; height: 1px; padding-top: 175px; margin-left: 242px;"><div style="box-sizing: border-box; font-size: 0px; text-align: left;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Internet</div></div></div></foreignObject><text x="242" y="178" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="10px">Internet</text></switch></g></g><g><rect x="540" y="100" width="50" height="30" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 48px; height: 1px; padding-top: 115px; margin-left: 542px;"><div style="box-sizing: border-box; font-size: 0px; text-align: left;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Internet</div></div></div></foreignObject><text x="542" y="118" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="10px">Internet</text></switch></g></g><g><rect x="340" y="359" width="120" height="30" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 118px; height: 1px; padding-top: 374px; margin-left: 342px;"><div style="box-sizing: border-box; font-size: 0px; text-align: left;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Wireless,e.g. BLE, Wifi</div></div></div></foreignObject><text x="342" y="377" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="10px">Wireless,e.g. BLE, Wifi</text></switch></g></g><g><rect x="550" y="297" width="120" height="30" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 118px; height: 1px; padding-top: 312px; margin-left: 552px;"><div style="box-sizing: border-box; font-size: 0px; text-align: left;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Wireless,e.g. 4G, 5G</div></div></div></foreignObject><text x="552" y="315" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="10px">Wireless,e.g. 4G, 5G</text></switch></g></g><g/><g><path d="M 20 548 L 877.04 551" fill="none" stroke="#4d9900" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="2 6" pointer-events="stroke"/></g><g><rect x="40" y="541" width="90" height="30" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 556px; margin-left: 41px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Zone ECU</b></div></div></div></foreignObject><text x="85" y="560" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Zone ECU</text></switch></g></g><g><rect x="0" y="601" width="60" height="30" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 616px; margin-left: 1px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ECU</div></div></div></foreignObject><text x="30" y="620" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ECU</text></switch></g></g><g><path d="M 85 571 L 85 616 L 60 616" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/></g><g><rect x="111" y="601" width="60" height="30" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 616px; margin-left: 112px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ECU</div></div></div></foreignObject><text x="141" y="620" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ECU</text></switch></g></g><g><path d="M 85 571 L 85 616 L 111 616" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/></g><g><path d="M 60 666 L 85 666 L 85 571" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/></g><g><rect x="0" y="651" width="60" height="30" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 666px; margin-left: 1px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ECU</div></div></div></foreignObject><text x="30" y="670" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ECU</text></switch></g></g><g><rect x="111" y="651" width="60" height="30" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 666px; margin-left: 112px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ECU</div></div></div></foreignObject><text x="141" y="670" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ECU</text></switch></g></g><g><path d="M 85 571 L 85 666 L 111 666" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/></g><g><path d="M 60 716 L 85 716 L 85 571" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/></g><g><g transform="translate(-0.5 -0.5)rotate(90 94.5 671.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 672px; margin-left: 95px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); "><div style="display: inline-block; font-size: 9px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">wired e.g CAN, LIN, FlexRay</div></div></div></foreignObject><text x="95" y="674" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="9px" text-anchor="middle">wired e.g CAN, LIN, FlexRay</text></switch></g></g><g><rect x="0" y="701" width="60" height="30" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 716px; margin-left: 1px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ECU</div></div></div></foreignObject><text x="30" y="720" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ECU</text></switch></g></g><g><rect x="110" y="701" width="60" height="30" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 716px; margin-left: 111px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ECU</div></div></div></foreignObject><text x="140" y="720" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ECU</text></switch></g></g><g><path d="M 85 571 L 85 716 L 110 716" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/></g><g><rect x="0" y="751" width="60" height="30" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 766px; margin-left: 1px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ECU</div></div></div></foreignObject><text x="30" y="770" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ECU</text></switch></g></g><g><path d="M 85 571 L 85 766 L 60 766" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/></g><g><rect x="110" y="751" width="60" height="30" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 766px; margin-left: 111px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ECU</div></div></div></foreignObject><text x="140" y="770" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ECU</text></switch></g></g><g><path d="M 85 571 L 85 766 L 110 766" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/></g><g><rect x="94" y="515" width="120" height="30" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 530px; margin-left: 95px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">e.g. Classic, QM OSEK</div></div></div></foreignObject><text x="154" y="533" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="10px" text-anchor="middle">e.g. Classic, QM OSEK</text></switch></g></g><g/><g><rect x="280" y="541" width="90" height="30" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 556px; margin-left: 281px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Zone ECU</b></div></div></div></foreignObject><text x="325" y="560" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Zone ECU</text></switch></g></g><g><rect x="240" y="601" width="60" height="30" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 616px; margin-left: 241px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ECU</div></div></div></foreignObject><text x="270" y="620" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ECU</text></switch></g></g><g><path d="M 325 571 L 325 616 L 300 616" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/></g><g><rect x="351" y="601" width="60" height="30" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 616px; margin-left: 352px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ECU</div></div></div></foreignObject><text x="381" y="620" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ECU</text></switch></g></g><g><path d="M 325 571 L 325 616 L 351 616" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/></g><g><path d="M 300 666 L 325 666 L 325 571" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/></g><g><rect x="240" y="651" width="60" height="30" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 666px; margin-left: 241px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ECU</div></div></div></foreignObject><text x="270" y="670" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ECU</text></switch></g></g><g><rect x="351" y="651" width="60" height="30" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 666px; margin-left: 352px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ECU</div></div></div></foreignObject><text x="381" y="670" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ECU</text></switch></g></g><g><path d="M 325 571 L 325 666 L 351 666" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/></g><g><path d="M 300 716 L 325 716 L 325 571" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/></g><g><g transform="translate(-0.5 -0.5)rotate(90 334.5 671.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 672px; margin-left: 335px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); "><div style="display: inline-block; font-size: 9px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">wired e.g CAN, LIN, FlexRay</div></div></div></foreignObject><text x="335" y="674" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="9px" text-anchor="middle">wired e.g CAN, LIN, FlexRay</text></switch></g></g><g><rect x="240" y="701" width="60" height="30" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 716px; margin-left: 241px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ECU</div></div></div></foreignObject><text x="270" y="720" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ECU</text></switch></g></g><g><rect x="350" y="701" width="60" height="30" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 716px; margin-left: 351px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ECU</div></div></div></foreignObject><text x="380" y="720" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ECU</text></switch></g></g><g><path d="M 325 571 L 325 716 L 350 716" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/></g><g><rect x="240" y="751" width="60" height="30" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 766px; margin-left: 241px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ECU</div></div></div></foreignObject><text x="270" y="770" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ECU</text></switch></g></g><g><path d="M 325 571 L 325 766 L 300 766" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/></g><g><rect x="350" y="751" width="60" height="30" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 766px; margin-left: 351px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ECU</div></div></div></foreignObject><text x="380" y="770" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ECU</text></switch></g></g><g><path d="M 325 571 L 325 766 L 350 766" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/></g><g><rect x="334" y="515" width="120" height="30" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 530px; margin-left: 335px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">e.g. Classic, QM OSEK</div></div></div></foreignObject><text x="394" y="533" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="10px" text-anchor="middle">e.g. Classic, QM OSEK</text></switch></g></g><g/><g><rect x="509.03" y="541" width="90" height="30" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 556px; margin-left: 510px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Zone ECU</b></div></div></div></foreignObject><text x="554" y="560" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Zone ECU</text></switch></g></g><g><rect x="469.03" y="601" width="60" height="30" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 616px; margin-left: 470px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ECU</div></div></div></foreignObject><text x="499" y="620" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ECU</text></switch></g></g><g><path d="M 554.03 571 L 554 616 L 529.03 616" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/></g><g><rect x="580.03" y="601" width="60" height="30" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 616px; margin-left: 581px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ECU</div></div></div></foreignObject><text x="610" y="620" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ECU</text></switch></g></g><g><path d="M 554.03 571 L 554 616 L 580.03 616" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/></g><g><path d="M 529.03 666 L 554 666 L 554.03 571" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/></g><g><rect x="469.03" y="651" width="60" height="30" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 666px; margin-left: 470px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ECU</div></div></div></foreignObject><text x="499" y="670" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ECU</text></switch></g></g><g><rect x="580.03" y="651" width="60" height="30" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 666px; margin-left: 581px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ECU</div></div></div></foreignObject><text x="610" y="670" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ECU</text></switch></g></g><g><path d="M 554.03 571 L 554 666 L 580.03 666" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/></g><g><path d="M 529.03 716 L 554 716 L 554 571" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/></g><g><g transform="translate(-0.5 -0.5)rotate(90 563.5 671.47)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 671px; margin-left: 564px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); "><div style="display: inline-block; font-size: 9px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">wired e.g CAN, LIN, FlexRay</div></div></div></foreignObject><text x="564" y="674" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="9px" text-anchor="middle">wired e.g CAN, LIN, FlexRay</text></switch></g></g><g><rect x="469.03" y="701" width="60" height="30" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 716px; margin-left: 470px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ECU</div></div></div></foreignObject><text x="499" y="720" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ECU</text></switch></g></g><g><rect x="579.03" y="701" width="60" height="30" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 716px; margin-left: 580px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ECU</div></div></div></foreignObject><text x="609" y="720" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ECU</text></switch></g></g><g><path d="M 554.03 571 L 554 716 L 579.03 716" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/></g><g><rect x="469.03" y="751" width="60" height="30" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 766px; margin-left: 470px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ECU</div></div></div></foreignObject><text x="499" y="770" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ECU</text></switch></g></g><g><path d="M 554.03 571 L 554 766 L 529.03 766" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/></g><g><rect x="579.03" y="751" width="60" height="30" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 766px; margin-left: 580px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ECU</div></div></div></foreignObject><text x="609" y="770" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ECU</text></switch></g></g><g><path d="M 554.03 571 L 554 766 L 579.03 766" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/></g><g><rect x="563.03" y="515" width="120" height="30" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 530px; margin-left: 564px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">e.g. Classic, QM OSEK</div></div></div></foreignObject><text x="623" y="533" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="10px" text-anchor="middle">e.g. Classic, QM OSEK</text></switch></g></g><g/><g><rect x="740" y="541" width="90" height="30" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 556px; margin-left: 741px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Zone ECU</b></div></div></div></foreignObject><text x="785" y="560" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Zone ECU</text></switch></g></g><g><rect x="700" y="601" width="60" height="30" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 616px; margin-left: 701px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ECU</div></div></div></foreignObject><text x="730" y="620" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ECU</text></switch></g></g><g><path d="M 785 571 L 785 616 L 760 616" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/></g><g><rect x="811" y="601" width="60" height="30" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 616px; margin-left: 812px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ECU</div></div></div></foreignObject><text x="841" y="620" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ECU</text></switch></g></g><g><path d="M 785 571 L 785 616 L 811 616" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/></g><g><path d="M 760 666 L 785 666 L 785 571" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/></g><g><rect x="700" y="651" width="60" height="30" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 666px; margin-left: 701px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ECU</div></div></div></foreignObject><text x="730" y="670" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ECU</text></switch></g></g><g><rect x="811" y="651" width="60" height="30" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 666px; margin-left: 812px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ECU</div></div></div></foreignObject><text x="841" y="670" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ECU</text></switch></g></g><g><path d="M 785 571 L 785 666 L 811 666" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/></g><g><path d="M 760 716 L 785 716 L 785 571" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/></g><g><g transform="translate(-0.5 -0.5)rotate(90 794.5 671.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 672px; margin-left: 795px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); "><div style="display: inline-block; font-size: 9px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">wired e.g CAN, LIN, FlexRay</div></div></div></foreignObject><text x="795" y="674" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="9px" text-anchor="middle">wired e.g CAN, LIN, FlexRay</text></switch></g></g><g><rect x="700" y="701" width="60" height="30" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 716px; margin-left: 701px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ECU</div></div></div></foreignObject><text x="730" y="720" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ECU</text></switch></g></g><g><rect x="810" y="701" width="60" height="30" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 716px; margin-left: 811px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ECU</div></div></div></foreignObject><text x="840" y="720" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ECU</text></switch></g></g><g><path d="M 785 571 L 785 716 L 810 716" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/></g><g><rect x="700" y="751" width="60" height="30" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 766px; margin-left: 701px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ECU</div></div></div></foreignObject><text x="730" y="770" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ECU</text></switch></g></g><g><path d="M 785 571 L 785 766 L 760 766" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/></g><g><rect x="810" y="751" width="60" height="30" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 766px; margin-left: 811px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ECU</div></div></div></foreignObject><text x="840" y="770" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ECU</text></switch></g></g><g><path d="M 785 571 L 785 766 L 810 766" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/></g><g><rect x="794" y="515" width="120" height="30" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 530px; margin-left: 795px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">e.g. Classic, QM OSEK</div></div></div></foreignObject><text x="854" y="533" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="10px" text-anchor="middle">e.g. Classic, QM OSEK</text></switch></g></g><g><rect x="210" y="271" width="48.45" height="69" fill="none" stroke="none" pointer-events="all"/><path d="M 234.2 276.48 C 234.8 276.48 235.33 276.01 235.33 275.41 C 235.33 274.59 234.68 274.27 234.27 274.27 C 233.58 274.27 233.11 274.8 233.11 275.4 C 233.11 276.02 233.7 276.48 234.2 276.48 Z M 255.15 331.22 L 255.15 279.75 L 213.3 279.75 L 213.3 331.22 Z M 234.21 337.81 C 235.61 337.81 236.43 336.63 236.43 335.66 C 236.43 334.39 235.46 333.43 234.18 333.43 C 232.93 333.43 232.02 334.52 232.02 335.56 C 232.02 336.89 233.08 337.81 234.21 337.81 Z M 214.23 340 C 212.16 340 210 338.1 210 335.68 L 210 275.37 C 210 273.1 211.88 271 214.36 271 L 254.1 271 C 256.53 271 258.45 273.1 258.45 275.26 L 258.45 335.59 C 258.45 337.97 256.54 340 254.03 340 Z" fill="#505050" stroke="none" pointer-events="all"/></g><g><path d="M 159 420 L 159 380 L 234.23 380 L 234.23 340" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/></g><g><path d="M 515 420 L 515 380 L 234.23 380 L 234.23 340" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg> \ No newline at end of file diff --git a/docs/docs-gen/assets/cdsp-logical-concept.drawio.svg b/docs/docs-gen/assets/cdsp-logical-concept.drawio.svg deleted file mode 100755 index 283688c8..00000000 --- a/docs/docs-gen/assets/cdsp-logical-concept.drawio.svg +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Do not edit this file with editors other than draw.io --> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="241px" height="281px" viewBox="-0.5 -0.5 241 281" content="<mxfile host="app.diagrams.net" modified="2024-03-25T17:04:25.449Z" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:120.0) Gecko/20100101 Firefox/120.0" etag="8aT1JPGa6kilg1K8_nOr" version="24.0.8" type="google"> <diagram id="XWc0CAkP7QAnL1UvAmES" name="Logical concept"> <mxGraphModel grid="1" page="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" pageScale="1" pageWidth="1169" pageHeight="827" math="0" shadow="0"> <root> <mxCell id="0" /> <mxCell id="1" parent="0" /> <mxCell id="H-F2qWcX5aFs4qW0o4R_-1" value="Central Data Service Playground" style="swimlane;whiteSpace=wrap;html=1;" vertex="1" parent="1"> <mxGeometry x="160" y="190" width="240" height="280" as="geometry" /> </mxCell> <mxCell id="H-F2qWcX5aFs4qW0o4R_-3" value="&lt;div&gt;Persistence&lt;br&gt;(history of model, signals etc)&lt;br&gt;&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;fontSize=14;align=left;" vertex="1" parent="H-F2qWcX5aFs4qW0o4R_-1"> <mxGeometry x="20" y="200" width="200" height="60" as="geometry" /> </mxCell> <mxCell id="H-F2qWcX5aFs4qW0o4R_-4" value="Data Models&lt;br&gt;(live data models, VSS, ..)" style="rounded=0;whiteSpace=wrap;html=1;fontSize=14;align=left;" vertex="1" parent="H-F2qWcX5aFs4qW0o4R_-1"> <mxGeometry x="20" y="120" width="200" height="60" as="geometry" /> </mxCell> <mxCell id="H-F2qWcX5aFs4qW0o4R_-5" value="Application Logic / APIs&lt;br&gt;(VISS, Native API etc.)" style="rounded=0;whiteSpace=wrap;html=1;fontStyle=0;fontSize=15;align=left;labelPosition=center;verticalLabelPosition=middle;verticalAlign=middle;" vertex="1" parent="H-F2qWcX5aFs4qW0o4R_-1"> <mxGeometry x="20" y="40" width="200" height="60" as="geometry" /> </mxCell> </root> </mxGraphModel> </diagram> </mxfile> " resource="https://app.diagrams.net/#G10B20iEW2UcoLwHgbR1CrUhLlZxcOPKt7#%7B%22pageId%22%3A%22XWc0CAkP7QAnL1UvAmES%22%7D"><defs/><g><g><path d="M 0 23 L 0 0 L 240 0 L 240 23" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 0 23 L 0 280 L 240 280 L 240 23" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 0 23 L 240 23" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 238px; height: 1px; padding-top: 12px; margin-left: 1px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; overflow-wrap: normal;">Central Data Service Playground</div></div></div></foreignObject><text x="120" y="15" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle" font-weight="bold">Central Data Service Playground</text></switch></g></g><g><rect x="20" y="200" width="200" height="60" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 198px; height: 1px; padding-top: 230px; margin-left: 22px;"><div style="box-sizing: border-box; font-size: 0px; text-align: left;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><div>Persistence<br />(history of model, signals etc)<br /></div></div></div></div></foreignObject><text x="22" y="234" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="14px">Persistence...</text></switch></g></g><g><rect x="20" y="120" width="200" height="60" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 198px; height: 1px; padding-top: 150px; margin-left: 22px;"><div style="box-sizing: border-box; font-size: 0px; text-align: left;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 14px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Data Models<br />(live data models, VSS, ..)</div></div></div></foreignObject><text x="22" y="154" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="14px">Data Models...</text></switch></g></g><g><rect x="20" y="40" width="200" height="60" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 198px; height: 1px; padding-top: 70px; margin-left: 22px;"><div style="box-sizing: border-box; font-size: 0px; text-align: left;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 15px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Application Logic / APIs<br />(VISS, Native API etc.)</div></div></div></foreignObject><text x="22" y="75" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="15px">Application Logic / APIs...</text></switch></g></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg> \ No newline at end of file diff --git a/docs/docs-gen/config.toml b/docs/docs-gen/config.toml deleted file mode 100644 index 3f3141f5..00000000 --- a/docs/docs-gen/config.toml +++ /dev/null @@ -1,22 +0,0 @@ -baseURL = "https://covesa.github.io/cdsp/" -languageCode = "en-us" -title = "Central Data Service Playground" -theme = "learn" -publishDir = "../docs" -[params] - # Change default color scheme with a variant one. Can be "red", "blue", "green". - themeVariant = "blue" - disableInlineCopyToClipBoard = true - editURL = "https://github.com/covesa/cdsp/edit/master/docs/docs-gen/content/" - disableLandingPageButton = true - - -[[menu.shortcuts]] -name = "<i class='fab fa-github'></i> Github repo" -identifier = "ds" -url = "https://github.com/covesa/cdsp" -weight = 10 - -# Generation of JSON index to allow search -[outputs] -home = [ "HTML", "RSS", "JSON"] diff --git a/docs/docs-gen/content/_index.md b/docs/docs-gen/content/_index.md deleted file mode 100644 index c35221ac..00000000 --- a/docs/docs-gen/content/_index.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -title: "Central Data Service Playground" ---- -# Central Data Service Playground -## Overview -Learn the basics and benefits of using the playground - -[Overview]({{< ref "cdsp-overview" >}} "Playground overview") - -## Browse by section - -### Manuals -This section contains user guides and reference manuals for the playground - -[Overview]({{< ref "manuals" >}} "Manuals overview") \| [Apache IoTDB]({{< ref "apache-iotdb" >}} "Apache IoTDB Guide") \| [VISSR]({{< ref "vissr-viss" >}} "VISSR (VISS data server) Guide") \| Integration guides \| etc. - -### Examples -Learn how to use the playground by stepping through examples. - -[Overview]({{< ref "examples" >}} "Examples overview") \ No newline at end of file diff --git a/docs/docs-gen/content/examples/_index.md b/docs/docs-gen/content/examples/_index.md deleted file mode 100644 index 7b5cd876..00000000 --- a/docs/docs-gen/content/examples/_index.md +++ /dev/null @@ -1,69 +0,0 @@ ---- -title: "Playground examples" -weight: 30 ---- - -The following examples are intended to show how to use playground components and how they can be combined to build larger systems. - -They are grouped by categories to help discovery of appropriate examples from different viewpoints. - -Note: There is not a separate section for the VSS data model because the vast majority of the examples will be making use of it. - -## Getting started - -| Name | Relationship to the category | -|------|-------------| -| [Docker sanity test](https://github.com/COVESA/cdsp/tree/main/docker#deploy-with-docker-compose) | Simple sanity test for the Playground Docker deployment | -| [Hello-world](https://github.com/COVESA/cdsp/tree/main/examples/cdsp-hello-world) | Simple "hello-world" example| - -## Data Layer, Processing and Analysis -Topic examples: Data Reduction, Data Quality, Events, Data Streams etc. - -| Name | Relationship to the category | -|------|-------------| -| [vehicle-speed-downsample-iotdb](https://github.com/COVESA/cdsp/tree/main/examples/vehicle-speed-downsample-iotdb) | Accurately down-sample a timeseries of pre-recorded high frequency VSS `Vehicle.Speed` data using the IoTDB Data Quality Library| - -Tip: well you wait for more examples consider how you could use the [IoTDB data processing functions]({{< ref "apache-iotdb#data-processing-functions" >}} "IoTDB data processing"). - -## Knowledge Layer, Reasoning and Data Models -Topic examples: Knowledge Layer Connector, Data Layer Connector etc. - -## Feeders -Topic examples: Virtual signal platforms, VISSR etc. - -| Name | Relationship to the category | -|------|-------------| -| [RemotiveLabs feeder](https://github.com/COVESA/cdsp/tree/main/examples/remotivelabs-feeder) | Example bridge that streams vehicle data from the RemotiveLabs cloud platform into the IoTDB data store | -| [KUKSA CAN Provider feeder](https://github.com/COVESA/cdsp/tree/main/examples/kuksa-can-feeder) | Using the KUKSA CAN Provider as a feeder of CAN data translated to the VSS data model into the IoTDB data store | - -## COVESA Touchpoints -Topic examples: Low level vehicle abstraction, Mobile devices, Car2Cloud / Cloud etc. - -## COVESA Technologies -Topic examples: vsome/ip (SOME/IP), uServices, Vehicle API, VISS etc. - -| Name | Relationship to the category | -|------|-------------| -| [VISSR/VISS hello-world](https://covesa.github.io/vissr/build-system/hello-world/) | hello-world tutorial for making VISS requests using VISSR in the upstream VISSR project | -| [VISS transport examples](https://raw.githack.com/COVESA/vehicle-information-service-specification/main/spec/VISSv3.0_Transport.html) | Examples in the VISS Specification for making VISS requests and the responses for various transport protocols | - -## Databases -Topic examples: Apache IoTDB, MongoDB Realm, Redis/SQLite/memcache etc. - -| Name | Relationship to the category | -|------|-------------| -| [vehicle-speed-downsample-iotdb](https://github.com/COVESA/cdsp/tree/main/examples/vehicle-speed-downsample-iotdb) | Using the IoTDB [Data Quality Library ]({{< ref "apache-iotdb#data-processing-functions" >}} "IoTDB Data Quality Library") for advanced (VSS) timeseries data processing| -| [RemotiveLabs feeder](https://github.com/COVESA/cdsp/tree/main/examples/remotivelabs-feeder) | Example of streaming (writing) southbound (VSS) timeseries data into IoTDB | - -## Frameworks / Protocols -Topic examples: vsome/ip (SOME/IP), VISS, uServices/uProtocol/Capabilities, Vehicle API, MQTT, Kafka, Apache Zeppelin etc. - -| Name | Relationship to the category | -|------|-------------| -| VISS | Find examples in the COVESA Technologies section and or search for VISS/VISSR in this page | - -## Big data -Topic examples: Hadoop, Flink, Spark, Cloud DB, Nifi etc. - -## Other examples -Topics that do not fit into the groups above. \ No newline at end of file diff --git a/docs/docs-gen/content/manuals/_index.md b/docs/docs-gen/content/manuals/_index.md deleted file mode 100644 index ce297f8b..00000000 --- a/docs/docs-gen/content/manuals/_index.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: "Manuals" -chapter: true -weight: 15 ---- - -# Introduction - -This section contains user guides and reference manuals for the playground diff --git a/docs/docs-gen/content/manuals/apache-iotdb.md b/docs/docs-gen/content/manuals/apache-iotdb.md deleted file mode 100644 index f900399b..00000000 --- a/docs/docs-gen/content/manuals/apache-iotdb.md +++ /dev/null @@ -1,225 +0,0 @@ ---- -title: "Apache IoTDB" ---- - -## Introduction -The playground uses Apache IoTDB to provide a highly functional data store. - -Description of Apache IoTDB from https://iotdb.apache.org/: - -*"Apache IoTDB (Database for Internet of Things) is an IoT native database with high performance for data management and analysis, deployable on the edge and the cloud. Due to its light-weight architecture, high performance and rich feature set together with its deep integration with Apache Hadoop, Spark and Flink, Apache IoTDB can meet the requirements of massive data storage, high-speed data ingestion and complex data analysis in the IoT industrial fields."* - -The IoTDB project [website](https://iotdb.apache.org/) has extensive documentation on the IoTDB server. In the guide below we focus on topics specific to the playground such as VSS data schemas and the connector for the VISSR VISS data server. - -Info: The intention is to add more information such as a guide for feeder integration as the project progresses. - -## Integrating VSS data into the IoTDB data model -The ["Background Knowledge"](https://iotdb.apache.org/UserGuide/latest/Background-knowledge/Data-Model-and-Terminology_apache.html) section of the IoTDB documentation introduces the IoTDB data model, data types, encoding and compression. - -In IoTDB terminology *measurement* is the key in a key/value pair. In VSS terms the leaf node name. The timeseries is the record of the measurement on the time axis. A timeseries is a series of time/value data points. - -The IoTDB data model supports hierarchical partitioning and like VSS uses a dot notation to separate the levels. This means if we simply appended a VSS leaf node name like `Vehicle.CurrentLocation.Longitude` as the measurement (key) name to the end of a IoTDB path such as `root.test2.dev1` IoTDB would treat the VSS path prefix `Vehicle.CurrentLocation.` as part of the IoTDB data model partitioning which could cause unwanted issues when scaling over millions of vehicles. - -We have separated those two concepts by quoting the VSS leaf node name using backticks when processing the name in IoTDB. As shown below: -``` -<IoTDB prefix path>.`<VSS leaf node name>` -``` -In our example the full IoTDB measurement path would become ``root.test2.dev1.`Vehicle.CurrentLocation.Longitude` `` and in an IoTDB timeseries would look like this: -``` -+------------------------+---------------------------------------------------+ -| Time|root.test2.dev1.`Vehicle.CurrentLocation.Longitude`| -+------------------------+---------------------------------------------------+ -|2024-03-07T17:55:24.514Z| -42.4567| -|2024-04-10T17:48:12.117Z| -41.3567| -|2024-04-10T17:48:23.389Z| -39.3567| -|2024-04-10T17:48:49.630Z| -40.2578| -+------------------------+---------------------------------------------------+ - -``` - -## Seeding the database with VSS data -To illustrate the concepts lets seed a database with some simple timeseries VSS data. - -The typical steps are: -1. Create the database in the server. -2. Create a timeseries in the database populated with the VSS leaf nodes (keys) you are interested in. -3. Load the VSS data into the timeseries. - -Note: IoTDB has data type detection so creating a schema for the timeseries in step 2 is optional. However, the use of a schema has performance and meta-data benefits so is recommended. - -IoTDB has a very extensive collection of integrations, tools, clients and APIs that could be used to achieve this. - -### Example using the IoTDB CLI client -The following tutorial shows an example using the [IoTDB CLI client](https://iotdb.apache.org/UserGuide/latest/Tools-System/CLI.html), using two methods. Firstly, in interactive mode where you type the commands and then sending the same commands in batch command mode. - - -1. Connect to the CLI client from your host: -``` -$ bash <iotdb path>/sbin/start-cli.sh -h <server hostname/ip> -``` -2. Create database from CLI command line: -``` -IoTDB > create database root.test2 -``` -3. Create timeseries from CLI command line: -``` -IoTDB > CREATE ALIGNED TIMESERIES root.test2.dev1(`Vehicle.CurrentLocation.Longitude` FLOAT, `Vehicle.CurrentLocation.Latitude` FLOAT, `Vehicle.Cabin.Infotainment.HMI.DistanceUnit` TEXT) -``` -4. Add some data into the timeseries: -``` -IoTDB> insert into root.test2.dev1(`Vehicle.CurrentLocation.Longitude`, `Vehicle.CurrentLocation.Latitude`, `Vehicle.Cabin.Infotainment.HMI.DistanceUnit`) values(-42.4567, 22.1234, 'MILES') -``` -5. Display the data just added as a sanity check: -``` -IoTDB> select last * from root.test2.dev1 -+------------------------+-------------------------------------------------------------+--------+--------+ -| Time| Timeseries| Value|DataType| -+------------------------+-------------------------------------------------------------+--------+--------+ -|2024-03-07T17:55:24.514Z| root.test2.dev1.`Vehicle.CurrentLocation.Longitude`|-42.4567| FLOAT| -|2024-03-07T17:55:24.514Z|root.test2.dev1.`Vehicle.Cabin.Infotainment.HMI.DistanceUnit`| MILES| TEXT| -|2024-03-07T17:55:24.514Z| root.test2.dev1.`Vehicle.CurrentLocation.Latitude`| 22.1234| FLOAT| -+------------------------+-------------------------------------------------------------+--------+--------+ -``` -You have now seeded the database with some initial VSS data. - -The CLI client startup script accepts SQL commands using the `-e` parameter. We can therefore use this to codify the above in a bash script. So the VSS node names (keys) are passed correctly on the command line the backticks must be escaped. - -For example: -``` -# !/bin/bash - -host=127.0.0.1 -rpcPort=6667 -user=root -pass=root - -bash ./sbin/start-cli.sh -h ${host} -p ${rpcPort} -u ${user} -pw ${pass} -e "create database root.test2" - -bash ./sbin/start-cli.sh -h ${host} -p ${rpcPort} -u ${user} -pw ${pass} -e "CREATE ALIGNED TIMESERIES root.test2.dev1(\`Vehicle.CurrentLocation.Longitude\` FLOAT, \`Vehicle.CurrentLocation.Latitude\` FLOAT, \`Vehicle.Cabin.Infotainment.HMI.DistanceUnit\` TEXT)" - -bash ./sbin/start-cli.sh -h ${host} -p ${rpcPort} -u ${user} -pw ${pass} -e "insert into root.test2.dev1(\`Vehicle.CurrentLocation.Longitude\`, \`Vehicle.CurrentLocation.Latitude\`, \`Vehicle.Cabin.Infotainment.HMI.DistanceUnit\`) values(-42.4567, 22.1234, 'MILES')" - -bash ./sbin/start-cli.sh -h ${host} -p ${rpcPort} -u ${user} -pw ${pass} -e "select last * from root.test2.dev1" -``` - -Of course any of the programming language clients provided by IoTDB, e.g. go, python, C++, Rust, or integration into tools that support its SQL language, can also be used to achieve the same result. - -## Single node (Edge) vs Cluster -The upstream IoTDB project has both standalone single node and cluster deployments, to cover use case requirements from edge to cloud. - -At the time of writing the playground docker deployment deploys the single node IoTDB docker image, as it is most suitable for deployment at the edge in-vehicle, whilst still being able to represent the cloud. - -Of course if your cloud development requires higher performance then you can integrate the cluster version. - -## Data processing functions -### Built-in functions -IoTDB has an extensive collection of built-in data processing functions covering areas including: - -- Aggregate Functions, such as `SUM`. -- Arithmetic Functions, such as `SIN`. -- Comparison Functions, such as `ON_OFF`. -- String Processing Functions, such as `STRING_CONTAINS`. -- Data Type Conversion Function, such as `CAST`. -- Constant Timeseries Generating Functions, such as `CONST`. -- Selector Functions, such as `TOP_K`. -- Continuous Interval Functions, such as `ZERO_DURATION`. -- Variation Trend Calculation Functions, such as `TIME_DIFFERENCE`. -- Sampling Functions, such as `M4`. -- Change Points Function, such as `CHANGE_POINTS`. - -A full function list with examples can be found in the upstream [IoTDB Function reference manual](https://iotdb.apache.org/UserGuide/latest/SQL-Manual/Operator-and-Expression.html#_2-built-in-functions). - -### Data Quality Library functions -The IoTDB project also maintains a Data Quality Library which provides an additional collection of functions covering: -- Data Quality, such as `Completeness`. -- Data Profiling, such as `Sample`. -- Anomaly Detection, such as `Outlier`. -- Frequency Domain Analysis, such as `HighPass`. -- Data Matching, such as `Cov`. -- Data Repair, such as `TimestampRepair`. -- Series Discovery, such as `ConsecutiveSequences`. -- Machine Learning, such as `AR`. - -A full function list with examples can be found in the upstream [IoTDB UDF Data Quality Library reference manual](https://iotdb.apache.org/UserGuide/latest/SQL-Manual/UDF-Libraries_apache.html). - -#### Setup -In the upstream IoTDB project the library is an optional install. - -For your convenience it is included in the Playground IoTDB image for you. However to call the functions they must first be registered in the running IoTDB instance, which you only need to do once. The script `/iotdb/sbin/register-UDF.sh` is included in the IoTDB image to do this for you. - -Steps: - -1. Start the Playground if it is not already running. -2. From your host execute the following command to run the registration script in the IoTDB container image: - ``` - sudo docker exec -ti iotdb-service /iotdb/sbin/register-UDF.sh - ``` - - -### User Defined functions -IoTDB also allows you to integrate your own functions as User Defined Functions (UDF). The [UDF development section](https://iotdb.apache.org/UserGuide/latest/User-Manual/User-defined-function_apache.html) of the IoTDB documentation explains how to develop and register your own. - -## VISSR (VISS) integration -As part of the initial development of the playground the team extended VISSR to support connections to Apache IoTDB as a VISSR data store backend and upstreamed the support. - -### Connector scope - -The support is implemented by connector code in the VISSR service manager, which connects VISSR to an external Apache IoTDB server. This code uses the IoTDB Go client to maintain a connection session to the IoTDB server, which it then uses to get/set vehicle data from the database. - -As VISSR and the IoTDB server are separate processes VISSR needs to be told where to find the IoTDB server and which storage prefix to use to access the data. - -Development followed the patterns set by the existing VISSR support for Redis and SQLite. The administration of the Apache IoTDB server itself, including startup and shutdown, is out of scope of the connector and is handled externally to VISSR. In the case of the playground this is handled by the playground compose. - -### Runtime notes - -VISSR runtime assumptions: -1. IoTDB server lifecycle (e.g. startup and shutdown) is handled externally to VISSR. -2. Management (e.g. creation/deletion) of the IoTDB timeseries containing VSS data is handled externally to VISSR. -3. Configuration of the connector code is specified in the config file iotdb-config.json. If the config file is not found then build-time defaults are used. - -Handling of IoTDB server and timeseries management is placed outside of VISSR to allow flexible deployment through loosely coupled connections. - -### Database schema assumptions -The connector assumes a simple key/value pair schema for accessing VSS data in an IoTDB timeseries: - -1. VSS node names (keys) are backtick quoted when stored as measurement keys in the database e.g. `` `Vehicle.CurrentLocation.Longitude` ``. This is for reasons explained above in ["Integrating VSS data into the IoTDB data model"](#integrating-vss-data-into-the-iotdb-data-model) to avoid IoTDB interpreting the VSS tree path, in the example `Vehicle.CurrentLocation.`, as part of its storage path which also uses a dot notation. - -2. VSS data is stored using native (IoTDB) data types rather than strings. - -3. That the timeseries containing VSS nodes can be found using the prefix path specified in the config file. - -### Configuration -The connection code reads its runtime configuration from the JSON formatted file `iotdb-config.json` located in the vissv2server directory. You must specify all values. - -#### Configuration file format - -| Key name | Type | Description | -| --- | --- | --- -|`host`|String|Hostname or IP address of the IoTDB server| -|`port`|String|RPC port of the server. Default is 6667| -|`username`|String|Username to access the server. Default is root| -|`password`|String|Password to access the server. Default is root| -|`queryPrefixPath`|String|Timeseries prefix path of VSS data in the database| -|`queryTimeout(ms)`|Int| Query timeout in milliseconds| - - -Example `iotdb-config.json`: -``` -{ - "host": "iotdb-service", - "port": "6667", - "username": "root", - "password": "root", - "queryPrefixPath": "root.test2.dev1", - "queryTimeout(ms)": 5000 -} -``` -### Logging -The connector writes information, warning and error messages to the VISSR server log with the prefix ``IoTDB``. Grepping in the log for that prefix string can help you quickly identify connector messages. - -### VISSR Development notes -Please see the notes in the VISSR source commit messages and related Github pull requests for the history of the development of the Apache IoTDB connection code and its integration into the VISSR Service Manager component. - -Development followed the patterns set by the existing support for Redis and SQLite. - -The connection code was first developed with Apache IoTDB v1.2.2, using the upstream standalone pre-built image and Apache IoTDB Go Client v1.1.7. \ No newline at end of file diff --git a/docs/docs-gen/content/manuals/vissr-viss.md b/docs/docs-gen/content/manuals/vissr-viss.md deleted file mode 100644 index 90a3b3d8..00000000 --- a/docs/docs-gen/content/manuals/vissr-viss.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: "VISSR (VISS data server)" ---- - -## Introduction -The playground uses the [VISSR](https://github.com/COVESA/vissr) project to provide its northbound VISS support, along with the other features it provides. - -The VISSR project [documentation site](https://covesa.github.io/vissr/) has extensive documentation on the VISSR components. So as the project progresses we will add information below focused on topics specific to the playground. - -## Apache IoTDB connector -Please see the [IoTDB guide]({{< ref "apache-iotdb" >}} "Apache IoTDB Guide") for details of the connector between VISSR and IoTDB. \ No newline at end of file diff --git a/docs/docs-gen/content/overview/_index.md b/docs/docs-gen/content/overview/_index.md deleted file mode 100644 index 94a8dcc5..00000000 --- a/docs/docs-gen/content/overview/_index.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: "Playground overview" -chapter: true -weight: 10 ---- - -# Introduction - -Learn the basics and benefits of using the playground diff --git a/docs/docs-gen/content/overview/cdsp-implementation-concept.md b/docs/docs-gen/content/overview/cdsp-implementation-concept.md deleted file mode 100644 index 3f5591a2..00000000 --- a/docs/docs-gen/content/overview/cdsp-implementation-concept.md +++ /dev/null @@ -1,72 +0,0 @@ ---- -title: "Playground implementation" -weight: 30 ---- - - -The prior section describing the logical concept should be read to understand the concepts to be implemented. - -As outlined in the logical description, as a starting point the Service is realized as a basic building block combining VISS Data Server with highly functional (VSS) Data Store. - -### VISS data server -The reference implementation for the COVESA VISS specification is developed in the [VISSR](https://github.com/COVESA/vissr) project. -The playground has included VISSR to provide its northbound VISS support. - -Alongside the VISS server the VISSR project provides clients, feeders and tooling. Further details can be found in the upstream [VISSR documentation site](https://covesa.github.io/vissr/). - -During initial development of the playground the upstream VISSR project supported using SQLite, Redis or memcached databases as its data store. - -### Highly functional (VSS) data store -As explained earlier in the [logical concept]({{< ref "cdsp-logical-concept.md/#components" >}} "data store logical description") the playground includes the use of highly functional VSS data stores to expand the available data processing possibilities. Two archetypes were considered: -1. Database server with timeseries capabilities -2. Application database - -The OSS Apache IoTDB project was selected for the database server archetype for reasons explained in the [section](#apache-iotdb) below. - -To enable access to VSS data stored in IoTDB using the VISS protocol the playground project extended VISSR to support IoTDB as one of its supported data store backends. That support was upstreamed and merged. - -For the application database archetype MongoDB Realm was selected. Support for it is currently a work in progress as part of the playground project backlog. - -#### Apache IoTDB - -The Apache IoTDB [project page](https://iotdb.apache.org/) describes IoTDB as: - -_"Apache IoTDB (Database for Internet of Things) is an IoT native database with high performance for data management and analysis, deployable on the edge and the cloud. Due to its light-weight architecture, high performance and rich feature set together with its deep integration with Apache Hadoop, Spark and Flink, Apache IoTDB can meet the requirements of massive data storage, high-speed data ingestion and complex data analysis in the IoT industrial fields."_ - -The diagram below summarizes some of the features that make it an attractive addition to the playground. - -{{< figure src="Apache-IoTDB-feature-summary.drawio.svg" title="Summary of Apache IoTDB features" width=50pc >}} - -+ The focus on timeseries IoT data delivering high throughput, with low latency are a good fit with the automotive domain. The availability of a single node (Edge) server build is critical for in-vehicle investigations and is supported by the existence of a cluster build for the cloud if needed. - -+ Its support for client server, event and streaming data architectures allows for flexible operation using a single solution. - -+ It also has very wide API support that greatly enhances the pluggability of the data store into other components, whilst supporting the playground project goal of loose coupling. - -+ Similarly the wide range of integrations into other tools and frameworks, particularly the Apache big data stack, simplifies the integration of VSS and associated data into data-centric workflows. - -+ IoTDB has a wide range of built-in timeseries data processing and analysis functions covering topics such as data quality, profiling, repair, anomaly detection and series discovery. For example, in-vehicle data analysis can be performed to derive some information or knowledge and then data reduced for further processing in the cloud. - -+ As well as Native APIs IoTDB also supports a SQL-like query language. This supports the describing of work in logical terms that affords some portability to other solutions. - -## Deployment -The project is currently targeting two deployment scenarios: -1. Easy to develop: make it easy to build, modify and trial by providing a containerized instance running on a host using [Docker containers](https://www.docker.com/). -2. Closer to production: the same base code should be deployable to systems closer to production, including on automotive hardware (or its simulation), e.g. [Yocto](https://www.yoctoproject.org/), container orchestration, [Service-orientated architecture (SOA)](https://en.wikipedia.org/wiki/Service-oriented_architecture) etc. - -Docker containers are chosen to facilitate the rapid integration and/or swapping of technology options. Be it internals of the playground itself, or connection to other components. For example, users can easily integrate the playground into their own [docker compose](https://docs.docker.com/compose/) containing other components. - -#### Status -The containerized docker deployment is available. Deployment on automotive hardware is currently not but is part of the project backlog. - -### Host based Docker - -The playground provides docker compose files to deploy the playground using docker images. The deployment contains three main services, for Apache IoTDB, VISSR and Redis. - -Please see the playground docker readme.md in the source tree for details. - -The service definitions are based on the upstream compose files from the IoTDB and VISSR projects. - -### Automotive hardware - -The project will provide information as hardware deployment progresses. \ No newline at end of file diff --git a/docs/docs-gen/content/overview/cdsp-logical-concept.md b/docs/docs-gen/content/overview/cdsp-logical-concept.md deleted file mode 100644 index dd4a1c8b..00000000 --- a/docs/docs-gen/content/overview/cdsp-logical-concept.md +++ /dev/null @@ -1,147 +0,0 @@ ---- -title: "Playground logical concept" -weight: 20 ---- - -## Importance of maintaining a logical concept -COVESA is a grass roots OSS automotive alliance. From a communication and community perspective it is important to maintain descriptions of the logical concepts. Discussion at a logical level allows different parties to collaborate on common concepts, whilst making different implementation decisions, e.g. in product/technology selection or system architecture for example. That however does not mean we need spend months in philosophical discussions before moving to implementation. Instead logical concepts (why, what) can be developed alongside implementation. - -The Data Architecture team therefore intends to maintain concepts for both logical and implementation alongside each other for their projects using the playground. - -Of course it is perfectly normal that in _using_ the playground to develop an idea, example or pattern, that an architecture and components are chosen as part of the design. - -## Why _Central Data Service Playground_ ? - -### Problem -OEMs have presented various open questions and requirements in tackling growing software complexity. One representative list appears below. - -"Key questions for a End-to-End Data Architecture: -- How data can be shared between all touchpoints? -- How different domains of data share same tech -stack? -- How should a bidirectional sync work? -- Who is responsible for conflict management? -- Who takes care about permissions, roles, rights -and privacy? -- How the data model can be updated and synced? -- How subscriptions can be handled? -- How to handle historized and time series data ... -- ...on different touchpoints? -- How to handle multiple sync endpoints? -- How to handle unidirectional data streams? -- How (new) knowledge ... -- ... can be shared with others?" - -Source: [_"Building Bridges with a common Data Middleware"_, OEM, COVESA Autumn 2023 AMM](https://wiki.covesa.global/download/attachments/78840403/COVESA_DataMiddleware-PoC-Status_v2.pdf?version=1&modificationDate=1698737955726&api=v2) - -At the same time there has been a realization that some problems require open collaboration. - -### Goal -The playground was first conceived by the COVESA Data Architecture team to meet their needs in addressing these problems. They also recognized similar needs in the wider community inside and outside COVESA. For example, for COVESA to demonstrate how VSS data can be used with its eco-system for newcomers. - -The playground goals from the introductory overview: - -_The Central Data Service Playground (CDSP) serves as a neutral, open playground for data services both within and outside the vehicle in the context of data-centric architectures. It enables investigation into the internals of these services and how they can be combined. Furthermore, the playground provides a means to publish and collaborate on such work in the open._ - -The following sections address the Why, What and How in more detail. - -### Why _Central Data Service_? - -+ VSS is a mechanism of abstraction. The COVESA logical architecture for the VSS eco-system shown below places operation in the 'big ECUs', in zonal ECUs and above. Discussion of next-gen and data-centric architectures suggests investigation into data services in zone, domain and HPC controller scenarios and the cooperation between them. Hence _Central_. - -{{< figure src="Logical-Architecture-Overview.drawio.svg" title="The COVESA Logical Architecture" width=50pc >}} - -+ A repeating pattern of discussion in the COVESA Data Architecture team is the combination of VSS Data Server and VSS Data Store with advanced features and their connection southbound to feeders/native data and northbound to clients and off-board. Hence _Data Service_. - -+ The name Central Data Service is not an attempt to introduce a new category of component. It is used here simply as a useful synonym for what otherwise would be a longer descriptive phrase explaining combinations of VSS centric Data Server and Store and their location in the vehicle. - - ### Why _Playground_? Why not PoC? - -+ A PoC is often a snapshot in time and often specific in scope. Playground suggests greater flexibility. The central service, the Lego building block, is intended to be flexible and evolving. Similarly with what it is combined with to illustrate COVESA concepts and technology. - -+ The Playground could certainly be used to implement a PoC. - -+ Patterns such as view/controller, out of the box data servers, data stores linked to applications (e.g. SQLite) etc are well known. The Service could in part be defined by what's not known, by open questions in next-gen architectures such as data-centric architectures, that needs to be tackled down. The Playground is the means to doing that and illustrating the results. - -## What? - -### Requirements - -{{< figure src="cdsp-logical-concept.drawio.svg" title="The data service core requirements" >}} - -At its core the service has requirements in three key areas: - -1. Data Models: the live data models - VSS as the abstracted view of the vehicle, along with other adjacent data models such as personal data. - -2. Persistence: history of the model and signals etc - historical and cached timeseries data. - -3. Application logic / APIs: standardized APIs for accessing the data such as the [Vehicle Information Service Specification (VISS)](https://github.com/COVESA/vehicle-information-service-specification) - or GraphQL. - -_Additional requirements:_ It is recognized that additional features, such as synchronization are absolutely desirable and have been a part of discussions in the Data Architecture team. Such features may also already be part of the feature set of the playground components. For example, the Apache IoTDB databases have sync capabilities. A base feature set is described as a starting point to help readers quickly grasp the concept. Additional features will be created or illustrated collectively based on interest and participation. - -### Components - -As a starting point the playground has been realized as a 'project of projects' to create the basic building block data service. Achieved by combining a VISS Data Protocol Server with highly functional VSS Data Stores. - -The VISS Protocol Server principally provides northbound get/set/sub application logic using the VISS protocol. Along with the secondary benefit of any additional features provided by the server. - -'Highly functional' in the context of the VSS Data Store means the flexible means to store, query, process and analysis timeseries data. An archetype would be a database server that can operate in-vehicle and the cloud. Such a component provides the possibility of using a variety of different architecture patterns, such as both client-server and event-driven, or data processing approaches. - -### Flexibility in use - -As well as the mentioned flexibility in implementation, flexibility in use is also intended: - -+ With some supporting documentation it can help meet the ongoing request from newcomers to the VSS eco-system as to how VSS can be used. - -+ The Data Architecture group has various topics it wishes to investigate related to data-centric architectures. Data layer topics such as sync, data reduction and data quality. Also separation of concerns and cooperation between data and knowledge layers. - -+ The playground can be used to investigate internals of data services. For example, connecting to medium and high speed data, or adding a protocol. - -+ External connections with other systems may also be a focus. For example, combining the service with other components to implement a particular touchpoint such as mobile. - -Further details can be found in the following sections. - -### The Playground in context - -To help understand its use lets quickly place the playground in context. - -**Big picture**: As stated above the COVESA logical architecture places its scope at Zonal ECUs and above as shown in the diagram. It is assumed that the playground would likely be deployed on a Zone, Domain or Central controller, with corresponding h/w capabilities. - -**Interaction between 'Large ECU'**: In the COVESA Data Architecture team it is recognized that zone/domain specific data services will need to synchronize and cooperate between themselves and/or with a central vehicle computer, e.g. Inter-controller sync/cooperation: - -![Cooperation between zonal data stores and central data service/store](https://raw.githubusercontent.com/slawr/vss-otaku/master/in-vehicle-storage/apache-iotdb/doc/zonal-vss-store-cooperation.drawio.svg "Cooperation between zonal data stores") -Source: [vss-otaku](https://github.com/slawr/vss-otaku) - -**In-vehicle southbound**: The playground can be integrated southbound to lower parts of the vehicle and its native data, through data feeders and connectors. This can include making connections to other systems such as Autosar etc. - -**Northbound**: connections will be made to clients, mobile, cloud and major in-vehicle domains such as IVI running Android/Apple etc. - -**Logical domains**: Connections may also be made to other logical data domains. For example, there is an [knowledge layer proposal](https://wiki.covesa.global/x/cYI8B) made in the COVESA Data Architecture team that discusses the separation of concerns and interaction between knowledge, information and raw data layers as illustrated below. The Playground here could be used to provide the data/information layer services in its investigation. - -![Knowledge layer proposal](https://wiki.covesa.global/download/attachments/71074417/Knowledge-Layer-v3.png?api=v2?width=50pc "Deployment illustration from the proposal") - Source: [knowledge layer proposal](https://wiki.covesa.global/x/cYI8B) - -### Project success factors - -1. Newcomers to COVESA technology use the playground to accelerate their understanding of how the technology can be used. That could be a looking at a simple instance of how a VSS data server is combined with a VSS data store and queried using VISS. It could also be a more complex instance that combines components to illustrate a longer specific end to end use case, e.g. mobile to vehicle connection. - -2. Internal groups within COVESA naturally use the logical concepts and the playground implementation in combination with other components to develop and disseminate ideas. This especially applies to the Data Architecture and Infrastructure pillar. - -3. Supporting materials such as patterns, diagrams, cookbooks etc are adopted as useful assets within and outside COVESA, which in turn helps socialization. - -## How? - -+ Address two high level implementation needs, keeping in mind a path towards production where possible: - - - Easy to develop: make it easy to build, modify and trial by providing an instance running on a host, e.g. using Docker container(s). - - - Closer to production: the same base code should be deployable to systems closer to production, including on automotive hardware (or its simulation), e.g. Yocto, container orchestration, SOA etc. - -+ A path towards production can be supported by using production components, rather than overly simple substitutes, where it makes sense. For instance a particular scenario may use Kafka in a cloud connection. The point is not to pick a winning product in a particular category, but to recognize that using a production tool can represent a category that is known to scale. Detailed requirements for a specific production project and product selection for it, is rightly left to that project. - -+ A generic code base for the basic building blocks should allow flexible compilation to meet those needs on multiple architectures, e.g. x86, ARM and RISC-V. The target for how it is used being a matter of deployment at a high level. - -+ Follow the OSS mantra of adopt where you can, extend if needed, create where necessary. - -+ Promote flexible reconfiguration of components by favouring loose coupling over tight coupling. diff --git a/docs/docs-gen/content/overview/cdsp-overview.md b/docs/docs-gen/content/overview/cdsp-overview.md deleted file mode 100644 index bb3e6f26..00000000 --- a/docs/docs-gen/content/overview/cdsp-overview.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: "Playground overview" -weight: 10 ---- -The Central Data Service Playground (CDSP) serves as a neutral, open playground for data services both within and outside the vehicle in the context of data-centric architectures. It enables investigation into the internals of these services and how they can be combined. Furthermore, the playground provides a means to publish and collaborate on such work in the open. - -The playground was first conceived by the COVESA Data Architecture team to meet their needs. They also recognized that there were the same needs in the wider community inside and outside COVESA. For example, to demonstrate how VSS data can be used with its eco-system for newcomers. - -Next steps: - -1. [Logical concept]({{< ref "/cdsp-logical-concept.md" >}} "Explore the logical concept") -2. [Implementation concept]({{< ref "/cdsp-implementation-concept.md" >}} "Explore the implementation concept") -3. [COVESA eco-system and beyond]({{< ref "covesa-and-beyond.md" >}} "How the playground fits into the wider eco-system") \ No newline at end of file diff --git a/docs/docs-gen/content/overview/covesa-and-beyond.md b/docs/docs-gen/content/overview/covesa-and-beyond.md deleted file mode 100644 index 04b492c6..00000000 --- a/docs/docs-gen/content/overview/covesa-and-beyond.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: "Combining with wider eco-system" -weight: 40 ---- - -\<TBA: This page will put the playground 'lego piece' in context with the wider COVESA eco-system and beyond, e.g. connection to CVI/Capabilities/Vehicle API gateway southbound\> \ No newline at end of file diff --git a/docs/docs-gen/data/units.yaml b/docs/docs-gen/data/units.yaml deleted file mode 100644 index fac53be7..00000000 --- a/docs/docs-gen/data/units.yaml +++ /dev/null @@ -1,226 +0,0 @@ -# This file defines units supported in the VSS standard catalog -units: - mm: - label: millimeter - description: Distance measured in millimeters - domain: distance - cm: - label: centimeter - description: Distance measured in centimeters - domain: distance - m: - label: meter - description: Distance measured in meters - domain: distance - km: - label: kilometer - description: Distance measured in kilometers - domain: distance - inch: - label: inch - description: Distance measured in inches - domain: distance - km/h: - label: kilometer per hour - description: Speed measured in kilometers per hours - domain: speed - m/s: - label: meters per second - description: Speed measured in meters per second - domain: speed - m/s^2: - label: meters per second squared - description: Acceleration measured in meters per second squared - domain: acceleration - cm/s^2: - label: centimeters per second squared - description: Acceleration measured in centimeters per second squared - domain: acceleration - ml: - label: milliliter - description: Volume measured in milliliters - domain: volume - l: - label: liter - description: Volume measured in liters - domain: volume - cm^3: - label: cubic centimeters - description: Volume measured in cubic centimeters - domain: volume - celsius: - label: degree celsius - description: Temperature measured in degree celsius - domain: temperature - degrees: - label: degree - description: Angle measured in degrees - domain: angle - degrees/s: - label: degree per second - description: Angular speed measured in degrees per second - domain: angular speed - W: - label: watt - description: Power measured in watts - domain: power - kW: - label: kilowatt - description: Power measured in kilowatts - domain: power - PS: - label: horsepower - description: Power measured in horsepower - domain: power - kWh: - label: kilowatt hours - description: Energy consumption measured in kilowatt hours - domain: energy consumption - g: - label: gram - description: Mass measured in grams - domain: mass - kg: - label: kilogram - description: Mass measured in kilograms - domain: mass - lbs: - label: pound - description: Mass measured in pounds - domain: mass - V: - label: volt - description: Electric potential measured in volts - domain: electric potential - A: - label: ampere - description: Electric current measured in amperes - domain: electric current - Ah: - label: ampere hours - description: Electric charge measured in ampere hours - domain: electric charge - ms: - label: millisecond - description: Time measured in milliseconds - domain: time - s: - label: second - description: Time measured in seconds - domain: time - min: - label: minute - description: Time measured in minutes - domain: time - h: - label: hour - description: Time measured in hours - domain: time - day: - label: days - description: Time measured in days - domain: time - weeks: - label: weeks - description: Time measured in weeks - domain: time - months: - label: months - description: Time measured in months - domain: time - years: - label: years - description: Time measured in years - domain: time - UNIX Timestamp: - label: UNIX Timestamp - description: Unix time is a system for describing a point in time. It is the number of seconds that have elapsed since the Unix epoch, excluding leap seconds. - domain: point in time - mbar: - label: millibar - description: Pressure measured in millibars - domain: pressure - Pa: - label: pascal - description: Pressure measured in pascal - domain: pressure - kPa: - label: kilopascal - description: Pressure measured in kilopascal - domain: pressure - stars: - label: stars - description: Rating measured in stars - domain: rating - g/s: - label: grams per second - description: Mass per time measured in grams per second - domain: mass per time - g/km: - label: grams per kilometer - description: Mass per distance measured in grams per kilometers - domain: mass per distance - kWh/100km: - label: kilowatt hours per 100 kilometers - description: Energy consumption per distance measured in kilowatt hours per 100 kilometers - domain: energy consumption per distance - ml/100km: - label: milliliter per 100 kilometers - description: Volume per distance measured in milliliters per 100 kilometers - domain: volume per distance - l/100km: - label: liter per 100 kilometers - description: Volume per distance measured in liters per 100 kilometers - domain: volume per distance - l/h: - label: liter per hour - description: Flow measured in liters per hour - domain: flow - mpg: - label: miles per gallon - description: Distance per volume measured in miles per gallon - domain: distance per volume - N: - label: newton - description: Force measured in newton - domain: force - Nm: - label: newton meter - description: Torque measured in newton meters - domain: torque - rpm: - label: revolutions per minute - description: Rotational speed measured in revolutions per minute - domain: rotational speed - Hz: - label: frequency - description: Frequency measured in hertz - domain: frequency - ratio: - label: ratio - description: Relation measured as ratio - domain: relation - percent: - label: percent - description: Relation measured in percent - domain: relation - nm/km: - label: nano meter per kilometer - description: nm/km - domain: nm/km - dBm: - label: decibel milliwatt - description: Power level expressed in decibels with reference to one milliwatt - domain: relation - kN: - label: kilo newton - description: Force measured in kilo newton - domain: force - cpm: - label: cycles per minute - description: Number of cycles per minute - domain: frequency - bpm: - label: beats per minute - description: Number of human heart beats per minute - domain: frequency diff --git a/docs/docs-gen/layouts/partials/favicon.html b/docs/docs-gen/layouts/partials/favicon.html deleted file mode 100644 index 40c4545f..00000000 --- a/docs/docs-gen/layouts/partials/favicon.html +++ /dev/null @@ -1 +0,0 @@ -<link rel="shortcut icon" href="/hierarchical_information_model/images/fav.png" type="image/x-icon" /> diff --git a/docs/docs-gen/layouts/partials/logo.html b/docs/docs-gen/layouts/partials/logo.html deleted file mode 100644 index b15baa0b..00000000 --- a/docs/docs-gen/layouts/partials/logo.html +++ /dev/null @@ -1,3 +0,0 @@ -<a id="logo" href="{{ .Site.BaseURL }}"> - <img src="/cdsp/images/cdsp.png"> -</a> diff --git a/docs/docs-gen/static/images/cdsp.png b/docs/docs-gen/static/images/cdsp.png deleted file mode 100644 index 26ca2c875c4104a7fc050d30c455f91dfeed5749..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12903 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 N$xEw9RY@2J{x4!Y2eAME diff --git a/docs/docs-gen/static/images/fav.png b/docs/docs-gen/static/images/fav.png deleted file mode 100644 index 25d01eca20ac32823242e5f7554a11c872fc2fcf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1953 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 I&MBb@0Grb3yZ`_I diff --git a/docs/docs-gen/themes/learn b/docs/docs-gen/themes/learn deleted file mode 160000 index 3202533a..00000000 --- a/docs/docs-gen/themes/learn +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 3202533a746f91c67de1a8fa373c0328ec1b403d From 2f07195640d7ee2694bde2235d160de0c87aa066 Mon Sep 17 00:00:00 2001 From: Stephen Lawrence <stephen.lawrence@renesas.com> Date: Thu, 19 Mar 2026 19:40:59 +0000 Subject: [PATCH 9/9] doc site: remove github action build_check.yaml that built old site Remove the github action build_check.yaml that despite its name only build the old doc site. The new doc site uses an updated action called pages.yaml Signed-off-by: Stephen Lawrence <stephen.lawrence@renesas.com> --- .github/workflows/buildcheck.yaml | 33 ------------------------------- 1 file changed, 33 deletions(-) delete mode 100644 .github/workflows/buildcheck.yaml diff --git a/.github/workflows/buildcheck.yaml b/.github/workflows/buildcheck.yaml deleted file mode 100644 index 9c83c983..00000000 --- a/.github/workflows/buildcheck.yaml +++ /dev/null @@ -1,33 +0,0 @@ -name: Standard Build Check - -on: [push, pull_request] - -jobs: - docgen: - name: Documentation Generation - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v3 - with: - submodules: true - - - name: Install hugo - env: - HUGO_VER : 0.124.0 - run: | - curl -LO https://github.com/gohugoio/hugo/releases/download/v${HUGO_VER}/hugo_${HUGO_VER}_linux-amd64.deb - sudo dpkg -i hugo_${HUGO_VER}_linux-amd64.deb - - - name: Make docs - run: | - hugo -s ./docs/docs-gen - - - name: Deploy docs - # Only deploy docs if this was a push to master - if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }} - uses: JamesIves/github-pages-deploy-action@4.1.4 - with: - branch: gh-pages # The branch the action should deploy to. - folder: docs # The folder the action should deploy. - commit-message: Auto-deploy docs built from commit ${{ github.sha }}