ironplc_dsl/
sfc.rs

1//! Provides definitions specific to sequential function chart elements.
2//!
3//!  
4use crate::ast::*;
5use crate::core::Id;
6use crate::dsl::*;
7
8#[derive(Debug, PartialEq, Clone)]
9pub enum ActionQualifier {
10    N,
11    R,
12    S,
13    P,
14}
15
16impl ActionQualifier {
17    pub fn from_char(l: char) -> ActionQualifier {
18        match l {
19            'N' => return ActionQualifier::N,
20            'R' => return ActionQualifier::R,
21            'S' => return ActionQualifier::S,
22            'P' => return ActionQualifier::P,
23            // TODO error message
24            _ => panic!(),
25        }
26    }
27}
28
29#[derive(Debug, PartialEq, Clone)]
30pub struct ActionAssociation {
31    pub name: Id,
32    pub qualifier: Option<ActionQualifier>,
33    pub indicators: Vec<Id>,
34}
35
36impl ActionAssociation {
37    pub fn new(name: &str, qualifier: Option<ActionQualifier>) -> ActionAssociation {
38        ActionAssociation {
39            name: Id::from(name),
40            qualifier: qualifier,
41            indicators: vec![],
42        }
43    }
44}
45
46#[derive(Debug, PartialEq, Clone)]
47pub enum Element {
48    Action {
49        name: Id,
50        body: FunctionBlockBody,
51    },
52
53    Transition {
54        name: Option<Id>,
55        priority: Option<u32>,
56        from: Vec<Id>,
57        to: Vec<Id>,
58        condition: ExprKind,
59    },
60
61    Step {
62        name: Id,
63        action_associations: Vec<ActionAssociation>,
64    },
65
66    InitialStep {
67        name: Id,
68        action_associations: Vec<ActionAssociation>,
69    },
70}
71
72impl Element {
73    pub fn action(name: &str, body: Vec<StmtKind>) -> Element {
74        Element::Action {
75            name: Id::from(name),
76            body: FunctionBlockBody::Statements(Statements { body: body }),
77        }
78    }
79
80    pub fn transition(from: &str, to: &str, condition: ExprKind) -> Element {
81        Element::Transition {
82            name: None,
83            priority: None,
84            from: vec![Id::from(from)],
85            to: vec![Id::from(to)],
86            condition: condition,
87        }
88    }
89}
90
91#[derive(Debug, PartialEq, Clone)]
92pub struct Network {
93    pub initial_step: Element,
94    pub elements: Vec<Element>,
95}