elia 1.2.0 → 2.3.2
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +7 -0
- data/VERSION +1 -1
- data/lib/bit_fields.rb +67 -27
- data/lib/errno_knows.rb +11 -0
- data/lib/file_with_read_buffer.rb +2 -2
- data/lib/ini.rb +31 -0
- data/lib/ruby19.rb +7 -0
- data/lib/ruby19/binread.rb +22 -0
- data/lib/ruby19/fiber.rb +8 -0
- data/lib/ruby19/tmm1-fiber18-a37a4c3/README +21 -0
- data/lib/ruby19/tmm1-fiber18-a37a4c3/Rakefile +8 -0
- data/lib/ruby19/tmm1-fiber18-a37a4c3/lib/compat/continuation.rb +0 -0
- data/lib/ruby19/tmm1-fiber18-a37a4c3/lib/compat/fiber.rb +0 -0
- data/lib/ruby19/tmm1-fiber18-a37a4c3/lib/fiber18.rb +96 -0
- data/lib/ruby19/tmm1-fiber18-a37a4c3/test/test_fiber.rb +165 -0
- data/lib/sass_support.rb +6 -2
- data/lib/sass_support/_box_shadow.sass +7 -0
- data/lib/sass_support/_css3.sass +3 -0
- data/lib/sass_support/_transform_rotate.sass +5 -0
- data/lib/world_logger.rb +15 -0
- data/spec/lib/bit_fields_spec.rb +7 -0
- data/spec/lib/ini_spec.rb +69 -0
- metadata +18 -9
- data/lib/ccsds.rb +0 -167
- data/lib/ccsds/cuc.rb +0 -29
- data/lib/space_wire.rb +0 -142
- data/spec/lib/space_wire/data.bin +0 -0
- data/spec/lib/space_wire/index.bin +0 -0
- data/spec/lib/space_wire_spec.rb +0 -53
data/Rakefile
CHANGED
@@ -44,3 +44,10 @@ Rake::RDocTask.new do |rdoc|
|
|
44
44
|
rdoc.rdoc_files.include('README*')
|
45
45
|
rdoc.rdoc_files.include('lib/**/*.rb')
|
46
46
|
end
|
47
|
+
|
48
|
+
task :tag do
|
49
|
+
root = File.dirname(__FILE__)
|
50
|
+
version = File.read( File.join(root,'VERSION') )
|
51
|
+
exec "git tag -f v#{version}"
|
52
|
+
end
|
53
|
+
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
2.3.2
|
data/lib/bit_fields.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'world_logger'
|
2
|
+
require 'ruby19' # for string ecoding compatibility
|
2
3
|
|
3
4
|
#
|
4
5
|
# BitFields provides a simple way to extract a values from bit fields,
|
@@ -70,6 +71,11 @@ module BitFields
|
|
70
71
|
# Collects the full <tt>String#unpack</tt> directive used to parse the raw value.
|
71
72
|
attr_reader :unpack_recipe
|
72
73
|
|
74
|
+
# Defines accessors for the attributes hash
|
75
|
+
def bits_attr_accessor name
|
76
|
+
class_eval "def #{name}; self.attributes[#{name.inspect}]; end;", __FILE__, __LINE__
|
77
|
+
class_eval "def #{name}=(val); self.attributes[#{name.inspect}]=val; end;", __FILE__, __LINE__
|
78
|
+
end
|
73
79
|
|
74
80
|
##
|
75
81
|
# Defines a field to be extracted with String#unpack from the raw value
|
@@ -80,6 +86,8 @@ module BitFields
|
|
80
86
|
#
|
81
87
|
# Also defines the attribute reader method
|
82
88
|
#
|
89
|
+
# TODO: add a skip bits syntax
|
90
|
+
#
|
83
91
|
def field name, unpack_recipe = 'C', &bit_fields_definitions_block
|
84
92
|
include InstanceMethods # when used we include instance methods
|
85
93
|
|
@@ -92,8 +100,8 @@ module BitFields
|
|
92
100
|
@unpack_recipe << unpack_recipe
|
93
101
|
@fields << name
|
94
102
|
|
95
|
-
# Define the attribute
|
96
|
-
|
103
|
+
# Define the attribute accessor
|
104
|
+
bits_attr_accessor(name)
|
97
105
|
|
98
106
|
# There's a bit-structure too?
|
99
107
|
if block_given?
|
@@ -101,7 +109,7 @@ module BitFields
|
|
101
109
|
|
102
110
|
bit_fields_definitions_block.call
|
103
111
|
|
104
|
-
@bit_fields[name] = @_current_bit_fields
|
112
|
+
@bit_fields[name] = @_current_bit_fields
|
105
113
|
@_current_bit_fields = nil
|
106
114
|
end
|
107
115
|
end
|
@@ -112,14 +120,17 @@ module BitFields
|
|
112
120
|
# +name+ :: the name of the bit field (that will be used to access it)
|
113
121
|
# +width+ :: the number of bits from which this value should be extracted
|
114
122
|
#
|
123
|
+
# TODO: add options to enable method aliases
|
124
|
+
# TODO: add a skip bits syntax
|
125
|
+
#
|
115
126
|
def bit_field name, width
|
116
127
|
raise "'bit_field' can be used only inside a 'field' block." if @_current_bit_fields.nil?
|
117
128
|
|
118
129
|
# Register the bit field definition
|
119
130
|
@_current_bit_fields << [name, width, bit_mask(width)]
|
120
131
|
|
121
|
-
# Define the attribute
|
122
|
-
|
132
|
+
# Define the attribute accessor
|
133
|
+
bits_attr_accessor(name)
|
123
134
|
|
124
135
|
if width == 1 or name.to_s =~ /_flag$/
|
125
136
|
# Define a question mark method if the size is 1 bit
|
@@ -151,9 +162,17 @@ module BitFields
|
|
151
162
|
# caches the bin string unpacked values
|
152
163
|
attr_reader :unpacked
|
153
164
|
|
165
|
+
class ValueOverflow < StandardError
|
166
|
+
end
|
167
|
+
|
154
168
|
# Takes the raw binary string and parses it
|
155
|
-
def initialize
|
156
|
-
|
169
|
+
def initialize bit_string_or_hash
|
170
|
+
if bit_string_or_hash.kind_of?(Hash)
|
171
|
+
@attributes = bit_string_or_hash
|
172
|
+
pack_bit_fields
|
173
|
+
else
|
174
|
+
parse_bit_fields(bit_string_or_hash) #.dup.freeze REMOVED: seems useless
|
175
|
+
end
|
157
176
|
end
|
158
177
|
|
159
178
|
# Makes defined fields accessible like a +Hash+
|
@@ -163,19 +182,6 @@ module BitFields
|
|
163
182
|
|
164
183
|
private
|
165
184
|
|
166
|
-
def eat_right_bits original_value, bits_number, bit_mask
|
167
|
-
# Filter the original value with the
|
168
|
-
# proper bitmask to get the rightmost bits
|
169
|
-
new_value = original_value & bit_mask
|
170
|
-
|
171
|
-
# Eat those rightmost bits
|
172
|
-
# wich we have just consumed
|
173
|
-
remaning = original_value >> bits_number
|
174
|
-
|
175
|
-
# Return also the remaning bits
|
176
|
-
return new_value, remaning
|
177
|
-
end
|
178
|
-
|
179
185
|
# Parses the raw value extracting the defined bit fields
|
180
186
|
def parse_bit_fields raw
|
181
187
|
@raw = raw
|
@@ -188,21 +194,55 @@ module BitFields
|
|
188
194
|
|
189
195
|
@attributes[name] = @unpacked[position]
|
190
196
|
|
191
|
-
# We must extract bits from end since
|
192
|
-
# ruby doesn't have types (and fixed lengths)
|
193
197
|
if bit_fields = self.class.bit_fields[name]
|
194
|
-
|
198
|
+
|
195
199
|
bit_value = attributes[name]
|
200
|
+
|
201
|
+
# We must extract bits from end since
|
202
|
+
# ruby doesn't have types (and fixed lengths)
|
203
|
+
bit_fields.reverse.each do |(bit_name, bits_number, bit_mask)|
|
204
|
+
@attributes[bit_name] = bit_value & bit_mask
|
205
|
+
bit_value = bit_value >> bits_number
|
206
|
+
end
|
207
|
+
end
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
public
|
212
|
+
|
213
|
+
|
214
|
+
# Parses the raw value extracting the defined bit fields
|
215
|
+
def pack_bit_fields
|
216
|
+
@unpacked = []
|
217
|
+
|
218
|
+
self.class.fields.each_with_index do |name, position|
|
219
|
+
|
220
|
+
if bit_fields = self.class.bit_fields[name]
|
221
|
+
|
222
|
+
bit_value = 0
|
196
223
|
bit_fields.each do |(bit_name, bits_number, bit_mask)|
|
197
|
-
|
198
|
-
|
224
|
+
masked = @attributes[bit_name] & bit_mask
|
225
|
+
|
226
|
+
raise ValueOverflow,
|
227
|
+
"the value #{@attributes[bit_name]} "+
|
228
|
+
"is too big for #{bits_number} bits" if masked != @attributes[bit_name]
|
199
229
|
|
200
|
-
|
201
|
-
bit_value
|
230
|
+
bit_value = bit_value << bits_number
|
231
|
+
bit_value |= masked
|
202
232
|
end
|
233
|
+
|
234
|
+
# Value of fields composed by binary fields is always overwritten
|
235
|
+
# by the composition of the latter
|
236
|
+
attributes[name] = bit_value
|
203
237
|
end
|
238
|
+
|
239
|
+
@unpacked[position] = @attributes[name] || 0
|
240
|
+
|
204
241
|
end
|
242
|
+
|
243
|
+
@raw = @unpacked.pack( self.class.unpack_recipe )
|
205
244
|
end
|
245
|
+
alias pack pack_bit_fields
|
206
246
|
|
207
247
|
def to_s
|
208
248
|
raw.to_s
|
data/lib/errno_knows.rb
ADDED
@@ -5,7 +5,7 @@ module FileWithBufferedRead
|
|
5
5
|
|
6
6
|
def buffered_read size
|
7
7
|
output = read_buffer.read(size)
|
8
|
-
until output.size == size or self.eof?
|
8
|
+
until output.nil? or output.size == size or self.eof?
|
9
9
|
output << read_buffer.read(size - output.size)
|
10
10
|
end
|
11
11
|
return output
|
@@ -19,7 +19,7 @@ module FileWithBufferedRead
|
|
19
19
|
def read_buffer
|
20
20
|
if @read_buffer.nil? or @read_buffer.eof?
|
21
21
|
# logger.debug{ "Buffering #{READ_BUFFER_SIZE} from #{self.inspect} current position: #{self.pos}" }
|
22
|
-
@read_buffer = StringIO.new(read(READ_BUFFER_SIZE))
|
22
|
+
@read_buffer = StringIO.new(read(READ_BUFFER_SIZE) || '')
|
23
23
|
# logger.debug{ "Buffered #{@read_buffer.size}, EOF:#{self.eof?} current position: #{self.pos}" }
|
24
24
|
@buffer_left = @read_buffer.size
|
25
25
|
end
|
data/lib/ini.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
module Ini
|
2
|
+
def parse_ini(input)
|
3
|
+
hash = {}
|
4
|
+
current_section = nil
|
5
|
+
|
6
|
+
input.each_line do |line|
|
7
|
+
line = line.sub(/\;.*$/, '').strip.chomp.strip # strip comments
|
8
|
+
next if line.strip.empty?
|
9
|
+
|
10
|
+
if line.strip =~ /\[([^\]]+)\]/
|
11
|
+
current_section = $1.downcase
|
12
|
+
hash[current_section] ||= {}
|
13
|
+
else
|
14
|
+
key, value = line.split('=')
|
15
|
+
|
16
|
+
value.strip!
|
17
|
+
value = case value
|
18
|
+
when /0x[\da-f]/i : value.hex
|
19
|
+
when /^[\+\-]?\d+$/ : value.to_i
|
20
|
+
when /^\"(.*)\"$/ : $1
|
21
|
+
else value
|
22
|
+
end
|
23
|
+
hash[current_section][key.downcase] = value
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
hash
|
28
|
+
end
|
29
|
+
|
30
|
+
extend self
|
31
|
+
end
|
data/lib/ruby19.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'ruby19'
|
2
|
+
|
3
|
+
ruby18 do
|
4
|
+
module Binread
|
5
|
+
def binread path_or_file_descriptor
|
6
|
+
open(path_or_file_descriptor,'rb'){|io| io.read }
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
IO.extend(Binread)
|
11
|
+
File.extend(Binread)
|
12
|
+
|
13
|
+
class String
|
14
|
+
def encode encoding
|
15
|
+
if %w[BINARY ASCII-8BIT].include? encoding
|
16
|
+
return self
|
17
|
+
else
|
18
|
+
super
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/ruby19/fiber.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
Poor Man's Fiber (API compatible Thread based Fiber implementation for Ruby 1.8)
|
2
|
+
(c) 2008 Aman Gupta (tmm1)
|
3
|
+
|
4
|
+
== Usage
|
5
|
+
|
6
|
+
f = Fiber.new{ |sym|
|
7
|
+
p(sym)
|
8
|
+
puts 'hi'
|
9
|
+
p(Fiber.yield 1)
|
10
|
+
puts 'bye'
|
11
|
+
:end
|
12
|
+
}
|
13
|
+
p(f.resume :begin)
|
14
|
+
p(f.resume 2)
|
15
|
+
|
16
|
+
:begin
|
17
|
+
hi
|
18
|
+
1
|
19
|
+
2
|
20
|
+
bye
|
21
|
+
:end
|
File without changes
|
File without changes
|
@@ -0,0 +1,96 @@
|
|
1
|
+
# Poor Man's Fiber (API compatible Thread based Fiber implementation for Ruby 1.8)
|
2
|
+
# (c) 2008 Aman Gupta (tmm1)
|
3
|
+
|
4
|
+
unless defined? Fiber
|
5
|
+
$:.unshift File.expand_path(File.dirname(__FILE__)) + '/compat'
|
6
|
+
require 'thread'
|
7
|
+
|
8
|
+
class FiberError < StandardError; end
|
9
|
+
|
10
|
+
class Fiber
|
11
|
+
def initialize
|
12
|
+
raise ArgumentError, 'new Fiber requires a block' unless block_given?
|
13
|
+
|
14
|
+
@yield = Queue.new
|
15
|
+
@resume = Queue.new
|
16
|
+
|
17
|
+
@thread = Thread.new{ @yield.push [yield(*@resume.pop)] }
|
18
|
+
@thread.abort_on_exception = true
|
19
|
+
@thread[:fiber] = self
|
20
|
+
end
|
21
|
+
attr_reader :thread
|
22
|
+
|
23
|
+
def resume *args
|
24
|
+
raise FiberError, 'dead fiber called' unless @thread.alive?
|
25
|
+
@resume.push(args)
|
26
|
+
result = @yield.pop
|
27
|
+
result.size > 1 ? result : result.first
|
28
|
+
end
|
29
|
+
|
30
|
+
def yield *args
|
31
|
+
@yield.push(args)
|
32
|
+
result = @resume.pop
|
33
|
+
result.size > 1 ? result : result.first
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.yield *args
|
37
|
+
if fiber = Thread.current[:fiber]
|
38
|
+
fiber.yield(*args)
|
39
|
+
else
|
40
|
+
raise FiberError, 'not inside a fiber'
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.current
|
45
|
+
if Thread.current == Thread.main
|
46
|
+
return Thread.main[:fiber] ||= RootFiber.new
|
47
|
+
end
|
48
|
+
|
49
|
+
Thread.current[:fiber] or raise FiberError, 'not inside a fiber'
|
50
|
+
end
|
51
|
+
|
52
|
+
def inspect
|
53
|
+
"#<#{self.class}:0x#{self.object_id.to_s(16)}>"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
class RootFiber < Fiber
|
58
|
+
def initialize
|
59
|
+
# XXX: what is a root fiber anyway?
|
60
|
+
end
|
61
|
+
|
62
|
+
def self.yield *args
|
63
|
+
raise FiberError, "can't yield from root fiber"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
if __FILE__ == $0
|
69
|
+
f = Fiber.new{ |sym|
|
70
|
+
p(sym)
|
71
|
+
puts 'hi'
|
72
|
+
p(Fiber.yield 1)
|
73
|
+
puts 'bye'
|
74
|
+
:end
|
75
|
+
}
|
76
|
+
p(f.resume :begin)
|
77
|
+
p(f.resume 2)
|
78
|
+
end
|
79
|
+
|
80
|
+
__END__
|
81
|
+
|
82
|
+
$ ruby fbr.rb
|
83
|
+
:begin
|
84
|
+
hi
|
85
|
+
1
|
86
|
+
2
|
87
|
+
bye
|
88
|
+
:end
|
89
|
+
|
90
|
+
$ ruby1.9 fbr.rb
|
91
|
+
:begin
|
92
|
+
hi
|
93
|
+
1
|
94
|
+
2
|
95
|
+
bye
|
96
|
+
:end
|
@@ -0,0 +1,165 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'fiber'
|
3
|
+
require 'continuation'
|
4
|
+
|
5
|
+
class TestFiber < Test::Unit::TestCase
|
6
|
+
def test_normal
|
7
|
+
f = Fiber.current
|
8
|
+
assert_equal(:ok2,
|
9
|
+
Fiber.new{|e|
|
10
|
+
assert_equal(:ok1, e)
|
11
|
+
Fiber.yield :ok2
|
12
|
+
}.resume(:ok1)
|
13
|
+
)
|
14
|
+
assert_equal([:a, :b], Fiber.new{|a, b| [a, b]}.resume(:a, :b))
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_term
|
18
|
+
assert_equal(:ok, Fiber.new{:ok}.resume)
|
19
|
+
assert_equal([:a, :b, :c, :d, :e],
|
20
|
+
Fiber.new{
|
21
|
+
Fiber.new{
|
22
|
+
Fiber.new{
|
23
|
+
Fiber.new{
|
24
|
+
[:a]
|
25
|
+
}.resume + [:b]
|
26
|
+
}.resume + [:c]
|
27
|
+
}.resume + [:d]
|
28
|
+
}.resume + [:e])
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_many_fibers
|
32
|
+
max = 10000
|
33
|
+
assert_equal(max, max.times{
|
34
|
+
Fiber.new{}
|
35
|
+
})
|
36
|
+
assert_equal(max,
|
37
|
+
max.times{|i|
|
38
|
+
Fiber.new{
|
39
|
+
}.resume
|
40
|
+
}
|
41
|
+
)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
__END__
|
45
|
+
|
46
|
+
def test_many_fibers_with_threads
|
47
|
+
max = 1000
|
48
|
+
@cnt = 0
|
49
|
+
(1..100).map{|ti|
|
50
|
+
Thread.new{
|
51
|
+
max.times{|i|
|
52
|
+
Fiber.new{
|
53
|
+
@cnt += 1
|
54
|
+
}.resume
|
55
|
+
}
|
56
|
+
}
|
57
|
+
}.each{|t|
|
58
|
+
t.join
|
59
|
+
}
|
60
|
+
assert_equal(:ok, :ok)
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_error
|
64
|
+
assert_raise(ArgumentError){
|
65
|
+
Fiber.new # Fiber without block
|
66
|
+
}
|
67
|
+
assert_raise(FiberError){
|
68
|
+
f = Fiber.new{}
|
69
|
+
Thread.new{f.resume}.join # Fiber yielding across thread
|
70
|
+
}
|
71
|
+
assert_raise(FiberError){
|
72
|
+
f = Fiber.new{}
|
73
|
+
f.resume
|
74
|
+
f.resume
|
75
|
+
}
|
76
|
+
assert_raise(RuntimeError){
|
77
|
+
f = Fiber.new{
|
78
|
+
@c = callcc{|c| @c = c}
|
79
|
+
}.resume
|
80
|
+
@c.call # cross fiber callcc
|
81
|
+
}
|
82
|
+
assert_raise(RuntimeError){
|
83
|
+
Fiber.new{
|
84
|
+
raise
|
85
|
+
}.resume
|
86
|
+
}
|
87
|
+
assert_raise(FiberError){
|
88
|
+
Fiber.yield
|
89
|
+
}
|
90
|
+
assert_raise(FiberError){
|
91
|
+
fib = Fiber.new{
|
92
|
+
fib.resume
|
93
|
+
}
|
94
|
+
fib.resume
|
95
|
+
}
|
96
|
+
assert_raise(FiberError){
|
97
|
+
fib = Fiber.new{
|
98
|
+
Fiber.new{
|
99
|
+
fib.resume
|
100
|
+
}.resume
|
101
|
+
}
|
102
|
+
fib.resume
|
103
|
+
}
|
104
|
+
end
|
105
|
+
|
106
|
+
def test_return
|
107
|
+
assert_raise(LocalJumpError){
|
108
|
+
Fiber.new do
|
109
|
+
return
|
110
|
+
end.resume
|
111
|
+
}
|
112
|
+
end
|
113
|
+
|
114
|
+
def test_throw
|
115
|
+
assert_raise(ArgumentError){
|
116
|
+
Fiber.new do
|
117
|
+
throw :a
|
118
|
+
end.resume
|
119
|
+
}
|
120
|
+
end
|
121
|
+
|
122
|
+
def test_transfer
|
123
|
+
ary = []
|
124
|
+
f2 = nil
|
125
|
+
f1 = Fiber.new{
|
126
|
+
ary << f2.transfer(:foo)
|
127
|
+
:ok
|
128
|
+
}
|
129
|
+
f2 = Fiber.new{
|
130
|
+
ary << f1.transfer(:baz)
|
131
|
+
:ng
|
132
|
+
}
|
133
|
+
assert_equal(:ok, f1.transfer)
|
134
|
+
assert_equal([:baz], ary)
|
135
|
+
end
|
136
|
+
|
137
|
+
def test_tls
|
138
|
+
#
|
139
|
+
def tvar(var, val)
|
140
|
+
old = Thread.current[var]
|
141
|
+
begin
|
142
|
+
Thread.current[var] = val
|
143
|
+
yield
|
144
|
+
ensure
|
145
|
+
Thread.current[var] = old
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
fb = Fiber.new {
|
150
|
+
assert_equal(nil, Thread.current[:v]); tvar(:v, :x) {
|
151
|
+
assert_equal(:x, Thread.current[:v]); Fiber.yield
|
152
|
+
assert_equal(:x, Thread.current[:v]); }
|
153
|
+
assert_equal(nil, Thread.current[:v]); Fiber.yield
|
154
|
+
raise # unreachable
|
155
|
+
}
|
156
|
+
|
157
|
+
assert_equal(nil, Thread.current[:v]); tvar(:v,1) {
|
158
|
+
assert_equal(1, Thread.current[:v]); tvar(:v,3) {
|
159
|
+
assert_equal(3, Thread.current[:v]); fb.resume
|
160
|
+
assert_equal(3, Thread.current[:v]); }
|
161
|
+
assert_equal(1, Thread.current[:v]); }
|
162
|
+
assert_equal(nil, Thread.current[:v]); fb.resume
|
163
|
+
assert_equal(nil, Thread.current[:v]);
|
164
|
+
end
|
165
|
+
end
|
data/lib/sass_support.rb
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
-
require '
|
1
|
+
require 'sass'
|
2
|
+
require 'sass/plugin'
|
2
3
|
|
3
|
-
Sass::Plugin.
|
4
|
+
Sass::Plugin.instance_eval {
|
5
|
+
@options[:load_paths] ||= []
|
6
|
+
@options[:load_paths] << File.join( File.dirname(__FILE__), 'sass_support' )
|
7
|
+
}
|
data/lib/world_logger.rb
CHANGED
@@ -10,8 +10,15 @@ module WorldLogger
|
|
10
10
|
@logger
|
11
11
|
end
|
12
12
|
|
13
|
+
class NoRaiseObject
|
14
|
+
def method_missing name, *args, &block
|
15
|
+
return self
|
16
|
+
end
|
17
|
+
end
|
13
18
|
|
14
19
|
def logger
|
20
|
+
return @__no_raise_object ||= NoRaiseObject.new if @__logger_disabled
|
21
|
+
|
15
22
|
if self.class.const_defined? :Rails
|
16
23
|
Rails.logger
|
17
24
|
else
|
@@ -19,6 +26,14 @@ module WorldLogger
|
|
19
26
|
end
|
20
27
|
end
|
21
28
|
|
29
|
+
def disable_logger!
|
30
|
+
@__logger_disabled = true
|
31
|
+
end
|
32
|
+
|
33
|
+
def enable_logger!
|
34
|
+
@__logger_disabled = false
|
35
|
+
end
|
36
|
+
|
22
37
|
end
|
23
38
|
|
24
39
|
Object.send :include, WorldLogger
|
data/spec/lib/bit_fields_spec.rb
CHANGED
@@ -58,5 +58,12 @@ describe BitFields do
|
|
58
58
|
@object.should respond_to(:secondary_header?)
|
59
59
|
@object.secondary_header?.should == true
|
60
60
|
end
|
61
|
+
|
62
|
+
it 'should be able to repack from its attributes correctly' do
|
63
|
+
repacked = @klass.new @object.attributes
|
64
|
+
repacked.raw.should == @object.raw
|
65
|
+
reunpacked = @klass.new repacked.raw
|
66
|
+
reunpacked.attributes.should == repacked.attributes
|
67
|
+
end
|
61
68
|
end
|
62
69
|
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
+
require 'ini'
|
3
|
+
|
4
|
+
INI_DATA = <<-INI
|
5
|
+
[general]\r
|
6
|
+
SequenceRepetition=100\r
|
7
|
+
BitRate=100\r
|
8
|
+
pri=5\r\n
|
9
|
+
\r\n
|
10
|
+
[packet_sequence]\r\n
|
11
|
+
TM_1=3\r\n
|
12
|
+
|
13
|
+
[TM_1]
|
14
|
+
PriOffset=0
|
15
|
+
type="CCSDS"
|
16
|
+
LogicalAddress=0x01
|
17
|
+
ProtocolID=3
|
18
|
+
VersionNumber=1
|
19
|
+
PacketType=0
|
20
|
+
DataFieldHeaderFlag=1
|
21
|
+
APID=1;ciao
|
22
|
+
;come stai
|
23
|
+
;molto bene
|
24
|
+
SegmentationFlags=3
|
25
|
+
SourceSequenceCounter=-1
|
26
|
+
PacketDataFieldLength=4096
|
27
|
+
PUSVersion=3
|
28
|
+
ServiceType=7
|
29
|
+
ServiceSubType=0x1E
|
30
|
+
DestinationId=5
|
31
|
+
time=-1
|
32
|
+
DataElementType=pattern
|
33
|
+
PatternFile=file_pattern.bin
|
34
|
+
INI
|
35
|
+
|
36
|
+
INI_HASH = {
|
37
|
+
"general"=>{
|
38
|
+
"bitrate"=>100,
|
39
|
+
"pri"=>5,
|
40
|
+
"sequencerepetition"=>100},
|
41
|
+
"packet_sequence"=>{
|
42
|
+
"tm_1"=>3},
|
43
|
+
"tm_1"=> {
|
44
|
+
"destinationid"=>5,
|
45
|
+
"datafieldheaderflag"=>1,
|
46
|
+
"dataelementtype"=>"pattern",
|
47
|
+
"apid"=>1,
|
48
|
+
"versionnumber"=>1,
|
49
|
+
"time"=>-1,
|
50
|
+
"sourcesequencecounter"=>-1,
|
51
|
+
"logicaladdress"=>1,
|
52
|
+
"patternfile"=>"file_pattern.bin",
|
53
|
+
"packetdatafieldlength"=>4096,
|
54
|
+
"servicetype"=>7,
|
55
|
+
"packettype"=>0,
|
56
|
+
"type"=>"CCSDS",
|
57
|
+
"prioffset"=>0,
|
58
|
+
"servicesubtype"=>30,
|
59
|
+
"segmentationflags"=>3,
|
60
|
+
"pusversion"=>3,
|
61
|
+
"protocolid"=>3}
|
62
|
+
}
|
63
|
+
|
64
|
+
describe Ini do
|
65
|
+
it 'should parse INI files' do
|
66
|
+
Ini.parse_ini(INI_DATA).should == INI_HASH
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: elia
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Elia Schito
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date:
|
12
|
+
date: 2010-01-19 00:00:00 +01:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -37,30 +37,39 @@ files:
|
|
37
37
|
- Rakefile
|
38
38
|
- VERSION
|
39
39
|
- lib/bit_fields.rb
|
40
|
-
- lib/ccsds.rb
|
41
|
-
- lib/ccsds/cuc.rb
|
42
40
|
- lib/elia.rb
|
41
|
+
- lib/errno_knows.rb
|
43
42
|
- lib/file_with_read_buffer.rb
|
44
43
|
- lib/indifferent_reader.rb
|
44
|
+
- lib/ini.rb
|
45
45
|
- lib/io_string.rb
|
46
46
|
- lib/path_operator.rb
|
47
47
|
- lib/process_extensions.rb
|
48
|
+
- lib/ruby19.rb
|
49
|
+
- lib/ruby19/binread.rb
|
50
|
+
- lib/ruby19/fiber.rb
|
51
|
+
- lib/ruby19/tmm1-fiber18-a37a4c3/README
|
52
|
+
- lib/ruby19/tmm1-fiber18-a37a4c3/Rakefile
|
53
|
+
- lib/ruby19/tmm1-fiber18-a37a4c3/lib/compat/continuation.rb
|
54
|
+
- lib/ruby19/tmm1-fiber18-a37a4c3/lib/compat/fiber.rb
|
55
|
+
- lib/ruby19/tmm1-fiber18-a37a4c3/lib/fiber18.rb
|
56
|
+
- lib/ruby19/tmm1-fiber18-a37a4c3/test/test_fiber.rb
|
48
57
|
- lib/sass_support.rb
|
49
58
|
- lib/sass_support/_border_radius.sass
|
59
|
+
- lib/sass_support/_box_shadow.sass
|
60
|
+
- lib/sass_support/_css3.sass
|
50
61
|
- lib/sass_support/_glider.sass
|
62
|
+
- lib/sass_support/_transform_rotate.sass
|
51
63
|
- lib/slapp.rb
|
52
|
-
- lib/space_wire.rb
|
53
64
|
- lib/string_nibbles.rb
|
54
65
|
- lib/world_logger.rb
|
55
66
|
- spec/lib/bit_fields_spec.rb
|
56
67
|
- spec/lib/ccsds_spec.rb
|
57
68
|
- spec/lib/elia_spec.rb
|
58
69
|
- spec/lib/indifferent_reader_spec.rb
|
70
|
+
- spec/lib/ini_spec.rb
|
59
71
|
- spec/lib/path_operator_spec.rb
|
60
72
|
- spec/lib/process_extensions_spec.rb
|
61
|
-
- spec/lib/space_wire/data.bin
|
62
|
-
- spec/lib/space_wire/index.bin
|
63
|
-
- spec/lib/space_wire_spec.rb
|
64
73
|
- spec/lib/string_nibbles_spec.rb
|
65
74
|
- spec/spec.opts
|
66
75
|
- spec/spec_helper.rb
|
@@ -97,8 +106,8 @@ test_files:
|
|
97
106
|
- spec/lib/ccsds_spec.rb
|
98
107
|
- spec/lib/elia_spec.rb
|
99
108
|
- spec/lib/indifferent_reader_spec.rb
|
109
|
+
- spec/lib/ini_spec.rb
|
100
110
|
- spec/lib/path_operator_spec.rb
|
101
111
|
- spec/lib/process_extensions_spec.rb
|
102
|
-
- spec/lib/space_wire_spec.rb
|
103
112
|
- spec/lib/string_nibbles_spec.rb
|
104
113
|
- spec/spec_helper.rb
|
data/lib/ccsds.rb
DELETED
@@ -1,167 +0,0 @@
|
|
1
|
-
# This links the logger method to Rails.logger
|
2
|
-
require 'world_logger'
|
3
|
-
require 'io_string'
|
4
|
-
require 'bit_fields'
|
5
|
-
require 'active_support'
|
6
|
-
require 'string_nibbles'
|
7
|
-
|
8
|
-
module CCSDS
|
9
|
-
|
10
|
-
class Packet
|
11
|
-
|
12
|
-
# HEADER
|
13
|
-
|
14
|
-
class Header
|
15
|
-
extend BitFields
|
16
|
-
field :packet_identification, 'n' do
|
17
|
-
bit_field :version, 3
|
18
|
-
bit_field :type, 1
|
19
|
-
bit_field :data_header, 1
|
20
|
-
bit_field :apid, 11
|
21
|
-
end
|
22
|
-
field :packet_sequence_control, 'n' do
|
23
|
-
bit_field :segmentation_flags, 2
|
24
|
-
bit_field :ssc, 14
|
25
|
-
end
|
26
|
-
field :packet_length, 'n'
|
27
|
-
def data_size
|
28
|
-
packet_length + 1
|
29
|
-
end
|
30
|
-
|
31
|
-
SIZE = 6 # bytes
|
32
|
-
end
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
# DATA HEADER
|
38
|
-
|
39
|
-
# Data Header is different for each project,
|
40
|
-
# so we assume it isn't present but we provide builtin support for it.
|
41
|
-
#
|
42
|
-
# If the header has
|
43
|
-
#
|
44
|
-
# Example:
|
45
|
-
#
|
46
|
-
# class DataHeader
|
47
|
-
# extend BitFields
|
48
|
-
# field :unknown
|
49
|
-
# SIZE = 1 # bytes
|
50
|
-
# end
|
51
|
-
#
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
# ERRORS
|
57
|
-
|
58
|
-
class DataError < StandardError
|
59
|
-
attr_reader :packet
|
60
|
-
def initialize message, packet
|
61
|
-
@packet = packet
|
62
|
-
super(message)
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
# ATTRIBUTES
|
70
|
-
|
71
|
-
attr_reader :data, :header, :data_header
|
72
|
-
|
73
|
-
# Delegate unknown methods to packet header.
|
74
|
-
def method_missing name, *args
|
75
|
-
if header.respond_to? name
|
76
|
-
header.send name, *args
|
77
|
-
else
|
78
|
-
super
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
def raw
|
83
|
-
header.raw + data
|
84
|
-
end
|
85
|
-
|
86
|
-
def data= data
|
87
|
-
raise "Data already filled: #{@data.inspect}" unless @data.blank?
|
88
|
-
@data = data
|
89
|
-
end
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
# INITAILIZATION
|
95
|
-
|
96
|
-
def initialize raw, validate_now = true
|
97
|
-
raise DataError.new("Received no RAW data to build the CCSDS Packet: #{raw.inspect}", self) if raw.blank?
|
98
|
-
|
99
|
-
# logger.debug { "Parsing CCSDS header" }
|
100
|
-
# @header = Header.new(raw[0...Header::SIZE]) # Packet Header
|
101
|
-
@header = Header.new(raw) # Packet Header
|
102
|
-
@data = raw[Header::SIZE..-1] # Packet Payload
|
103
|
-
validate! if validate_now
|
104
|
-
|
105
|
-
if defined? DataHeader
|
106
|
-
raise "You should define CCSDS::Packet::DataHeader class" unless defined? DataHeader
|
107
|
-
|
108
|
-
@data_header = DataHeader.new( @data[0 ... DataHeader::SIZE] )
|
109
|
-
|
110
|
-
# Update the data contents excluding the Data Header
|
111
|
-
@data = @data[DataHeader::SIZE .. -1]
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
# VALIDATION
|
119
|
-
|
120
|
-
def validate
|
121
|
-
@errors = []
|
122
|
-
if data.size != header.data_size
|
123
|
-
@errors << "Available data (#{data.size} bytes) is different than "+
|
124
|
-
"specified by the CCSDS packet header (#{header.data_size} bytes)."+
|
125
|
-
"\nHeader #{header.raw.nibbles.inspect} dump: #{header.inspect}"
|
126
|
-
end
|
127
|
-
end
|
128
|
-
|
129
|
-
def validate!
|
130
|
-
validate
|
131
|
-
raise DataError.new(@errors.first, self) unless @errors.blank?
|
132
|
-
end
|
133
|
-
|
134
|
-
def valid?
|
135
|
-
validate
|
136
|
-
return @errors.empty?
|
137
|
-
end
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
# PACKET EXTRACTION
|
143
|
-
|
144
|
-
class << self
|
145
|
-
include IndifferentReader
|
146
|
-
|
147
|
-
def extract_packet io_or_string, *errors_to_rescue
|
148
|
-
begin
|
149
|
-
packet = new( io_or_string.io.read(Header::SIZE), false )
|
150
|
-
packet.data = io_or_string.io.read(packet.data_size)
|
151
|
-
packet.validate!
|
152
|
-
return packet
|
153
|
-
rescue *errors_to_rescue
|
154
|
-
logger.info "Rescued error: (#{$!.class}) #{$!.to_s}"
|
155
|
-
return nil # just go on...
|
156
|
-
end
|
157
|
-
end
|
158
|
-
|
159
|
-
def each_packet io_or_string, *errors_to_rescue
|
160
|
-
while packet = extract_packet(io_or_string, *errors_to_rescue)
|
161
|
-
yield packet
|
162
|
-
end
|
163
|
-
end
|
164
|
-
end
|
165
|
-
|
166
|
-
end
|
167
|
-
end
|
data/lib/ccsds/cuc.rb
DELETED
@@ -1,29 +0,0 @@
|
|
1
|
-
# CCSDS Unsegmented Time Code
|
2
|
-
|
3
|
-
|
4
|
-
module CCSDS
|
5
|
-
module CUC
|
6
|
-
|
7
|
-
# def cuc_time time
|
8
|
-
# secs, msecs = time.to_f.divmod(1) # split integer and fractional parts
|
9
|
-
# msecs = (msecs * 256).to_i
|
10
|
-
# [secs, msecs].pack('xN C') # cut off first byte: "@" skips a byte
|
11
|
-
# end
|
12
|
-
#
|
13
|
-
# def self.cuc_time_parse cuc
|
14
|
-
# secs, msecs = (0.chr + cuc).unpack('xN C')
|
15
|
-
# time = secs + (msecs / 256.0)
|
16
|
-
# Time.at(time)
|
17
|
-
# end
|
18
|
-
|
19
|
-
class << self
|
20
|
-
# coarse are seconds
|
21
|
-
# fine are milliseconds muliplied for 256
|
22
|
-
def parse coarse, fine
|
23
|
-
secs, usecs = coarse, ((fine * 15.0) / 1_000_000.0)
|
24
|
-
Time.at(secs + usecs)
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
end
|
29
|
-
end
|
data/lib/space_wire.rb
DELETED
@@ -1,142 +0,0 @@
|
|
1
|
-
require 'bit_fields'
|
2
|
-
require 'indifferent_reader'
|
3
|
-
require 'file_with_read_buffer'
|
4
|
-
|
5
|
-
module SpaceWire
|
6
|
-
|
7
|
-
|
8
|
-
# Reads the index file generated by the SpaceWire FEE
|
9
|
-
# along with the binary file.
|
10
|
-
class Index
|
11
|
-
|
12
|
-
# Each line of the Index is 9 bytes:
|
13
|
-
# * 1 for en of packet character
|
14
|
-
# * 8 indicating the byte position of the end of the
|
15
|
-
# packet inside of the binady file
|
16
|
-
class Record
|
17
|
-
extend BitFields
|
18
|
-
field :error_control, 'c'
|
19
|
-
field :end_position, 'Q'
|
20
|
-
|
21
|
-
alias bad_end_position end_position
|
22
|
-
def end_position
|
23
|
-
bad_end_position + 1
|
24
|
-
end
|
25
|
-
|
26
|
-
SIZE = 9
|
27
|
-
end
|
28
|
-
|
29
|
-
include IndifferentReader
|
30
|
-
attr_reader :records
|
31
|
-
|
32
|
-
def records
|
33
|
-
if @records.nil?
|
34
|
-
@records = []
|
35
|
-
each do |record|
|
36
|
-
@records << record
|
37
|
-
end
|
38
|
-
end
|
39
|
-
@records
|
40
|
-
end
|
41
|
-
|
42
|
-
# Takes a string, string io, or any io
|
43
|
-
def initialize(io_or_string)
|
44
|
-
@source = io_or_string
|
45
|
-
end
|
46
|
-
|
47
|
-
def each
|
48
|
-
if @records.nil?
|
49
|
-
@records = []
|
50
|
-
|
51
|
-
while line = @source.io.read(Record::SIZE)
|
52
|
-
record = Record.new(line)
|
53
|
-
@records << record
|
54
|
-
yield record if block_given?
|
55
|
-
end
|
56
|
-
else
|
57
|
-
block_given? ? records.each(&block) : records
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
|
63
|
-
class Data
|
64
|
-
attr_reader :file, :index
|
65
|
-
|
66
|
-
def initialize file_path, index_path
|
67
|
-
@file_path, @index_path = file_path, index_path
|
68
|
-
|
69
|
-
@file = File.open(@file_path)
|
70
|
-
@file.extend FileWithBufferedRead
|
71
|
-
|
72
|
-
@index = Index.new File.read(@index_path)
|
73
|
-
end
|
74
|
-
|
75
|
-
def each_packet
|
76
|
-
previous_end_position = 0
|
77
|
-
index.each do |packet_index|
|
78
|
-
packet_size = packet_index.end_position - previous_end_position
|
79
|
-
|
80
|
-
packet = file.buffered_read(packet_size).extend(Packet)
|
81
|
-
# packet = extract_packet(previous_end_position, packet_index.end_position)
|
82
|
-
yield packet
|
83
|
-
previous_end_position = packet_index.end_position
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
def packets
|
88
|
-
if @packets.nil?
|
89
|
-
@packets = []
|
90
|
-
each_packet { |packet| @packets << packet }
|
91
|
-
end
|
92
|
-
@packets
|
93
|
-
end
|
94
|
-
|
95
|
-
def extract_packet start_position, end_position
|
96
|
-
previous_file_position = file.pos
|
97
|
-
file.seek start_position
|
98
|
-
packet = file.read(end_position - start_position)
|
99
|
-
file.seek previous_file_position
|
100
|
-
|
101
|
-
packet.extend Packet
|
102
|
-
packet.header_size = 4
|
103
|
-
packet
|
104
|
-
end
|
105
|
-
|
106
|
-
def [] position
|
107
|
-
if position == 0
|
108
|
-
then start_position = 0
|
109
|
-
else start_position = index.records[position - 1].end_position
|
110
|
-
end
|
111
|
-
|
112
|
-
end_position = index.records[ position ].end_position
|
113
|
-
extract_packet(start_position, end_position)
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
|
118
|
-
module Packet
|
119
|
-
HEADER_SIZE = 4
|
120
|
-
def raw
|
121
|
-
self
|
122
|
-
end
|
123
|
-
|
124
|
-
def header
|
125
|
-
self[0 ... HEADER_SIZE]
|
126
|
-
end
|
127
|
-
|
128
|
-
def data
|
129
|
-
self[HEADER_SIZE ...-1]
|
130
|
-
end
|
131
|
-
|
132
|
-
def end_of_packet_char
|
133
|
-
self[-1].chr
|
134
|
-
end
|
135
|
-
end
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
def self.rote_quadrate
|
140
|
-
raise "È una doccia fredda!"
|
141
|
-
end
|
142
|
-
end
|
Binary file
|
Binary file
|
data/spec/lib/space_wire_spec.rb
DELETED
@@ -1,53 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
-
require 'space_wire'
|
3
|
-
require 'stringio'
|
4
|
-
|
5
|
-
describe SpaceWire do
|
6
|
-
before :all do
|
7
|
-
base_dir = File.dirname(__FILE__) + '/space_wire/'
|
8
|
-
|
9
|
-
@index_path = base_dir + '/index.bin'
|
10
|
-
@file_path = base_dir + '/data.bin'
|
11
|
-
end
|
12
|
-
|
13
|
-
it 'should read SpaceWire indexes' do
|
14
|
-
last_end_position = 0
|
15
|
-
index = SpaceWire::Index.new(File.read(@index_path))
|
16
|
-
index.records.size.should == 100
|
17
|
-
index.records.each do |record|
|
18
|
-
record.end_position.should == last_end_position + 4117
|
19
|
-
record.error_control.should == 0
|
20
|
-
last_end_position = record.end_position
|
21
|
-
end
|
22
|
-
|
23
|
-
File.open(@index_path,'r') do |file|
|
24
|
-
last_end_position = 0
|
25
|
-
while index = file.read(9)
|
26
|
-
end_char, end_position = index.unpack('cQ')
|
27
|
-
end_position.should == last_end_position + 4117
|
28
|
-
end_char.should == 0
|
29
|
-
last_end_position = end_position
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
it 'should read packets from data file' do
|
35
|
-
space_wire_data = SpaceWire::Data.new(@file_path, @index_path)
|
36
|
-
|
37
|
-
packets = []
|
38
|
-
space_wire_data.each_packet do |packet|
|
39
|
-
packet.end_of_packet_char.should == 0.chr
|
40
|
-
packet.size.should == 4117
|
41
|
-
packet.header_size.should == 4
|
42
|
-
packet.header.size.should == packet.header_size
|
43
|
-
packets << packet
|
44
|
-
end
|
45
|
-
packets.size.should == 100
|
46
|
-
space_wire_data.packets.should == packets
|
47
|
-
|
48
|
-
100.times { |n|
|
49
|
-
space_wire_data[n].should == packets[n]
|
50
|
-
}
|
51
|
-
end
|
52
|
-
|
53
|
-
end
|