gv_fsm 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 74b717895ae52d4a28c56c12944e18db81886463858bd42d9507a6cbb3c1309e
4
- data.tar.gz: f929706aace8b53639fdd8e67aa3096be88994c551266d4c7805196144595e26
3
+ metadata.gz: 9cdb522af0bd9bac3a853e75ad379b063657a6bd21ceb2fcad80c427ca6c00ed
4
+ data.tar.gz: 350cd6c0dbdbe1e3ff03f8e26eda97b16be7764dc7f5c244a98b3e0997d50b3a
5
5
  SHA512:
6
- metadata.gz: a807c54fa79bda61a07df1fee06b8dac62d193d92eb7e056a44c56b144fd008f63e983b0ea28e18d1a7008637a5cf5c64dd21a430f5133cb03f8ca62a75af021
7
- data.tar.gz: 6c471ada43c67ef29bdf12d7797b8f4d4bd23aa4e37bcc78ff7e56f0c91657c01066bec2ee5ee5d64a8c5ce0ac50845c4a156e7cf5ebc5d2af28413d25be3a40
6
+ metadata.gz: 2b623ee5a2d45345ff3ab13db5605ffa978b30add3b0ca912588d531fbf81f13b3f5a3210b02bbcee29e736115a10b936201e57828635d81c9c2c82eec869e74
7
+ data.tar.gz: bc2584dfcc1025b41499bc66ff85113eb2b440031467e1ac74a44450717cc48850cc4c35cfe8594262b59ac6d3e0164c766f439aa9f8eaf6e36e6cdc790262d9
data/bin/gv_fsm CHANGED
@@ -11,6 +11,7 @@ OptionParser.new do |parser|
11
11
  Graphviz to Finite State Machine generator
12
12
  Version: #{GV_FSM::VERSION}
13
13
  See also https://github.com/pbosetti/gv_fsm
14
+
14
15
  Usage: gv_fsm [options] scheme.dot
15
16
  EOB
16
17
 
@@ -50,3 +51,5 @@ if options[:source] then
50
51
  sm.generate_c
51
52
  puts "Generated source #{sm.cname}.c"
52
53
  end
54
+
55
+
@@ -31,6 +31,7 @@ module GV_FSM
31
31
  g.each_edge do |e|
32
32
  from = e.node_one
33
33
  to = e.node_two
34
+ next unless e[:label]
34
35
  case e[:label].source
35
36
  when ""
36
37
  label = nil
@@ -82,6 +83,15 @@ module GV_FSM
82
83
  return dest
83
84
  end
84
85
 
86
+ def transitions_paths
87
+ path = {}
88
+ @transitions.each do |t|
89
+ path[t[:function]] = [] unless path[t[:function]]
90
+ path[t[:function]] << {from: t[:from], to: t[:to]}
91
+ end
92
+ return path
93
+ end
94
+
85
95
  def generate_c(filename = @cname)
86
96
  File.open("#{filename}.c", "w") do |f|
87
97
  f.puts ERB.new(HEADER, 0, "<>").result(binding)
@@ -41,17 +41,18 @@ module GV_FSM
41
41
  state_t <%= s[:function] %>(void *data);
42
42
  <% end %>
43
43
 
44
+ // List of state functions
45
+ state_func_t *const state_table[NUM_STATES] = {
46
+ <%= self.state_functions_list.join(",\n ")%>
47
+ };
48
+
49
+ <% if self.transition_functions_list.count > 0 then %>
44
50
  // transition functions
45
51
  <% self.transition_functions_list.each do |t| %>
46
52
  <% next if t == "NULL" %>
47
53
  void <%= t %>(void *data);
48
54
  <% end %>
49
55
 
50
- // List of state functions
51
- state_func_t *const state_table[NUM_STATES] = {
52
- <%= self.state_functions_list.join(",\n ")%>
53
- };
54
-
55
56
  // Table of transition functions
56
57
  transition_func_t *const transition_table[NUM_STATES][NUM_STATES] = {
57
58
  <% sl = self.states_list %>
@@ -62,6 +63,9 @@ module GV_FSM
62
63
  /* <%= sl[i].ljust(sw) %> */ {<%= l.map {|e| e.ljust(fw)}.join(", ") %>},
63
64
  <% end %>
64
65
  };
66
+ <% else %>
67
+ // No transition functions
68
+ <% end %>
65
69
 
66
70
  // state manager
67
71
  state_t run_state(state_t cur_state, void *data);
@@ -73,7 +77,18 @@ module GV_FSM
73
77
  #include <syslog.h>
74
78
  #include "<%= self.cname %>.h"
75
79
 
76
- // State functions
80
+ // ____ _ _
81
+ // / ___|| |_ __ _| |_ ___
82
+ // \\___ \\| __/ _` | __/ _ \\
83
+ // ___) | || (_| | || __/
84
+ // |____/ \\__\\__,_|\\__\\___|
85
+ //
86
+ // __ _ _
87
+ // / _|_ _ _ __ ___| |_(_) ___ _ __ ___
88
+ // | |_| | | | '_ \\ / __| __| |/ _ \\| '_ \\/ __|
89
+ // | _| |_| | | | | (__| |_| | (_) | | | \\__ \\
90
+ // |_| \\__,_|_| |_|\\___|\\__|_|\\___/|_| |_|___/
91
+ //
77
92
  <% dest = self.destinations.dup %>
78
93
  <% self.states.each do |s| %>
79
94
  <% stable = true if dest[s[:id]].include? s[:id] %>
@@ -81,6 +96,7 @@ module GV_FSM
81
96
  <% if dest[s[:id]].empty? or stable then
82
97
  dest[s[:id]].unshift "NO_CHANGE"
83
98
  end %>
99
+ // To be executed in state <%= s[:id] %>
84
100
  state_t <%= s[:function] %>(void *data) {
85
101
  state_t next_state = <%= dest[s[:id]].first %>;
86
102
 
@@ -102,22 +118,54 @@ module GV_FSM
102
118
 
103
119
  <% end %>
104
120
 
105
- // Transition functions
121
+ <% if self.transition_functions_list.count > 0 then %>
122
+ // _____ _ _ _
123
+ // |_ _| __ __ _ _ __ ___(_) |_(_) ___ _ __
124
+ // | || '__/ _` | '_ \\/ __| | __| |/ _ \\| '_ \\
125
+ // | || | | (_| | | | \\__ \\ | |_| | (_) | | | |
126
+ // |_||_| \\__,_|_| |_|___/_|\\__|_|\\___/|_| |_|
127
+ //
128
+ // __ _ _
129
+ // / _|_ _ _ __ ___| |_(_) ___ _ __ ___
130
+ // | |_| | | | '_ \\ / __| __| |/ _ \\| '_ \\/ __|
131
+ // | _| |_| | | | | (__| |_| | (_) | | | \\__ \\
132
+ // |_| \\__,_|_| |_|\\___|\\__|_|\\___/|_| |_|___/
133
+ //
134
+
106
135
  <% self.transition_functions_list.each do |t| %>
107
136
  <% next if t == "NULL" %>
137
+ // This function is called in transitions:
138
+ <% self.transitions_paths[t].each do |e| %>
139
+ // from <%= e[:from] %> to <%= e[:to] %>
140
+ <% end %>
108
141
  void <%= t %>(void *data) {
109
142
  syslog(LOG_INFO, "[FSM] State transition <%= t %>");
110
143
  /* Your code here */
111
144
  }
112
145
 
113
146
  <% end %>
147
+ <% end %>
148
+
149
+ // ____ _ _
150
+ // / ___|| |_ __ _| |_ ___
151
+ // \\___ \\| __/ _` | __/ _ \\
152
+ // ___) | || (_| | || __/
153
+ // |____/ \\__\\__,_|\\__\\___|
154
+ //
155
+ //
156
+ // _ __ ___ __ _ _ __ __ _ __ _ ___ _ __
157
+ // | '_ ` _ \\ / _` | '_ \\ / _` |/ _` |/ _ \\ '__|
158
+ // | | | | | | (_| | | | | (_| | (_| | __/ |
159
+ // |_| |_| |_|\\__,_|_| |_|\\__,_|\\__, |\\___|_|
160
+ // |___/
114
161
 
115
- // State manager
116
162
  state_t run_state(state_t cur_state, void *data) {
117
163
  state_t new_state = state_table[cur_state](data);
164
+ <% if self.transition_functions_list.count > 0 then %>
118
165
  transition_func_t *transition = transition_table[cur_state][new_state];
119
166
  if (transition)
120
167
  transition(data);
168
+ <% end %>
121
169
  return new_state == NO_CHANGE ? cur_state : new_state;
122
170
  };
123
171
 
@@ -1,3 +1,3 @@
1
1
  module GV_FSM
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gv_fsm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Paolo Bosetti