gv_fsm 0.2.9 → 0.3.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 +4 -4
- data/bin/gv_fsm +16 -0
- data/lib/gv_fsm.rb +7 -2
- data/lib/templates.rb +28 -6
- data/lib/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 16cf9c4cad02807aa41c4229aceea78be6f407c28f2a25a8b40e4395c6c7d494
|
4
|
+
data.tar.gz: 21f75946fb7d626d97cb87bcc44108e7fd3c01d0f8c388c08f0f3a65fb8f65c3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0eb8b28821342aaea705c4f4fceb94f5a689579934ce8da6f6e6dba06a3e902de73da42fa95019fa10a5a8dd457f7fe54a23946b5ce437d298cf88358a92c184
|
7
|
+
data.tar.gz: 885046a66dd9f4ac5b996ca0b28bad123b6ca21bf3983690556064f9b70ce9b2b546c0305e3148bc0ffb4692fe22b3aa0adc55dec8918d8e3b85180a902ca783
|
data/bin/gv_fsm
CHANGED
@@ -48,6 +48,10 @@ op = OptionParser.new do |parser|
|
|
48
48
|
sm.syslog = false
|
49
49
|
end
|
50
50
|
|
51
|
+
parser.on("-k", "--sigint STATE", "Install SIGINT handler that points to STATE") do |state|
|
52
|
+
sm.sigint = state
|
53
|
+
end
|
54
|
+
|
51
55
|
parser.on("-h", "--help", "Prints this help") do
|
52
56
|
puts parser
|
53
57
|
exit
|
@@ -73,6 +77,11 @@ unless sm.parse(ARGV[0]) then
|
|
73
77
|
exit 3
|
74
78
|
end
|
75
79
|
|
80
|
+
if sm.ino && sm.sigint then
|
81
|
+
STDERR.puts "ERROR: signal handler is not supported on Arduino!\n\n"
|
82
|
+
exit 4
|
83
|
+
end
|
84
|
+
|
76
85
|
puts "Parsed #{sm.dotfile}"
|
77
86
|
top = sm.topology
|
78
87
|
puts "Graph topology:"
|
@@ -87,11 +96,18 @@ end
|
|
87
96
|
puts "Generating C functions for states: #{sm.states_list.join(", ")}."
|
88
97
|
puts " for transition: #{sm.transition_functions_list.join(", ")}."
|
89
98
|
|
99
|
+
if (sm.sigint) then
|
100
|
+
puts "Installed signal handler for SIGINT in state #{top[:sources][0]}:\n stable states have emergency transition to state #{sm.sigint}"
|
101
|
+
unless top[:sinks].include? sm.sigint then
|
102
|
+
puts "WARNING: the state #{sm.sigint} is not a source, please check topology"
|
103
|
+
end
|
104
|
+
end
|
90
105
|
|
91
106
|
if options[:header] then
|
92
107
|
name = sm.generate_h
|
93
108
|
puts "Generated header #{name}"
|
94
109
|
end
|
110
|
+
|
95
111
|
if options[:source] then
|
96
112
|
name = sm.generate_c
|
97
113
|
puts "Generated source #{name}"
|
data/lib/gv_fsm.rb
CHANGED
@@ -10,7 +10,7 @@ require File.expand_path("../version.rb", __FILE__)
|
|
10
10
|
module GV_FSM
|
11
11
|
class FSM
|
12
12
|
attr_reader :states, :transitions, :dotfile, :prefix, :error
|
13
|
-
attr_accessor :project_name, :description, :cname, :syslog, :ino
|
13
|
+
attr_accessor :project_name, :description, :cname, :syslog, :ino, :sigint
|
14
14
|
include GV_FSM::Templates
|
15
15
|
|
16
16
|
def initialize(filename = nil)
|
@@ -20,6 +20,7 @@ module GV_FSM
|
|
20
20
|
@error = nil
|
21
21
|
@matrix = nil
|
22
22
|
@nodemap = {}
|
23
|
+
@sigint = nil
|
23
24
|
parse(filename) if filename
|
24
25
|
end
|
25
26
|
|
@@ -48,7 +49,7 @@ module GV_FSM
|
|
48
49
|
return nil
|
49
50
|
end
|
50
51
|
@matrix = Matrix.zero(n, n)
|
51
|
-
@description = g.name
|
52
|
+
@description = g.name unless @description
|
52
53
|
i = 0
|
53
54
|
g.each_node do |id|
|
54
55
|
n = g.get_node(id)
|
@@ -85,6 +86,10 @@ module GV_FSM
|
|
85
86
|
@error = "Parsing error"
|
86
87
|
return nil
|
87
88
|
end
|
89
|
+
if (self.sigint && !states.find {|s| s[:id] == self.sigint}) then
|
90
|
+
@error = "Missing SIGINT state #{self.sigint}"
|
91
|
+
return nil
|
92
|
+
end
|
88
93
|
return graph
|
89
94
|
end
|
90
95
|
|
data/lib/templates.rb
CHANGED
@@ -23,8 +23,8 @@ module GV_FSM
|
|
23
23
|
|
24
24
|
HH =<<~EOH
|
25
25
|
<% if !@ino then %>
|
26
|
-
#ifndef <%= @cname.upcase %>_H
|
27
|
-
#define <%= @cname.upcase %>_H
|
26
|
+
#ifndef <%= File::basename(@cname).upcase %>_H
|
27
|
+
#define <%= File::basename(@cname).upcase %>_H
|
28
28
|
#include <stdlib.h>
|
29
29
|
<% else %>
|
30
30
|
#include <arduino.h>
|
@@ -92,7 +92,7 @@ module GV_FSM
|
|
92
92
|
<% end %>
|
93
93
|
|
94
94
|
// state manager
|
95
|
-
<%= @prefix %>state_t <%= @prefix %>run_state(<%= @prefix %>state_t cur_state, state_data_t *data);
|
95
|
+
<%= @prefix %>state_t <%= @prefix %>run_state(<%= @prefix %>state_t cur_state, <%= @prefix %>state_data_t *data);
|
96
96
|
|
97
97
|
<% if !@ino then %>
|
98
98
|
#endif
|
@@ -108,8 +108,21 @@ module GV_FSM
|
|
108
108
|
<% else %>
|
109
109
|
<% if @syslog then log = :ino end %>
|
110
110
|
<% end %>
|
111
|
-
#include "<%= @cname %>.h"
|
111
|
+
#include "<%= File::basename(@cname) %>.h"
|
112
112
|
|
113
|
+
<% if sigint then %>// Install signal handler:
|
114
|
+
// SIGINT requests a transition to state <%= self.sigint %>
|
115
|
+
#include <signal.h>
|
116
|
+
static int _exit_request = 0;
|
117
|
+
static void signal_handler(int signal) {
|
118
|
+
if (signal == SIGINT) {
|
119
|
+
_exit_request = 1;<% if log == :syslog then %>
|
120
|
+
syslog(LOG_WARNING, "[FSM] SIGINT transition to <%= sigint %>");<% elsif log == :ino then %>
|
121
|
+
Serial.println("[FSM] SIGINT transition to <%= sigint %>");<% end %>
|
122
|
+
}
|
123
|
+
}
|
124
|
+
|
125
|
+
<% end %>
|
113
126
|
<% placeholder = "Your Code Here" %>
|
114
127
|
// SEARCH FOR <%= placeholder %> FOR CODE INSERTION POINTS!
|
115
128
|
|
@@ -153,6 +166,7 @@ module GV_FSM
|
|
153
166
|
// |_| \\__,_|_| |_|\\___|\\__|_|\\___/|_| |_|___/
|
154
167
|
//
|
155
168
|
<% dest = destinations.dup %>
|
169
|
+
<% topo = self.topology %>
|
156
170
|
<% @states.each do |s| %>
|
157
171
|
<% stable = true if dest[s[:id]].include? s[:id] %>
|
158
172
|
<% dest[s[:id]].map! {|n| (@prefix+"STATE_"+n).upcase} %>
|
@@ -161,9 +175,13 @@ module GV_FSM
|
|
161
175
|
end %>
|
162
176
|
// Function to be executed in state <%= s[:id] %>
|
163
177
|
// valid return states: <%= dest[s[:id]].join(", ") %>
|
178
|
+
<% if sigint && stable && topo[:sources][0] != s[:id] then %>
|
179
|
+
// SIGINT triggers an emergency transition to <%= self.sigint %>
|
180
|
+
<% end %>
|
164
181
|
<%= @prefix %>state_t <%= s[:function] %>(<%= @prefix %>state_data_t *data) {
|
165
182
|
<%= @prefix %>state_t next_state = <%= dest[s[:id]].first %>;
|
166
|
-
|
183
|
+
<% if sigint && topo[:sources][0] == s[:id] then %>signal(SIGINT, signal_handler);
|
184
|
+
<% end %>
|
167
185
|
<% if log == :syslog then %>
|
168
186
|
syslog(LOG_INFO, "[FSM] In state <%= s[:id] %>");
|
169
187
|
<% elsif log == :ino then %>
|
@@ -186,6 +204,10 @@ module GV_FSM
|
|
186
204
|
<% end %>
|
187
205
|
next_state = <%= @prefix.upcase %>NO_CHANGE;
|
188
206
|
}
|
207
|
+
<% if sigint && stable && topo[:sources][0] != s[:id] then %>
|
208
|
+
// SIGINT transition override
|
209
|
+
if (_exit_request) next_state = <%= (@prefix+"STATE_"+self.sigint ).upcase %>;
|
210
|
+
<% end %>
|
189
211
|
return next_state;
|
190
212
|
}
|
191
213
|
|
@@ -282,4 +304,4 @@ module GV_FSM
|
|
282
304
|
<% end %>
|
283
305
|
EOC
|
284
306
|
end
|
285
|
-
end
|
307
|
+
end
|
data/lib/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gv_fsm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Paolo Bosetti
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-05-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ruby-graphviz
|