lignite 0.5.0 → 0.6.0
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/.rubocop.yml +4 -0
- data/NEWS.md +10 -0
- data/VERSION +1 -1
- data/examples/bobbee.rb +75 -29
- data/examples/gyro-sensor.rb +19 -0
- data/lib/lignite.rb +12 -0
- data/lib/lignite/assembler.rb +48 -5
- data/lib/lignite/body_compiler.rb +35 -37
- data/lib/lignite/condition.rb +116 -0
- data/lib/lignite/connection.rb +4 -0
- data/lib/lignite/ev3_ops.rb +104 -12
- data/lib/lignite/ev3_tool.rb +9 -2
- data/lib/lignite/jump_offset.rb +18 -0
- data/lib/lignite/motors.rb +17 -8
- data/lib/lignite/op_compiler.rb +52 -26
- data/lib/lignite/parameter_declarer.rb +15 -15
- data/lib/lignite/variables.rb +27 -15
- data/lignite.gemspec +3 -0
- data/spec/data/HelloWorld.rb +2 -2
- data/spec/data/Performance.rb +1 -1
- data/spec/data/Performance.rbf +0 -0
- data/spec/data/ev3tool_download.yml +4 -2
- data/spec/data/everstorm.rbf +0 -0
- data/spec/ev3_tool_spec.rb +4 -1
- data/tools/ops_from_yml +9 -1
- metadata +5 -2
@@ -15,94 +15,94 @@ module Lignite
|
|
15
15
|
# Declare an 8-bit input parameter
|
16
16
|
# @param name [Symbol] parameter name
|
17
17
|
def in8(name)
|
18
|
-
parameters.param(name, 1, PAR8, IN)
|
18
|
+
parameters.param(name, 1, 1, PAR8, IN)
|
19
19
|
end
|
20
20
|
|
21
21
|
# Declare an 8-bit output parameter
|
22
22
|
# @param name [Symbol] parameter name
|
23
23
|
def out8(name)
|
24
|
-
parameters.param(name, 1, PAR8, OUT)
|
24
|
+
parameters.param(name, 1, 1, PAR8, OUT)
|
25
25
|
end
|
26
26
|
|
27
27
|
# Declare an 8-bit input+output parameter
|
28
28
|
# @param name [Symbol] parameter name
|
29
29
|
def io8(name)
|
30
|
-
parameters.param(name, 1, PAR8, IN | OUT)
|
30
|
+
parameters.param(name, 1, 1, PAR8, IN | OUT)
|
31
31
|
end
|
32
32
|
|
33
33
|
# Declare a 16-bit input parameter
|
34
34
|
# @param name [Symbol] parameter name
|
35
35
|
def in16(name)
|
36
|
-
parameters.param(name, 2, PAR16, IN)
|
36
|
+
parameters.param(name, 2, 1, PAR16, IN)
|
37
37
|
end
|
38
38
|
|
39
39
|
# Declare a 16-bit output parameter
|
40
40
|
# @param name [Symbol] parameter name
|
41
41
|
def out16(name)
|
42
|
-
parameters.param(name, 2, PAR16, OUT)
|
42
|
+
parameters.param(name, 2, 1, PAR16, OUT)
|
43
43
|
end
|
44
44
|
|
45
45
|
# Declare a 16-bit input+output parameter
|
46
46
|
# @param name [Symbol] parameter name
|
47
47
|
def io16(name)
|
48
|
-
parameters.param(name, 2, PAR16, IN | OUT)
|
48
|
+
parameters.param(name, 2, 1, PAR16, IN | OUT)
|
49
49
|
end
|
50
50
|
|
51
51
|
# Declare a 32-bit input parameter
|
52
52
|
# @param name [Symbol] parameter name
|
53
53
|
def in32(name)
|
54
|
-
parameters.param(name, 4, PAR32, IN)
|
54
|
+
parameters.param(name, 4, 1, PAR32, IN)
|
55
55
|
end
|
56
56
|
|
57
57
|
# Declare a 32-bit output parameter
|
58
58
|
# @param name [Symbol] parameter name
|
59
59
|
def out32(name)
|
60
|
-
parameters.param(name, 4, PAR32, OUT)
|
60
|
+
parameters.param(name, 4, 1, PAR32, OUT)
|
61
61
|
end
|
62
62
|
|
63
63
|
# Declare a 32-bit input+output parameter
|
64
64
|
# @param name [Symbol] parameter name
|
65
65
|
def io32(name)
|
66
|
-
parameters.param(name, 4, PAR32, IN | OUT)
|
66
|
+
parameters.param(name, 4, 1, PAR32, IN | OUT)
|
67
67
|
end
|
68
68
|
|
69
69
|
# Declare a floating-point input parameter
|
70
70
|
# @param name [Symbol] parameter name
|
71
71
|
def inf(name)
|
72
|
-
parameters.param(name, 4, PARF, IN)
|
72
|
+
parameters.param(name, 4, 1, PARF, IN)
|
73
73
|
end
|
74
74
|
|
75
75
|
# Declare a floating-point output parameter
|
76
76
|
# @param name [Symbol] parameter name
|
77
77
|
def outf(name)
|
78
|
-
parameters.param(name, 4, PARF, OUT)
|
78
|
+
parameters.param(name, 4, 1, PARF, OUT)
|
79
79
|
end
|
80
80
|
|
81
81
|
# Declare a floating-point input+output parameter
|
82
82
|
# @param name [Symbol] parameter name
|
83
83
|
def iof(name)
|
84
|
-
parameters.param(name, 4, PARF, IN | OUT)
|
84
|
+
parameters.param(name, 4, 1, PARF, IN | OUT)
|
85
85
|
end
|
86
86
|
|
87
87
|
# Declare a string input parameter
|
88
88
|
# @param name [Symbol] parameter name
|
89
89
|
# @param size [Integer] maximum string size, including the terminating 0
|
90
90
|
def ins(name, size)
|
91
|
-
parameters.param(name, size, PARS, IN)
|
91
|
+
parameters.param(name, 1, size, PARS, IN)
|
92
92
|
end
|
93
93
|
|
94
94
|
# Declare a string output parameter
|
95
95
|
# @param name [Symbol] parameter name
|
96
96
|
# @param size [Integer] maximum string size, including the terminating 0
|
97
97
|
def outs(name, size)
|
98
|
-
parameters.param(name, size, PARS, OUT)
|
98
|
+
parameters.param(name, 1, size, PARS, OUT)
|
99
99
|
end
|
100
100
|
|
101
101
|
# Declare a string input+output parameter
|
102
102
|
# @param name [Symbol] parameter name
|
103
103
|
# @param size [Integer] maximum string size, including the terminating 0
|
104
104
|
def ios(name, size)
|
105
|
-
parameters.param(name, size, PARS, IN | OUT)
|
105
|
+
parameters.param(name, 1, size, PARS, IN | OUT)
|
106
106
|
end
|
107
107
|
end
|
108
108
|
end
|
data/lib/lignite/variables.rb
CHANGED
@@ -1,8 +1,5 @@
|
|
1
1
|
module Lignite
|
2
2
|
# Allocate local or global variables
|
3
|
-
# FIXME: the user can make bad alignment, resulting in VMError at runtime
|
4
|
-
# bad: data8 :speed; data32 :tacho; output_read(...)
|
5
|
-
# good data32 :tacho; data8 :speed; output_read(...)
|
6
3
|
class Variables
|
7
4
|
include Bytes
|
8
5
|
|
@@ -15,19 +12,27 @@ module Lignite
|
|
15
12
|
@param_decl_bytes = ""
|
16
13
|
end
|
17
14
|
|
18
|
-
#
|
19
|
-
|
15
|
+
# Declare a variable/parameter *id*
|
16
|
+
# @param id [Symbol]
|
17
|
+
# @param size [Integer] byte size of one element of the data
|
18
|
+
# @param count [Integer] 1 for scalars, more for arrays
|
19
|
+
# @param unpacker [String] for String#unpack for direct commands
|
20
|
+
def add(id, size, count, unpacker)
|
20
21
|
raise "Duplicate variable #{id}" if @vars.key?(id)
|
21
|
-
@
|
22
|
-
@offset
|
22
|
+
@offset = align(@offset, size)
|
23
|
+
@vars[id] = { offset: @offset, size: size * count }
|
24
|
+
@offset += size * count
|
23
25
|
@unpacker += unpacker
|
24
26
|
end
|
25
27
|
|
26
28
|
# declare a subroutine parameter
|
27
|
-
def param(name, size, size_code, direction)
|
29
|
+
def param(name, size, count, size_code, direction)
|
28
30
|
raise "Duplicate parameter #{name}" if @vars.key?(name)
|
31
|
+
unless @offset == align(@offset, size)
|
32
|
+
raise "Misaligned parameter #{name} of size #{size} at #{@offset}"
|
33
|
+
end
|
29
34
|
nonsense_unpacker = "," # FIXME: better
|
30
|
-
add(name, size, nonsense_unpacker)
|
35
|
+
add(name, size, count, nonsense_unpacker)
|
31
36
|
|
32
37
|
@param_count += 1
|
33
38
|
@param_decl_bytes += u8(size_code | direction)
|
@@ -57,32 +62,39 @@ module Lignite
|
|
57
62
|
values = buf.unpack(@unpacker)
|
58
63
|
values.size == 1 ? values.first : values
|
59
64
|
end
|
65
|
+
|
66
|
+
private
|
67
|
+
|
68
|
+
# Round *n* up to a next multiple of *size*
|
69
|
+
def align(n, size)
|
70
|
+
(n + size - 1).div(size) * size
|
71
|
+
end
|
60
72
|
end
|
61
73
|
|
62
74
|
# `variables` are {Variables}
|
63
75
|
module VariableDeclarer
|
64
76
|
def data8(id)
|
65
|
-
variables.add(id, 1, "C")
|
77
|
+
variables.add(id, 1, 1, "C")
|
66
78
|
end
|
67
79
|
|
68
80
|
def data16(id)
|
69
|
-
variables.add(id, 2, "S<")
|
81
|
+
variables.add(id, 2, 1, "S<")
|
70
82
|
end
|
71
83
|
|
72
84
|
def data32(id)
|
73
|
-
variables.add(id, 4, "L<")
|
85
|
+
variables.add(id, 4, 1, "L<")
|
74
86
|
end
|
75
87
|
|
76
88
|
def dataf(id)
|
77
|
-
variables.add(id, 4, "e")
|
89
|
+
variables.add(id, 4, 1, "e")
|
78
90
|
end
|
79
91
|
|
80
92
|
def datas(id, size)
|
81
|
-
variables.add(id, size, "a#{size}")
|
93
|
+
variables.add(id, 1, size, "a#{size}")
|
82
94
|
end
|
83
95
|
|
84
96
|
def array8(id, count)
|
85
|
-
variables.add(id,
|
97
|
+
variables.add(id, 1, count, "C#{count}")
|
86
98
|
end
|
87
99
|
end
|
88
100
|
end
|
data/lignite.gemspec
CHANGED
@@ -33,6 +33,7 @@ TXT
|
|
33
33
|
"data/lignite-btaddr",
|
34
34
|
"data/sysops.yml",
|
35
35
|
"examples/bobbee.rb",
|
36
|
+
"examples/gyro-sensor.rb",
|
36
37
|
"examples/hello.rb",
|
37
38
|
"examples/hello.yml",
|
38
39
|
"examples/light-sensor.rb",
|
@@ -47,6 +48,7 @@ TXT
|
|
47
48
|
"lib/lignite/assembler.rb",
|
48
49
|
"lib/lignite/body_compiler.rb",
|
49
50
|
"lib/lignite/bytes.rb",
|
51
|
+
"lib/lignite/condition.rb",
|
50
52
|
"lib/lignite/connection.rb",
|
51
53
|
"lib/lignite/connection/bluetooth.rb",
|
52
54
|
"lib/lignite/connection/replay.rb",
|
@@ -59,6 +61,7 @@ TXT
|
|
59
61
|
"lib/lignite/enums.rb.erb",
|
60
62
|
"lib/lignite/ev3_ops.rb",
|
61
63
|
"lib/lignite/ev3_tool.rb",
|
64
|
+
"lib/lignite/jump_offset.rb",
|
62
65
|
"lib/lignite/logger.rb",
|
63
66
|
"lib/lignite/message.rb",
|
64
67
|
"lib/lignite/motors.rb",
|
data/spec/data/HelloWorld.rb
CHANGED
data/spec/data/Performance.rb
CHANGED
@@ -437,7 +437,7 @@ sub :Test_JR do
|
|
437
437
|
|
438
438
|
loop_while lambda {
|
439
439
|
# TEST ***********************************************
|
440
|
-
jr(
|
440
|
+
jr(0)
|
441
441
|
# ****************************************************
|
442
442
|
add32(1, :Counter, :Counter)
|
443
443
|
}, Lt32.new(:Counter, TIMES)
|
data/spec/data/Performance.rbf
CHANGED
Binary file
|
@@ -1,3 +1,5 @@
|
|
1
1
|
---
|
2
|
-
- SEND:
|
3
|
-
- RECV:
|
2
|
+
- SEND: 01000194e8032e2e2f70726a732f6576657273746f726d2f6576657273746f726d2e72626600
|
3
|
+
- RECV: 0100039400a3040000024c45474fa304000065000e0004000000b8000000000000001a0000001a02000000000000000000002202000000000000000000003702000000000000000000004c02000000000000000000005b02000000000000000000006a02000000000000000000008302000000000000000000009c0200000000000000000000e8020000000000000a0000004c0300000000000004000000b60300000000000004000000fa03000000000000040000006e0400000000000000000000821b08841200841300820000820000841c01820000820000842e2e2f617070732f427269636b2050726f6772616d2f4f6e427269636b496d616765313200841101840500823500821900844556335253544f524d0084003000603000617c0462991d00021d000140991d0003812100014005820b0030014a30014b30014c30016364600282380068600e8232008e820000820100487d0948014e3160483000606d488202008215006948820a00820d007d02846f6b004e5194026251960548991d0000003f01443c444d414d821600424a8214009402628472696768740030014a4082030030004a991d00021d0001443c444d644d0a821500424b821300940262846c6566740030014b4082030030004b991d000381210001443c444d684d1b823500424c823300940262842e2e2f617070732f427269636b2050726f6772616d2f4f6e427269636b536f756e6430340030014c4082030030004c0b42638220ff0a300061a30007000a300061b100068164820000830000000000a600060a300061b1000681ce820000830000000000a600060a300061a5000222a500041ea600060a300061a500021ea5000422a600060aae0001816483000000008338040000830000000000a600010aae0001819c83000000008338040000830000000000a600010a300061b00006814b820000830000000000ae0001816483000000008338040000830000000000a60007aa0001ae0001819c83000000008338040000830000000000a60001aa0001a30006000a300161318132484161825700b10006816448830000000000a60006416182430036828a024085404486444161823400194882ffff484161822900b10006816448830000000000a60006416182150036821405408540448644194882ffff48426182d2ff0a300061b10006816482c80083fa00000001a60006aa0006b1000681648238ff83fa00000001a60006aa0006b10006816482c80083fa00000001a60006aa0006b1000681648238ff83fa00000001a60006aa0006a30006008583c80000004086409402628468657900960a30006194026284736e65657a6500b10006819c820000832c01000001a60006aa0006b100068164820000832c01000001a600
|
4
|
+
- SEND: 0200019502e803
|
5
|
+
- RECV: 02000395080206aa0006858332000000408640a30006000a300061940262846c65667400968583c8000000408640b0000681328238ff835e01000001a60006aa00068583c800000040864094026284726967687400968583c8000000408640b00006813282c80083c201000001a60006aa0006b0000681328238ff839600000001a60006aa0006a30006000a300061a3000f00940262842e2e2f617070732f427269636b2050726f6772616d2f4f6e427269636b536f756e64313100963000630a
|
data/spec/data/everstorm.rbf
CHANGED
Binary file
|
data/spec/ev3_tool_spec.rb
CHANGED
@@ -52,10 +52,13 @@ describe Lignite::Ev3Tool do
|
|
52
52
|
|
53
53
|
it "communicates the right thing" do
|
54
54
|
expected_file_contents = File.read("#{datadir}/everstorm.rbf", mode: "rb")
|
55
|
+
e1 = expected_file_contents[0...1000]
|
56
|
+
e2 = expected_file_contents[1000..-1]
|
55
57
|
f = double("File")
|
56
58
|
expect(File).to receive(:open).with("everstorm.rbf", "w").and_yield(f)
|
57
59
|
allow(File).to receive(:open).and_call_original
|
58
|
-
expect(f).to receive(:write).with(
|
60
|
+
expect(f).to receive(:write).with(e1)
|
61
|
+
expect(f).to receive(:write).with(e2)
|
59
62
|
|
60
63
|
expect { subject.download("../prjs/everstorm/everstorm.rbf") }.not_to raise_error
|
61
64
|
end
|
data/tools/ops_from_yml
CHANGED
@@ -93,6 +93,8 @@ def param_handler(par)
|
|
93
93
|
when "PAR8", "PAR16", "PAR32", "PARF", "PARV"
|
94
94
|
:param_simple
|
95
95
|
when "PARNO"
|
96
|
+
:param_n_multiple
|
97
|
+
when "PARVALUES"
|
96
98
|
:param_multiple
|
97
99
|
else
|
98
100
|
raise TODO, "Unhandled param type #{par_type}"
|
@@ -116,10 +118,16 @@ end
|
|
116
118
|
def rendered_op4(oname, odesc, ovalue, cvalue, params) # rubocop:disable Metrics/MethodLength
|
117
119
|
s = ""
|
118
120
|
|
121
|
+
# (..., PARVALUES, PAR8) means that there is a variable number of parameters
|
122
|
+
# of type PAR8. But since we do not check types yet, let's treat that
|
123
|
+
# like PARNO, which is a variable number of parameters of unspecified type.
|
124
|
+
params = params[0..-2] if params.fetch(-2, {})["type"] == "PARVALUES"
|
125
|
+
|
119
126
|
param_handlers = params.map { |par| param_handler(par) }
|
120
127
|
|
121
128
|
param_names = params.map do |par|
|
122
|
-
(par["type"]
|
129
|
+
star = ["PARNO", "PARVALUES"].include?(par["type"]) ? "*" : ""
|
130
|
+
star + par["name"].downcase
|
123
131
|
end
|
124
132
|
param_decl = param_names.join ", "
|
125
133
|
param_decl = "(#{param_decl})" unless param_decl.empty?
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lignite
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Martin Vidner
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-03-
|
11
|
+
date: 2018-03-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: libusb
|
@@ -154,6 +154,7 @@ files:
|
|
154
154
|
- data/lignite-btaddr
|
155
155
|
- data/sysops.yml
|
156
156
|
- examples/bobbee.rb
|
157
|
+
- examples/gyro-sensor.rb
|
157
158
|
- examples/hello.rb
|
158
159
|
- examples/hello.yml
|
159
160
|
- examples/light-sensor.rb
|
@@ -168,6 +169,7 @@ files:
|
|
168
169
|
- lib/lignite/assembler.rb
|
169
170
|
- lib/lignite/body_compiler.rb
|
170
171
|
- lib/lignite/bytes.rb
|
172
|
+
- lib/lignite/condition.rb
|
171
173
|
- lib/lignite/connection.rb
|
172
174
|
- lib/lignite/connection/bluetooth.rb
|
173
175
|
- lib/lignite/connection/replay.rb
|
@@ -180,6 +182,7 @@ files:
|
|
180
182
|
- lib/lignite/enums.rb.erb
|
181
183
|
- lib/lignite/ev3_ops.rb
|
182
184
|
- lib/lignite/ev3_tool.rb
|
185
|
+
- lib/lignite/jump_offset.rb
|
183
186
|
- lib/lignite/logger.rb
|
184
187
|
- lib/lignite/message.rb
|
185
188
|
- lib/lignite/motors.rb
|