cosmos 3.3.3 → 3.4.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/.gitattributes +2 -0
- data/.travis.yml +2 -1
- data/Gemfile +4 -3
- data/Manifest.txt +22 -0
- data/autohotkey/tools/handbook_creator.ahk +9 -0
- data/autohotkey/tools/packet_viewer.ahk +4 -0
- data/bin/exchndl20-x64.dll +0 -0
- data/bin/exchndl20.dll +0 -0
- data/bin/exchndl21-x64.dll +0 -0
- data/bin/exchndl21.dll +0 -0
- data/bin/exchndl22-x64.dll +0 -0
- data/bin/exchndl22.dll +0 -0
- data/bin/mgwhelp-x64.dll +0 -0
- data/bin/mgwhelp.dll +0 -0
- data/cosmos.gemspec +1 -0
- data/data/crc.txt +30 -24
- data/demo/config/data/crc.txt +3 -3
- data/demo/config/tools/handbook_creator/templates/command_packets.html.erb +3 -1
- data/demo/config/tools/handbook_creator/templates/telemetry_packets.html.erb +3 -1
- data/demo/procedures/cosmos_api_test.rb +1 -1
- data/ext/cosmos/ext/low_fragmentation_array/low_fragmentation_array.c +4 -0
- data/ext/cosmos/ext/platform/platform.c +22 -2
- data/ext/cosmos/ext/structure/structure.c +631 -104
- data/ext/cosmos/ext/telemetry/telemetry.c +3 -2
- data/lib/cosmos/gui/line_graph/line_graph_drawing.rb +71 -92
- data/lib/cosmos/gui/line_graph/overview_graph.rb +1 -1
- data/lib/cosmos/gui/qt.rb +38 -24
- data/lib/cosmos/gui/text/ruby_editor.rb +1 -1
- data/lib/cosmos/packets/binary_accessor.rb +1 -288
- data/lib/cosmos/packets/telemetry.rb +2 -1
- data/lib/cosmos/script/cmd_tlm_server.rb +110 -0
- data/lib/cosmos/script/commands.rb +166 -0
- data/lib/cosmos/script/extract.rb +2 -2
- data/lib/cosmos/script/limits.rb +108 -0
- data/lib/cosmos/script/script.rb +28 -1487
- data/lib/cosmos/script/scripting.rb +889 -0
- data/lib/cosmos/script/telemetry.rb +174 -0
- data/lib/cosmos/script/tools.rb +138 -0
- data/lib/cosmos/streams/stream_protocol.rb +9 -6
- data/lib/cosmos/system/target.rb +55 -38
- data/lib/cosmos/tools/cmd_tlm_server/api.rb +6 -3
- data/lib/cosmos/tools/cmd_tlm_server/connections.rb +0 -1
- data/lib/cosmos/tools/cmd_tlm_server/gui/interfaces_tab.rb +17 -7
- data/lib/cosmos/tools/cmd_tlm_server/interface_thread.rb +15 -4
- data/lib/cosmos/tools/handbook_creator/handbook_creator.rb +15 -8
- data/lib/cosmos/tools/handbook_creator/handbook_creator_config.rb +41 -13
- data/lib/cosmos/tools/packet_viewer/packet_viewer.rb +18 -1
- data/lib/cosmos/tools/tlm_viewer/widgets/canvasline_widget.rb +1 -1
- data/lib/cosmos/tools/tlm_viewer/widgets/canvaslinevalue_widget.rb +1 -1
- data/lib/cosmos/tools/tlm_viewer/widgets/limitsbar_widget.rb +1 -1
- data/lib/cosmos/tools/tlm_viewer/widgets/rangebar_widget.rb +1 -1
- data/lib/cosmos/top_level.rb +1 -1
- data/lib/cosmos/utilities/ruby_lex_utils.rb +1 -1
- data/lib/cosmos/version.rb +5 -5
- data/spec/gui/line_graph/line_clip_spec.rb +6 -6
- data/spec/gui/qt_spec.rb +102 -0
- data/spec/interfaces/interface_spec.rb +9 -9
- data/spec/interfaces/linc_interface_spec.rb +72 -15
- data/spec/interfaces/serial_interface_spec.rb +9 -9
- data/spec/interfaces/simulated_target_interface_spec.rb +7 -7
- data/spec/interfaces/stream_interface_spec.rb +4 -4
- data/spec/interfaces/tcpip_client_interface_spec.rb +8 -8
- data/spec/interfaces/tcpip_server_interface_spec.rb +9 -9
- data/spec/interfaces/udp_interface_spec.rb +20 -20
- data/spec/io/json_drb_spec.rb +4 -4
- data/spec/io/raw_logger_pair_spec.rb +20 -20
- data/spec/io/raw_logger_spec.rb +3 -3
- data/spec/io/tcpip_server_spec.rb +9 -9
- data/spec/io/udp_sockets_spec.rb +2 -2
- data/spec/io/win32_serial_driver_spec.rb +2 -2
- data/spec/packets/binary_accessor_spec.rb +143 -6
- data/spec/packets/commands_spec.rb +5 -5
- data/spec/packets/limits_spec.rb +15 -15
- data/spec/packets/packet_config_spec.rb +19 -19
- data/spec/packets/packet_item_limits_spec.rb +3 -3
- data/spec/packets/packet_item_spec.rb +4 -4
- data/spec/packets/packet_spec.rb +33 -33
- data/spec/packets/structure_item_spec.rb +19 -19
- data/spec/packets/telemetry_spec.rb +6 -6
- data/spec/script/cmd_tlm_server_spec.rb +110 -0
- data/spec/script/commands_disconnect_spec.rb +270 -0
- data/spec/script/commands_spec.rb +288 -0
- data/spec/script/limits_spec.rb +153 -0
- data/spec/script/script_spec.rb +32 -696
- data/spec/script/scripting_spec.rb +436 -0
- data/spec/script/telemetry_spec.rb +130 -0
- data/spec/script/tools_spec.rb +117 -0
- data/spec/spec_helper.rb +10 -5
- data/spec/streams/preidentified_stream_protocol_spec.rb +4 -4
- data/spec/streams/serial_stream_spec.rb +8 -8
- data/spec/streams/stream_protocol_spec.rb +4 -4
- data/spec/streams/tcpip_client_stream_spec.rb +3 -3
- data/spec/streams/tcpip_socket_stream_spec.rb +7 -7
- data/spec/streams/template_stream_protocol_spec.rb +1 -1
- data/spec/system/system_spec.rb +6 -6
- data/spec/system/target_spec.rb +2 -0
- data/spec/tools/cmd_tlm_server/api_spec.rb +17 -17
- data/spec/tools/cmd_tlm_server/cmd_tlm_server_config_spec.rb +5 -5
- data/spec/tools/cmd_tlm_server/interface_thread_spec.rb +3 -3
- data/spec/top_level/top_level_spec.rb +8 -8
- data/spec/utilities/csv_spec.rb +3 -3
- data/spec/utilities/message_log_spec.rb +3 -3
- data/spec/utilities/ruby_lex_utils_spec.rb +7 -7
- data/test/performance/config/tools/launcher/launcher_threads.txt +8 -1
- data/test/performance/tools/CmdTlmServerMemProf +1 -1
- data/test/performance/tools/TlmGrapherMemProf +19 -0
- data/test/performance/tools/TlmGrapherMemProf.bat +59 -0
- metadata +38 -2
|
@@ -22,17 +22,17 @@ module Cosmos
|
|
|
22
22
|
it "is not writeable if no write port given" do
|
|
23
23
|
i = UdpInterface.new('localhost','nil','8889')
|
|
24
24
|
expect(i.name).to eql "Cosmos::UdpInterface"
|
|
25
|
-
expect(i.write_allowed?).to
|
|
26
|
-
expect(i.write_raw_allowed?).to
|
|
27
|
-
expect(i.read_allowed?).to
|
|
25
|
+
expect(i.write_allowed?).to be false
|
|
26
|
+
expect(i.write_raw_allowed?).to be false
|
|
27
|
+
expect(i.read_allowed?).to be true
|
|
28
28
|
end
|
|
29
29
|
|
|
30
30
|
it "is not readable if no read port given" do
|
|
31
31
|
i = UdpInterface.new('localhost','8888','nil')
|
|
32
32
|
expect(i.name).to eql "Cosmos::UdpInterface"
|
|
33
|
-
expect(i.write_allowed?).to
|
|
34
|
-
expect(i.write_raw_allowed?).to
|
|
35
|
-
expect(i.read_allowed?).to
|
|
33
|
+
expect(i.write_allowed?).to be true
|
|
34
|
+
expect(i.write_raw_allowed?).to be true
|
|
35
|
+
expect(i.read_allowed?).to be false
|
|
36
36
|
end
|
|
37
37
|
end
|
|
38
38
|
|
|
@@ -47,11 +47,11 @@ module Cosmos
|
|
|
47
47
|
expect(UdpWriteSocket).to receive(:new).and_return(write)
|
|
48
48
|
expect(UdpReadSocket).to receive(:new).and_return(read)
|
|
49
49
|
i = UdpInterface.new('localhost','8888','8889')
|
|
50
|
-
expect(i.connected?).to
|
|
50
|
+
expect(i.connected?).to be false
|
|
51
51
|
i.connect
|
|
52
|
-
expect(i.connected?).to
|
|
52
|
+
expect(i.connected?).to be true
|
|
53
53
|
i.disconnect
|
|
54
|
-
expect(i.connected?).to
|
|
54
|
+
expect(i.connected?).to be false
|
|
55
55
|
end
|
|
56
56
|
|
|
57
57
|
it "creates a UdpWriteSocket if write port given" do
|
|
@@ -61,11 +61,11 @@ module Cosmos
|
|
|
61
61
|
expect(UdpWriteSocket).to receive(:new).and_return(write)
|
|
62
62
|
expect(UdpReadSocket).to_not receive(:new)
|
|
63
63
|
i = UdpInterface.new('localhost','8888','nil')
|
|
64
|
-
expect(i.connected?).to
|
|
64
|
+
expect(i.connected?).to be false
|
|
65
65
|
i.connect
|
|
66
|
-
expect(i.connected?).to
|
|
66
|
+
expect(i.connected?).to be true
|
|
67
67
|
i.disconnect
|
|
68
|
-
expect(i.connected?).to
|
|
68
|
+
expect(i.connected?).to be false
|
|
69
69
|
end
|
|
70
70
|
|
|
71
71
|
it "creates a UdpReadSocket if read port given" do
|
|
@@ -75,11 +75,11 @@ module Cosmos
|
|
|
75
75
|
expect(UdpWriteSocket).to_not receive(:new)
|
|
76
76
|
expect(UdpReadSocket).to receive(:new).and_return(read)
|
|
77
77
|
i = UdpInterface.new('localhost','nil','8889')
|
|
78
|
-
expect(i.connected?).to
|
|
78
|
+
expect(i.connected?).to be false
|
|
79
79
|
i.connect
|
|
80
|
-
expect(i.connected?).to
|
|
80
|
+
expect(i.connected?).to be true
|
|
81
81
|
i.disconnect
|
|
82
|
-
expect(i.connected?).to
|
|
82
|
+
expect(i.connected?).to be false
|
|
83
83
|
end
|
|
84
84
|
end
|
|
85
85
|
|
|
@@ -94,11 +94,11 @@ module Cosmos
|
|
|
94
94
|
expect(UdpWriteSocket).to receive(:new).and_return(write)
|
|
95
95
|
expect(UdpReadSocket).to receive(:new).and_return(read)
|
|
96
96
|
i = UdpInterface.new('localhost','8888','8889')
|
|
97
|
-
expect(i.connected?).to
|
|
97
|
+
expect(i.connected?).to be false
|
|
98
98
|
i.connect
|
|
99
|
-
expect(i.connected?).to
|
|
99
|
+
expect(i.connected?).to be true
|
|
100
100
|
i.disconnect
|
|
101
|
-
expect(i.connected?).to
|
|
101
|
+
expect(i.connected?).to be false
|
|
102
102
|
end
|
|
103
103
|
end
|
|
104
104
|
|
|
@@ -107,7 +107,7 @@ module Cosmos
|
|
|
107
107
|
i = UdpInterface.new('localhost','8888','nil')
|
|
108
108
|
thread = Thread.new { i.read }
|
|
109
109
|
sleep 0.1
|
|
110
|
-
expect(thread.stop?).to
|
|
110
|
+
expect(thread.stop?).to be true
|
|
111
111
|
Cosmos.kill_thread(nil, thread)
|
|
112
112
|
end
|
|
113
113
|
|
|
@@ -119,7 +119,7 @@ module Cosmos
|
|
|
119
119
|
i.connect
|
|
120
120
|
thread = Thread.new { i.read }
|
|
121
121
|
sleep 0.1
|
|
122
|
-
expect(thread.stop?).to
|
|
122
|
+
expect(thread.stop?).to be true
|
|
123
123
|
Cosmos.kill_thread(nil, thread)
|
|
124
124
|
end
|
|
125
125
|
|
data/spec/io/json_drb_spec.rb
CHANGED
|
@@ -86,7 +86,7 @@ module Cosmos
|
|
|
86
86
|
it "creates a single listen thread" do
|
|
87
87
|
expect(@json.thread).to be_nil
|
|
88
88
|
@json.start_service('127.0.0.1', 7777, self)
|
|
89
|
-
expect(@json.thread.alive?).to
|
|
89
|
+
expect(@json.thread.alive?).to be true
|
|
90
90
|
expect { @json.start_service('127.0.0.1', 7777, self) }.to raise_error(/Error binding to port/)
|
|
91
91
|
@json.stop_service
|
|
92
92
|
sleep(0.1)
|
|
@@ -114,7 +114,7 @@ module Cosmos
|
|
|
114
114
|
@json.start_service('127.0.0.1', 7777, self)
|
|
115
115
|
socket = TCPSocket.open('127.0.0.1',7777)
|
|
116
116
|
sleep 0.1
|
|
117
|
-
expect(socket.eof?).to
|
|
117
|
+
expect(socket.eof?).to be true
|
|
118
118
|
socket.close
|
|
119
119
|
@json.stop_service
|
|
120
120
|
sleep(0.1)
|
|
@@ -300,9 +300,9 @@ module Cosmos
|
|
|
300
300
|
describe "debug, debug?" do
|
|
301
301
|
it "sets the debug level" do
|
|
302
302
|
JsonDRb.debug = true
|
|
303
|
-
expect(JsonDRb.debug?).to
|
|
303
|
+
expect(JsonDRb.debug?).to be true
|
|
304
304
|
JsonDRb.debug = false
|
|
305
|
-
expect(JsonDRb.debug?).to
|
|
305
|
+
expect(JsonDRb.debug?).to be false
|
|
306
306
|
end
|
|
307
307
|
end
|
|
308
308
|
|
|
@@ -20,14 +20,14 @@ module Cosmos
|
|
|
20
20
|
pair = RawLoggerPair.new('MYINT')
|
|
21
21
|
expect(pair.read_logger).not_to be_nil
|
|
22
22
|
expect(pair.write_logger).not_to be_nil
|
|
23
|
-
expect(pair.read_logger.logging_enabled).to
|
|
24
|
-
expect(pair.write_logger.logging_enabled).to
|
|
23
|
+
expect(pair.read_logger.logging_enabled).to be false
|
|
24
|
+
expect(pair.write_logger.logging_enabled).to be false
|
|
25
25
|
|
|
26
26
|
pair = RawLoggerPair.new('MYINT2', ['raw_logger.rb', true, 100000, './'])
|
|
27
27
|
expect(pair.read_logger).not_to be_nil
|
|
28
28
|
expect(pair.write_logger).not_to be_nil
|
|
29
|
-
expect(pair.read_logger.logging_enabled).to
|
|
30
|
-
expect(pair.write_logger.logging_enabled).to
|
|
29
|
+
expect(pair.read_logger.logging_enabled).to be true
|
|
30
|
+
expect(pair.write_logger.logging_enabled).to be true
|
|
31
31
|
end
|
|
32
32
|
end
|
|
33
33
|
|
|
@@ -35,8 +35,8 @@ module Cosmos
|
|
|
35
35
|
it "starts logging" do
|
|
36
36
|
pair = RawLoggerPair.new('MYINT')
|
|
37
37
|
pair.start
|
|
38
|
-
expect(pair.write_logger.logging_enabled).to
|
|
39
|
-
expect(pair.read_logger.logging_enabled).to
|
|
38
|
+
expect(pair.write_logger.logging_enabled).to be true
|
|
39
|
+
expect(pair.read_logger.logging_enabled).to be true
|
|
40
40
|
end
|
|
41
41
|
end
|
|
42
42
|
|
|
@@ -44,30 +44,30 @@ module Cosmos
|
|
|
44
44
|
it "stops logging" do
|
|
45
45
|
pair = RawLoggerPair.new('MYINT')
|
|
46
46
|
pair.start
|
|
47
|
-
expect(pair.write_logger.logging_enabled).to
|
|
48
|
-
expect(pair.read_logger.logging_enabled).to
|
|
47
|
+
expect(pair.write_logger.logging_enabled).to be true
|
|
48
|
+
expect(pair.read_logger.logging_enabled).to be true
|
|
49
49
|
pair.stop
|
|
50
|
-
expect(pair.write_logger.logging_enabled).to
|
|
51
|
-
expect(pair.read_logger.logging_enabled).to
|
|
50
|
+
expect(pair.write_logger.logging_enabled).to be false
|
|
51
|
+
expect(pair.read_logger.logging_enabled).to be false
|
|
52
52
|
end
|
|
53
53
|
end
|
|
54
54
|
|
|
55
55
|
describe "clone" do
|
|
56
56
|
it "clones itself including logging state" do
|
|
57
57
|
pair = RawLoggerPair.new('MYINT')
|
|
58
|
-
expect(pair.write_logger.logging_enabled).to
|
|
59
|
-
expect(pair.read_logger.logging_enabled).to
|
|
58
|
+
expect(pair.write_logger.logging_enabled).to be false
|
|
59
|
+
expect(pair.read_logger.logging_enabled).to be false
|
|
60
60
|
pair_clone1 = pair.clone
|
|
61
61
|
pair.start
|
|
62
|
-
expect(pair.write_logger.logging_enabled).to
|
|
63
|
-
expect(pair.read_logger.logging_enabled).to
|
|
64
|
-
expect(pair_clone1.write_logger.logging_enabled).to
|
|
65
|
-
expect(pair_clone1.read_logger.logging_enabled).to
|
|
62
|
+
expect(pair.write_logger.logging_enabled).to be true
|
|
63
|
+
expect(pair.read_logger.logging_enabled).to be true
|
|
64
|
+
expect(pair_clone1.write_logger.logging_enabled).to be false
|
|
65
|
+
expect(pair_clone1.read_logger.logging_enabled).to be false
|
|
66
66
|
pair_clone2 = pair.clone
|
|
67
|
-
expect(pair_clone1.write_logger.logging_enabled).to
|
|
68
|
-
expect(pair_clone1.read_logger.logging_enabled).to
|
|
69
|
-
expect(pair_clone2.write_logger.logging_enabled).to
|
|
70
|
-
expect(pair_clone2.read_logger.logging_enabled).to
|
|
67
|
+
expect(pair_clone1.write_logger.logging_enabled).to be false
|
|
68
|
+
expect(pair_clone1.read_logger.logging_enabled).to be false
|
|
69
|
+
expect(pair_clone2.write_logger.logging_enabled).to be true
|
|
70
|
+
expect(pair_clone2.read_logger.logging_enabled).to be true
|
|
71
71
|
end
|
|
72
72
|
end
|
|
73
73
|
|
data/spec/io/raw_logger_spec.rb
CHANGED
|
@@ -117,12 +117,12 @@ module Cosmos
|
|
|
117
117
|
describe "start and stop" do
|
|
118
118
|
it "enables and disable logging" do
|
|
119
119
|
raw_logger = RawLogger.new('MYINT', :WRITE, false, 200, nil)
|
|
120
|
-
expect(raw_logger.logging_enabled).to
|
|
120
|
+
expect(raw_logger.logging_enabled).to be false
|
|
121
121
|
raw_logger.start
|
|
122
|
-
expect(raw_logger.logging_enabled).to
|
|
122
|
+
expect(raw_logger.logging_enabled).to be true
|
|
123
123
|
raw_logger.write("\x00\x01\x02\x03")
|
|
124
124
|
raw_logger.stop
|
|
125
|
-
expect(raw_logger.logging_enabled).to
|
|
125
|
+
expect(raw_logger.logging_enabled).to be false
|
|
126
126
|
file = Dir[File.join(@log_path,"*.bin")][-1]
|
|
127
127
|
expect(File.size(file)).not_to eql 0
|
|
128
128
|
end
|
|
@@ -35,12 +35,12 @@ module Cosmos
|
|
|
35
35
|
server = TcpipServer.new(nil,8889,nil,nil,'Burst')
|
|
36
36
|
server.connect
|
|
37
37
|
sleep 0.2
|
|
38
|
-
expect(server.connected?).to
|
|
38
|
+
expect(server.connected?).to be true
|
|
39
39
|
# 2 because the RSpec main thread plus the listener
|
|
40
40
|
expect(Thread.list.length).to eql 2
|
|
41
41
|
server.disconnect
|
|
42
42
|
sleep 0.2
|
|
43
|
-
expect(server.connected?).to
|
|
43
|
+
expect(server.connected?).to be false
|
|
44
44
|
expect(Thread.list.length).to eql 1
|
|
45
45
|
end
|
|
46
46
|
|
|
@@ -48,13 +48,13 @@ module Cosmos
|
|
|
48
48
|
server = TcpipServer.new(8888,nil,nil,nil,'Burst')
|
|
49
49
|
server.connect
|
|
50
50
|
sleep 0.2
|
|
51
|
-
expect(server.connected?).to
|
|
51
|
+
expect(server.connected?).to be true
|
|
52
52
|
# 3 because the RSpec main thread plus the listener
|
|
53
53
|
# plus one for the write thread
|
|
54
54
|
expect(Thread.list.length).to eql 3
|
|
55
55
|
server.disconnect
|
|
56
56
|
sleep 0.2
|
|
57
|
-
expect(server.connected?).to
|
|
57
|
+
expect(server.connected?).to be false
|
|
58
58
|
expect(Thread.list.length).to eql 1
|
|
59
59
|
end
|
|
60
60
|
|
|
@@ -62,13 +62,13 @@ module Cosmos
|
|
|
62
62
|
server = TcpipServer.new(8888,8888,nil,nil,'Burst')
|
|
63
63
|
server.connect
|
|
64
64
|
sleep 0.2
|
|
65
|
-
expect(server.connected?).to
|
|
65
|
+
expect(server.connected?).to be true
|
|
66
66
|
# 3 because the RSpec main thread plus the listener
|
|
67
67
|
# plus one for the write thread
|
|
68
68
|
expect(Thread.list.length).to eql 3
|
|
69
69
|
server.disconnect
|
|
70
70
|
sleep 0.2
|
|
71
|
-
expect(server.connected?).to
|
|
71
|
+
expect(server.connected?).to be false
|
|
72
72
|
expect(Thread.list.length).to eql 1
|
|
73
73
|
end
|
|
74
74
|
|
|
@@ -76,13 +76,13 @@ module Cosmos
|
|
|
76
76
|
server = TcpipServer.new(8888,8889,nil,nil,'Burst')
|
|
77
77
|
server.connect
|
|
78
78
|
sleep 0.2
|
|
79
|
-
expect(server.connected?).to
|
|
79
|
+
expect(server.connected?).to be true
|
|
80
80
|
# 4 because the RSpec main thread plus the two listeners
|
|
81
81
|
# plus one for the write thread
|
|
82
82
|
expect(Thread.list.length).to eql 4
|
|
83
83
|
server.disconnect
|
|
84
84
|
sleep 0.2
|
|
85
|
-
expect(server.connected?).to
|
|
85
|
+
expect(server.connected?).to be false
|
|
86
86
|
expect(Thread.list.length).to eql 1
|
|
87
87
|
end
|
|
88
88
|
|
|
@@ -152,7 +152,7 @@ module Cosmos
|
|
|
152
152
|
socket = TCPSocket.open("127.0.0.1",8889)
|
|
153
153
|
sleep 0.2
|
|
154
154
|
expect(server.num_clients).to eql 0
|
|
155
|
-
expect(socket.eof?).to
|
|
155
|
+
expect(socket.eof?).to be true
|
|
156
156
|
server.disconnect
|
|
157
157
|
sleep 0.2
|
|
158
158
|
socket.close
|
data/spec/io/udp_sockets_spec.rb
CHANGED
|
@@ -50,8 +50,8 @@ module Cosmos
|
|
|
50
50
|
|
|
51
51
|
describe "multicast" do
|
|
52
52
|
it "determines if a host is multicast" do
|
|
53
|
-
expect(UdpWriteSocket.multicast?('127.0.0.1')).to
|
|
54
|
-
expect(UdpWriteSocket.multicast?('224.0.1.1')).to
|
|
53
|
+
expect(UdpWriteSocket.multicast?('127.0.0.1')).to be false
|
|
54
|
+
expect(UdpWriteSocket.multicast?('224.0.1.1')).to be true
|
|
55
55
|
end
|
|
56
56
|
end
|
|
57
57
|
|
|
@@ -46,9 +46,9 @@ module Cosmos
|
|
|
46
46
|
it "closes the handle" do
|
|
47
47
|
expect(Win32).to receive(:close_handle)
|
|
48
48
|
driver = Win32SerialDriver.new('COM1',9600)
|
|
49
|
-
expect(driver.closed?).to
|
|
49
|
+
expect(driver.closed?).to be false
|
|
50
50
|
driver.close
|
|
51
|
-
expect(driver.closed?).to
|
|
51
|
+
expect(driver.closed?).to be true
|
|
52
52
|
end
|
|
53
53
|
end
|
|
54
54
|
|
|
@@ -16,7 +16,7 @@ module Cosmos
|
|
|
16
16
|
|
|
17
17
|
describe BinaryAccessor do
|
|
18
18
|
|
|
19
|
-
describe "read" do
|
|
19
|
+
describe "read only" do
|
|
20
20
|
|
|
21
21
|
before(:each) do
|
|
22
22
|
@data = "\x80\x81\x82\x83\x84\x85\x86\x87\x00\x09\x0A\x0B\x0C\x0D\x0E\x0F"
|
|
@@ -240,6 +240,21 @@ module Cosmos
|
|
|
240
240
|
expect(BinaryAccessor.read(65, bit_size, :INT, @data, :BIG_ENDIAN)).to eql(expected[1])
|
|
241
241
|
end
|
|
242
242
|
|
|
243
|
+
it "reads 67-bit unsigned integers" do
|
|
244
|
+
expected = [0x808182838485868700 >> 5, 0x8700090A0B0C0D0E0F >> 5]
|
|
245
|
+
bit_size = 67
|
|
246
|
+
expect(BinaryAccessor.read(0, bit_size, :UINT, @data, :BIG_ENDIAN)).to eql(expected[0])
|
|
247
|
+
expect(BinaryAccessor.read(56, bit_size, :UINT, @data, :BIG_ENDIAN)).to eql(expected[1])
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
it "reads 67-bit signed integers" do
|
|
251
|
+
expected = [0x808182838485868700 >> 5, 0x8700090A0B0C0D0E0F >> 5]
|
|
252
|
+
bit_size = 67
|
|
253
|
+
expected.each_with_index { |value, index| expected[index] = value - 2**bit_size if value >= 2**(bit_size - 1) }
|
|
254
|
+
expect(BinaryAccessor.read(0, bit_size, :INT, @data, :BIG_ENDIAN)).to eql(expected[0])
|
|
255
|
+
expect(BinaryAccessor.read(56, bit_size, :INT, @data, :BIG_ENDIAN)).to eql(expected[1])
|
|
256
|
+
end
|
|
257
|
+
|
|
243
258
|
it "reads aligned 64-bit unsigned integers" do
|
|
244
259
|
expected_array = [0x8081828384858687, 0x00090A0B0C0D0E0F]
|
|
245
260
|
index = 0
|
|
@@ -404,6 +419,19 @@ module Cosmos
|
|
|
404
419
|
expect(BinaryAccessor.read(57, bit_size, :INT, @data, :LITTLE_ENDIAN)).to eql(expected[1])
|
|
405
420
|
end
|
|
406
421
|
|
|
422
|
+
it "reads 67-bit unsigned integers" do
|
|
423
|
+
expected = [0x0F0E0D0C0B0A090087 >> 5]
|
|
424
|
+
bit_size = 67
|
|
425
|
+
expect(BinaryAccessor.read(120, bit_size, :UINT, @data, :LITTLE_ENDIAN)).to eql(expected[0])
|
|
426
|
+
end
|
|
427
|
+
|
|
428
|
+
it "reads 67-bit signed integers" do
|
|
429
|
+
expected = [0x0F0E0D0C0B0A090087 >> 5]
|
|
430
|
+
bit_size = 67
|
|
431
|
+
expected.each_with_index { |value, index| expected[index] = value - 2**bit_size if value >= 2**(bit_size - 1) }
|
|
432
|
+
expect(BinaryAccessor.read(120, bit_size, :INT, @data, :LITTLE_ENDIAN)).to eql(expected[0])
|
|
433
|
+
end
|
|
434
|
+
|
|
407
435
|
it "reads aligned 64-bit unsigned integers" do
|
|
408
436
|
expected_array = [0x8786858483828180, 0x0F0E0D0C0B0A0900]
|
|
409
437
|
index = 0
|
|
@@ -677,7 +705,7 @@ module Cosmos
|
|
|
677
705
|
end # given big endian data
|
|
678
706
|
end # describe "read_array"
|
|
679
707
|
|
|
680
|
-
describe "write" do
|
|
708
|
+
describe "write only" do
|
|
681
709
|
|
|
682
710
|
before(:each) do
|
|
683
711
|
@data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
|
@@ -804,6 +832,36 @@ module Cosmos
|
|
|
804
832
|
expect { BinaryAccessor.write(@baseline_data, 8, 800, :STRING, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "16 byte buffer insufficient to write STRING at bit_offset 8 with bit_size 800")
|
|
805
833
|
end
|
|
806
834
|
|
|
835
|
+
it "truncates the buffer for 0 bitsize" do
|
|
836
|
+
expect(@data.length).to eql 16
|
|
837
|
+
BinaryAccessor.write("\x01\x02\x03", 8, 0, :BLOCK, @data, :BIG_ENDIAN, :ERROR)
|
|
838
|
+
expect(@data).to eql("\x00\x01\x02\x03")
|
|
839
|
+
expect(@data.length).to eql 4
|
|
840
|
+
end
|
|
841
|
+
|
|
842
|
+
it "expands the buffer for 0 bitsize" do
|
|
843
|
+
expect(@data.length).to eql 16
|
|
844
|
+
BinaryAccessor.write("\x01\x02\x03", (14 * 8), 0, :BLOCK, @data, :BIG_ENDIAN, :ERROR)
|
|
845
|
+
expect(@data).to eql("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x03")
|
|
846
|
+
expect(@data.length).to eql 17
|
|
847
|
+
end
|
|
848
|
+
|
|
849
|
+
it "writes a frozen string" do
|
|
850
|
+
buffer = "BLANKxxxWORLD"
|
|
851
|
+
string = "HELLO".freeze
|
|
852
|
+
# Specify 3 more bytes than given to exercise the padding logic
|
|
853
|
+
string = BinaryAccessor.write(string, 0, (string.length + 3)*8, :STRING, buffer, :BIG_ENDIAN, :ERROR)
|
|
854
|
+
expect(buffer).to eql("HELLO\x00\x00\x00WORLD")
|
|
855
|
+
expect(string).to eql("HELLO")
|
|
856
|
+
expect(string.frozen?).to be true
|
|
857
|
+
end
|
|
858
|
+
|
|
859
|
+
it "complains about writing a frozen buffer" do
|
|
860
|
+
buffer = "BLANK WORLD".freeze
|
|
861
|
+
string = "HELLO"
|
|
862
|
+
expect {BinaryAccessor.write(string, 0, string.length*8, :STRING, buffer, :BIG_ENDIAN, :ERROR) }.to raise_error(RuntimeError, "can't modify frozen String")
|
|
863
|
+
end
|
|
864
|
+
|
|
807
865
|
it "writes aligned 8-bit unsigned integers" do
|
|
808
866
|
0.step((@data.length - 1) * 8, 8) do |bit_offset|
|
|
809
867
|
@data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
|
@@ -824,6 +882,27 @@ module Cosmos
|
|
|
824
882
|
end
|
|
825
883
|
end
|
|
826
884
|
|
|
885
|
+
it "converts floats when writing integers" do
|
|
886
|
+
@data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
|
887
|
+
BinaryAccessor.write(1.0, 0, 8, :UINT, @data, :BIG_ENDIAN, :ERROR)
|
|
888
|
+
BinaryAccessor.write(2.5, 8, 8, :INT, @data, :BIG_ENDIAN, :ERROR)
|
|
889
|
+
BinaryAccessor.write(4.99, 16, 8, :UINT, @data, :BIG_ENDIAN, :ERROR)
|
|
890
|
+
expect(@data).to eql("\x01\x02\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
|
|
891
|
+
end
|
|
892
|
+
|
|
893
|
+
it "converts integer strings when writing integers" do
|
|
894
|
+
@data = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
|
895
|
+
BinaryAccessor.write("1", 0, 8, :UINT, @data, :BIG_ENDIAN, :ERROR)
|
|
896
|
+
BinaryAccessor.write("2", 8, 8, :INT, @data, :BIG_ENDIAN, :ERROR)
|
|
897
|
+
BinaryAccessor.write("4", 16, 8, :UINT, @data, :BIG_ENDIAN, :ERROR)
|
|
898
|
+
expect(@data).to eql("\x01\x02\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
|
|
899
|
+
end
|
|
900
|
+
|
|
901
|
+
it "complains about non-integer strings when writing integers" do
|
|
902
|
+
expect { BinaryAccessor.write("1.0", 0, 8, :UINT, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError)
|
|
903
|
+
expect { BinaryAccessor.write("abc123", 0, 8, :UINT, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError)
|
|
904
|
+
end
|
|
905
|
+
|
|
827
906
|
describe "given big endian data" do
|
|
828
907
|
|
|
829
908
|
it "writes 1-bit unsigned integers" do
|
|
@@ -834,10 +913,12 @@ module Cosmos
|
|
|
834
913
|
end
|
|
835
914
|
|
|
836
915
|
it "writes 1-bit signed integers" do
|
|
916
|
+
@data[1] = "\x55"
|
|
837
917
|
BinaryAccessor.write(0x1, 8, 1, :INT, @data, :BIG_ENDIAN, :ERROR)
|
|
838
918
|
BinaryAccessor.write(0x0, 9, 1, :INT, @data, :BIG_ENDIAN, :ERROR)
|
|
839
919
|
BinaryAccessor.write(0x1, 10, 1, :INT, @data, :BIG_ENDIAN, :ERROR)
|
|
840
|
-
|
|
920
|
+
BinaryAccessor.write(0x0, 11, 1, :INT, @data, :BIG_ENDIAN, :ERROR)
|
|
921
|
+
expect(@data).to eql("\x00\xA5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
|
|
841
922
|
end
|
|
842
923
|
|
|
843
924
|
it "writes 7-bit unsigned integers" do
|
|
@@ -916,6 +997,11 @@ module Cosmos
|
|
|
916
997
|
expect(@data).to eql(@baseline_data)
|
|
917
998
|
end
|
|
918
999
|
|
|
1000
|
+
it "writes aligned 32-bit negative integers" do
|
|
1001
|
+
BinaryAccessor.write(-2147483648, 0, 32, :INT, @data, :BIG_ENDIAN, :ERROR_ALLOW_HEX)
|
|
1002
|
+
expect(@data).to eql("\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
|
|
1003
|
+
end
|
|
1004
|
+
|
|
919
1005
|
it "writes aligned 32-bit floats" do
|
|
920
1006
|
expected_array = [-1.189360e-038, -3.139169e-036, 8.301067e-040, 1.086646e-031]
|
|
921
1007
|
BinaryAccessor.write(expected_array[0], 0, 32, :FLOAT, @data, :BIG_ENDIAN, :ERROR)
|
|
@@ -941,9 +1027,12 @@ module Cosmos
|
|
|
941
1027
|
end
|
|
942
1028
|
|
|
943
1029
|
it "writes 63-bit unsigned integers" do
|
|
1030
|
+
@data[-1] = "\xFF"
|
|
944
1031
|
BinaryAccessor.write(0x8081828384858687 >> 1, 0, 63, :UINT, @data, :BIG_ENDIAN, :ERROR)
|
|
945
|
-
|
|
946
|
-
|
|
1032
|
+
expect(@data).to eql("\x80\x81\x82\x83\x84\x85\x86\x86\x00\x00\x00\x00\x00\x00\x00\xFF")
|
|
1033
|
+
@data[0] = "\xFF"
|
|
1034
|
+
BinaryAccessor.write(0x08090A0B0C0D0E0F, 65, 63, :UINT, @data, :BIG_ENDIAN, :ERROR)
|
|
1035
|
+
expect(@data).to eql("\xFF\x81\x82\x83\x84\x85\x86\x86\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F")
|
|
947
1036
|
end
|
|
948
1037
|
|
|
949
1038
|
it "writes 63-bit signed integers" do
|
|
@@ -952,6 +1041,16 @@ module Cosmos
|
|
|
952
1041
|
expect(@data).to eql("\x80\x81\x82\x83\x84\x85\x86\x86\x00\x09\x0A\x0B\x0C\x0D\x0E\x0F")
|
|
953
1042
|
end
|
|
954
1043
|
|
|
1044
|
+
it "writes 67-bit unsigned integers" do
|
|
1045
|
+
BinaryAccessor.write(0x8081828384858687FF >> 5, 0, 67, :UINT, @data, :BIG_ENDIAN, :ERROR)
|
|
1046
|
+
expect(@data).to eql("\x80\x81\x82\x83\x84\x85\x86\x87\xE0\x00\x00\x00\x00\x00\x00\x00")
|
|
1047
|
+
end
|
|
1048
|
+
|
|
1049
|
+
it "writes 67-bit signed integers" do
|
|
1050
|
+
BinaryAccessor.write((0x8081828384858687FF >> 5) - 2**67, 0, 67, :INT, @data, :BIG_ENDIAN, :ERROR)
|
|
1051
|
+
expect(@data).to eql("\x80\x81\x82\x83\x84\x85\x86\x87\xE0\x00\x00\x00\x00\x00\x00\x00")
|
|
1052
|
+
end
|
|
1053
|
+
|
|
955
1054
|
it "writes aligned 64-bit unsigned integers" do
|
|
956
1055
|
expected_array = [0x8081828384858687, 0x00090A0B0C0D0E0F]
|
|
957
1056
|
index = 0
|
|
@@ -982,6 +1081,32 @@ module Cosmos
|
|
|
982
1081
|
expect(BinaryAccessor.read(64, 64, :FLOAT, @data, :BIG_ENDIAN)).to be_within(1.0e-308).of(expected_array[1])
|
|
983
1082
|
end
|
|
984
1083
|
|
|
1084
|
+
it "converts integers to floats" do
|
|
1085
|
+
BinaryAccessor.write(1, 0, 32, :FLOAT, @data, :BIG_ENDIAN, :ERROR)
|
|
1086
|
+
value = BinaryAccessor.read(0, 32, :FLOAT, @data, :BIG_ENDIAN)
|
|
1087
|
+
expect(value).to eql(1.0)
|
|
1088
|
+
expect(value).to be_a(Float)
|
|
1089
|
+
BinaryAccessor.write(4, 32, 64, :FLOAT, @data, :BIG_ENDIAN, :ERROR)
|
|
1090
|
+
value = BinaryAccessor.read(32, 64, :FLOAT, @data, :BIG_ENDIAN)
|
|
1091
|
+
expect(value).to eql(4.0)
|
|
1092
|
+
expect(value).to be_a(Float)
|
|
1093
|
+
end
|
|
1094
|
+
|
|
1095
|
+
it "converts strings when writing floats" do
|
|
1096
|
+
BinaryAccessor.write("1", 0, 32, :FLOAT, @data, :BIG_ENDIAN, :ERROR)
|
|
1097
|
+
value = BinaryAccessor.read(0, 32, :FLOAT, @data, :BIG_ENDIAN)
|
|
1098
|
+
expect(value).to eql(1.0)
|
|
1099
|
+
expect(value).to be_a(Float)
|
|
1100
|
+
BinaryAccessor.write("4.5", 32, 64, :FLOAT, @data, :BIG_ENDIAN, :ERROR)
|
|
1101
|
+
value = BinaryAccessor.read(32, 64, :FLOAT, @data, :BIG_ENDIAN)
|
|
1102
|
+
expect(value).to eql(4.5)
|
|
1103
|
+
expect(value).to be_a(Float)
|
|
1104
|
+
end
|
|
1105
|
+
|
|
1106
|
+
it "complains about non-float strings when writing floats" do
|
|
1107
|
+
expect { BinaryAccessor.write("abc123", 0, 32, :FLOAT, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError)
|
|
1108
|
+
end
|
|
1109
|
+
|
|
985
1110
|
it "complains about unaligned floats" do
|
|
986
1111
|
expect { BinaryAccessor.write(0.0, 17, 32, :FLOAT, @data, :BIG_ENDIAN, :ERROR) }.to raise_error(ArgumentError, "bit_offset 17 is not byte aligned for data_type FLOAT")
|
|
987
1112
|
end
|
|
@@ -999,10 +1124,12 @@ module Cosmos
|
|
|
999
1124
|
end
|
|
1000
1125
|
|
|
1001
1126
|
it "writes 1-bit unsigned integers" do
|
|
1127
|
+
@data[1] = "\x55"
|
|
1002
1128
|
BinaryAccessor.write(0x1, 8, 1, :UINT, @data, :LITTLE_ENDIAN, :ERROR)
|
|
1003
1129
|
BinaryAccessor.write(0x0, 9, 1, :UINT, @data, :LITTLE_ENDIAN, :ERROR)
|
|
1004
1130
|
BinaryAccessor.write(0x1, 10, 1, :UINT, @data, :LITTLE_ENDIAN, :ERROR)
|
|
1005
|
-
|
|
1131
|
+
BinaryAccessor.write(0x0, 11, 1, :INT, @data, :BIG_ENDIAN, :ERROR)
|
|
1132
|
+
expect(@data).to eql("\x00\xA5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
|
|
1006
1133
|
end
|
|
1007
1134
|
|
|
1008
1135
|
it "writes 1-bit signed integers" do
|
|
@@ -1124,6 +1251,16 @@ module Cosmos
|
|
|
1124
1251
|
expect(@data).to eql("\x80\x81\x82\x83\x84\x85\x86\x47\x00\x09\x0A\x0B\x0C\x0D\x0E\x0F")
|
|
1125
1252
|
end
|
|
1126
1253
|
|
|
1254
|
+
it "writes 67-bit unsigned integers" do
|
|
1255
|
+
BinaryAccessor.write(0x0F0E0D0C0B0A0900FF >> 5, 120, 67, :UINT, @data, :LITTLE_ENDIAN, :ERROR)
|
|
1256
|
+
expect(@data).to eql("\x00\x00\x00\x00\x00\x00\x00\xE0\x00\x09\x0A\x0B\x0C\x0D\x0E\x0F")
|
|
1257
|
+
end
|
|
1258
|
+
|
|
1259
|
+
it "writes 67-bit signed integers" do
|
|
1260
|
+
BinaryAccessor.write(0x0F0E0D0C0B0A0900FF >> 5, 120, 67, :INT, @data, :LITTLE_ENDIAN, :ERROR)
|
|
1261
|
+
expect(@data).to eql("\x00\x00\x00\x00\x00\x00\x00\xE0\x00\x09\x0A\x0B\x0C\x0D\x0E\x0F")
|
|
1262
|
+
end
|
|
1263
|
+
|
|
1127
1264
|
it "writes aligned 64-bit unsigned integers" do
|
|
1128
1265
|
expected_array = [0x8786858483828180, 0x0F0E0D0C0B0A0900]
|
|
1129
1266
|
index = 0
|