From 94cfd84ad65a9f02f97ea40474f0124f3f87e537 Mon Sep 17 00:00:00 2001 From: alex13sh Date: Tue, 19 Oct 2021 15:54:16 +0300 Subject: [PATCH 01/24] [meln_logic] Re-export structs --- meln_logic/src/lib.rs | 4 ++-- meln_logic/src/structs_2/dozator.rs | 2 +- meln_logic/src/structs_2/half_meln.rs | 5 +++-- meln_logic/src/structs_2/material.rs | 3 +-- meln_logic/src/structs_2/meln.rs | 24 +++++++++++----------- meln_logic/src/structs_2/mod.rs | 3 +++ meln_logic/src/structs_2/oil_station.rs | 2 +- meln_logic/src/structs_2/property.rs | 7 +++++-- meln_logic/src/structs_2/vacuum_station.rs | 2 +- 9 files changed, 29 insertions(+), 23 deletions(-) diff --git a/meln_logic/src/lib.rs b/meln_logic/src/lib.rs index 939df18..e692160 100644 --- a/meln_logic/src/lib.rs +++ b/meln_logic/src/lib.rs @@ -10,5 +10,5 @@ pub use init_clear::init; // pub mod algorithm; pub mod devices; -mod structs_2; -use structs_2::*; +pub mod structs_2; +pub use structs_2 as structs; diff --git a/meln_logic/src/structs_2/dozator.rs b/meln_logic/src/structs_2/dozator.rs index 563dc57..ff1e5c6 100644 --- a/meln_logic/src/structs_2/dozator.rs +++ b/meln_logic/src/structs_2/dozator.rs @@ -70,7 +70,7 @@ impl From<&ModbusValues> for Dozator { } pub mod watcher { - use crate::Property; + use crate::structs::Property; pub struct Dozator { pub speed: Property, pub motor: Property, diff --git a/meln_logic/src/structs_2/half_meln.rs b/meln_logic/src/structs_2/half_meln.rs index 0254dcb..6093e2e 100644 --- a/meln_logic/src/structs_2/half_meln.rs +++ b/meln_logic/src/structs_2/half_meln.rs @@ -97,7 +97,8 @@ pub enum SpeedChange { } pub mod watcher { - use crate::Property; +// #[macro_use] + use crate::structs::{Property, changed_any}; pub struct HalfMeln { pub invertor: Invertor, pub motor: Motor, @@ -122,7 +123,7 @@ pub mod watcher { let mut hz = self.invertor.hz.subscribe(); let mut amper = self.invertor.amper.subscribe(); loop { - crate::changed_any!(vibro, hz, amper); + changed_any!(vibro, hz, amper); { let vibro = *vibro.borrow(); let hz = *hz.borrow(); diff --git a/meln_logic/src/structs_2/material.rs b/meln_logic/src/structs_2/material.rs index d0f98b9..fa2f858 100644 --- a/meln_logic/src/structs_2/material.rs +++ b/meln_logic/src/structs_2/material.rs @@ -24,8 +24,7 @@ impl From<&ModbusValues> for Material { } pub mod watcher { - use crate::Property; - use super::super::*; + use crate::structs::*; use dozator::watcher::Dozator; pub struct Material { diff --git a/meln_logic/src/structs_2/meln.rs b/meln_logic/src/structs_2/meln.rs index 97979af..c38e255 100644 --- a/meln_logic/src/structs_2/meln.rs +++ b/meln_logic/src/structs_2/meln.rs @@ -33,12 +33,12 @@ impl From<&ModbusValues> for Meln { } pub mod watcher { - use super::super::*; - use half_meln::watcher::HalfMeln; - use oil_station::watcher::OilStation; - use vacuum_station::watcher::VacuumStation; - use material::watcher::Material; - use dozator::watcher::Dozator; + use crate::structs::*; + pub use half_meln::watcher::HalfMeln; + pub use oil_station::watcher::OilStation; + pub use vacuum_station::watcher::VacuumStation; + pub use material::watcher::Material; + pub use dozator::watcher::Dozator; pub struct Meln { pub material: Material, @@ -70,7 +70,7 @@ pub mod watcher { let mut start_bottom = self.half_bottom.is_started.subscribe(); loop { - crate::changed_any!(start_top, start_bottom); + changed_any!(start_top, start_bottom); let start_top = *start_top.borrow(); let start_bottom = *start_bottom.borrow(); @@ -127,7 +127,7 @@ pub mod watcher { let mut клапан_верхнего_контейнера = meln.material.клапан_верхнего_контейнера.subscribe(); let mut клапан_нижнего_контейнера = meln.material.клапан_нижнего_контейнера.subscribe(); - crate::changed_all!( + changed_all!( клапан_помольной_камеры, клапан_верхнего_контейнера, клапан_нижнего_контейнера @@ -136,7 +136,7 @@ pub mod watcher { } Step_3 => { let mut motor = meln.vacuum.motor.subscribe(); - crate::changed_all!(motor); + changed_all!(motor); Откачка_воздуха_из_вакуумной_системы } Откачка_воздуха_из_вакуумной_системы => { @@ -144,19 +144,19 @@ pub mod watcher { let mut oil_motor = meln.oil.motor.subscribe(); let _klapan = meln.material.клапан_подачи_материала.get(); // klapan == false; // Проверить закрыт ли клапан, если нет, то ошибка! - crate::changed_all!(meln_motor, oil_motor); + changed_all!(meln_motor, oil_motor); Запуск_маслостанции_и_основных_двигателей } Запуск_маслостанции_и_основных_двигателей => { let mut motor = meln.material.dozator.motor.subscribe(); - crate::changed_all!(motor); + changed_all!(motor); // *motor.borrow() == true Подача_материала } Подача_материала => { let mut клапан_помольной_камеры = meln.material.клапан_помольной_камеры.subscribe(); let mut клапан_нижнего_контейнера = meln.material.клапан_помольной_камеры.subscribe(); - crate::changed_all!(клапан_помольной_камеры, клапан_нижнего_контейнера); + changed_all!(клапан_помольной_камеры, клапан_нижнего_контейнера); Измельчение_материала } diff --git a/meln_logic/src/structs_2/mod.rs b/meln_logic/src/structs_2/mod.rs index 717d002..af975dd 100644 --- a/meln_logic/src/structs_2/mod.rs +++ b/meln_logic/src/structs_2/mod.rs @@ -1,6 +1,7 @@ mod meln; mod half_meln; mod dozator; +#[macro_use] mod property; mod oil_station; mod vacuum_station; @@ -13,3 +14,5 @@ pub use property::Property; use oil_station::OilStation; use vacuum_station::VacuumStation; use material::Material; + +use property::{changed_all, changed_any}; diff --git a/meln_logic/src/structs_2/oil_station.rs b/meln_logic/src/structs_2/oil_station.rs index 98995d0..554f1ed 100644 --- a/meln_logic/src/structs_2/oil_station.rs +++ b/meln_logic/src/structs_2/oil_station.rs @@ -30,7 +30,7 @@ impl OilStation { } pub mod watcher { - use crate::Property; + use crate::structs::Property; pub struct OilStation { pub температура: Property, pub motor: Property, diff --git a/meln_logic/src/structs_2/property.rs b/meln_logic/src/structs_2/property.rs index 84468de..096f2e8 100644 --- a/meln_logic/src/structs_2/property.rs +++ b/meln_logic/src/structs_2/property.rs @@ -44,7 +44,7 @@ impl Property { // futures::future::select_all(iter.map(|r| r.changed())); // } -#[macro_export] +// #[macro_export] macro_rules! changed_any( ($($r:ident),+) => { tokio::select! { @@ -53,7 +53,7 @@ macro_rules! changed_any( } ); -#[macro_export] +// #[macro_export] macro_rules! changed_all( ($($r:ident),+) => { let res = tokio::join! ( @@ -62,3 +62,6 @@ macro_rules! changed_all( dbg!(res); } ); + +pub(in crate::structs_2) use changed_any; +pub(in crate::structs_2) use changed_all; diff --git a/meln_logic/src/structs_2/vacuum_station.rs b/meln_logic/src/structs_2/vacuum_station.rs index 2751e9a..ae4d7c3 100644 --- a/meln_logic/src/structs_2/vacuum_station.rs +++ b/meln_logic/src/structs_2/vacuum_station.rs @@ -50,7 +50,7 @@ impl VacuumStation { } pub mod watcher { - use crate::Property; + use crate::structs::Property; pub struct VacuumStation { pub vacuum: Property, From b1885c45479e79d2bc8afdd7eec394b84c5251f0 Mon Sep 17 00:00:00 2001 From: alex13sh Date: Tue, 19 Oct 2021 16:12:21 +0300 Subject: [PATCH 02/24] =?UTF-8?q?[meln=5Flogic]=20=D0=A1=D0=B4=D0=B5=D0=BB?= =?UTF-8?q?=D0=B0=D0=BB=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8E=20`cr?= =?UTF-8?q?eate=5Fmeln`=20=D0=B8=20=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BB=20`Default`=20=D0=B4=D0=BB=D1=8F=20`Pr?= =?UTF-8?q?operty`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- meln_logic/src/lib.rs | 1 + meln_logic/src/structs_2/dozator.rs | 2 ++ meln_logic/src/structs_2/half_meln.rs | 10 ++++++++++ meln_logic/src/structs_2/material.rs | 1 + meln_logic/src/structs_2/meln.rs | 7 +++++++ meln_logic/src/structs_2/mod.rs | 8 ++++++++ meln_logic/src/structs_2/oil_station.rs | 2 ++ meln_logic/src/structs_2/property.rs | 6 ++++++ meln_logic/src/structs_2/vacuum_station.rs | 2 ++ src/app_complex_simple_ui.rs | 1 + 10 files changed, 40 insertions(+) diff --git a/meln_logic/src/lib.rs b/meln_logic/src/lib.rs index e692160..2383857 100644 --- a/meln_logic/src/lib.rs +++ b/meln_logic/src/lib.rs @@ -12,3 +12,4 @@ pub mod devices; pub mod structs_2; pub use structs_2 as structs; +pub use structs_2::create_meln; diff --git a/meln_logic/src/structs_2/dozator.rs b/meln_logic/src/structs_2/dozator.rs index ff1e5c6..fb0e307 100644 --- a/meln_logic/src/structs_2/dozator.rs +++ b/meln_logic/src/structs_2/dozator.rs @@ -71,6 +71,8 @@ impl From<&ModbusValues> for Dozator { pub mod watcher { use crate::structs::Property; + + #[derive(Default)] pub struct Dozator { pub speed: Property, pub motor: Property, diff --git a/meln_logic/src/structs_2/half_meln.rs b/meln_logic/src/structs_2/half_meln.rs index 6093e2e..f61bfb3 100644 --- a/meln_logic/src/structs_2/half_meln.rs +++ b/meln_logic/src/structs_2/half_meln.rs @@ -96,9 +96,17 @@ pub enum SpeedChange { Stop, // Остановка } +impl Default for SpeedChange { + fn default() -> Self { + SpeedChange::Stop + } +} + pub mod watcher { // #[macro_use] use crate::structs::{Property, changed_any}; + + #[derive(Default)] pub struct HalfMeln { pub invertor: Invertor, pub motor: Motor, @@ -142,6 +150,7 @@ pub mod watcher { } } + #[derive(Default)] pub struct Invertor { pub hz: Property, pub speed: Property, @@ -159,6 +168,7 @@ pub mod watcher { } } + #[derive(Default)] pub struct Motor { pub speed: Property, diff --git a/meln_logic/src/structs_2/material.rs b/meln_logic/src/structs_2/material.rs index fa2f858..8584a27 100644 --- a/meln_logic/src/structs_2/material.rs +++ b/meln_logic/src/structs_2/material.rs @@ -27,6 +27,7 @@ pub mod watcher { use crate::structs::*; use dozator::watcher::Dozator; + #[derive(Default)] pub struct Material { pub dozator: Dozator, diff --git a/meln_logic/src/structs_2/meln.rs b/meln_logic/src/structs_2/meln.rs index c38e255..7996841 100644 --- a/meln_logic/src/structs_2/meln.rs +++ b/meln_logic/src/structs_2/meln.rs @@ -40,6 +40,7 @@ pub mod watcher { pub use material::watcher::Material; pub use dozator::watcher::Dozator; + #[derive(Default)] pub struct Meln { pub material: Material, @@ -117,6 +118,12 @@ pub mod watcher { ErrorStep, } + impl Default for MelnStep { + fn default() -> Self { + MelnStep::Начало_работы + } + } + impl MelnStep { async fn check_next_step(self, meln: &Meln) -> Self { use MelnStep::*; diff --git a/meln_logic/src/structs_2/mod.rs b/meln_logic/src/structs_2/mod.rs index af975dd..9145913 100644 --- a/meln_logic/src/structs_2/mod.rs +++ b/meln_logic/src/structs_2/mod.rs @@ -15,4 +15,12 @@ use oil_station::OilStation; use vacuum_station::VacuumStation; use material::Material; +pub use meln::watcher::Meln as MelnWatch; use property::{changed_all, changed_any}; + +pub fn create_meln(values: &modbus::ModbusValues) -> (Meln, MelnWatch) { + ( + values.into(), + Default::default(), + ) +} diff --git a/meln_logic/src/structs_2/oil_station.rs b/meln_logic/src/structs_2/oil_station.rs index 554f1ed..b62fc14 100644 --- a/meln_logic/src/structs_2/oil_station.rs +++ b/meln_logic/src/structs_2/oil_station.rs @@ -31,6 +31,8 @@ impl OilStation { pub mod watcher { use crate::structs::Property; + + #[derive(Default)] pub struct OilStation { pub температура: Property, pub motor: Property, diff --git a/meln_logic/src/structs_2/property.rs b/meln_logic/src/structs_2/property.rs index 096f2e8..fbd814a 100644 --- a/meln_logic/src/structs_2/property.rs +++ b/meln_logic/src/structs_2/property.rs @@ -6,6 +6,12 @@ pub struct Property { sender: watch::Sender } +impl Default for Property { + fn default() -> Self { + Property::new(T::default()) + } +} + impl Property { pub(crate) fn new(value: T) -> Self { Property{ diff --git a/meln_logic/src/structs_2/vacuum_station.rs b/meln_logic/src/structs_2/vacuum_station.rs index ae4d7c3..c16bf45 100644 --- a/meln_logic/src/structs_2/vacuum_station.rs +++ b/meln_logic/src/structs_2/vacuum_station.rs @@ -51,6 +51,8 @@ impl VacuumStation { pub mod watcher { use crate::structs::Property; + + #[derive(Default)] pub struct VacuumStation { pub vacuum: Property, diff --git a/src/app_complex_simple_ui.rs b/src/app_complex_simple_ui.rs index 28a76ac..0538634 100644 --- a/src/app_complex_simple_ui.rs +++ b/src/app_complex_simple_ui.rs @@ -76,6 +76,7 @@ impl Application for App { fn new(_flags: ()) -> (Self, Command) { let logic = meln_logic::init::Complect::new(); + let meln = meln_logic::create_meln(logic.get_values()); let values_1 = logic.get_values().get_values_by_name_contains(&["М1"]); let values_2 = logic.get_values().get_values_by_name_contains(&["М2"]); From 57b40897b98f7a736b9575c993d24ae33dbb9348 Mon Sep 17 00:00:00 2001 From: alex13sh Date: Tue, 19 Oct 2021 17:55:42 +0300 Subject: [PATCH 03/24] =?UTF-8?q?[app,=20complex,=20meln=5Flogic]=20=D0=97?= =?UTF-8?q?=D0=B0=D0=BF=D1=83=D1=81=D1=82=D0=B8=D0=BB=20=D0=B0=D0=B2=D1=82?= =?UTF-8?q?=D0=BE=D0=BC=D0=B0=D1=82=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8E=20?= =?UTF-8?q?=D1=87=D0=B5=D1=80=D0=B5=D0=B7=20`Command::batch`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Сейчас у меня всё собирается потому, что я сделал `async move` --- meln_logic/src/lib.rs | 2 +- meln_logic/src/structs_2/meln.rs | 12 ++++++------ meln_logic/src/structs_2/mod.rs | 2 ++ src/app_complex_simple_ui.rs | 13 ++++++++++++- 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/meln_logic/src/lib.rs b/meln_logic/src/lib.rs index 2383857..0a4fdea 100644 --- a/meln_logic/src/lib.rs +++ b/meln_logic/src/lib.rs @@ -12,4 +12,4 @@ pub mod devices; pub mod structs_2; pub use structs_2 as structs; -pub use structs_2::create_meln; +pub use structs_2::{create_meln, meln_automation_mut}; diff --git a/meln_logic/src/structs_2/meln.rs b/meln_logic/src/structs_2/meln.rs index 7996841..586e09c 100644 --- a/meln_logic/src/structs_2/meln.rs +++ b/meln_logic/src/structs_2/meln.rs @@ -92,12 +92,12 @@ pub mod watcher { self.half_bottom.automation(), ); } - pub async fn automation_mut(values: &super::Meln, properties: &Meln) { - Dozator::automation_mut( - &values.material.dozator, - &properties.material.dozator - ).await; - } + } + pub async fn automation_mut(values: &super::Meln, properties: &Meln) { + Dozator::automation_mut( + &values.material.dozator, + &properties.material.dozator + ).await; } // Шаги алгоритма работы мельницы diff --git a/meln_logic/src/structs_2/mod.rs b/meln_logic/src/structs_2/mod.rs index 9145913..3cd01a7 100644 --- a/meln_logic/src/structs_2/mod.rs +++ b/meln_logic/src/structs_2/mod.rs @@ -24,3 +24,5 @@ pub fn create_meln(values: &modbus::ModbusValues) -> (Meln, MelnWatch) { Default::default(), ) } + +pub use meln::watcher::automation_mut as meln_automation_mut; diff --git a/src/app_complex_simple_ui.rs b/src/app_complex_simple_ui.rs index 0538634..26b4359 100644 --- a/src/app_complex_simple_ui.rs +++ b/src/app_complex_simple_ui.rs @@ -103,7 +103,18 @@ impl Application for App { log: log::Logger::open_csv(), log_values: Vec::new(), }, - Command::perform(async{MessageMudbusUpdate::ModbusConnect}, Message::MessageUpdate)) + + Command::batch(vec![ + async{Message::MessageUpdate(MessageMudbusUpdate::ModbusConnect)}.into(), + async move { + tokio::join!( + meln.1.automation(), + meln_logic::meln_automation_mut(&meln.0, &meln.1) + ); + Message::MessageUpdate(MessageMudbusUpdate::ModbusUpdateAsyncAnswer) + }.into() + ]) + ) } fn title(&self) -> String { From f976ac1a4d90fa89fd2d872a0c479854c15c5586 Mon Sep 17 00:00:00 2001 From: alex13sh Date: Tue, 19 Oct 2021 18:09:48 +0300 Subject: [PATCH 04/24] =?UTF-8?q?[app,=20complex,=20meln=5Flogic]=20=D0=A1?= =?UTF-8?q?=D0=BE=D0=B7=D0=B4=D0=B0=D0=BB=20=D0=BE=D0=B1=D1=89=D0=B5=D1=8E?= =?UTF-8?q?=20=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=82=D1=83=D1=80=D1=83=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20values=20=D0=B8=20properties?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Структура Meln объединяет values и properties, и упаковывает их в Arc, чтобы можно было клонировать структуру и перенести клон в async функцию --- meln_logic/src/lib.rs | 2 +- meln_logic/src/structs_2/mod.rs | 27 ++++++++++++++++++++------- src/app_complex_simple_ui.rs | 9 ++++++--- 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/meln_logic/src/lib.rs b/meln_logic/src/lib.rs index 0a4fdea..1f94256 100644 --- a/meln_logic/src/lib.rs +++ b/meln_logic/src/lib.rs @@ -12,4 +12,4 @@ pub mod devices; pub mod structs_2; pub use structs_2 as structs; -pub use structs_2::{create_meln, meln_automation_mut}; +pub use structs_2::Meln; diff --git a/meln_logic/src/structs_2/mod.rs b/meln_logic/src/structs_2/mod.rs index 3cd01a7..6956f10 100644 --- a/meln_logic/src/structs_2/mod.rs +++ b/meln_logic/src/structs_2/mod.rs @@ -7,7 +7,7 @@ mod oil_station; mod vacuum_station; mod material; -use meln::Meln; +use meln::Meln as MelnValues; use half_meln::HalfMeln; use dozator::Dozator; pub use property::Property; @@ -17,12 +17,25 @@ use material::Material; pub use meln::watcher::Meln as MelnWatch; use property::{changed_all, changed_any}; +use std::sync::Arc; -pub fn create_meln(values: &modbus::ModbusValues) -> (Meln, MelnWatch) { - ( - values.into(), - Default::default(), - ) +#[derive(Clone)] +pub struct Meln { + pub values: Arc, + pub properties: Arc, } -pub use meln::watcher::automation_mut as meln_automation_mut; +impl Meln { + pub fn new(values: &modbus::ModbusValues) -> Self { + Meln { + values: Arc::new(values.into()), + properties: Default::default(), + } + } + pub async fn automation(&self) { + self.properties.automation().await + } + pub async fn automation_mut(&self) { + meln::watcher::automation_mut(&self.values, &self.properties).await + } +} diff --git a/src/app_complex_simple_ui.rs b/src/app_complex_simple_ui.rs index 26b4359..9af377b 100644 --- a/src/app_complex_simple_ui.rs +++ b/src/app_complex_simple_ui.rs @@ -20,6 +20,7 @@ pub struct App { ui: UI, has_exit: bool, logic: meln_logic::init::Complect, + meln: meln_logic::Meln, txt_status: String, dvij_is_started: bool, @@ -76,7 +77,8 @@ impl Application for App { fn new(_flags: ()) -> (Self, Command) { let logic = meln_logic::init::Complect::new(); - let meln = meln_logic::create_meln(logic.get_values()); + let meln = meln_logic::Meln::new(logic.get_values()); + let meln_fut = meln.clone(); let values_1 = logic.get_values().get_values_by_name_contains(&["М1"]); let values_2 = logic.get_values().get_values_by_name_contains(&["М2"]); @@ -100,6 +102,7 @@ impl Application for App { info_pane: ui::InfoPane::new(), logic: logic, + meln: meln, log: log::Logger::open_csv(), log_values: Vec::new(), }, @@ -108,8 +111,8 @@ impl Application for App { async{Message::MessageUpdate(MessageMudbusUpdate::ModbusConnect)}.into(), async move { tokio::join!( - meln.1.automation(), - meln_logic::meln_automation_mut(&meln.0, &meln.1) + meln_fut.automation(), + meln_fut.automation_mut() ); Message::MessageUpdate(MessageMudbusUpdate::ModbusUpdateAsyncAnswer) }.into() From 6497f8b8457934c4aae956cab9f7c9ee46c53c7b Mon Sep 17 00:00:00 2001 From: alex13sh Date: Thu, 21 Oct 2021 15:14:24 +0300 Subject: [PATCH 05/24] =?UTF-8?q?[meln=5Flogic,=20fix]=20=D0=98=D1=81?= =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=20=D0=B8=D0=BD=D0=B8=D1=86?= =?UTF-8?q?=D0=B8=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8E=20=D1=81?= =?UTF-8?q?=D1=82=D1=80=D1=83=D0=BA=D1=82=D1=83=D1=80=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- meln_logic/src/structs_2/half_meln.rs | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/meln_logic/src/structs_2/half_meln.rs b/meln_logic/src/structs_2/half_meln.rs index f61bfb3..93aac33 100644 --- a/meln_logic/src/structs_2/half_meln.rs +++ b/meln_logic/src/structs_2/half_meln.rs @@ -34,13 +34,13 @@ impl From<&HalfPartInner> for HalfPart { impl HalfMeln { pub fn low(values: &ModbusValues) -> Self { - let values = values.get_values_by_name_ends(&["М1"]) + let values = values.get_values_by_name_contains(&["М1/"]) + values.get_values_by_name_starts(&["5) Invertor"]); let температура_масла = ["Температура масла на верхн. выходе дв. М1", "Температура масла на нижн. выходе дв. М1" ]; HalfMeln { invertor: Invertor::from(&values), motor: Motor::from(&values), - vibro: values.get_value_arc("Виброскорость").unwrap(), + vibro: values.get_value_arc_starts("Виброскорость").unwrap(), part: HalfPartInner::Low{ температура_масла_values: values.get_values_by_name_contains(&температура_масла) }, @@ -48,14 +48,13 @@ impl HalfMeln { } } pub fn top(values: &ModbusValues) -> Self { - let values = values.get_values_by_name_ends(&["М2"]) + let values = values.get_values_by_name_contains(&["М2/"]) + values.get_values_by_name_starts(&["6) Invertor"]); - // values.get_values_by_name_contains( let температура_подшибника = ["Температура верх подшипника дв. М2", "Температура нижн подшипника дв. М2"]; HalfMeln { invertor: Invertor::from(&values), motor: Motor::from(&values), - vibro: values.get_value_arc("Виброскорость").unwrap(), + vibro: values.get_value_arc_starts("Виброскорость").unwrap(), part: HalfPartInner::Top{ температура_подшибника_values: values.get_values_by_name_contains(&температура_подшибника) }, @@ -70,7 +69,7 @@ impl HalfMeln { pub type Invertor = modbus::InvertorValues; pub struct Motor { - speed: ValueArc, +// speed: ValueArc, // speed_changed: Signal, // "Температура статора", @@ -81,7 +80,7 @@ pub struct Motor { impl From<&ModbusValues> for Motor { fn from(values: &ModbusValues) -> Self { Motor { - speed: values.get_value_arc("Скорость двигателя").unwrap(), +// speed: values.get_value_arc("Скорость двигателя").unwrap(), температуры_values: values.get_values_by_name_contains(&["Температура статора", "Температура ротора Пирометр",]), } } From 9074a690a403a9edf1da6d06923fc37fa3780e58 Mon Sep 17 00:00:00 2001 From: alex13sh Date: Thu, 21 Oct 2021 16:14:45 +0300 Subject: [PATCH 06/24] [meln_logic] Re-export values, watcher. Box::leak (lifetime static) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Решил хранить статическую ссылку на структуру, чтобы было легко делать ссылки (alias) отдельных частей --- meln_logic/src/lib.rs | 2 +- meln_logic/src/structs_2/meln.rs | 13 +++++++------ meln_logic/src/structs_2/mod.rs | 20 ++++++++++++++++++++ src/app_complex_simple_ui.rs | 7 ++++--- 4 files changed, 32 insertions(+), 10 deletions(-) diff --git a/meln_logic/src/lib.rs b/meln_logic/src/lib.rs index 1f94256..362e088 100644 --- a/meln_logic/src/lib.rs +++ b/meln_logic/src/lib.rs @@ -12,4 +12,4 @@ pub mod devices; pub mod structs_2; pub use structs_2 as structs; -pub use structs_2::Meln; +pub use structs_2::{Meln, values, watcher}; diff --git a/meln_logic/src/structs_2/meln.rs b/meln_logic/src/structs_2/meln.rs index 586e09c..0029524 100644 --- a/meln_logic/src/structs_2/meln.rs +++ b/meln_logic/src/structs_2/meln.rs @@ -33,12 +33,13 @@ impl From<&ModbusValues> for Meln { } pub mod watcher { - use crate::structs::*; - pub use half_meln::watcher::HalfMeln; - pub use oil_station::watcher::OilStation; - pub use vacuum_station::watcher::VacuumStation; - pub use material::watcher::Material; - pub use dozator::watcher::Dozator; + use crate::structs::{ + Property, changed_all, changed_any, + watcher::{ + HalfMeln, OilStation, VacuumStation, + Material, Dozator, + } + }; #[derive(Default)] pub struct Meln { diff --git a/meln_logic/src/structs_2/mod.rs b/meln_logic/src/structs_2/mod.rs index 6956f10..90707dd 100644 --- a/meln_logic/src/structs_2/mod.rs +++ b/meln_logic/src/structs_2/mod.rs @@ -39,3 +39,23 @@ impl Meln { meln::watcher::automation_mut(&self.values, &self.properties).await } } + +pub mod values { + use super::*; + pub use meln::Meln; + pub use half_meln::HalfMeln; + pub use dozator::Dozator; + pub use oil_station::OilStation; + pub use vacuum_station::VacuumStation; + pub use material::Material; +} + +pub mod watcher { + use super::*; + pub use meln::watcher::Meln; + pub use half_meln::watcher::HalfMeln; + pub use dozator::watcher::Dozator; + pub use oil_station::watcher::OilStation; + pub use vacuum_station::watcher::VacuumStation; + pub use material::watcher::Material; +} diff --git a/src/app_complex_simple_ui.rs b/src/app_complex_simple_ui.rs index 9af377b..2db3acb 100644 --- a/src/app_complex_simple_ui.rs +++ b/src/app_complex_simple_ui.rs @@ -20,7 +20,7 @@ pub struct App { ui: UI, has_exit: bool, logic: meln_logic::init::Complect, - meln: meln_logic::Meln, + meln: &'static meln_logic::Meln, txt_status: String, dvij_is_started: bool, @@ -77,8 +77,9 @@ impl Application for App { fn new(_flags: ()) -> (Self, Command) { let logic = meln_logic::init::Complect::new(); - let meln = meln_logic::Meln::new(logic.get_values()); - let meln_fut = meln.clone(); + let meln = Box::new(meln_logic::Meln::new(logic.get_values())); + let meln = Box::leak(meln); + let meln_fut: &'static _ = meln; let values_1 = logic.get_values().get_values_by_name_contains(&["М1"]); let values_2 = logic.get_values().get_values_by_name_contains(&["М2"]); From ea3a221ff1ef993ba14541228a61113b45a3980b Mon Sep 17 00:00:00 2001 From: alex13sh Date: Thu, 21 Oct 2021 20:04:26 +0300 Subject: [PATCH 07/24] =?UTF-8?q?[meln=5Flogic]=20=D0=94=D0=BE=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D0=BD=D0=B8=D0=BB=20=D1=81=D0=BF=D0=B8=D1=81=D0=BE=D0=BA?= =?UTF-8?q?=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- meln_logic/src/structs_2/half_meln.rs | 13 +++++++++++-- meln_logic/src/structs_2/meln.rs | 3 +++ meln_logic/src/structs_2/mod.rs | 5 ++++- modbus/src/devices/invertor.rs | 14 +++++++++----- 4 files changed, 27 insertions(+), 8 deletions(-) diff --git a/meln_logic/src/structs_2/half_meln.rs b/meln_logic/src/structs_2/half_meln.rs index 93aac33..6eef1d2 100644 --- a/meln_logic/src/structs_2/half_meln.rs +++ b/meln_logic/src/structs_2/half_meln.rs @@ -8,6 +8,8 @@ pub struct HalfMeln { pub motor: Motor, pub vibro: ValueArc, part: HalfPartInner, + pub температура_верх: ValueArc, + pub температура_нижн: ValueArc, } enum HalfPartInner { @@ -44,6 +46,8 @@ impl HalfMeln { part: HalfPartInner::Low{ температура_масла_values: values.get_values_by_name_contains(&температура_масла) }, + температура_верх: values.get_value_arc(температура_масла[0]).unwrap(), + температура_нижн: values.get_value_arc(температура_масла[1]).unwrap(), values: values, } } @@ -58,6 +62,8 @@ impl HalfMeln { part: HalfPartInner::Top{ температура_подшибника_values: values.get_values_by_name_contains(&температура_подшибника) }, + температура_верх: values.get_value_arc(температура_подшибника[0]).unwrap(), + температура_нижн: values.get_value_arc(температура_подшибника[1]).unwrap(), values: values, } } @@ -72,8 +78,9 @@ pub struct Motor { // speed: ValueArc, // speed_changed: Signal, - // "Температура статора", - // "Температура ротора Пирометр", + pub температура_статора: ValueArc, // "Температура статора", + pub температура_ротора: ValueArc, // "Температура ротора Пирометр", + температуры_values: ModbusValues, // Значения температур } @@ -81,6 +88,8 @@ impl From<&ModbusValues> for Motor { fn from(values: &ModbusValues) -> Self { Motor { // speed: values.get_value_arc("Скорость двигателя").unwrap(), + температура_статора: values.get_value_arc("Температура статора").unwrap(), + температура_ротора: values.get_value_arc("Температура ротора Пирометр").unwrap(), температуры_values: values.get_values_by_name_contains(&["Температура статора", "Температура ротора Пирометр",]), } } diff --git a/meln_logic/src/structs_2/meln.rs b/meln_logic/src/structs_2/meln.rs index 0029524..076b82c 100644 --- a/meln_logic/src/structs_2/meln.rs +++ b/meln_logic/src/structs_2/meln.rs @@ -48,6 +48,7 @@ pub mod watcher { pub half_top: HalfMeln, pub half_bottom: HalfMeln, pub is_started: Property, + pub is_worked: Property, // is started | oil.motor pub oil: OilStation, pub vacuum: VacuumStation, @@ -64,6 +65,8 @@ pub mod watcher { self.oil.update_property(&values.oil); self.vacuum.update_property(&values.vacuum); + + self.is_worked.set(self.oil.motor.get()); } pub async fn automation(&self) { diff --git a/meln_logic/src/structs_2/mod.rs b/meln_logic/src/structs_2/mod.rs index 90707dd..885af6e 100644 --- a/meln_logic/src/structs_2/mod.rs +++ b/meln_logic/src/structs_2/mod.rs @@ -43,7 +43,10 @@ impl Meln { pub mod values { use super::*; pub use meln::Meln; - pub use half_meln::HalfMeln; + pub use half_meln::{ + HalfMeln, HalfPart, + Invertor, + }; pub use dozator::Dozator; pub use oil_station::OilStation; pub use vacuum_station::VacuumStation; diff --git a/modbus/src/devices/invertor.rs b/modbus/src/devices/invertor.rs index 80bfe9f..c7641e1 100644 --- a/modbus/src/devices/invertor.rs +++ b/modbus/src/devices/invertor.rs @@ -1,6 +1,7 @@ use super::init::{DeviceType, InvertorFunc}; use super::{Device, DeviceError, ModbusValues}; use super::Value; +use crate::ValueArc; use std::sync::Arc; @@ -21,6 +22,9 @@ pub enum DvijDirect { #[derive(Clone)] pub struct InvertorValues { values: ModbusValues, + + pub выходной_ток: ValueArc, + pub скорость_двигателя: ValueArc, } impl InvertorValues { @@ -32,9 +36,11 @@ impl InvertorValues { "Stop", "Run", "FWD", "REV", "Команда задания частоты", - "Выходной ток (A)", "Скорость двигателя", +// "Выходной ток (A)", "Скорость двигателя", ]; InvertorValues { + выходной_ток: values.get_value_arc("Выходной ток (A)").unwrap(), + скорость_двигателя: values.get_value_arc("Скорость двигателя").unwrap(), values: values.get_values_by_name_starts(&values_str), } } @@ -96,16 +102,14 @@ impl InvertorValues { v_set_speed.set_value(hz); } pub fn get_amper_out_value(&self) -> Arc { - let vm = &self.values; - vm.get("Выходной ток (A)").unwrap().clone() + self.выходной_ток.value_clone() } pub fn get_hz_out_value(&self) -> Arc { let vm = &self.values; vm.get("Скорость двигателя").unwrap().clone() // Заменить на "Выходная частота" } pub fn get_speed_out_value(&self) -> Arc { - let vm = &self.values; - vm.get("Скорость двигателя").unwrap().clone() + self.скорость_двигателя.value_clone() } } From 956f0ef54a23c0e37a36b41680a243ba8fef3ef8 Mon Sep 17 00:00:00 2001 From: alex13sh Date: Thu, 21 Oct 2021 20:05:41 +0300 Subject: [PATCH 08/24] =?UTF-8?q?[app,=20complex,=20meln=5Flogic]=20=D0=98?= =?UTF-8?q?=D0=BD=D1=82=D0=B5=D0=B3=D1=80=D0=B8=D1=80=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D0=BB=20HalfMeln?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Много мусора выкинул из программы --- src/app_complex_simple_ui.rs | 201 ++++++++++------------------------- src/ui/invertor.rs | 27 +++-- 2 files changed, 69 insertions(+), 159 deletions(-) diff --git a/src/app_complex_simple_ui.rs b/src/app_complex_simple_ui.rs index 2db3acb..2095a36 100644 --- a/src/app_complex_simple_ui.rs +++ b/src/app_complex_simple_ui.rs @@ -57,7 +57,7 @@ pub enum Message { InfoPane(ui::info_pane::Message), MessageUpdate(MessageMudbusUpdate), - + MelnMessage(MelnMessage), } #[derive(Debug, Clone)] @@ -70,6 +70,12 @@ pub enum MessageMudbusUpdate { LogUpdate, } +#[derive(Debug, Clone)] +pub enum MelnMessage { + IsStartedChanged(bool), + +} + impl Application for App { type Executor = executor::Default; type Flags = (); @@ -90,8 +96,8 @@ impl Application for App { txt_status: "".into(), dvij_is_started: false, - low: HalfComplect::new(HalfPart::Low, values_1, logic.invertor_1.clone()), - top: HalfComplect::new(HalfPart::Top, values_2, logic.invertor_2.clone()), + low: HalfComplect::new(&meln.values.half_bottom), + top: HalfComplect::new(&meln.values.half_top), klapans: ui::Klapans::new(logic.digit_o.device().values_map() + logic.digit_i.device().values_map() + logic.get_values().get_values_by_name_starts(&["Давление воздуха компрессора"]) @@ -179,6 +185,7 @@ impl Application for App { } Message::InfoPane(m) => self.info_pane.update(m), Message::MessageUpdate(m) => return self.modbus_update(m), + Message::MelnMessage(m) => self.meln_update(m), } Command::none() } @@ -256,7 +263,6 @@ impl App { self.logic.update(); self.proccess_values(); - self.proccess_speed(); }, MessageMudbusUpdate::ModbusUpdateAsync => { let device_futures = self.logic.update_async(UpdateReq::ReadOnly); @@ -277,7 +283,7 @@ impl App { MessageMudbusUpdate::ModbusConnect => { println!("MessageMudbusUpdate::ModbusConnect "); // self.save_invertor(); - let mut device_futures = self.logic.reconnect_devices(); + let device_futures = self.logic.reconnect_devices(); return Command::batch(device_futures.into_iter() .map(|(d, f)| Command::perform(f, move |res| Message::MessageUpdate( MessageMudbusUpdate::ModbusConnectAnswer(d.clone(), res))) @@ -318,31 +324,25 @@ impl App { // MessageMudbusUpdate::GraphicUpdate => self.graph.update_svg(); MessageMudbusUpdate::LogUpdate => { self.proccess_values(); - match self.get_proc_speed() { - Some(half_complect::SpeedChange::Up) => { - self.oil_station.oil_station(true); - self.logic.update_new_values(); - }, - Some(half_complect::SpeedChange::Down) => { - self.oil_station.oil_station(false); - self.klapans.davl_dis(); - self.logic.update_new_values(); - },_ => {}, - } - self.proccess_speed(); }, } Command::none() } - fn is_started(&self) -> bool { - self.low.is_started() | self.top.is_started() - } - fn is_worked(&self) -> bool { - self.low.is_started() | self.top.is_started() - | self.logic.get_bit("Двигатель маслостанции М4").unwrap() + fn meln_update(&mut self, message: MelnMessage) { + use MelnMessage::*; + match message { + IsStartedChanged(is_started) => { + self.dvij_is_started = is_started; + if is_started { + self.reset_values(); + } else { + self.log_save(); + } + } + } } - + fn proccess_values(&mut self) { use std::convert::TryFrom; let values = self.logic.get_values(); @@ -363,33 +363,6 @@ impl App { self.txt_status = if warn {"Ошибка значений"} else {""}.into(); } - fn get_proc_speed(&self) -> Option { - let changed_low = self.low.get_proc_speed(); - changed_low - } - fn proccess_speed(&mut self) { - use half_complect::SpeedChange::*; - let is_started_1 = self.is_started(); - let changed_low = self.low.proccess_speed(); - match changed_low { - Some(Up) => { - self.dvij_is_started = true; - self.reset_values(); - } - Some(Down) => { - self.dvij_is_started = false; - self.log_save(); - },_ => {}, - }; -// let changed_top = self.top.proccess_speed(); -// let is_started_2 = self.is_started(); -// let _change = changed_low.or(changed_top); -// match (is_started_1, is_started_2) { -// (false, true) => self.reset_values(), -// (true, false) => self.log_save(), -// _ => {} -// }; - } fn log_save(&mut self) { if self.log_values.len() > 0 { self.log.new_session(&self.log_values); @@ -449,23 +422,26 @@ impl App { fn reset_values(&mut self) { self.log_values = Vec::new(); } + fn is_started(&self) -> bool { + self.meln.properties.is_started.get() + } + fn is_worked(&self) -> bool { + self.meln.properties.is_worked.get() + } } -use half_complect::{HalfComplect, HalfPart}; +use half_complect::{HalfComplect}; mod half_complect { use super::*; + pub use meln_logic::values::HalfPart; pub struct HalfComplect { pub invertor: ui::Invertor, - values: ModbusValues, + values: &'static meln_logic::values::HalfMeln, values_list: Vec, part: HalfPart, } - pub enum HalfPart { - Top, // Верхняя часть - Low, // Нижняя часть - } #[derive(Default)] struct UI { @@ -477,55 +453,35 @@ mod half_complect { InvertorUI(ui::invertor::Message), UpdateValues, } - - pub enum SpeedChange { - Up, - Down, - } impl HalfComplect { -// pub fn new_by_name(values: ModbusValues - pub fn new(part: HalfPart, values: ModbusValues, invertor: modbus::Invertor) -> Self { + pub fn new(values: &'static meln_logic::values::HalfMeln) -> Self { // dbg!(values.keys()); - let values: HashMap<_,_> = values.iter() - .filter(|(k,_)| k.matches("/").count()<=1) - .map(|(k,v)| (k.clone(), v.clone())) - .collect(); - let mut values = ModbusValues::from(values); - let inv_values = invertor.device().values_map() - .get_values_by_name_contains(&["Выходной ток (A)","Скорость двигателя",]); - values.extend(inv_values.into_iter()); -// dbg!(values.get_values_by_name_ends(&["value", "bit"]).keys()); - + let part = values.get_part(); HalfComplect { - invertor: ui::Invertor::new(invertor), + invertor: ui::Invertor::new(&values.invertor), - values_list: ui::make_value_lists_start(&values, - match part { - HalfPart::Low => map!{BTreeMap, - "Температуры" => [ - "Температура статора", - "Температура ротора Пирометр", - "Температура масла на верхн. выходе дв. М1", - "Температура масла на нижн. выходе дв. М1", - "Виброскорость", - "Выходной ток (A)", - "Скорость двигателя", - ] - }, - HalfPart::Top => map!{BTreeMap, - "Температуры" => [ - "Температура статора", - "Температура ротора Пирометр", - "Температура верх подшипника дв. М2", - "Температура нижн подшипника дв. М2", - "Виброскорость", - "Выходной ток (A)", - "Скорость двигателя", - ] + values_list: vec![ + ui::ValuesList { + name: "Температуры".into(), + values: vec![ + values.motor.температура_статора.clone(), + values.motor.температура_ротора.clone(), + + // "Температура масла на верхн. выходе дв. М1", + // "Температура верх подшипника дв. М2", + values.температура_верх.clone(), + // "Температура масла на нижн. выходе дв. М1", + // "Температура нижн подшипника дв. М2", + values.температура_нижн.clone(), + + values.vibro.clone(), + values.invertor.get_amper_out_value().into(), + values.invertor.get_speed_out_value().into(), + ], } - } - ), + ], + values: values, part: part, } @@ -557,49 +513,4 @@ mod half_complect { column.into() } } - - impl HalfComplect { - pub fn has_speed(&self) -> bool { - use std::convert::TryFrom; - let speed_value = self.invertor.get_hz_out_value(); - let speed_value = f32::try_from(speed_value.as_ref()).unwrap(); - speed_value > 5.0 - } - - pub fn is_started(&self) -> bool { - self.invertor.is_started - } -// pub fn has_vibra(&self) -> bool { -// -// } - - pub fn get_proc_speed(&self) -> Option { - use std::convert::TryFrom; - let speed_value = self.invertor.get_hz_out_value(); - let speed_value = f32::try_from(speed_value.as_ref()).unwrap(); - - let vibra_value = self.values.get_value_arc_starts("Виброскорость").unwrap(); - let vibra_value = f32::try_from(&vibra_value as &modbus::Value).unwrap(); - let tok_value = self.values.get_value_arc("Выходной ток (A)").unwrap(); // "Выходной ток (A)" - let tok_value = f32::try_from(&tok_value as &modbus::Value).unwrap(); - - if self.invertor.is_started == false && (speed_value > 1.0 || tok_value > 1.0) { - return Some(SpeedChange::Up); - } else if self.invertor.is_started == true - && (speed_value < 2.0 && vibra_value<0.2 && tok_value < 2.0) { - return Some(SpeedChange::Down); - }; - return None; - } - - pub fn proccess_speed(&mut self) -> Option { - let change = self.get_proc_speed(); - match change { - Some(SpeedChange::Up) => self.invertor.is_started = true, - Some(SpeedChange::Down) => self.invertor.is_started = false, - _ => {} - } - change - } - } } diff --git a/src/ui/invertor.rs b/src/ui/invertor.rs index 779ee8f..8fc25e1 100644 --- a/src/ui/invertor.rs +++ b/src/ui/invertor.rs @@ -10,7 +10,7 @@ pub struct Invertor { ui: UI, pub is_started: bool, pub speed: u32, - device: modbus::Invertor, + values: &'static meln_logic::values::Invertor, } #[derive(Default)] @@ -28,12 +28,12 @@ pub enum Message { } impl Invertor { - pub fn new(invertor: modbus::Invertor) -> Self { + pub fn new(values: &'static meln_logic::values::Invertor) -> Self { Invertor { ui: UI::default(), is_started: false, speed: 0, - device: invertor, + values: values, } } @@ -46,23 +46,22 @@ impl Invertor { // Invertor SetSpeed // Invertor Start | Stop if start { - self.device.start(); + self.values.start(); } else { - self.device.stop(); + self.values.stop(); } -// self.log_save(); }, Message::SpeedChanged(speed) => { self.speed = speed; // dbg!((10*speed)/6); - self.device.set_speed((10*speed)/6); + self.values.set_speed(100*speed/60); }, Message::SetSpeed(speed) => {}, } } pub fn view(&mut self) -> Element { - if self.device.device().is_connect() { +// if self.device.device().is_connect() { let is_started = self.is_started; let start = self.ui.start.view( self.is_started, @@ -91,19 +90,19 @@ impl Invertor { .push(slider) ).push(start) .into() - } else { - Text::new("Инвертор не подключен") - .into() - } +// } else { +// Text::new("Инвертор не подключен") +// .into() +// } } } impl Invertor { pub fn get_hz_out_value(&self) -> Arc { - self.device.get_hz_out_value() + self.values.get_hz_out_value() } pub fn stop(&self) { - self.device.stop(); + self.values.stop(); } } From a0be60f22e49970212f1aea34d15ea2f24718170 Mon Sep 17 00:00:00 2001 From: alex13sh Date: Thu, 21 Oct 2021 20:14:14 +0300 Subject: [PATCH 09/24] =?UTF-8?q?[app,=20complex,=20meln=5Flogic]=20=D0=AD?= =?UTF-8?q?=D0=BA=D1=81=D1=82=D1=80=D0=B5=D0=BD=D0=BD=D0=BE=D0=B5=20=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=BC=D0=BE=D0=B6=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B2?= =?UTF-8?q?=D1=81=D0=B5=D0=B9=20=D0=BC=D0=B5=D0=BB=D1=8C=D0=BD=D0=B8=D1=86?= =?UTF-8?q?=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- meln_logic/src/structs_2/half_meln.rs | 4 ++++ meln_logic/src/structs_2/meln.rs | 8 ++++++++ src/app_complex_simple_ui.rs | 9 +-------- src/ui/invertor.rs | 9 --------- 4 files changed, 13 insertions(+), 17 deletions(-) diff --git a/meln_logic/src/structs_2/half_meln.rs b/meln_logic/src/structs_2/half_meln.rs index 6eef1d2..b7f603a 100644 --- a/meln_logic/src/structs_2/half_meln.rs +++ b/meln_logic/src/structs_2/half_meln.rs @@ -70,6 +70,10 @@ impl HalfMeln { pub fn get_part(&self) -> HalfPart { HalfPart::from(&self.part) } + + pub fn stop(&self) { + self.invertor.stop(); + } } pub type Invertor = modbus::InvertorValues; diff --git a/meln_logic/src/structs_2/meln.rs b/meln_logic/src/structs_2/meln.rs index 076b82c..0bb9aac 100644 --- a/meln_logic/src/structs_2/meln.rs +++ b/meln_logic/src/structs_2/meln.rs @@ -32,6 +32,14 @@ impl From<&ModbusValues> for Meln { } } +impl Meln { + // Экстренное торможение ? + pub fn stop(&self) { + self.half_top.stop(); + self.half_bottom.stop(); + } +} + pub mod watcher { use crate::structs::{ Property, changed_all, changed_any, diff --git a/src/app_complex_simple_ui.rs b/src/app_complex_simple_ui.rs index 2095a36..4e58031 100644 --- a/src/app_complex_simple_ui.rs +++ b/src/app_complex_simple_ui.rs @@ -164,8 +164,7 @@ impl Application for App { match message { Message::ButtonExit => self.has_exit = true, Message::EmergencyStop => { - self.top.invertor.stop(); - self.low.invertor.stop(); + self.meln.values.stop(); }, Message::LowHalfComplectUI(m) => self.low.update(m), Message::TopHalfComplectUI(m) => self.top.update(m), @@ -310,12 +309,6 @@ impl App { // dbg!(&d); if res.is_ok() { // println!("Message::ModbusUpdateAsyncAnswerDevice {}", d.name()); - if !d.is_connect() { - // println!("\tis not connect"); - } else { -// self.proccess_values(); -// self.proccess_speed(); - } if d.name() == "4) МУ210-410" { self.klapans.update_klapans(); } diff --git a/src/ui/invertor.rs b/src/ui/invertor.rs index 8fc25e1..36b07c9 100644 --- a/src/ui/invertor.rs +++ b/src/ui/invertor.rs @@ -97,15 +97,6 @@ impl Invertor { } } -impl Invertor { - pub fn get_hz_out_value(&self) -> Arc { - self.values.get_hz_out_value() - } - pub fn stop(&self) { - self.values.stop(); - } -} - mod ui_button_start { use super::*; From e27f42e30d33cd49911c0b151102299d2fbe018a Mon Sep 17 00:00:00 2001 From: alex13sh Date: Thu, 21 Oct 2021 21:21:23 +0300 Subject: [PATCH 10/24] =?UTF-8?q?[app,=20complex]=20=D0=92=D1=81=D1=91=20?= =?UTF-8?q?=D1=82=D0=B0=D0=BA=D0=B8=20=D1=80=D0=B5=D1=88=D0=B8=D0=BB=20Mel?= =?UTF-8?q?n=20=D1=85=D1=80=D0=B0=D0=BD=D0=B8=D1=82=D1=8C=20=D0=B2=D0=BE?= =?UTF-8?q?=20=D0=B2=D0=BB=D0=B0=D0=B4=D0=B5=D0=BD=D0=B8=D0=B5,=20=D0=B0?= =?UTF-8?q?=20=D0=BD=D0=B5=20=D1=81=D1=82=D0=B0=D1=82=D0=B8=D1=87=D0=B5?= =?UTF-8?q?=D1=81=D0=BA=D1=83=D1=8E=20=D1=81=D1=81=D1=8B=D0=BB=D0=BA=D1=83?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit То есть я полностью избавился от статической ссылки на логическую структуру во всех ui компонентах. И решил передавать обычную ссылку на часть структуры в аргумент функции `update` и `subscribe`. Этот подход я почерпнул из Elm-архитектуры --- src/app_complex_simple_ui.rs | 26 +++++++++++--------------- src/ui/invertor.rs | 12 +++++------- 2 files changed, 16 insertions(+), 22 deletions(-) diff --git a/src/app_complex_simple_ui.rs b/src/app_complex_simple_ui.rs index 4e58031..d28999f 100644 --- a/src/app_complex_simple_ui.rs +++ b/src/app_complex_simple_ui.rs @@ -20,7 +20,7 @@ pub struct App { ui: UI, has_exit: bool, logic: meln_logic::init::Complect, - meln: &'static meln_logic::Meln, + meln: meln_logic::Meln, txt_status: String, dvij_is_started: bool, @@ -83,9 +83,8 @@ impl Application for App { fn new(_flags: ()) -> (Self, Command) { let logic = meln_logic::init::Complect::new(); - let meln = Box::new(meln_logic::Meln::new(logic.get_values())); - let meln = Box::leak(meln); - let meln_fut: &'static _ = meln; + let meln = meln_logic::Meln::new(logic.get_values()); + let meln_fut = meln.clone(); let values_1 = logic.get_values().get_values_by_name_contains(&["М1"]); let values_2 = logic.get_values().get_values_by_name_contains(&["М2"]); @@ -166,8 +165,8 @@ impl Application for App { Message::EmergencyStop => { self.meln.values.stop(); }, - Message::LowHalfComplectUI(m) => self.low.update(m), - Message::TopHalfComplectUI(m) => self.top.update(m), + Message::LowHalfComplectUI(m) => self.low.update(m, &self.meln.values.half_bottom), + Message::TopHalfComplectUI(m) => self.top.update(m, &self.meln.values.half_top), Message::DozatorUI(m) => { let res = self.dozator.update(m, vec![self.logic.digit_o.device().clone()]) .map(Message::DozatorUI); @@ -430,7 +429,6 @@ mod half_complect { pub struct HalfComplect { pub invertor: ui::Invertor, - values: &'static meln_logic::values::HalfMeln, values_list: Vec, part: HalfPart, @@ -448,11 +446,10 @@ mod half_complect { } impl HalfComplect { - pub fn new(values: &'static meln_logic::values::HalfMeln) -> Self { -// dbg!(values.keys()); - let part = values.get_part(); + pub fn new(values: &meln_logic::values::HalfMeln) -> Self { + HalfComplect { - invertor: ui::Invertor::new(&values.invertor), + invertor: ui::Invertor::new(), values_list: vec![ ui::ValuesList { @@ -475,14 +472,13 @@ mod half_complect { } ], - values: values, - part: part, + part: values.get_part(), } } - pub fn update(&mut self, message: Message) { + pub fn update(&mut self, message: Message, values: &meln_logic::values::HalfMeln) { match message { - Message::InvertorUI(m) => self.invertor.update(m), + Message::InvertorUI(m) => self.invertor.update(m, &values.invertor), Message::UpdateValues => {}, } } diff --git a/src/ui/invertor.rs b/src/ui/invertor.rs index 36b07c9..d041419 100644 --- a/src/ui/invertor.rs +++ b/src/ui/invertor.rs @@ -10,7 +10,6 @@ pub struct Invertor { ui: UI, pub is_started: bool, pub speed: u32, - values: &'static meln_logic::values::Invertor, } #[derive(Default)] @@ -28,16 +27,15 @@ pub enum Message { } impl Invertor { - pub fn new(values: &'static meln_logic::values::Invertor) -> Self { + pub fn new() -> Self { Invertor { ui: UI::default(), is_started: false, speed: 0, - values: values, } } - pub fn update(&mut self, message: Message) { + pub fn update(&mut self, message: Message, values: &meln_logic::values::Invertor) { match message { Message::ButtonStart(message) => self.ui.start.update(message), Message::ToggleStart(start) => { @@ -46,15 +44,15 @@ impl Invertor { // Invertor SetSpeed // Invertor Start | Stop if start { - self.values.start(); + values.start(); } else { - self.values.stop(); + values.stop(); } }, Message::SpeedChanged(speed) => { self.speed = speed; // dbg!((10*speed)/6); - self.values.set_speed(100*speed/60); + values.set_speed(100*speed/60); }, Message::SetSpeed(speed) => {}, } From 40dbe88dd89053aa4a9f18938f38d3b326c6bf0c Mon Sep 17 00:00:00 2001 From: alex13sh Date: Thu, 21 Oct 2021 22:20:24 +0300 Subject: [PATCH 11/24] =?UTF-8?q?[app,=20complex,=20meln=5Flogic]=20=D0=98?= =?UTF-8?q?=D0=BD=D1=82=D0=B5=D0=B3=D1=80=D0=B8=D1=80=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D0=BB=20=D0=B4=D0=BE=D0=B7=D0=B0=D1=82=D0=BE=D1=80=20=D0=B8=20?= =?UTF-8?q?=D0=BC=D0=B0=D1=81=D0=BB=D0=BE=D1=81=D1=82=D0=B0=D0=BD=D1=86?= =?UTF-8?q?=D0=B8=D1=8E.=20=D0=9E=D1=81=D1=82=D0=B0=D0=BB=D0=BE=D1=81?= =?UTF-8?q?=D1=8C=20=D0=B8=D0=BD=D1=82=D0=B5=D0=B3=D1=80=D0=B8=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D1=82=D1=8C=20=D0=BA=D0=BB=D0=B0=D0=BF=D0=B0=D0=BD?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- meln_logic/src/structs_2/oil_station.rs | 17 +++++- meln_logic/src/structs_2/vacuum_station.rs | 2 +- src/app_complex_simple_ui.rs | 8 +-- src/ui/dozator.rs | 12 ++--- src/ui/oil_station.rs | 62 +++++++++++++--------- 5 files changed, 61 insertions(+), 40 deletions(-) diff --git a/meln_logic/src/structs_2/oil_station.rs b/meln_logic/src/structs_2/oil_station.rs index b62fc14..f743dcb 100644 --- a/meln_logic/src/structs_2/oil_station.rs +++ b/meln_logic/src/structs_2/oil_station.rs @@ -3,7 +3,9 @@ use modbus::{ValueArc, ModbusValues}; pub struct OilStation { - температура: ValueArc, + pub температура: ValueArc, + pub давление_масла: ValueArc, + pub уровень_масла: ValueArc, motor: ValueArc, } @@ -11,6 +13,8 @@ impl From<&ModbusValues> for OilStation { fn from(values: &ModbusValues) -> Self { OilStation { температура: values.get_value_arc("Температура масла на выходе маслостанции").unwrap(), + давление_масла: values.get_value_arc("Давление масла на выходе маслостанции").unwrap(), + уровень_масла: values.get_value_arc("PDU-RS/value").unwrap(), motor: values.get_value_arc("Двигатель маслостанции М4").unwrap(), } } @@ -23,10 +27,17 @@ impl OilStation { pub fn stop(&self) { self.motor.set_bit(false); } + pub fn motor_turn(&self, enb: bool) { + self.motor.set_bit(enb); + } pub fn температура(&self) -> f32 { use modbus::{Value, TryFrom}; f32::try_from(&self.температура as &Value).unwrap() // todo: Обработка ошибок } + pub fn давление_масла(&self) -> f32 { + use modbus::{Value, TryFrom}; + f32::try_from(&self.давление_масла as &Value).unwrap() // todo: Обработка ошибок + } } pub mod watcher { @@ -35,12 +46,16 @@ pub mod watcher { #[derive(Default)] pub struct OilStation { pub температура: Property, + pub давление_масла: Property, + pub уровень_масла: Property, pub motor: Property, } impl OilStation { pub(crate) fn update_property(&self, values: &super::OilStation) { self.температура.set(values.температура()); + self.давление_масла.set(values.давление_масла()); + self.уровень_масла.set(values.уровень_масла.value()); self.motor.set(values.motor.get_bit()); } } diff --git a/meln_logic/src/structs_2/vacuum_station.rs b/meln_logic/src/structs_2/vacuum_station.rs index c16bf45..87193cc 100644 --- a/meln_logic/src/structs_2/vacuum_station.rs +++ b/meln_logic/src/structs_2/vacuum_station.rs @@ -3,7 +3,7 @@ use modbus::{ValueArc, ModbusValues}; pub struct VacuumStation { - vacuum: ValueArc, + pub vacuum: ValueArc, motor_1: ValueArc, motor_2: ValueArc, diff --git a/src/app_complex_simple_ui.rs b/src/app_complex_simple_ui.rs index d28999f..1376c2b 100644 --- a/src/app_complex_simple_ui.rs +++ b/src/app_complex_simple_ui.rs @@ -103,8 +103,8 @@ impl Application for App { //.get_values_by_name_starts(&["Клапан 24В", "Клапан 2", "Насос"]) // .clone() ), - dozator: ui::Dozator::new(logic.dozator.clone()), - oil_station: ui::OilStation::new(logic.get_values().clone()), + dozator: ui::Dozator::new(), + oil_station: ui::OilStation::new_by_meln(&meln.values), info_pane: ui::InfoPane::new(), logic: logic, @@ -168,13 +168,13 @@ impl Application for App { Message::LowHalfComplectUI(m) => self.low.update(m, &self.meln.values.half_bottom), Message::TopHalfComplectUI(m) => self.top.update(m, &self.meln.values.half_top), Message::DozatorUI(m) => { - let res = self.dozator.update(m, vec![self.logic.digit_o.device().clone()]) + let res = self.dozator.update(m, &self.meln.values.material.dozator) .map(Message::DozatorUI); self.logic.update_new_values(); return res; }, Message::OilStation(m) => { - self.oil_station.update(m); + self.oil_station.update(m, &self.meln.values.oil); self.logic.update_new_values(); }, Message::KlapansUI(m) => { diff --git a/src/ui/dozator.rs b/src/ui/dozator.rs index 666f37e..ad4df86 100644 --- a/src/ui/dozator.rs +++ b/src/ui/dozator.rs @@ -13,8 +13,7 @@ pub struct Dozator { ui: UI, shim_hz_ui: i32, shim_hz_cur: i32, shim_hz_new: i32, klapan_enb: bool, - device: meln_logic::devices::Dozator, -// anim: LinerAnimation, + } #[derive(Default)] @@ -33,13 +32,11 @@ pub enum Message { } impl Dozator { - pub fn new(device: meln_logic::devices::Dozator) -> Self { + pub fn new() -> Self { Dozator { ui: UI::default(), shim_hz_ui: 0, shim_hz_cur: 0, shim_hz_new: 0, klapan_enb: false, - device: device, -// anim: LinerAnimation::new(0.0, 20).duration(5_000), } } @@ -54,13 +51,12 @@ impl Dozator { // } } - pub fn update(&mut self, message: Message, devices: Vec>) -> Command { + pub fn update(&mut self, message: Message, values: &meln_logic::values::Dozator) -> Command { match message { Message::ShimHzChanged(hz) => self.shim_hz_ui = hz, Message::SetShimHz => { println!("Set HZ: {}", self.shim_hz_ui); self.shim_hz_new = self.shim_hz_ui; -// self.anim.set_from_to(self.shim_hz_cur as f32, self.shim_hz_new as f32); }, Message::ToggleKlapan(enb) => { self.klapan_enb = enb; @@ -69,7 +65,7 @@ impl Dozator { self.shim_hz_ui = value as i32; self.shim_hz_cur = self.shim_hz_ui; // dbg!(value); - self.device.set_value(self.shim_hz_cur); + values.set_speed(self.shim_hz_cur); }, Message::AnimationPos(super::animations::Progress::Finished) => { // self.anim.stop(); diff --git a/src/ui/oil_station.rs b/src/ui/oil_station.rs index e285f3f..2a8e101 100644 --- a/src/ui/oil_station.rs +++ b/src/ui/oil_station.rs @@ -8,7 +8,6 @@ use super::style; pub struct OilStation { ui: UI, - values: modbus::ModbusValues, values_list: super::ValuesList, pub is_started: bool, } @@ -26,36 +25,54 @@ pub enum Message { } impl OilStation { - pub fn new(values: modbus::ModbusValues) -> Self { + pub fn new_by_meln(values: &meln_logic::values::Meln) -> Self { OilStation { ui: UI::default(), - values_list: super::make_value_lists(&values, crate::map!{BTreeMap, - "МаслоСтанция" => [ - "PDU-RS/value", -// "PDU-RS/hight limit", -// "PDU-RS/low limit", - "Температура масла на выходе маслостанции", - "Давление масла на выходе маслостанции", - "5) Invertor/Выходной ток (A)", - "5) Invertor/Скорость двигателя", - "2) МВ110-24.8АС/Виброскорость дв. М1", - "2) МВ110-24.8АС/Давление воздуха компрессора", - "2) МВ110-24.8АС/Разрежение воздуха в системе", - ] - }).pop().unwrap(), - values: values, + values_list: super::ValuesList { + name: "МаслоСтанция".into(), + values: vec![ + values.oil.уровень_масла.clone(), + values.oil.температура.clone(), + values.oil.давление_масла.clone(), + + values.half_bottom.invertor.выходной_ток.clone(), + values.half_bottom.invertor.скорость_двигателя.clone(), + + values.half_bottom.vibro.clone(), + // Давление воздуха в Клапанах + values.vacuum.vacuum.clone(), + ] + }, + is_started: false, } } + + pub fn new(values: &meln_logic::values::OilStation) -> Self { - pub fn update(&mut self, message: Message) { + OilStation { + ui: UI::default(), + values_list: super::ValuesList { + name: "МаслоСтанция".into(), + values: vec![ + values.уровень_масла.clone(), + values.температура.clone(), + values.давление_масла.clone(), + ] + }, + + is_started: false, + } + } + + pub fn update(&mut self, message: Message, values: &meln_logic::values::OilStation) { match message { // Message::StartStop(enb) => self.is_started = enb; Message::StartStopToggle => { self.is_started = !self.is_started; // dbg!(self.is_started); - self.values.get_value_arc("Двигатель маслостанции М4").unwrap().set_bit(self.is_started); + values.motor_turn(self.is_started); }, } } @@ -82,10 +99,3 @@ impl OilStation { column.into() } } - -impl OilStation { - pub fn oil_station(&mut self, enb: bool) { - self.is_started = enb; - self.values.get_value_arc("Двигатель маслостанции М4").unwrap().set_bit(enb); - } -} From fa1a8187df522f822034fc6f2ba11a14dffe7f2b Mon Sep 17 00:00:00 2001 From: alex13sh Date: Fri, 22 Oct 2021 00:18:15 +0300 Subject: [PATCH 12/24] =?UTF-8?q?[app,=20complex,=20meln=5Flogic]=20=D0=98?= =?UTF-8?q?=D0=BD=D1=82=D0=B5=D0=B3=D1=80=D0=B8=D1=80=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D0=BB=20=D0=BA=D0=BB=D0=B0=D0=BF=D0=B0=D0=BD=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Сделал специальную логическую структуру для клапанов, чтобы был единый доступ к ним. --- meln_logic/src/structs_2/klapans.rs | 79 +++++++++++++++++++ meln_logic/src/structs_2/material.rs | 9 +++ meln_logic/src/structs_2/meln.rs | 5 ++ meln_logic/src/structs_2/mod.rs | 4 + src/app_complex_simple_ui.rs | 14 ++-- src/ui/klapans_2.rs | 109 +++++++++------------------ 6 files changed, 142 insertions(+), 78 deletions(-) create mode 100644 meln_logic/src/structs_2/klapans.rs diff --git a/meln_logic/src/structs_2/klapans.rs b/meln_logic/src/structs_2/klapans.rs new file mode 100644 index 0000000..6773337 --- /dev/null +++ b/meln_logic/src/structs_2/klapans.rs @@ -0,0 +1,79 @@ +use modbus::{ValueArc, ModbusValues}; + +pub struct Klapans { + pub давление_воздуха: ValueArc, + двигатель_компрессора_воздуха: ValueArc, + +// // Материал +// клапан_подачи_материала: ValueArc, // ШК2 +// клапан_верхнего_контейнера: ValueArc, // ШК5 +// клапан_помольной_камеры: ValueArc, // ШК3 +// клапан_нижнего_контейнера: ValueArc, // ШК1 +// +// // Вакуум +// клапан_напуска: ValueArc, +// клапан_насоса: ValueArc, + + klapans: ModbusValues, +} + +impl From<&ModbusValues> for Klapans { + fn from(values: &ModbusValues) -> Self { + Klapans { + давление_воздуха: values.get_value_arc("Давление воздуха компрессора").unwrap(), + двигатель_компрессора_воздуха: values.get_value_arc("Двигатель компрессора воздуха").unwrap(), + klapans: values.get_values_by_name_contains( + &["Клапан нижнего контейнера", "Клапан верхнего контейнера", + "Клапан подачи материала", "Клапан помольной камеры", + "Клапан напуска", "Клапан насоса М5"] + ), + } + } +} + +impl Klapans { + + pub fn klapan_turn(&self, name: &str, enb: bool) { + if self.давление_воздуха.is_error() { + return; + } + + if let Err(e) = self.klapans.set_bit(name, enb) { + dbg!(e); + } + } + fn двигатель_компрессора_воздуха_turn(&self, enb: bool) { + self.двигатель_компрессора_воздуха.set_bit(enb); + } +} + +pub mod watcher { + use crate::structs::Property; + use std::collections::HashMap; + + pub struct Klapans { + pub давление_воздуха: Property, + pub klapans: HashMap>, + } + impl Klapans { + pub(crate) fn update_property(&self, values: &super::Klapans) { + for (k, p) in &self.klapans { + p.set(values.klapans.get_bit(k).unwrap()); + } + } + + } + + impl Default for Klapans { + fn default() -> Self { + Klapans { + давление_воздуха: Property::default(), + klapans: ["Клапан нижнего контейнера", "Клапан верхнего контейнера", + "Клапан подачи материала", "Клапан помольной камеры", + "Клапан напуска", "Клапан насоса М5"].into_iter() + .map(|&n| (n.to_owned(), Property::::default())) + .collect(), + } + } + } +} diff --git a/meln_logic/src/structs_2/material.rs b/meln_logic/src/structs_2/material.rs index 8584a27..591e452 100644 --- a/meln_logic/src/structs_2/material.rs +++ b/meln_logic/src/structs_2/material.rs @@ -23,6 +23,15 @@ impl From<&ModbusValues> for Material { } } +impl Material { + pub fn ШК_в_рабочее_положение(&self, enb: bool) { + self.клапан_нижнего_контейнера.set_bit(enb); + self.клапан_верхнего_контейнера.set_bit(enb); + //self.set_klapan("Клапан подачи материала", enb); // ШК2 + self.клапан_помольной_камеры.set_bit(enb); + } +} + pub mod watcher { use crate::structs::*; use dozator::watcher::Dozator; diff --git a/meln_logic/src/structs_2/meln.rs b/meln_logic/src/structs_2/meln.rs index 0bb9aac..5db074c 100644 --- a/meln_logic/src/structs_2/meln.rs +++ b/meln_logic/src/structs_2/meln.rs @@ -6,6 +6,7 @@ use super::Dozator; use super::OilStation; use super::VacuumStation; use super::Material; +use super::Klapans; pub struct Meln { @@ -16,6 +17,8 @@ pub struct Meln { pub oil: OilStation, pub vacuum: VacuumStation, + + pub klapans: Klapans, } impl From<&ModbusValues> for Meln { @@ -28,6 +31,8 @@ impl From<&ModbusValues> for Meln { oil: values.into(), vacuum: values.into(), + + klapans: values.into(), } } } diff --git a/meln_logic/src/structs_2/mod.rs b/meln_logic/src/structs_2/mod.rs index 885af6e..e68bc63 100644 --- a/meln_logic/src/structs_2/mod.rs +++ b/meln_logic/src/structs_2/mod.rs @@ -6,6 +6,7 @@ mod property; mod oil_station; mod vacuum_station; mod material; +mod klapans; use meln::Meln as MelnValues; use half_meln::HalfMeln; @@ -14,6 +15,7 @@ pub use property::Property; use oil_station::OilStation; use vacuum_station::VacuumStation; use material::Material; +use klapans::Klapans; pub use meln::watcher::Meln as MelnWatch; use property::{changed_all, changed_any}; @@ -51,6 +53,7 @@ pub mod values { pub use oil_station::OilStation; pub use vacuum_station::VacuumStation; pub use material::Material; + pub use klapans::Klapans; } pub mod watcher { @@ -61,4 +64,5 @@ pub mod watcher { pub use oil_station::watcher::OilStation; pub use vacuum_station::watcher::VacuumStation; pub use material::watcher::Material; + pub use klapans::watcher::Klapans; } diff --git a/src/app_complex_simple_ui.rs b/src/app_complex_simple_ui.rs index 1376c2b..f73b269 100644 --- a/src/app_complex_simple_ui.rs +++ b/src/app_complex_simple_ui.rs @@ -159,26 +159,28 @@ impl Application for App { } fn update(&mut self, message: Self::Message, _clipboard: &mut Clipboard) -> Command { - + let meln = &self.meln.values; match message { Message::ButtonExit => self.has_exit = true, Message::EmergencyStop => { self.meln.values.stop(); }, - Message::LowHalfComplectUI(m) => self.low.update(m, &self.meln.values.half_bottom), - Message::TopHalfComplectUI(m) => self.top.update(m, &self.meln.values.half_top), + Message::LowHalfComplectUI(m) => self.low.update(m, &meln.half_bottom), + Message::TopHalfComplectUI(m) => self.top.update(m, &meln.half_top), Message::DozatorUI(m) => { - let res = self.dozator.update(m, &self.meln.values.material.dozator) + let res = self.dozator.update(m, &meln.material.dozator) .map(Message::DozatorUI); self.logic.update_new_values(); return res; }, Message::OilStation(m) => { - self.oil_station.update(m, &self.meln.values.oil); + self.oil_station.update(m, &meln.oil); self.logic.update_new_values(); }, Message::KlapansUI(m) => { - self.klapans.update(m); + self.klapans.update_material(m.clone(), &meln.material); + self.klapans.update_vacuum(m.clone(), &meln.vacuum); + self.klapans.update(m, &meln.klapans); self.logic.update_new_values(); } Message::InfoPane(m) => self.info_pane.update(m), diff --git a/src/ui/klapans_2.rs b/src/ui/klapans_2.rs index 72bb967..e6c3226 100644 --- a/src/ui/klapans_2.rs +++ b/src/ui/klapans_2.rs @@ -66,56 +66,64 @@ impl Klapans { } } - pub fn update(&mut self, message: Message) { + pub fn update_vacuum(&mut self, message: Message, values: &meln_logic::values::VacuumStation) { match message { - Message::ToggleKlapan(name, enb) => { -// self.klapans.iter_mut().find(|s| s.name==name).unwrap().enb = enb; -// self.values.set_bit(&name, enb).unwrap(); - self.set_klapan(name.as_str(), enb); - } Message::PressButton(name) => { let mut pb = self.buttons.iter_mut().find(|s| s.name==name).unwrap(); match (name.as_str(), pb.enb) { ("Уменьшить давление", false) => { pb.enb = true; - self.davl_down(); + values.davl_down(); }, ("Уменьшить давление", true) => { pb.enb = false; -// pb.0 = "Увеличить давление".into(); - self.davl_dis(); + values.davl_dis(); }, ("Увеличить давление", false) => { pb.enb = true; - - self.davl_up(); + values.davl_up(); }, ("Увеличить давление", true) => { pb.enb = false; -// pb.0 = "Уменьшить давление".into(); - - self.davl_dis(); + values.davl_dis(); }, + _ => {} + } + } + _ => {} + } + } + + pub fn update_material(&mut self, message: Message, values: &meln_logic::values::Material) { + match message { + Message::PressButton(name) => { + let mut pb = self.buttons.iter_mut().find(|s| s.name==name).unwrap(); + match (name.as_str(), pb.enb) { ("ШК в рабочее положение", _) => { pb.enb = !pb.enb; - let enb = pb.enb; - self.set_klapan("Клапан нижнего контейнера", enb); // ШК1 - self.set_klapan("Клапан верхнего контейнера", enb); // ШК5 -// self.set_klapan("Клапан подачи материала", enb); // ШК2 - self.set_klapan("Клапан помольной камеры", enb); // ШК3 + values.ШК_в_рабочее_положение(pb.enb); }, + _ => {} + } + } + _ => {} + } + } + + pub fn update(&mut self, message: Message, values: &meln_logic::values::Klapans) { + match message { + Message::ToggleKlapan(name, enb) => { + values.klapan_turn(name.as_str(), enb); + } + Message::PressButton(name) => { + let mut pb = self.buttons.iter_mut().find(|s| s.name==name).unwrap(); + match (name.as_str(), pb.enb) { ("Двигатель компрессора воздуха", _) => { pb.enb = !pb.enb; - let enb = pb.enb; - self.set_klapan("Двигатель компрессора воздуха", enb); + // values.двигатель_компрессора_воздуха_turn(pb.enb); }, - _ => {}} -// match name { -// "Двигатель насоса вакуума" => { -// self.values.set_bit("Двигатель насоса вакуума 1", enb).unwrap(); -// self.values.set_bit("Двигатель насоса вакуума 2", enb).unwrap(); -// }, -// _ => {} -// } + _ => {} + } } + _ => {} } } @@ -154,53 +162,10 @@ impl Klapans { } } - fn set_klapan(&mut self, name: &str, enb: bool) { - pub use std::convert::TryFrom; - if self.values.get_value_arc("Давление воздуха компрессора") - .map(|v| v.is_error()).unwrap_or(true) - { - return; - } - - // Если давление воздуха меньше 4, то клапана открываться не будут. - if let Some(v) = self.klapans.iter_mut().find(|s| s.name==name) { - v.enb = enb; - } - if let Err(e) = self.values.set_bit(name, enb) { - dbg!(e); - } - } - fn set_button(&mut self, name: &str, enb: bool) { if let Some(v) = self.buttons.iter_mut().find(|s| s.name==name) { v.enb = enb; } } - fn davl_down(&mut self) { - self.values.set_bit("Двигатель насоса вакуума 1", true).unwrap(); - self.values.set_bit("Двигатель насоса вакуума 2", true).unwrap(); - - self.set_klapan("Клапан насоса М5", true); - -// self.set_button("Уменьшить давление", true); - } - pub fn davl_dis(&mut self) { - self.values.set_bit("Клапан насоса М5", false).unwrap(); - self.values.set_bit("Двигатель насоса вакуума 1", false).unwrap(); - self.values.set_bit("Двигатель насоса вакуума 2", false).unwrap(); - - self.set_klapan("Клапан напуска", false); - self.set_button("Уменьшить давление", false); - self.set_button("Увеличить давление", false); - } - fn davl_up(&mut self) { - self.davl_dis(); - - self.set_klapan("Клапан напуска", true); - } - - pub fn oil_station(&self, enb: bool) { - - } } From ffce174fd0ce2ba2acdd692b62470fc33cbe1ddb Mon Sep 17 00:00:00 2001 From: alex13sh Date: Fri, 22 Oct 2021 00:50:08 +0300 Subject: [PATCH 13/24] =?UTF-8?q?[meln=5Flogic]=20=D0=94=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D0=BB=20=D0=BE=D0=B1=D1=89=D0=B8=D0=B9=20=D1=81?= =?UTF-8?q?=D0=B8=D0=B3=D0=BD=D0=B0=D0=BB=20=D0=B4=D0=BB=D1=8F=20=D0=BA?= =?UTF-8?q?=D0=BB=D0=B0=D0=BF=D0=B0=D0=BD=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Это для того, чтобы было легче подписываться на изменения всех клапанов --- meln_logic/Cargo.toml | 1 + meln_logic/src/structs_2/klapans.rs | 18 +++++++++++++++++- meln_logic/src/structs_2/meln.rs | 5 ++++- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/meln_logic/Cargo.toml b/meln_logic/Cargo.toml index 9c78a88..d1b4ec7 100644 --- a/meln_logic/Cargo.toml +++ b/meln_logic/Cargo.toml @@ -16,6 +16,7 @@ name = "meln_logic" tokio = { version = "1.3.0", features = ["sync", "macros"]} async-stream = "*" futures-core = "0.3" +futures-util = "0.3" macros = {path="./macros", package="meln_logic_macro", optional=true} modbus = {path = "../modbus", optional=true} diff --git a/meln_logic/src/structs_2/klapans.rs b/meln_logic/src/structs_2/klapans.rs index 6773337..db4a489 100644 --- a/meln_logic/src/structs_2/klapans.rs +++ b/meln_logic/src/structs_2/klapans.rs @@ -54,6 +54,7 @@ pub mod watcher { pub struct Klapans { pub давление_воздуха: Property, pub klapans: HashMap>, + pub klapans_send: Property<(String, bool)>, } impl Klapans { pub(crate) fn update_property(&self, values: &super::Klapans) { @@ -61,7 +62,21 @@ pub mod watcher { p.set(values.klapans.get_bit(k).unwrap()); } } - + + pub(crate) async fn automation(&self) { + loop { + let futs = self.klapans.iter() + .map(|(name, prop)| { + let mut sub = prop.subscribe(); + async move { + sub.changed().await; + let klapan = sub.borrow(); + self.klapans_send.send((name.to_owned(), *klapan)); + } + }); + futures_util::future::join_all(futs); + } + } } impl Default for Klapans { @@ -73,6 +88,7 @@ pub mod watcher { "Клапан напуска", "Клапан насоса М5"].into_iter() .map(|&n| (n.to_owned(), Property::::default())) .collect(), + klapans_send: Property::default(), } } } diff --git a/meln_logic/src/structs_2/meln.rs b/meln_logic/src/structs_2/meln.rs index 5db074c..88cdcf5 100644 --- a/meln_logic/src/structs_2/meln.rs +++ b/meln_logic/src/structs_2/meln.rs @@ -50,7 +50,7 @@ pub mod watcher { Property, changed_all, changed_any, watcher::{ HalfMeln, OilStation, VacuumStation, - Material, Dozator, + Material, Dozator, Klapans, } }; @@ -65,6 +65,7 @@ pub mod watcher { pub oil: OilStation, pub vacuum: VacuumStation, + pub klapans: Klapans, pub step: Property, } @@ -78,6 +79,7 @@ pub mod watcher { self.oil.update_property(&values.oil); self.vacuum.update_property(&values.vacuum); + self.klapans.update_property(&values.klapans); self.is_worked.set(self.oil.motor.get()); } @@ -107,6 +109,7 @@ pub mod watcher { f_step, self.half_top.automation(), self.half_bottom.automation(), + self.klapans.automation(), ); } } From 2f26ccd1e0b236ea3ae9ea8bea531ebfdc675c03 Mon Sep 17 00:00:00 2001 From: alex13sh Date: Fri, 22 Oct 2021 01:18:16 +0300 Subject: [PATCH 14/24] =?UTF-8?q?[app,=20complex,=20meln=5Flogic]=20=D0=A1?= =?UTF-8?q?=D0=BE=D0=B7=D0=B4=D0=B0=D0=BB=20PropertyAnimation=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D0=BF=D0=BE=D0=B4=D0=BF=D0=B8=D1=81=D0=BA=D0=B8?= =?UTF-8?q?=20=D0=BD=D0=B0=20Property?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- meln_logic/src/structs_2/mod.rs | 5 +++- src/ui/mod.rs | 2 ++ src/ui/property_animation.rs | 47 +++++++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 src/ui/property_animation.rs diff --git a/meln_logic/src/structs_2/mod.rs b/meln_logic/src/structs_2/mod.rs index e68bc63..1534f5c 100644 --- a/meln_logic/src/structs_2/mod.rs +++ b/meln_logic/src/structs_2/mod.rs @@ -11,13 +11,13 @@ mod klapans; use meln::Meln as MelnValues; use half_meln::HalfMeln; use dozator::Dozator; -pub use property::Property; use oil_station::OilStation; use vacuum_station::VacuumStation; use material::Material; use klapans::Klapans; pub use meln::watcher::Meln as MelnWatch; +pub use property::Property; use property::{changed_all, changed_any}; use std::sync::Arc; @@ -65,4 +65,7 @@ pub mod watcher { pub use vacuum_station::watcher::VacuumStation; pub use material::watcher::Material; pub use klapans::watcher::Klapans; + + pub use property::Property; + pub use tokio::sync::watch::Receiver as Subscription; } diff --git a/src/ui/mod.rs b/src/ui/mod.rs index fcc6970..1938361 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -18,9 +18,11 @@ pub use info_pane::InfoPane; pub mod style; mod liner_animation; +mod property_animation; pub mod animations { pub use super::liner_animation::LinerAnimation; + pub use super::property_animation::PropertyAnimation; #[derive(Debug, Clone)] pub enum Progress { diff --git a/src/ui/property_animation.rs b/src/ui/property_animation.rs new file mode 100644 index 0000000..736be2f --- /dev/null +++ b/src/ui/property_animation.rs @@ -0,0 +1,47 @@ +use iced_futures::*; +use async_stream::stream; + +pub struct PropertyAnimation { + name: String, + sub: meln_logic::watcher::Subscription, +} + +impl PropertyAnimation { + pub fn new(name: &str, sub: meln_logic::watcher::Subscription) -> Self { + PropertyAnimation { + name: name.to_owned(), + sub: sub, + } + } +} + +impl subscription::Recipe for PropertyAnimation +where + H: std::hash::Hasher, + T: Clone + Send + Sync + 'static +{ + type Output = T; + + fn hash(&self, state: &mut H) { + use std::hash::Hash; + + std::any::TypeId::of::().hash(state); +// self.sub.hash(state); + self.name.hash(state); + } + + fn stream( + self: Box, + _input: futures::stream::BoxStream<'static, I>, + ) -> futures::stream::BoxStream<'static, Self::Output> { + let mut sub = self.sub; + let gen = stream! { + loop { + sub.changed().await; + let val = sub.borrow().clone(); + yield val; + } + }; + Box::pin(gen) + } +} From 14140e810fa5723bd0eefd9723a551eb0f194dce Mon Sep 17 00:00:00 2001 From: alex13sh Date: Fri, 22 Oct 2021 01:32:02 +0300 Subject: [PATCH 15/24] =?UTF-8?q?[app,=20complex,=20fix]=20=D0=98=D1=81?= =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=20=D0=BA=D0=BE=D0=BD=D1=81?= =?UTF-8?q?=D1=82=D1=80=D1=83=D0=BA=D1=82=D0=BE=D1=80=20=D0=9A=D0=BB=D0=B0?= =?UTF-8?q?=D0=BF=D0=B0=D0=BD=D0=BE=D0=B2.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app_complex_simple_ui.rs | 10 +--------- src/ui/klapans_2.rs | 16 +--------------- 2 files changed, 2 insertions(+), 24 deletions(-) diff --git a/src/app_complex_simple_ui.rs b/src/app_complex_simple_ui.rs index f73b269..3174269 100644 --- a/src/app_complex_simple_ui.rs +++ b/src/app_complex_simple_ui.rs @@ -97,12 +97,7 @@ impl Application for App { dvij_is_started: false, low: HalfComplect::new(&meln.values.half_bottom), top: HalfComplect::new(&meln.values.half_top), - klapans: ui::Klapans::new(logic.digit_o.device().values_map() - + logic.digit_i.device().values_map() - + logic.get_values().get_values_by_name_starts(&["Давление воздуха компрессора"]) - //.get_values_by_name_starts(&["Клапан 24В", "Клапан 2", "Насос"]) -// .clone() - ), + klapans: ui::Klapans::new(), dozator: ui::Dozator::new(), oil_station: ui::OilStation::new_by_meln(&meln.values), info_pane: ui::InfoPane::new(), @@ -310,9 +305,6 @@ impl App { // dbg!(&d); if res.is_ok() { // println!("Message::ModbusUpdateAsyncAnswerDevice {}", d.name()); - if d.name() == "4) МУ210-410" { - self.klapans.update_klapans(); - } } }, // MessageMudbusUpdate::GraphicUpdate => self.graph.update_svg(); diff --git a/src/ui/klapans_2.rs b/src/ui/klapans_2.rs index e6c3226..16f25d2 100644 --- a/src/ui/klapans_2.rs +++ b/src/ui/klapans_2.rs @@ -23,7 +23,6 @@ struct MyButton { pub struct Klapans { klapans: Vec, buttons: Vec, - values: modbus::ModbusValues, } #[derive(Debug, Clone)] @@ -33,7 +32,7 @@ pub enum Message { } impl Klapans { - pub fn new(values: modbus::ModbusValues) -> Self { + pub fn new() -> Self { let klapan_names = [ ("ШК1", "Клапан нижнего контейнера"), // ШК1 ("ШК3", "Клапан верхнего контейнера"), // ШК5 @@ -62,7 +61,6 @@ impl Klapans { enb: false, state: Default::default() }).collect(), - values: values, } } @@ -150,18 +148,6 @@ impl Klapans { } impl Klapans { - pub fn update_klapans(&mut self) { -// dbg!("update klapans"); - for k in self.klapans.iter_mut() { -// dbg!(&k.shk); -// if let Ok(enb) = self.values.get_bit(&format!("Клапан {} открыт", k.shk)) { - if let Ok(enb) = self.values.get_bit(&k.name) { - k.enb = enb; -// dbg!(enb); - } - } - } - fn set_button(&mut self, name: &str, enb: bool) { if let Some(v) = self.buttons.iter_mut().find(|s| s.name==name) { v.enb = enb; From 902d0e03f505a5c2b40148fd4b5963faf875e3af Mon Sep 17 00:00:00 2001 From: alex13sh Date: Fri, 22 Oct 2021 02:22:26 +0300 Subject: [PATCH 16/24] =?UTF-8?q?[meln=5Flogic,=20fix]=20=D0=98=D1=81?= =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=20=D0=B8=D0=BD=D0=B8=D1=86?= =?UTF-8?q?=D0=B8=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8E=20=D0=B8?= =?UTF-8?q?=D0=BD=D0=B2=D0=B5=D1=80=D1=82=D0=BE=D1=80=D0=B0=20=D0=B8=20?= =?UTF-8?q?=D0=BC=D0=BE=D1=82=D0=BE=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- meln_logic/src/init_clear.rs | 2 +- meln_logic/src/structs_2/half_meln.rs | 12 +++--- modbus/src/devices/invertor.rs | 5 ++- modbus/src/value.rs | 54 +++++++++++++++++++++++---- 4 files changed, 57 insertions(+), 16 deletions(-) diff --git a/meln_logic/src/init_clear.rs b/meln_logic/src/init_clear.rs index 6d8aae5..cecb006 100644 --- a/meln_logic/src/init_clear.rs +++ b/meln_logic/src/init_clear.rs @@ -53,7 +53,7 @@ impl Complect { let pdu_rs = Arc::new(Device::from(init::make_pdu_rs("192.168.1.13", 12))); let owen_mkon = Arc::new(Device::from(init::make_mkon("192.168.1.13", 1))); - let values = Self::init_values(&mut [&invertor_1.device(), &invertor_1.device(), &digit_i.device(), &digit_o.device(), &analog_1, &analog_2, &pdu_rs]); + let values = Self::init_values(&mut [&invertor_1.device(), &invertor_2.device(), &digit_i.device(), &digit_o.device(), &analog_1, &analog_2, &pdu_rs]); let values_dozator = values.get_values_by_name_starts(&["Двигатель подачи материала в камеру/", "Направление вращения двигателя ШД/"]); Complect { values: values, diff --git a/meln_logic/src/structs_2/half_meln.rs b/meln_logic/src/structs_2/half_meln.rs index b7f603a..3947a22 100644 --- a/meln_logic/src/structs_2/half_meln.rs +++ b/meln_logic/src/structs_2/half_meln.rs @@ -36,8 +36,8 @@ impl From<&HalfPartInner> for HalfPart { impl HalfMeln { pub fn low(values: &ModbusValues) -> Self { - let values = values.get_values_by_name_contains(&["М1/"]) - + values.get_values_by_name_starts(&["5) Invertor"]); + let values = values.get_values_by_name_contains(&["М1/"]).convert_to_sensor() + + values.get_values_by_name_start("5) Invertor/"); let температура_масла = ["Температура масла на верхн. выходе дв. М1", "Температура масла на нижн. выходе дв. М1" ]; HalfMeln { invertor: Invertor::from(&values), @@ -52,8 +52,8 @@ impl HalfMeln { } } pub fn top(values: &ModbusValues) -> Self { - let values = values.get_values_by_name_contains(&["М2/"]) - + values.get_values_by_name_starts(&["6) Invertor"]); + let values = values.get_values_by_name_contains(&["М2/"]).convert_to_sensor() + + values.get_values_by_name_start("6) Invertor/"); let температура_подшибника = ["Температура верх подшипника дв. М2", "Температура нижн подшипника дв. М2"]; HalfMeln { invertor: Invertor::from(&values), @@ -92,8 +92,8 @@ impl From<&ModbusValues> for Motor { fn from(values: &ModbusValues) -> Self { Motor { // speed: values.get_value_arc("Скорость двигателя").unwrap(), - температура_статора: values.get_value_arc("Температура статора").unwrap(), - температура_ротора: values.get_value_arc("Температура ротора Пирометр").unwrap(), + температура_статора: values.get_value_arc_starts("Температура статора").unwrap(), + температура_ротора: values.get_value_arc_starts("Температура ротора Пирометр").unwrap(), температуры_values: values.get_values_by_name_contains(&["Температура статора", "Температура ротора Пирометр",]), } } diff --git a/modbus/src/devices/invertor.rs b/modbus/src/devices/invertor.rs index c7641e1..c5bb8c9 100644 --- a/modbus/src/devices/invertor.rs +++ b/modbus/src/devices/invertor.rs @@ -105,8 +105,9 @@ impl InvertorValues { self.выходной_ток.value_clone() } pub fn get_hz_out_value(&self) -> Arc { - let vm = &self.values; - vm.get("Скорость двигателя").unwrap().clone() // Заменить на "Выходная частота" +// let vm = &self.values; +// vm.get("Скорость двигателя").unwrap().clone() // Заменить на "Выходная частота" + self.get_speed_out_value() } pub fn get_speed_out_value(&self) -> Arc { self.скорость_двигателя.value_clone() diff --git a/modbus/src/value.rs b/modbus/src/value.rs index 6e88d05..b773d23 100644 --- a/modbus/src/value.rs +++ b/modbus/src/value.rs @@ -300,15 +300,10 @@ impl ValueArc { } } pub fn sensor_name(&self) -> Option<&str> { - let mut parts = self.0.rsplit("/"); - parts.skip(1).next() + ModbusValues::sensor_name(&self.0) } pub fn device_name(&self) -> Option<&str> { - let mut parts = self.0.rsplit("/"); - let name_end = parts.skip(2).next()?; - let pos_end = name_end.as_ptr() as usize - self.0.as_ptr() as usize - + name_end.len(); - Some(&self.0[..pos_end]) + ModbusValues::device_name(&self.0) } pub fn value_clone(&self) -> Arc { self.1.clone() @@ -380,6 +375,13 @@ impl ModbusValues { }).map(|(k,v)|(k.clone(), v.clone())).collect() ) } + pub fn get_values_by_name_start(&self, name: &str) -> ModbusValues { + ModbusValues ( + self.0.iter().filter_map(|(k, v)| + Some((k.strip_prefix(name)?.to_owned(), v.clone())) + ).collect() + ) + } pub fn get_values_by_name_ends(&self, names: &[&str]) -> ModbusValues { ModbusValues ( self.0.iter().filter(|(k, v)| { @@ -395,6 +397,44 @@ impl ModbusValues { ) } + pub fn value_name(name: &str) -> Option<&str> { + let mut parts = name.rsplit("/"); + parts.next() + } + pub fn sensor_name(name: &str) -> Option<&str> { + let mut parts = name.rsplit("/"); + parts.skip(1).next() + } + pub fn sensor_full_name(name: &str) -> Option<&str> { + let mut parts = name.rsplit("/"); + let sensor_name = parts.skip(1).next()?; + let pos_start = sensor_name.as_ptr() as usize - name.as_ptr() as usize ; + Some(&name[pos_start..]) + } + pub fn device_name(name: &str) -> Option<&str> { + let mut parts = name.rsplit("/"); + let name_end = parts.skip(2).next()?; + let pos_end = name_end.as_ptr() as usize - name.as_ptr() as usize + + name_end.len(); + Some(&name[..pos_end]) + } + + pub fn convert_to_values(self) -> Self { + let map = self.0.into_iter() + .filter_map(|(k, v)| Some(( + Self::value_name(&k)?.to_owned(), v + )) ) + .collect(); + Self(map) + } + pub fn convert_to_sensor(self) -> Self { + let map = self.0.into_iter() + .filter_map(|(k, v)| Some(( + Self::sensor_full_name(&k)?.to_owned(), v + )) ) + .collect(); + Self(map) + } pub fn print_values(&self) -> String { use std::collections::BTreeMap; let b: BTreeMap<_,_> = self.0.iter().map(|(k, v)| (k.clone(), (v.address(), v.value()))).collect(); From 9ba8ac974aba31b6a59ef60fdc7c3978a0388e40 Mon Sep 17 00:00:00 2001 From: alex13sh Date: Fri, 22 Oct 2021 03:01:01 +0300 Subject: [PATCH 17/24] =?UTF-8?q?[app,=20complex,=20meln=5Flogic]=20=D0=97?= =?UTF-8?q?=D0=B0=D0=B2=D1=91=D0=BB=20=D0=BF=D0=BE=D0=B4=D0=BF=D0=B8=D1=81?= =?UTF-8?q?=D0=BA=D1=83=20=D0=BD=D0=B0=20=D0=BA=D0=BB=D0=B0=D0=BF=D0=B0?= =?UTF-8?q?=D0=BD=D0=B0!!=20=D0=A0=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D0=B5?= =?UTF-8?q?=D1=82!!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Но для этого пришлось исправить асинхронную функцию automation --- meln_logic/src/structs_2/klapans.rs | 16 ++++++++-------- src/app_complex_simple_ui.rs | 5 +++++ src/ui/klapans_2.rs | 13 +++++++++++++ 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/meln_logic/src/structs_2/klapans.rs b/meln_logic/src/structs_2/klapans.rs index db4a489..3e2c8cd 100644 --- a/meln_logic/src/structs_2/klapans.rs +++ b/meln_logic/src/structs_2/klapans.rs @@ -64,18 +64,18 @@ pub mod watcher { } pub(crate) async fn automation(&self) { - loop { - let futs = self.klapans.iter() - .map(|(name, prop)| { - let mut sub = prop.subscribe(); - async move { + let futs = self.klapans.iter() + .map(|(name, prop)| { + let mut sub = prop.subscribe(); + async move { + loop { sub.changed().await; let klapan = sub.borrow(); self.klapans_send.send((name.to_owned(), *klapan)); } - }); - futures_util::future::join_all(futs); - } + } + }); + futures_util::future::join_all(futs).await; } } diff --git a/src/app_complex_simple_ui.rs b/src/app_complex_simple_ui.rs index 3174269..5d62627 100644 --- a/src/app_complex_simple_ui.rs +++ b/src/app_complex_simple_ui.rs @@ -150,6 +150,8 @@ impl Application for App { ]).map(Message::MessageUpdate), self.dozator.subscription().map(Message::DozatorUI), + + self.klapans.subscription(&self.meln.properties.klapans).map(Message::KlapansUI), ]) } @@ -260,6 +262,8 @@ impl App { self.proccess_values(); }, MessageMudbusUpdate::ModbusUpdateAsync => { + self.meln.properties.update_property(&self.meln.values); + let device_futures = self.logic.update_async(UpdateReq::ReadOnly); return Command::batch(device_futures.into_iter() @@ -305,6 +309,7 @@ impl App { // dbg!(&d); if res.is_ok() { // println!("Message::ModbusUpdateAsyncAnswerDevice {}", d.name()); + self.meln.properties.update_property(&self.meln.values); } }, // MessageMudbusUpdate::GraphicUpdate => self.graph.update_svg(); diff --git a/src/ui/klapans_2.rs b/src/ui/klapans_2.rs index 16f25d2..3d21b72 100644 --- a/src/ui/klapans_2.rs +++ b/src/ui/klapans_2.rs @@ -28,6 +28,7 @@ pub struct Klapans { #[derive(Debug, Clone)] pub enum Message { ToggleKlapan(String, bool), + ToggledKlapan(String, bool), PressButton(String), } @@ -64,6 +65,13 @@ impl Klapans { } } + pub fn subscription(&self, props: &meln_logic::watcher::Klapans) -> iced::Subscription { + use super::animations::PropertyAnimation; + iced::Subscription::from_recipe( + PropertyAnimation::new("Клапана", props.klapans_send.subscribe()) + ).map(|(name, enb)| Message::ToggledKlapan(name, enb)) + } + pub fn update_vacuum(&mut self, message: Message, values: &meln_logic::values::VacuumStation) { match message { Message::PressButton(name) => { @@ -111,6 +119,11 @@ impl Klapans { Message::ToggleKlapan(name, enb) => { values.klapan_turn(name.as_str(), enb); } + Message::ToggledKlapan(name, enb) => { + if let Some(v) = self.klapans.iter_mut().find(|s| s.name==name) { + v.enb = enb; + } + } Message::PressButton(name) => { let mut pb = self.buttons.iter_mut().find(|s| s.name==name).unwrap(); match (name.as_str(), pb.enb) { From 3c37c9d0caa17cfc860434cc9c303413369e0256 Mon Sep 17 00:00:00 2001 From: alex13sh Date: Fri, 22 Oct 2021 03:58:56 +0300 Subject: [PATCH 18/24] =?UTF-8?q?[app,=20complex,=20meln=5Flogic]=20=D0=97?= =?UTF-8?q?=D0=B0=D0=B2=D1=91=D0=BB=20=D0=BF=D0=BE=D0=B4=D0=BF=D0=B8=D1=81?= =?UTF-8?q?=D0=BA=D1=83=20=D0=BD=D0=B0=20=D0=B4=D0=BE=D0=B7=D0=B0=D1=82?= =?UTF-8?q?=D0=BE=D1=80.=20=D0=90=D0=BD=D0=B8=D0=BC=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D0=B5=D1=82!!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Но пришлось исправить логику анимации. И логику установки целевой скорости. --- meln_logic/src/structs_2/dozator.rs | 14 ++++++------- src/app_complex_simple_ui.rs | 2 +- src/ui/dozator.rs | 31 +++++++++++------------------ 3 files changed, 20 insertions(+), 27 deletions(-) diff --git a/meln_logic/src/structs_2/dozator.rs b/meln_logic/src/structs_2/dozator.rs index fb0e307..265907c 100644 --- a/meln_logic/src/structs_2/dozator.rs +++ b/meln_logic/src/structs_2/dozator.rs @@ -8,7 +8,7 @@ pub struct Dozator { speed: ValueArc, // скоость ШИМа direct: ValueArc, - target_speed: Mutex>, + target_speed: Mutex>, } impl Dozator { @@ -30,15 +30,15 @@ impl Dozator { let mut target_speed = self.target_speed.lock().unwrap(); let current_speed = self.speed(); let dlt: i32 = (speed - current_speed) / Self::STEPS as i32; - - *target_speed = Some((speed, dlt)); + *target_speed = Some((speed, dlt, Self::STEPS)); } fn get_next_step(&self) -> Option { let mut target = self.target_speed.lock().unwrap(); - if let Some((target_speed, delta)) = *target { + if let Some((target_speed, delta, ref mut step)) = target.as_mut() { let current_speed = self.speed(); - if current_speed != target_speed { - return Some(delta); + if *step>0 { + *step -= 1; + return Some(*delta); } } *target = None; @@ -53,7 +53,7 @@ impl Dozator { use tokio::time::{sleep, Duration}; loop { self.next_step(); - sleep(Duration::from_millis(1000 / super::Dozator::STEPS as u64)).await; + sleep(Duration::from_millis(5_000 / super::Dozator::STEPS as u64)).await; } } } diff --git a/src/app_complex_simple_ui.rs b/src/app_complex_simple_ui.rs index 5d62627..33c5bac 100644 --- a/src/app_complex_simple_ui.rs +++ b/src/app_complex_simple_ui.rs @@ -149,7 +149,7 @@ impl Application for App { .map(|_| MessageMudbusUpdate::LogUpdate), ]).map(Message::MessageUpdate), - self.dozator.subscription().map(Message::DozatorUI), + self.dozator.subscription(&self.meln.properties.material.dozator).map(Message::DozatorUI), self.klapans.subscription(&self.meln.properties.klapans).map(Message::KlapansUI), ]) diff --git a/src/ui/dozator.rs b/src/ui/dozator.rs index ad4df86..6d6de39 100644 --- a/src/ui/dozator.rs +++ b/src/ui/dozator.rs @@ -28,7 +28,7 @@ pub enum Message { ShimHzChanged(i32), SetShimHz, SetShimHzFinished, ToggleKlapan(bool), - AnimationPos(super::animations::Progress), + AnimationPos(i32), } impl Dozator { @@ -40,35 +40,28 @@ impl Dozator { } } - pub fn subscription(&self) -> iced::Subscription { -// if self.shim_hz_cur != self.shim_hz_new { - iced::Subscription::from_recipe( - LinerAnimation::from_to(self.shim_hz_cur as f32, self.shim_hz_new as f32) - .steps(20).duration(5_000) - ).map(Message::AnimationPos) -// } else { -// iced::Subscription::none() -// } + pub fn subscription(&self, props: &meln_logic::watcher::Dozator) -> iced::Subscription { + use super::animations::PropertyAnimation; + iced::Subscription::from_recipe( + PropertyAnimation::new("ШИМ", props.speed.subscribe()) + ).map(Message::AnimationPos) } pub fn update(&mut self, message: Message, values: &meln_logic::values::Dozator) -> Command { match message { - Message::ShimHzChanged(hz) => self.shim_hz_ui = hz, + Message::ShimHzChanged(hz) => { + self.shim_hz_ui = hz; + self.shim_hz_new = hz; + } Message::SetShimHz => { println!("Set HZ: {}", self.shim_hz_ui); - self.shim_hz_new = self.shim_hz_ui; + values.set_target_speed(self.shim_hz_new); }, Message::ToggleKlapan(enb) => { self.klapan_enb = enb; }, - Message::AnimationPos(super::animations::Progress::Value(value)) => { + Message::AnimationPos(value) => { self.shim_hz_ui = value as i32; - self.shim_hz_cur = self.shim_hz_ui; -// dbg!(value); - values.set_speed(self.shim_hz_cur); - }, - Message::AnimationPos(super::animations::Progress::Finished) => { -// self.anim.stop(); }, _ => {}, } From 8dd7e9b63068f5fa41618596b7c0a6480186b150 Mon Sep 17 00:00:00 2001 From: alex13sh Date: Fri, 22 Oct 2021 12:01:34 +0300 Subject: [PATCH 19/24] =?UTF-8?q?[app,=20complex,=20meln=5Flogic]=20=D0=9F?= =?UTF-8?q?=D0=BE=D0=B4=D0=BF=D0=B8=D1=81=D0=B0=D0=BB=D1=81=D1=8F=20=D0=BD?= =?UTF-8?q?=D0=B0=20=D0=BE=D0=B1=D1=80=D0=B0=D1=82=D0=BD=D1=83=D1=8E=20?= =?UTF-8?q?=D1=81=D0=B2=D1=8F=D0=B7=D1=8C=20=D0=BA=D0=BB=D0=B0=D0=BF=D0=B0?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- meln_logic/src/structs_2/half_meln.rs | 5 ++- meln_logic/src/structs_2/klapans.rs | 60 +++++++++++++++++++++------ src/app_complex_simple_ui.rs | 2 +- src/ui/klapans_2.rs | 2 +- 4 files changed, 53 insertions(+), 16 deletions(-) diff --git a/meln_logic/src/structs_2/half_meln.rs b/meln_logic/src/structs_2/half_meln.rs index 3947a22..8482ad5 100644 --- a/meln_logic/src/structs_2/half_meln.rs +++ b/meln_logic/src/structs_2/half_meln.rs @@ -134,8 +134,9 @@ pub mod watcher { pub(crate) fn update_property(&self, values: &super::HalfMeln) { use modbus::{Value, TryFrom}; self.invertor.update_property(&values.invertor); - let vibro: f32 = f32::try_from(&values.vibro as &Value).unwrap(); // todo: Необходимо обработать ошибку - self.vibro.set(vibro); + if let Ok(vibro) = f32::try_from(&values.vibro as &Value) { // todo: Необходимо обработать ошибку + self.vibro.set(vibro); + } } pub(crate) async fn automation(&self) { diff --git a/meln_logic/src/structs_2/klapans.rs b/meln_logic/src/structs_2/klapans.rs index 3e2c8cd..3cf844b 100644 --- a/meln_logic/src/structs_2/klapans.rs +++ b/meln_logic/src/structs_2/klapans.rs @@ -15,10 +15,15 @@ pub struct Klapans { // клапан_насоса: ValueArc, klapans: ModbusValues, + klapans_шк: ModbusValues, } impl From<&ModbusValues> for Klapans { fn from(values: &ModbusValues) -> Self { + let klapans_шк = (0..12).map(|i| + format!("Клапан ШК{} {}", i/2+1, + if i%2==0 {"открыт"} else {"закрыт"}) + ).collect::>(); Klapans { давление_воздуха: values.get_value_arc("Давление воздуха компрессора").unwrap(), двигатель_компрессора_воздуха: values.get_value_arc("Двигатель компрессора воздуха").unwrap(), @@ -27,6 +32,10 @@ impl From<&ModbusValues> for Klapans { "Клапан подачи материала", "Клапан помольной камеры", "Клапан напуска", "Клапан насоса М5"] ), + klapans_шк: values.get_values_by_name_contains( + klapans_шк.iter().map(|name| name.as_str()) + .collect::>().as_slice() + ), } } } @@ -34,9 +43,9 @@ impl From<&ModbusValues> for Klapans { impl Klapans { pub fn klapan_turn(&self, name: &str, enb: bool) { - if self.давление_воздуха.is_error() { - return; - } +// if self.давление_воздуха.is_error() { +// return; +// } if let Err(e) = self.klapans.set_bit(name, enb) { dbg!(e); @@ -53,18 +62,25 @@ pub mod watcher { pub struct Klapans { pub давление_воздуха: Property, + pub klapans: HashMap>, pub klapans_send: Property<(String, bool)>, + + pub klapans_шк: HashMap<(String, String), Property>, + pub klapans_шк_send: Property<(String, bool)>, } impl Klapans { pub(crate) fn update_property(&self, values: &super::Klapans) { - for (k, p) in &self.klapans { - p.set(values.klapans.get_bit(k).unwrap()); + for (n, p) in &self.klapans { + p.set(values.klapans.get_bit(n).unwrap()); + } + for ((шк, _n), p) in &self.klapans_шк { + p.set(values.klapans_шк.get_bit(&format!("Клапан {} открыт", шк)).unwrap()); } } pub(crate) async fn automation(&self) { - let futs = self.klapans.iter() + let futs1 = self.klapans.iter() .map(|(name, prop)| { let mut sub = prop.subscribe(); async move { @@ -75,20 +91,40 @@ pub mod watcher { } } }); - futures_util::future::join_all(futs).await; + let futs2 = self.klapans_шк.iter() + .map(|((_шк, name), prop)| { + let mut sub = prop.subscribe(); + async move { + loop { + sub.changed().await; + let klapan = sub.borrow(); + self.klapans_send.send((name.to_owned(), *klapan)); + } + } + }); + tokio::join!( + futures_util::future::join_all(futs1), + futures_util::future::join_all(futs2), + ); } } impl Default for Klapans { fn default() -> Self { + let klapan_names = [ + ("ШК1", "Клапан нижнего контейнера"), // ШК1 + ("ШК3", "Клапан верхнего контейнера"), // ШК5 + ("ШК2", "Клапан подачи материала"), // ШК2 + ("ШК5", "Клапан помольной камеры"), // ШК3 + ("ШК4", "Клапан напуска"), // ШК4 + ("ШК6", "Клапан насоса М5"), // ШК6 + ]; Klapans { давление_воздуха: Property::default(), - klapans: ["Клапан нижнего контейнера", "Клапан верхнего контейнера", - "Клапан подачи материала", "Клапан помольной камеры", - "Клапан напуска", "Клапан насоса М5"].into_iter() - .map(|&n| (n.to_owned(), Property::::default())) - .collect(), + klapans: klapan_names.iter().map(|&(_, n)| (n.to_owned(), Property::::default())).collect(), klapans_send: Property::default(), + klapans_шк: klapan_names.iter().map(|&(шк, n)| ((шк.to_owned(), n.to_owned()), Property::::default())).collect(), + klapans_шк_send: Property::default(), } } } diff --git a/src/app_complex_simple_ui.rs b/src/app_complex_simple_ui.rs index 33c5bac..e6ec271 100644 --- a/src/app_complex_simple_ui.rs +++ b/src/app_complex_simple_ui.rs @@ -149,8 +149,8 @@ impl Application for App { .map(|_| MessageMudbusUpdate::LogUpdate), ]).map(Message::MessageUpdate), - self.dozator.subscription(&self.meln.properties.material.dozator).map(Message::DozatorUI), + self.dozator.subscription(&self.meln.properties.material.dozator).map(Message::DozatorUI), self.klapans.subscription(&self.meln.properties.klapans).map(Message::KlapansUI), ]) } diff --git a/src/ui/klapans_2.rs b/src/ui/klapans_2.rs index 3d21b72..d7b54f0 100644 --- a/src/ui/klapans_2.rs +++ b/src/ui/klapans_2.rs @@ -68,7 +68,7 @@ impl Klapans { pub fn subscription(&self, props: &meln_logic::watcher::Klapans) -> iced::Subscription { use super::animations::PropertyAnimation; iced::Subscription::from_recipe( - PropertyAnimation::new("Клапана", props.klapans_send.subscribe()) + PropertyAnimation::new("Клапана", props.klapans_шк_send.subscribe()) ).map(|(name, enb)| Message::ToggledKlapan(name, enb)) } From 31a31441ffbcd9ecbbf5362bce1322b15f1d6777 Mon Sep 17 00:00:00 2001 From: alex13sh Date: Fri, 22 Oct 2021 13:34:26 +0300 Subject: [PATCH 20/24] =?UTF-8?q?[app,=20complex,=20meln=5Flogic]=20=D0=A1?= =?UTF-8?q?=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20BroadcastAnimation=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D0=BA=D0=BB=D0=B0=D0=BF=D0=B0=D0=BD=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit А то с PropertyAnimation была проблема, что я не все значения видел, так как у Property буфер с размером = 1, а broadcast с размером буфера = 10 --- meln_logic/src/structs_2/klapans.rs | 13 ++++++----- src/ui/klapans_2.rs | 7 ++++-- src/ui/mod.rs | 2 +- src/ui/property_animation.rs | 36 +++++++++++++++++++++++++++++ 4 files changed, 49 insertions(+), 9 deletions(-) diff --git a/meln_logic/src/structs_2/klapans.rs b/meln_logic/src/structs_2/klapans.rs index 3cf844b..0fb4918 100644 --- a/meln_logic/src/structs_2/klapans.rs +++ b/meln_logic/src/structs_2/klapans.rs @@ -59,15 +59,16 @@ impl Klapans { pub mod watcher { use crate::structs::Property; use std::collections::HashMap; + use tokio::sync::broadcast; pub struct Klapans { pub давление_воздуха: Property, pub klapans: HashMap>, - pub klapans_send: Property<(String, bool)>, + pub klapans_send: broadcast::Sender<(String, bool)>, pub klapans_шк: HashMap<(String, String), Property>, - pub klapans_шк_send: Property<(String, bool)>, + pub klapans_шк_send: broadcast::Sender<(String, bool)>, } impl Klapans { pub(crate) fn update_property(&self, values: &super::Klapans) { @@ -87,7 +88,7 @@ pub mod watcher { loop { sub.changed().await; let klapan = sub.borrow(); - self.klapans_send.send((name.to_owned(), *klapan)); + let _ = self.klapans_send.send((name.to_owned(), *klapan)); } } }); @@ -98,7 +99,7 @@ pub mod watcher { loop { sub.changed().await; let klapan = sub.borrow(); - self.klapans_send.send((name.to_owned(), *klapan)); + let _ = self.klapans_send.send((name.to_owned(), *klapan)); } } }); @@ -122,9 +123,9 @@ pub mod watcher { Klapans { давление_воздуха: Property::default(), klapans: klapan_names.iter().map(|&(_, n)| (n.to_owned(), Property::::default())).collect(), - klapans_send: Property::default(), + klapans_send: broadcast::channel(16).0, klapans_шк: klapan_names.iter().map(|&(шк, n)| ((шк.to_owned(), n.to_owned()), Property::::default())).collect(), - klapans_шк_send: Property::default(), + klapans_шк_send: broadcast::channel(16).0, } } } diff --git a/src/ui/klapans_2.rs b/src/ui/klapans_2.rs index d7b54f0..92acb86 100644 --- a/src/ui/klapans_2.rs +++ b/src/ui/klapans_2.rs @@ -66,9 +66,12 @@ impl Klapans { } pub fn subscription(&self, props: &meln_logic::watcher::Klapans) -> iced::Subscription { - use super::animations::PropertyAnimation; + use super::animations::BroadcastAnimation; iced::Subscription::from_recipe( - PropertyAnimation::new("Клапана", props.klapans_шк_send.subscribe()) + BroadcastAnimation { + name: "Клапана".into(), + sub: props.klapans_send.subscribe() + } ).map(|(name, enb)| Message::ToggledKlapan(name, enb)) } diff --git a/src/ui/mod.rs b/src/ui/mod.rs index 1938361..6b1bfe5 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -22,7 +22,7 @@ mod property_animation; pub mod animations { pub use super::liner_animation::LinerAnimation; - pub use super::property_animation::PropertyAnimation; + pub use super::property_animation::{PropertyAnimation, BroadcastAnimation}; #[derive(Debug, Clone)] pub enum Progress { diff --git a/src/ui/property_animation.rs b/src/ui/property_animation.rs index 736be2f..190cdfd 100644 --- a/src/ui/property_animation.rs +++ b/src/ui/property_animation.rs @@ -45,3 +45,39 @@ where Box::pin(gen) } } + + +pub struct BroadcastAnimation { + pub name: String, + pub sub: tokio::sync::broadcast::Receiver, +} + +impl subscription::Recipe for BroadcastAnimation +where + H: std::hash::Hasher, + T: Clone + Send + Sync + 'static +{ + type Output = T; + + fn hash(&self, state: &mut H) { + use std::hash::Hash; + + std::any::TypeId::of::().hash(state); +// self.sub.hash(state); + self.name.hash(state); + } + + fn stream( + self: Box, + _input: futures::stream::BoxStream<'static, I>, + ) -> futures::stream::BoxStream<'static, Self::Output> { + let mut sub = self.sub; + let gen = stream! { + loop { + let val = sub.recv().await.unwrap(); + yield val; + } + }; + Box::pin(gen) + } +} From 98365142e7b2d24d0b5b0b935277eca8676f6ede Mon Sep 17 00:00:00 2001 From: alex13sh Date: Fri, 22 Oct 2021 13:40:36 +0300 Subject: [PATCH 21/24] =?UTF-8?q?[meln=5Flogic]=20=D0=90=D0=B2=D1=82=D0=BE?= =?UTF-8?q?=D0=BC=D0=B0=D1=82=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B8=20=D0=BE=D1=81=D1=82=D0=B0=D0=BD=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B8=20=D0=BC=D0=B5=D0=BB=D1=8C=D0=BD=D0=B8=D1=86=D1=8B.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit При остановки мельницы: выключается вакуумный насос, и через 10 сек отключается маслостанция --- meln_logic/src/structs_2/meln.rs | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/meln_logic/src/structs_2/meln.rs b/meln_logic/src/structs_2/meln.rs index 88cdcf5..df8149d 100644 --- a/meln_logic/src/structs_2/meln.rs +++ b/meln_logic/src/structs_2/meln.rs @@ -113,11 +113,23 @@ pub mod watcher { ); } } - pub async fn automation_mut(values: &super::Meln, properties: &Meln) { - Dozator::automation_mut( - &values.material.dozator, - &properties.material.dozator - ).await; + pub async fn automation_mut(values: &super::Meln, props: &Meln) { + use tokio::time::{sleep, Duration}; + let mut sub_is_started = props.is_started.subscribe(); + let f_stop = async move { + let _ = sub_is_started.changed().await; + values.vacuum.davl_dis(); + sleep(Duration::from_millis(10_000)).await; + values.oil.stop(); + }; + + tokio::join!( + Dozator::automation_mut( + &values.material.dozator, + &props.material.dozator + ), + f_stop, + ); } // Шаги алгоритма работы мельницы From 522536b111ad030d5be7c07ab9a8cb79abb6ae8d Mon Sep 17 00:00:00 2001 From: alex13sh Date: Fri, 22 Oct 2021 13:55:50 +0300 Subject: [PATCH 22/24] =?UTF-8?q?[app,=20complex]=20=D0=9F=D0=BE=D0=B4?= =?UTF-8?q?=D0=BF=D0=B8=D1=81=D0=B0=D0=BB=D1=81=D1=8F=20=D0=BD=D0=B0=20?= =?UTF-8?q?=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=81?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D0=BE=D1=8F=D0=BD=D0=B8=D1=8F=20=D0=BC=D0=B5?= =?UTF-8?q?=D0=BB=D1=8C=D0=BD=D0=B8=D1=86=D1=8B.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Теперь при остановки мельницы логи сохраняются --- src/app_complex_simple_ui.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/app_complex_simple_ui.rs b/src/app_complex_simple_ui.rs index e6ec271..f89bd72 100644 --- a/src/app_complex_simple_ui.rs +++ b/src/app_complex_simple_ui.rs @@ -133,6 +133,9 @@ impl Application for App { fn scale_factor(&self) -> f64 {0.6} fn subscription(&self) -> Subscription { + use ui::animations::PropertyAnimation; + let props = &self.meln.properties; + let interval_update = if self.is_worked() {100} else {1000}; let interval_log = if self.is_worked() {100} else {10000}; Subscription::batch(vec![ @@ -150,8 +153,11 @@ impl Application for App { ]).map(Message::MessageUpdate), - self.dozator.subscription(&self.meln.properties.material.dozator).map(Message::DozatorUI), - self.klapans.subscription(&self.meln.properties.klapans).map(Message::KlapansUI), + Subscription::from_recipe( + PropertyAnimation::new("ШИМ", props.is_started.subscribe()) + ).map(|enb| Message::MelnMessage(MelnMessage::IsStartedChanged(enb))), + self.dozator.subscription(&props.material.dozator).map(Message::DozatorUI), + self.klapans.subscription(&props.klapans).map(Message::KlapansUI), ]) } From 15b65efedfae6db5c045de6d928fda61c1cf2ddb Mon Sep 17 00:00:00 2001 From: alex13sh Date: Fri, 22 Oct 2021 15:10:55 +0300 Subject: [PATCH 23/24] =?UTF-8?q?[app,=20complex]=20=D0=9F=D1=80=D0=B8?= =?UTF-8?q?=D0=BC=D0=B0=D1=80=D0=B0=D1=84=D0=B5=D1=82=D0=B8=D0=BB=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app_complex_simple_ui.rs | 5 +---- src/ui/dozator.rs | 5 ++--- src/ui/invertor.rs | 3 --- src/ui/klapans_2.rs | 17 ++--------------- src/ui/oil_station.rs | 4 ---- src/ui/property_animation.rs | 4 ++-- 6 files changed, 7 insertions(+), 31 deletions(-) diff --git a/src/app_complex_simple_ui.rs b/src/app_complex_simple_ui.rs index f89bd72..5de6bae 100644 --- a/src/app_complex_simple_ui.rs +++ b/src/app_complex_simple_ui.rs @@ -86,9 +86,6 @@ impl Application for App { let meln = meln_logic::Meln::new(logic.get_values()); let meln_fut = meln.clone(); - let values_1 = logic.get_values().get_values_by_name_contains(&["М1"]); - let values_2 = logic.get_values().get_values_by_name_contains(&["М2"]); - (App { ui: Default::default(), has_exit: false, @@ -154,7 +151,7 @@ impl Application for App { ]).map(Message::MessageUpdate), Subscription::from_recipe( - PropertyAnimation::new("ШИМ", props.is_started.subscribe()) + PropertyAnimation::new("IsStarted", props.is_started.subscribe()) ).map(|enb| Message::MelnMessage(MelnMessage::IsStartedChanged(enb))), self.dozator.subscription(&props.material.dozator).map(Message::DozatorUI), self.klapans.subscription(&props.klapans).map(Message::KlapansUI), diff --git a/src/ui/dozator.rs b/src/ui/dozator.rs index 6d6de39..07366cf 100644 --- a/src/ui/dozator.rs +++ b/src/ui/dozator.rs @@ -11,7 +11,7 @@ use std::sync::Arc; pub struct Dozator { ui: UI, - shim_hz_ui: i32, shim_hz_cur: i32, shim_hz_new: i32, + shim_hz_ui: i32, shim_hz_new: i32, klapan_enb: bool, } @@ -35,7 +35,7 @@ impl Dozator { pub fn new() -> Self { Dozator { ui: UI::default(), - shim_hz_ui: 0, shim_hz_cur: 0, shim_hz_new: 0, + shim_hz_ui: 0, shim_hz_new: 0, klapan_enb: false, } } @@ -54,7 +54,6 @@ impl Dozator { self.shim_hz_new = hz; } Message::SetShimHz => { - println!("Set HZ: {}", self.shim_hz_ui); values.set_target_speed(self.shim_hz_new); }, Message::ToggleKlapan(enb) => { diff --git a/src/ui/invertor.rs b/src/ui/invertor.rs index d041419..2409c3e 100644 --- a/src/ui/invertor.rs +++ b/src/ui/invertor.rs @@ -41,8 +41,6 @@ impl Invertor { Message::ToggleStart(start) => { self.is_started = start; self.ui.start = Default::default(); - // Invertor SetSpeed - // Invertor Start | Stop if start { values.start(); } else { @@ -51,7 +49,6 @@ impl Invertor { }, Message::SpeedChanged(speed) => { self.speed = speed; -// dbg!((10*speed)/6); values.set_speed(100*speed/60); }, Message::SetSpeed(speed) => {}, diff --git a/src/ui/klapans_2.rs b/src/ui/klapans_2.rs index 92acb86..b1200a6 100644 --- a/src/ui/klapans_2.rs +++ b/src/ui/klapans_2.rs @@ -70,7 +70,7 @@ impl Klapans { iced::Subscription::from_recipe( BroadcastAnimation { name: "Клапана".into(), - sub: props.klapans_send.subscribe() + sub: props.klapans_шк_send.subscribe() } ).map(|(name, enb)| Message::ToggledKlapan(name, enb)) } @@ -83,14 +83,10 @@ impl Klapans { ("Уменьшить давление", false) => { pb.enb = true; values.davl_down(); - }, ("Уменьшить давление", true) => { - pb.enb = false; - values.davl_dis(); - }, ("Увеличить давление", false) => { pb.enb = true; values.davl_up(); - }, ("Увеличить давление", true) => { + }, ("Увеличить давление" | "Уменьшить давление", true) => { pb.enb = false; values.davl_dis(); }, @@ -162,12 +158,3 @@ impl Klapans { .into() } } - -impl Klapans { - fn set_button(&mut self, name: &str, enb: bool) { - if let Some(v) = self.buttons.iter_mut().find(|s| s.name==name) { - v.enb = enb; - } - } - -} diff --git a/src/ui/oil_station.rs b/src/ui/oil_station.rs index 2a8e101..49b8452 100644 --- a/src/ui/oil_station.rs +++ b/src/ui/oil_station.rs @@ -15,12 +15,10 @@ pub struct OilStation { #[derive(Default)] struct UI { pb_start_stop: button::State, - } #[derive(Debug, Clone)] pub enum Message { -// StartStop(bool), StartStopToggle, } @@ -68,10 +66,8 @@ impl OilStation { pub fn update(&mut self, message: Message, values: &meln_logic::values::OilStation) { match message { -// Message::StartStop(enb) => self.is_started = enb; Message::StartStopToggle => { self.is_started = !self.is_started; -// dbg!(self.is_started); values.motor_turn(self.is_started); }, } diff --git a/src/ui/property_animation.rs b/src/ui/property_animation.rs index 190cdfd..55552af 100644 --- a/src/ui/property_animation.rs +++ b/src/ui/property_animation.rs @@ -2,8 +2,8 @@ use iced_futures::*; use async_stream::stream; pub struct PropertyAnimation { - name: String, - sub: meln_logic::watcher::Subscription, + pub name: String, + pub sub: meln_logic::watcher::Subscription, } impl PropertyAnimation { From e481486a837a2f78f5db4e6c8929516c9c4c1ad8 Mon Sep 17 00:00:00 2001 From: alex13sh Date: Fri, 22 Oct 2021 15:25:24 +0300 Subject: [PATCH 24/24] =?UTF-8?q?[app,=20complex]=20=D0=9F=D0=BE=D0=B4?= =?UTF-8?q?=D0=BF=D0=B8=D1=81=D0=B0=D0=BB=D1=81=D1=8F=20=D0=BD=D0=B0=20?= =?UTF-8?q?=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=81?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D0=BE=D1=8F=D0=BD=D0=B8=D0=B5=20=D1=88=D0=B0?= =?UTF-8?q?=D0=B3=D0=B0=20=D0=BC=D0=B5=D0=BB=D1=8C=D0=BD=D0=B8=D1=86=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit И пока что шаг только отображается в статусной строке. --- meln_logic/src/structs_2/meln.rs | 1 + meln_logic/src/structs_2/mod.rs | 2 +- src/app_complex_simple_ui.rs | 13 ++++++++++--- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/meln_logic/src/structs_2/meln.rs b/meln_logic/src/structs_2/meln.rs index df8149d..4045168 100644 --- a/meln_logic/src/structs_2/meln.rs +++ b/meln_logic/src/structs_2/meln.rs @@ -98,6 +98,7 @@ pub mod watcher { } }; let f_step = async { + self.step.send(self.step.get()); loop { let next_step = self.step.get() .check_next_step(self).await; diff --git a/meln_logic/src/structs_2/mod.rs b/meln_logic/src/structs_2/mod.rs index 1534f5c..0bb9e9b 100644 --- a/meln_logic/src/structs_2/mod.rs +++ b/meln_logic/src/structs_2/mod.rs @@ -58,7 +58,7 @@ pub mod values { pub mod watcher { use super::*; - pub use meln::watcher::Meln; + pub use meln::watcher::{Meln, MelnStep}; pub use half_meln::watcher::HalfMeln; pub use dozator::watcher::Dozator; pub use oil_station::watcher::OilStation; diff --git a/src/app_complex_simple_ui.rs b/src/app_complex_simple_ui.rs index 5de6bae..e72f212 100644 --- a/src/app_complex_simple_ui.rs +++ b/src/app_complex_simple_ui.rs @@ -73,7 +73,7 @@ pub enum MessageMudbusUpdate { #[derive(Debug, Clone)] pub enum MelnMessage { IsStartedChanged(bool), - + NextStep(meln_logic::watcher::MelnStep), } impl Application for App { @@ -153,6 +153,10 @@ impl Application for App { Subscription::from_recipe( PropertyAnimation::new("IsStarted", props.is_started.subscribe()) ).map(|enb| Message::MelnMessage(MelnMessage::IsStartedChanged(enb))), + Subscription::from_recipe( + PropertyAnimation::new("Steps", props.step.subscribe()) + ).map(|step| Message::MelnMessage(MelnMessage::NextStep(step))), + self.dozator.subscription(&props.material.dozator).map(Message::DozatorUI), self.klapans.subscription(&props.klapans).map(Message::KlapansUI), ]) @@ -232,7 +236,7 @@ impl Application for App { .style(ui::style::Button::Exit)); // col.into() - let txt_status = Text::new(format!("Status: {}", self.txt_status)); + let txt_status = Text::new(format!("Step: {}", self.txt_status)); let row_exit = Row::new() .push(txt_status) .push(Space::with_width(Length::Fill)) @@ -334,6 +338,9 @@ impl App { self.log_save(); } } + NextStep(step) => { + self.txt_status = format!("{:?}",step); + } } } @@ -354,7 +361,7 @@ impl App { let warn = values.iter().map(|(_,v)| v) .map(|v| v.is_error()) .any(|err| err); - self.txt_status = if warn {"Ошибка значений"} else {""}.into(); +// self.txt_status = if warn {"Ошибка значений"} else {""}.into(); } fn log_save(&mut self) {