From 982df513b2844dd820489a4a9a0cf30cdc61aec4 Mon Sep 17 00:00:00 2001 From: Claudio Bisegni <Claudio.Bisegni@lnf.infn.it> Date: Mon, 7 Jan 2019 14:55:14 +0100 Subject: [PATCH] add some minimal documentation --- README.md | 1 + doc/02_Micro_Unit_Toolkit | 0 doc/config.json | 32 +++++++ doc/control-unit/external_driver.md | 10 +++ doc/control-unit/external_unit.md | 1 + doc/control-unit/index.md | 4 + doc/control-unit/native_driver.md | 1 + doc/index.md | 44 ++++++++++ doc/logo_chaos_col.png | Bin 0 -> 36331 bytes doc/mds/index.md | 5 ++ .../http_connection_adapter.md | 5 ++ doc/micro-unit-toolkit/index.md | 80 ++++++++++++++++++ .../raw_driver_unit_proxy.md | 1 + 13 files changed, 184 insertions(+) create mode 100644 doc/02_Micro_Unit_Toolkit create mode 100644 doc/config.json create mode 100644 doc/control-unit/external_driver.md create mode 100644 doc/control-unit/external_unit.md create mode 100644 doc/control-unit/index.md create mode 100644 doc/control-unit/native_driver.md create mode 100644 doc/index.md create mode 100644 doc/logo_chaos_col.png create mode 100644 doc/mds/index.md create mode 100644 doc/micro-unit-toolkit/http_connection_adapter.md create mode 100644 doc/micro-unit-toolkit/index.md create mode 100644 doc/micro-unit-toolkit/raw_driver_unit_proxy.md diff --git a/README.md b/README.md index 8c238b614..25de82c41 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,7 @@ Key features and development strategies of !CHAOS are: "BSON" stands for "binary JSON" - a binary storage format that is JSON inspired. This distribution merely rips it out of the bson repository into its own. +Read the [Documentation](control-unit/index.md) For further documentation please visit: diff --git a/doc/02_Micro_Unit_Toolkit b/doc/02_Micro_Unit_Toolkit new file mode 100644 index 000000000..e69de29bb diff --git a/doc/config.json b/doc/config.json new file mode 100644 index 000000000..a4205a4a3 --- /dev/null +++ b/doc/config.json @@ -0,0 +1,32 @@ +{ + "title": "!CHAOS Control System", + "tagline": "Control system based on Highly Abstracted and Open Structure", + "author": "Claudio Bisegni", + "image": "logo_chaos_col.png", + "ignore": { + "files": ["Work_In_Progress.md"], + "folders": ["99_Not_Ready"] + }, + "live": { + "clean_urls": true + }, + "html": { + "theme": "daux-blue", + "breadcrumbs": true, + "breadcrumb_separator": "Chevrons", + "toggle_code": false, + "date_modified": true, + "float": true, + "inherit_index": true, + "links": { + "INFN Repo": "https://baltig.infn.it/chaos-lnf-control/chaosframework", + "INFN Doc Repo":"https://baltig.infn.it:chaos-lnf-control/chaosframework-doc", + "Help/Support/Bugs": "https://baltig.infn.it/chaos-lnf-control/chaosframework/issues", + "Made by INFN": "http://www.infn.it" + }, + "edit_on": { + "name": "Gitlab", + "basepath": "https://baltig.infn.it/chaos-lnf-control/chaosframework" + } + } +} diff --git a/doc/control-unit/external_driver.md b/doc/control-unit/external_driver.md new file mode 100644 index 000000000..f5cd6f84a --- /dev/null +++ b/doc/control-unit/external_driver.md @@ -0,0 +1,10 @@ +# Control Unit External Driver + +[TOC] + +External driver are like normal control unit driver with the difference that are divide into two separate physical process: +* *Control Unit Driver*, is the driver that is specified into metadata server and is associated to CU instance when it is loaded +* *Remote Unit Driver* is the process built on [Micro Unit Toolkit](../02_Micro_Unit_Toolkit) + + +Control unit toolkit uses ***External Unit Layers***(EUL) to provide diff --git a/doc/control-unit/external_unit.md b/doc/control-unit/external_unit.md new file mode 100644 index 000000000..1fb7042ae --- /dev/null +++ b/doc/control-unit/external_unit.md @@ -0,0 +1 @@ +#External Unit diff --git a/doc/control-unit/index.md b/doc/control-unit/index.md new file mode 100644 index 000000000..f766194ba --- /dev/null +++ b/doc/control-unit/index.md @@ -0,0 +1,4 @@ +# Control Unit Toolkit + +The Control Unit Toolkit(CUT) provides a library and interfaces to abstract the device concept. +Each CU (device) defines a dataset and/or actions/commands that represent respectively the data and the commands that !CHAOS use to handle with control and/or DAQ processes. diff --git a/doc/control-unit/native_driver.md b/doc/control-unit/native_driver.md new file mode 100644 index 000000000..148dac300 --- /dev/null +++ b/doc/control-unit/native_driver.md @@ -0,0 +1 @@ +# Native Control Unit Driver diff --git a/doc/index.md b/doc/index.md new file mode 100644 index 000000000..e72910609 --- /dev/null +++ b/doc/index.md @@ -0,0 +1,44 @@ + + +[TOC] + +# Description +The !CHAOS project aims to develop a new concept of control system and data acquisition framework by providing, with a high level of abstraction, all the services needed for controlling and managing a large scientific, or non-scientific, infrastructure. +!CHAOS redefines the Control System paradigm by introducing the new concept of Control Service, i.e. a distributed, scalable provider offering, to a general class of clients, high- performance services such as data sharing, commands dispatching, continuous historical data archiving, configuration tools, middle-layer resource management, etc ... + +The key features and development strategies of !CHAOS are: scalability of performances and size: +* integration of all functionalities +* abstraction of services, devices and data +* easy and modular customisation +* extensive data catching for performance boost high-performance internet software technologies. + +# Principal Components +Here are briefly described the components of the system. + +##Control Unit (CU) +CU interfaces with the !CHAOS hardware by using a driver and developing both control and data acquisition. +At software level, CU is an exe file built using the !CHAOS libraries, developed in C language. +see documentation [here](control-unit/index.md) + +## Execution Unit (EU) +performs the feedback control of the CU via a dedicated driver. It captures data from CDS, processes them and sends commands to the feedback of the CU. + +## Client toolkits (UI) +monitors data and shows them to the users. The impact of the UI on the infrastructure is strictly related to: +the quantity of data to monitor; +the type of the user interface used (command line, web, ...) +see documentation [here](micro-unit-toolkit/index.md) + +## Metadata Server (MDS) +is aimed to manage configuration metadata of the other components of the architecture. The required characteristics are: +High availability +High scalability is not required since the load of the metadata server is not proportional to the workload of the control system, but is only related to the number of system components. + +## CHAOS Data Server (CDS) +is responsible of data archiving and distribution from and to the Control Units, Execution Units and User Interfaces. Data management includes the following activities: +data storage reading the latest data available; querying historical data. +CDS should provide the following characteristics: high performances; +high scalability; multi-threading. + + +link to specialised pages: diff --git a/doc/logo_chaos_col.png b/doc/logo_chaos_col.png new file mode 100644 index 0000000000000000000000000000000000000000..9a88623f04bc9d2e227bd7384911995fc4f1b4fc GIT binary patch literal 36331 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 AAOHXW literal 0 HcmV?d00001 diff --git a/doc/mds/index.md b/doc/mds/index.md new file mode 100644 index 000000000..52446d65c --- /dev/null +++ b/doc/mds/index.md @@ -0,0 +1,5 @@ +# Metadata service + +[TOC] + +The ***Metadata Service***(MDS) is a chaos process that act as separation layer from !CHAOS nodes and backend implementations(live cache, database and storage) diff --git a/doc/micro-unit-toolkit/http_connection_adapter.md b/doc/micro-unit-toolkit/http_connection_adapter.md new file mode 100644 index 000000000..2be0a8f51 --- /dev/null +++ b/doc/micro-unit-toolkit/http_connection_adapter.md @@ -0,0 +1,5 @@ +# HTTP Connection Adapter + +[TOC] + +The ***HTTP Connection Adapter*** (HCA) implements the EUS protocol using a standard web-socket connection sending and receiving JSON message. diff --git a/doc/micro-unit-toolkit/index.md b/doc/micro-unit-toolkit/index.md new file mode 100644 index 000000000..09cf70134 --- /dev/null +++ b/doc/micro-unit-toolkit/index.md @@ -0,0 +1,80 @@ +# Micro Unit toolkit + +[TOC] + +The ***Micro Unit Toolkit***(MUT) provides a way to connect with the external unit layer exposed by control unit toolkit. It is build with very little dependency, most of which are included directly in MUT source as amalgamated source file. + +## Why another toolkit +<p align="justify"> +This new toolkit is created keeping in mind that it should compile on most platform starting from a very old operating system and hardware to the new realtime operation system. In general where !CHAOS framework can't be compiled or run the micro unit toolkit permit extends this limitation. The toolkit is the remote counterpart of the [External Unit Server (EUS)](../control-unit/external_unit.md) hosted by the CUT. +</p> + +## Dependency +The library that are used by the toolkit are: +* [jsonccp](https://github.com/open-source-parsers/jsoncpp) used for the data serialization +* [mongoose](https://github.com/cesanta/mongoose) used for web-socket http management + +## Architecture +<p align="justify"> +The internal MUT architecture is base on two different Layers, on that abstract the connection implementation and one that realize the unit implementation. The toolkit is totally developed to an event based interaction with user. The unit toolkit uses the connection adapter to create a connection to the remote EUS and exchange data, with the remote counterpart, with the chosen unit proxy. +</p> +<p align="justify"> +The Exchanged data consists on message that are exchanged by each endpoint in an asynchronous way. Each one can, spontaneously, send a message to the other counterpart. The semantic of the messages follow the key/value logic. Different serialization can optimize the way to code this semantic[example json, bson, avro , etc...] +</p> + +### Connection Adapter(CAL) +<p align="center"> <img src="../img/mut_ca.png"></p> +<p align="justify"> +The abstract adapter implement all primitive communication for send message and request and contains a queue of received spontaneous message from remote endpoint or response to a request response. The subclass need to implement four abstract method: +</p> +```cpp +virtual int connect() = 0; +virtual void poll(int32_t milliseconds_wait = 100) = 0; +virtual int sendRawMessage(chaos::micro_unit_toolkit::data::DataPackUniquePtr& message) = 0; +virtual int close() = 0; +``` + +<p align="justify"> +The subclass need to manage by itself the connection state and a queue of message to send, pool is called repetitively to permit to implementation to send data and receive new message. When something has been received, subclass need to call the below superclass method to send new arrival in the queue of the received messages. +</p> +```cpp +void handleReceivedMessage(chaos::micro_unit_toolkit::data::DataPackSharedPtr& received_message); +``` +<p align="justify"> +The design is very basic and not use any thread or async things, so every additional feature need to be implemented by the user. In this way the adapter can be adapted also into very bare-bone or limited resources hardware. The abstraction itself implements the external unit logic communication layer exposing this public method: +</p> + +```cpp +const ConnectionState& getConnectionState() const; +int sendMessage(data::DataPackUniquePtr& message); +int sendRequest(data::DataPackUniquePtr& message, uint32_t& request_id); +bool hasMoreMessage(); +chaos::micro_unit_toolkit::data::DataPackSharedPtr getNextMessage(); +bool hasResponse(); +bool hasResponseAvailable(uint32_t request_id); +``` +<p align="justify"> +Below is shown the flow of a connection by his states: +<p align="center"> <img src="../img/mut_connection_flow.png"></p> +</p> + +Implemented superclass and protocols: +* [http connection adapter](./http_connection_adapter.md) + + +#### HTTP Connection Adapter +<p align="justify"> +The http connection adapter realize a JSON based protocol transmitter over web-socket connection with the remote EUS exposed by control unit. +</p> + +### Unit Proxy(UPL) +<p align="center"> <img src="../img/mut_up.png"></p> +<p align="justify"> +the unit proxy uses the connection and abstract data representation to exchange dat with the [EUS](../control-unit/external_unit.md). In other world the type of connection and serialization are managed at connection level. In any way, in whatever serialization will be created, the messages will ever contains a notions of key and value, so the semantic will never changes. +</p> +<p align="justify"> +Unit Proxy is the base class for all implemented unit at this time only the Raw Driver unit is implemented. In future will be implemented the whole Control Unit protocol stack for totally externalize a real CU. Unit proxy realize the base transport layer for unit object, it define the semantic of send and receive message and request. +</p> + +* Message are data that are send o received by each connection endpoint. +* <p align="justify">Requests are message that need a response by the endpoint that received it. The request with the message also delivers the is of the request. This code need to be send with the message that need to be used as response.</p> diff --git a/doc/micro-unit-toolkit/raw_driver_unit_proxy.md b/doc/micro-unit-toolkit/raw_driver_unit_proxy.md new file mode 100644 index 000000000..f2cb60a3e --- /dev/null +++ b/doc/micro-unit-toolkit/raw_driver_unit_proxy.md @@ -0,0 +1 @@ +# Raw Driver Unit -- GitLab