gv_fsm 0.2.5 → 0.2.6
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 -17
- data/lib/gv_fsm.rb +28 -12
- data/lib/templates.rb +24 -8
- data/lib/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 61d5d6c1ef593ce7d516c48ab905c210d3005081fdd241b47298c55c5340236c
|
4
|
+
data.tar.gz: d8bc69220e149140bd150ad3890dbf11e33651352bf22df483b7941c9a9911c7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c92f9ebb2275bfb8fd4fa23060cc22c8d34fe2e7eb219e9833f60517417ca11a420758c99fb0bee82cc58795f184a44d230bf03ae947072e1a72271bad34b2c9
|
7
|
+
data.tar.gz: 7a2898d7f153fe7c80a9eb046c54bd4076ffa15bf69987f069d94a70708a17085641fc7dff765fd7816df839f469ce363e7793122e5d09538e882667d5e83650
|
data/bin/gv_fsm
CHANGED
@@ -44,7 +44,7 @@ op = OptionParser.new do |parser|
|
|
44
44
|
sm.ino = true
|
45
45
|
end
|
46
46
|
|
47
|
-
parser.on("-l", "--no-
|
47
|
+
parser.on("-l", "--no-log", "Omit log calls in stub functions") do
|
48
48
|
sm.syslog = false
|
49
49
|
end
|
50
50
|
|
@@ -60,28 +60,27 @@ op.parse!
|
|
60
60
|
unless ARGV[0]
|
61
61
|
STDERR.puts "ERROR: I need the path to a Graphviz file!\n\n"
|
62
62
|
STDERR.puts op
|
63
|
-
exit
|
63
|
+
exit 1
|
64
64
|
end
|
65
|
-
|
65
|
+
if !File.extname(ARGV[0]) == ".dot" or !File.exist? ARGV[0] then
|
66
66
|
STDERR.puts "ERROR: #{ARGV[0]} does not look like a Graphviz file!\n\n"
|
67
67
|
STDERR.puts op
|
68
|
-
exit
|
68
|
+
exit 2
|
69
69
|
end
|
70
70
|
|
71
|
-
sm.parse(ARGV[0])
|
71
|
+
unless sm.parse(ARGV[0]) then
|
72
|
+
puts "Error parsing the file #{ARGV[0]}: #{sm.error}"
|
73
|
+
exit 3
|
74
|
+
end
|
72
75
|
|
73
76
|
puts "Parsed #{sm.dotfile}.\nGenerating C stub for states: #{sm.states_list.join(", ")}."
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
if options[:source] then
|
83
|
-
sm.generate_c
|
84
|
-
puts "Generated source #{sm.cname}.c"
|
85
|
-
end
|
77
|
+
|
78
|
+
if options[:header] then
|
79
|
+
name = sm.generate_h
|
80
|
+
puts "Generated header #{name}"
|
81
|
+
end
|
82
|
+
if options[:source] then
|
83
|
+
name = sm.generate_c
|
84
|
+
puts "Generated source #{name}"
|
86
85
|
end
|
87
86
|
|
data/lib/gv_fsm.rb
CHANGED
@@ -8,7 +8,7 @@ require File.expand_path("../version.rb", __FILE__)
|
|
8
8
|
|
9
9
|
module GV_FSM
|
10
10
|
class FSM
|
11
|
-
attr_reader :states, :transitions, :dotfile, :prefix
|
11
|
+
attr_reader :states, :transitions, :dotfile, :prefix, :error
|
12
12
|
attr_accessor :project_name, :description, :cname, :syslog, :ino
|
13
13
|
include GV_FSM::Templates
|
14
14
|
|
@@ -16,6 +16,7 @@ module GV_FSM
|
|
16
16
|
@prefix = ""
|
17
17
|
@syslog = true
|
18
18
|
@ino = false
|
19
|
+
@error = nil
|
19
20
|
parse(filename) if filename
|
20
21
|
end
|
21
22
|
|
@@ -29,7 +30,20 @@ module GV_FSM
|
|
29
30
|
@dotfile = filename
|
30
31
|
@states = []
|
31
32
|
@transitions = []
|
32
|
-
GraphViz.parse(filename) do |g|
|
33
|
+
graph = GraphViz.parse(filename) do |g|
|
34
|
+
if g.graph_count > 1 then
|
35
|
+
@error = "Only one graph in the dot file is permitted"
|
36
|
+
return nil
|
37
|
+
end
|
38
|
+
unless g.type == "digraph" then
|
39
|
+
@error = "Graph is not directed"
|
40
|
+
return nil
|
41
|
+
end
|
42
|
+
if g.node_count == 0 then
|
43
|
+
@error = "Graph is empty"
|
44
|
+
return nil
|
45
|
+
end
|
46
|
+
@description = g.name
|
33
47
|
g.each_node do |id|
|
34
48
|
n = g.get_node(id)
|
35
49
|
if n[:label].source.empty? or
|
@@ -58,6 +72,11 @@ module GV_FSM
|
|
58
72
|
@transitions << {from: from, to: to, function: label ? @prefix+label : nil}
|
59
73
|
end
|
60
74
|
end
|
75
|
+
unless graph then
|
76
|
+
@error = "Parsing error"
|
77
|
+
return nil
|
78
|
+
end
|
79
|
+
return graph
|
61
80
|
end
|
62
81
|
|
63
82
|
def state_functions_list
|
@@ -108,27 +127,24 @@ module GV_FSM
|
|
108
127
|
end
|
109
128
|
|
110
129
|
def generate_c(filename = @cname)
|
111
|
-
|
130
|
+
ext = @ino ? "cpp" : "c"
|
131
|
+
fname = "#{filename}.#{ext}"
|
132
|
+
File.open(fname, "w") do |f|
|
112
133
|
f.puts ERB.new(HEADER, 0, "<>").result(binding)
|
113
134
|
f.puts ERB.new(CC, 0, "<>").result(binding)
|
114
135
|
end
|
136
|
+
return fname
|
115
137
|
end
|
116
138
|
|
117
139
|
def generate_h(filename = @cname)
|
118
|
-
|
140
|
+
fname = "#{filename}.h"
|
141
|
+
File.open(fname, "w") do |f|
|
119
142
|
f.puts ERB.new(HEADER, 0, "<>").result(binding)
|
120
143
|
f.puts ERB.new(HH, 0, "<>").result(binding)
|
121
144
|
end
|
145
|
+
return fname
|
122
146
|
end
|
123
147
|
|
124
|
-
def generate_ino(filename=@cname)
|
125
|
-
@syslog = false
|
126
|
-
File.open("#{filename}.ino", "w") do |f|
|
127
|
-
f.puts ERB.new(HEADER, 0, "<>").result(binding)
|
128
|
-
f.puts ERB.new(HH, 0, "<>").result(binding)
|
129
|
-
f.puts ERB.new(CC, 0, "<>").result(binding)
|
130
|
-
end
|
131
|
-
end
|
132
148
|
end
|
133
149
|
|
134
150
|
end
|
data/lib/templates.rb
CHANGED
@@ -26,6 +26,8 @@ module GV_FSM
|
|
26
26
|
#ifndef <%= @cname.upcase %>_H
|
27
27
|
#define <%= @cname.upcase %>_H
|
28
28
|
#include <stdlib.h>
|
29
|
+
<% else %>
|
30
|
+
#include <arduino.h>
|
29
31
|
<% end %>
|
30
32
|
|
31
33
|
// State data object
|
@@ -100,10 +102,13 @@ module GV_FSM
|
|
100
102
|
CC =<<~EOC
|
101
103
|
<% if !@ino then %>
|
102
104
|
<% if @syslog then %>
|
105
|
+
<% log = :syslog %>
|
103
106
|
#include <syslog.h>
|
104
107
|
<% end %>
|
105
|
-
|
108
|
+
<% else %>
|
109
|
+
<% if @syslog then log = :ino end %>
|
106
110
|
<% end %>
|
111
|
+
#include "<%= @cname %>.h"
|
107
112
|
|
108
113
|
<% placeholder = "Your Code Here" %>
|
109
114
|
// SEARCH FOR <%= placeholder %> FOR CODE INSERTION POINTS!
|
@@ -159,8 +164,10 @@ module GV_FSM
|
|
159
164
|
<%= @prefix %>state_t <%= s[:function] %>(<%= @prefix %>state_data_t *data) {
|
160
165
|
<%= @prefix %>state_t next_state = <%= dest[s[:id]].first %>;
|
161
166
|
|
162
|
-
<% if
|
167
|
+
<% if log == :syslog then %>
|
163
168
|
syslog(LOG_INFO, "[FSM] In state <%= s[:id] %>");
|
169
|
+
<% elsif log == :ino then %>
|
170
|
+
Serial.println("[FSM] In state <%= s[:id] %>");
|
164
171
|
<% end %>
|
165
172
|
/* <%= placeholder %> */
|
166
173
|
|
@@ -170,8 +177,12 @@ module GV_FSM
|
|
170
177
|
<% end %>
|
171
178
|
break;
|
172
179
|
default:
|
173
|
-
<% if
|
180
|
+
<% if log == :syslog then %>
|
174
181
|
syslog(LOG_WARNING, "[FSM] Cannot pass from <%= s[:id] %> to %s, remaining in this state", state_names[next_state]);
|
182
|
+
<% elsif log == :ino then %>
|
183
|
+
Serial.print("[FSM] Cannot pass from <%= s[:id] %> to ");
|
184
|
+
Serial.print(state_names[next_state]);
|
185
|
+
Serial.println(", remaining in this state");
|
175
186
|
<% end %>
|
176
187
|
next_state = <%= @prefix.upcase %>NO_CHANGE;
|
177
188
|
}
|
@@ -202,8 +213,10 @@ module GV_FSM
|
|
202
213
|
// <%= i+1 %>. from <%= e[:from] %> to <%= e[:to] %>
|
203
214
|
<% end %>
|
204
215
|
void <%= t %>(<%= @prefix %>state_data_t *data) {
|
205
|
-
<% if
|
216
|
+
<% if log == :syslog then %>
|
206
217
|
syslog(LOG_INFO, "[FSM] State transition <%= t %>");
|
218
|
+
<% elsif log == :ino then %>
|
219
|
+
Serial.println("[FSM] State transition <%= t %>");
|
207
220
|
<% end %>
|
208
221
|
/* <%= placeholder %> */
|
209
222
|
}
|
@@ -237,11 +250,17 @@ module GV_FSM
|
|
237
250
|
|
238
251
|
<% if @ino then %>
|
239
252
|
/* Example usage:
|
253
|
+
<%= @prefix %>state_data_t data = {count: 1};
|
254
|
+
|
255
|
+
void loop() {
|
256
|
+
static <%= @prefix %>state_t cur_state = <%= @prefix.upcase %>STATE_INIT;
|
257
|
+
cur_state = <%= @prefix %>run_state(cur_state, &data);
|
258
|
+
}
|
259
|
+
*/
|
240
260
|
<% else %>
|
241
261
|
#ifdef TEST_MAIN
|
242
262
|
#include <unistd.h>
|
243
263
|
int main() {
|
244
|
-
<% end %>
|
245
264
|
<%= @prefix %>state_t cur_state = <%= @prefix.upcase %>STATE_INIT;
|
246
265
|
<% if @syslog then %>
|
247
266
|
openlog("SM", LOG_PID | LOG_PERROR, LOG_USER);
|
@@ -251,12 +270,9 @@ module GV_FSM
|
|
251
270
|
cur_state = <%= @prefix %>run_state(cur_state, NULL);
|
252
271
|
sleep(1);
|
253
272
|
} while (cur_state != <%= @prefix.upcase %>STATE_STOP);
|
254
|
-
<% if !@ino then %>
|
255
273
|
return 0;
|
256
274
|
}
|
257
275
|
#endif
|
258
|
-
<% else %>
|
259
|
-
*/
|
260
276
|
<% end %>
|
261
277
|
EOC
|
262
278
|
end
|
data/lib/version.rb
CHANGED