rsiot/components/cmp_plc/plc/library/drives/select_sp/
logic.rs

1use super::{IHmiCommand, QHmiPermission, QHmiStatus, I, Q, S};
2
3pub fn logic(input: &I, stat: &mut S) -> Q {
4    stat.sp_plc_act = match input.sp_en_source {
5        // из hmi
6        false => match input.hmi_command {
7            IHmiCommand::no_command => stat.sp_plc_act,
8            IHmiCommand::sp_hmi_en => false,
9            IHmiCommand::sp_plc_en => true,
10            IHmiCommand::sp_hmi(_) => stat.sp_plc_act,
11        },
12
13        // из plc
14        true => {
15            if input.sp_hmi_en {
16                false
17            } else if input.sp_plc_en {
18                true
19            } else {
20                stat.sp_plc_act
21            }
22        }
23    };
24
25    if let IHmiCommand::sp_hmi(sp) = input.hmi_command {
26        stat.sp_hmi = sp
27    };
28
29    let sp = match stat.sp_plc_act {
30        true => {
31            stat.sp_hmi = input.sp_plc;
32            input.sp_plc
33        }
34        false => stat.sp_hmi,
35    };
36
37    Q {
38        hmi_status: QHmiStatus {
39            hmi_permission: QHmiPermission {
40                sp_hmi_en: !input.sp_en_source && stat.sp_plc_act,
41                sp_plc_en: !input.sp_en_source && !stat.sp_plc_act,
42                sp_hmi_plc_en: !input.sp_en_source,
43                sp_hmi: !stat.sp_plc_act,
44            },
45            sp_plc_act: stat.sp_plc_act,
46            sp_hmi_act: !stat.sp_plc_act,
47            sp,
48        },
49        sp_plc_act: stat.sp_plc_act,
50        sp_hmi_act: !stat.sp_plc_act,
51        sp,
52    }
53}