rsiot/
lib.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
//! Компоненты для построения системы сбора, обработки и визуализации данных
//!
//! Документация по платформам:
//!
//! - [x86_64-unknown-linux-gnu](../../x86_64-unknown-linux-gnu/rsiot/index.html)
//! - [aarch64-linux-android](../../aarch64-linux-android/rsiot/index.html)
//! - [aarch64-unknown-linux-gnu](../../aarch64-unknown-linux-gnu/rsiot/index.html)
//! - [riscv32imc-esp-espidf](../../riscv32imc-esp-espidf/rsiot/index.html)
//! - [wasm32-unknown-unknown](../../wasm32-unknown-unknown/rsiot/index.html)
//!
//! ## Обзор
//!
//! Набор компонентов для создания системы управления и диспетчиризации.
//!
//! Клиентское подключение:
//!
//! - cmp_http_client_wasm
//! - cmp_http_client
//! - cmp_modbus_client
//! - cmp_websocket_client_wasm
//! - cmp_websocket_client
//!
//! Сервера:
//!
//! - cmp_http_server_esp
//! - cmp_http_server
//! - cmp_websocket_server
//!
//! Брокеры сообщений:
//!
//! - cmp_esp_mqtt_client
//! - cmp_mqtt_client
//! - cmp_redis_client
//!
//! Интерфейс пользователя:
//!
//! - cmp_leptos
//! - cmp_slint
//!
//! Авторизация:
//!
//! - cmp_auth
//!
//! Сохранение данных:
//!
//! - cmp_esp_nvs
//! - cmp_influxdb
//! - cmp_surrealdb
//! - cmp_timescaledb
//! - cmp_webstorage
//!
//! Взаимодействие с аппаратной частью:
//!
//! - cmp_esp_adc
//! - cmp_esp_gpio
//! - cmp_esp_i2c_master
//! - cmp_esp_i2c_slave
//! - cmp_esp_led
//! - cmp_esp_mqtt_client
//! - cmp_esp_spi_master
//! - cmp_esp_wifi
//! - cmp_raspberrypi_gpio
//!
//! Логика исполнения
//!
//! - cmp_plc
//!
//! Систеная информация
//!
//! - cmp_system_info
//!
//! Служебные компоненты:
//!
//! - cmp_add_input_stream
//! - cmp_add_output_stream
//! - cmp_derive
//! - cmp_external_fn_process
//! - cmp_inject_periodic
//! - cmp_logger
//!
#![doc = include_str!("../doc/Новая концепция-2024-01-03-10-46.svg")]
//! ![](./rsiot/doc/Новая%20концепция-2024-01-03-10-46.svg)
//!
//!
//! ## Описание
//!
//! **Компоненты** представляют собой асинхронные функции. У всех функций три аргумента:
//!
//! ```rust
//! # use tokio;
//! # use rsiot_messages_core::IMessage;
//! async fn component<TMessage, TConfig>(
//!     input: Option<tokio::sync::mpsc::Receiver<TMessage>>,
//!     output: Option<tokio::sync::mpsc::Sender<TMessage>>,
//!     config: TConfig,
//! ) -> ()
//! where
//!     TMessage: IMessage
//! {}
//! ```
//!
//! Сообщения между компонентами передаются через каналы "many producers to a single consumer"
//! библиотеки `tokio`.
//!
//! Входной или выходной потоки могут быть не заданы, поэтому каналы обернуты в Option.
//!
//! Структура конфигурации типа `TConfig` у каждого компонента своя.
//!
//! Компоненты ничего не возвращают (точнее, возвращают тип `()`). Если в компоненте возникает
//! ошибка, логику перезапуска необходимо реализовать внутри данной функции. TODO - пересмотреть,
//! возможно стоит возвращать Result при критических ошибках.
//!
//! **Сообщения** представляют собой тип enum, например:
//!
//! ```rust
//! use rsiot_messages_core::eav::EavModel;
//! use rsiot_messages_core::IMessage;
//! use serde::{Deserialize, Serialize};
//!
//! [derive(Clone, Debug, Deserialize, Serialize)]
//! enum Message {
//!     /// Текущее значение температуры
//!     Temperature(f64),
//!     /// Задание уставки
//!     ChangeSetpoint(f64),
//! }
//!
//! impl IMessage for Message {
//!     fn into_eav(self) -> Vec<EavModel> {
//!         vec![]
//!     }}
//! ```
//!
//! Трейт `IMessage` реализует основные методы - см. документацию по крейту
//! [rsiot-messages-core](https://docs.rs/rsiot-messages-core/latest)
//!
//! Для упрощения компоненты можно создавать и объединять в **цепочку компонентов**.
//!
//!
//! - может генерировать сообщения как на основе входных сообщений
//! - может генерировать сообщения периодически
//!
//!  ## Флаги `feature`:
#![doc = document_features::document_features!()]
#![cfg_attr(docsrs, feature(doc_auto_cfg))]
#![warn(rustdoc::bare_urls)]
#![warn(missing_docs)]

//! TODO - какая-то проблема в tokio
// #![allow(clippy::needless_return)]

pub mod components_config;
pub mod message;

#[cfg(feature = "executor")]
pub mod components;

#[cfg(any(feature = "cmp_esp", feature = "cmp_raspberrypi"))]
pub mod drivers_i2c;

#[cfg(feature = "env_vars")]
pub mod env_vars;

#[cfg(feature = "executor")]
pub mod executor;

#[cfg(feature = "logging")]
pub mod logging;

#[cfg(feature = "rustdoc")]
pub mod doc;

pub mod serde_utils;