cosmos 3.5.3 → 3.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.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -1
  3. data/Manifest.txt +3 -0
  4. data/autohotkey/procedures/script_test.rb +4 -0
  5. data/autohotkey/tools/script_runner2.ahk +13 -0
  6. data/cosmos.gemspec +2 -2
  7. data/data/crc.txt +17 -17
  8. data/demo/config/data/crc.txt +10 -7
  9. data/demo/config/targets/INST/cmd_tlm/_ccsds_cmd.txt +9 -0
  10. data/demo/config/targets/INST/cmd_tlm/_ccsds_tlm.txt +19 -0
  11. data/demo/config/targets/INST/cmd_tlm/inst_cmds.txt +19 -84
  12. data/demo/config/targets/INST/cmd_tlm/inst_tlm.txt +27 -110
  13. data/demo/config/tools/table_manager/TLMMonitoringTable_def.txt +3 -220
  14. data/demo/config/tools/tlm_extractor/_adcs_time.txt +2 -0
  15. data/demo/config/tools/tlm_extractor/tlm_extractor.txt +1 -1
  16. data/demo/config/tools/tlm_extractor/tlm_extractor2.txt +1 -1
  17. data/demo/config/tools/tlm_extractor/tlm_extractor3.txt +1 -1
  18. data/demo/config/tools/tlm_extractor/tlm_extractor4.txt +1 -1
  19. data/lib/cosmos/config/config_parser.rb +54 -1
  20. data/lib/cosmos/gui/utilities/script_module_gui.rb +31 -20
  21. data/lib/cosmos/io/json_drb.rb +33 -23
  22. data/lib/cosmos/io/json_drb_object.rb +4 -1
  23. data/lib/cosmos/io/tcpip_server.rb +1 -1
  24. data/lib/cosmos/packets/packet_config.rb +5 -1
  25. data/lib/cosmos/packets/parsers/macro_parser.rb +1 -1
  26. data/lib/cosmos/script/scripting.rb +28 -0
  27. data/lib/cosmos/streams/tcpip_socket_stream.rb +72 -19
  28. data/lib/cosmos/system/target.rb +16 -2
  29. data/lib/cosmos/tools/cmd_sender/cmd_sender.rb +28 -17
  30. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_config.rb +14 -2
  31. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +1 -1
  32. data/lib/cosmos/tools/cmd_tlm_server/gui/packets_tab.rb +27 -20
  33. data/lib/cosmos/tools/cmd_tlm_server/interface_thread.rb +2 -2
  34. data/lib/cosmos/tools/script_runner/script_runner_frame.rb +40 -36
  35. data/lib/cosmos/version.rb +5 -5
  36. data/spec/config/config_parser_spec.rb +1 -1
  37. data/spec/io/json_drb_spec.rb +7 -21
  38. data/spec/packets/packet_config_spec.rb +12 -12
  39. data/spec/packets/parsers/format_string_parser_spec.rb +3 -3
  40. data/spec/packets/parsers/limits_parser_spec.rb +10 -10
  41. data/spec/packets/parsers/limits_response_parser_spec.rb +2 -2
  42. data/spec/packets/parsers/macro_parser_spec.rb +6 -6
  43. data/spec/packets/parsers/packet_parser_spec.rb +1 -1
  44. data/spec/packets/parsers/processor_parser_spec.rb +2 -2
  45. data/spec/packets/parsers/state_parser_spec.rb +1 -1
  46. data/spec/script/scripting_spec.rb +23 -0
  47. data/spec/streams/tcpip_socket_stream_spec.rb +28 -0
  48. data/spec/system/system_spec.rb +20 -20
  49. data/spec/system/target_spec.rb +10 -10
  50. data/spec/tools/cmd_tlm_server/cmd_tlm_server_config_spec.rb +30 -22
  51. metadata +9 -6
@@ -25,224 +25,7 @@ TABLE "TLM Monitoring" "Telemetry Monitoring Table" TWO_DIMENSIONAL BIG_ENDIAN 4
25
25
  STATE UNSIGNED 1
26
26
  STATE SIGNED 2
27
27
 
28
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
29
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
30
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
31
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
32
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
33
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
34
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
35
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
36
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
37
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
38
-
39
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
40
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
41
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
42
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
43
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
44
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
45
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
46
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
47
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
48
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
49
-
50
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
51
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
52
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
53
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
54
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
55
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
56
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
57
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
58
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
59
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
60
-
61
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
62
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
63
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
64
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
65
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
66
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
67
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
68
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
69
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
70
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
71
-
72
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
73
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
74
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
75
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
76
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
77
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
78
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
79
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
80
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
81
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
82
-
83
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
84
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
85
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
86
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
87
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
88
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
89
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
90
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
91
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
92
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
93
-
94
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
95
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
96
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
97
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
98
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
99
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
100
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
101
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
102
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
103
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
104
-
105
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
106
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
107
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
108
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
109
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
110
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
111
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
112
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
113
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
114
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
115
-
116
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
117
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
118
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
119
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
120
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
121
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
122
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
123
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
124
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
125
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
126
-
127
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
128
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
129
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
130
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
131
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
132
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
133
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
134
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
135
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
136
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
137
-
138
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
139
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
140
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
141
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
142
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
143
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
144
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
145
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
146
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
147
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
148
-
149
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
150
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
151
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
152
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
153
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
154
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
155
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
156
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
157
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
158
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
159
-
160
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
161
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
162
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
163
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
164
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
165
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
166
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
167
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
168
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
169
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
170
-
171
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
172
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
173
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
174
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
175
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
176
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
177
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
178
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
179
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
180
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
181
-
182
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
183
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
184
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
185
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
186
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
187
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
188
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
189
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
190
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
191
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
192
-
193
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
194
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
195
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
196
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
197
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
198
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
199
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
200
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
201
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
202
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
203
-
204
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
205
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
206
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
207
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
208
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
209
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
210
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
211
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
212
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
213
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
214
-
215
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
216
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
217
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
218
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
219
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
220
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
221
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
222
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
223
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
224
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
225
-
226
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
227
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
228
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
229
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
230
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
231
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
232
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
233
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
234
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
235
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
236
-
237
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
238
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
239
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
240
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
241
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
242
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
243
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
244
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
245
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
246
- DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
247
-
28
+ <% 200.times do %>
29
+ DEFAULT 0x0 0 BITS 0x0 0 LESS_THAN NO_ACTION_REQUIRED ALL_MODES UNSIGNED
30
+ <% end %>
248
31
 
@@ -0,0 +1,2 @@
1
+ ITEM INST ADCS TIMESECONDS
2
+ ITEM INST ADCS TIMEFORMATTED
@@ -1,4 +1,4 @@
1
- ITEM INST ADCS TIMEFORMATTED
1
+ <%= render "_adcs_time.txt" %>
2
2
  ITEM INST ADCS Q1 RAW
3
3
  ITEM INST ADCS Q1
4
4
  ITEM INST ADCS Q1 FORMATTED
@@ -1,2 +1,2 @@
1
- ITEM INST ADCS TIMEFORMATTED
1
+ <%= render "_adcs_time.txt" %>
2
2
  ITEM INST ADCS Q2 RAW
@@ -1,2 +1,2 @@
1
- ITEM INST ADCS TIMEFORMATTED
1
+ <%= render "_adcs_time.txt" %>
2
2
  ITEM INST ADCS Q3 RAW
@@ -1,2 +1,2 @@
1
- ITEM INST ADCS TIMEFORMATTED
1
+ <%= render "_adcs_time.txt" %>
2
2
  ITEM INST ADCS Q4 RAW
@@ -9,6 +9,7 @@
9
9
  # attribution addendums as found in the LICENSE.txt
10
10
 
11
11
  require 'cosmos/ext/config_parser'
12
+ require 'erb'
12
13
 
13
14
  module Cosmos
14
15
 
@@ -143,6 +144,18 @@ module Cosmos
143
144
  return Error.new(self, message, usage, url)
144
145
  end
145
146
 
147
+ # Called by the ERB template to render a partial
148
+ def render(template_name, options = {})
149
+ b = binding
150
+ if options[:locals]
151
+ options[:locals].each do |key, value|
152
+ eval("#{key} = #{value}", b)
153
+ end
154
+ end
155
+ # Assume the file is there. If not we raise a pretty obvious error
156
+ ERB.new(File.read(File.join(File.dirname(@filename), template_name))).result(b)
157
+ end
158
+
146
159
  # Processes a file and yields |config| to the given block
147
160
  #
148
161
  # @param filename [String] The full name and path of the configuration file
@@ -158,8 +171,15 @@ module Cosmos
158
171
  remove_quotes = true,
159
172
  &block)
160
173
  @filename = filename
161
- file = File.new(@filename, 'r')
174
+ file = nil
175
+ unparsed_data = nil
162
176
  begin
177
+ # Create a temp file where we can write the ERB parsed output
178
+ file = Tempfile.new("parsed_#{File.basename(filename)}")
179
+ unparsed_data = File.read(@filename)
180
+ file.write(ERB.new(unparsed_data).result(binding))
181
+ file.rewind
182
+
163
183
  size = file.stat.size.to_f
164
184
 
165
185
  # Callbacks for beginning of parsing
@@ -173,6 +193,13 @@ module Cosmos
173
193
  size,
174
194
  PARSING_REGEX,
175
195
  &block)
196
+ rescue Exception => e
197
+ debug_file = create_debug_output_file(filename, file, unparsed_data, e)
198
+ if debug_file
199
+ raise e, "#{e}\nDebug output in #{debug_file}", e.backtrace
200
+ else
201
+ raise e
202
+ end
176
203
  ensure
177
204
  file.close unless file.closed?
178
205
  end
@@ -309,6 +336,32 @@ module Cosmos
309
336
 
310
337
  protected
311
338
 
339
+ # Writes the parsed results for debugging if we had an error parsing
340
+ def create_debug_output_file(filename, file, unparsed_data, exception)
341
+ begin
342
+ debug_file = nil
343
+ tmp_folder = File.join(Cosmos::USERPATH, 'outputs', 'tmp')
344
+ tmp_folder = Cosmos::USERPATH unless File.exist?(tmp_folder)
345
+ debug_file = File.join(tmp_folder, "parser_error_#{File.basename(filename)}")
346
+ File.open(debug_file, 'w') do |save_file|
347
+ save_file.puts exception.formatted
348
+ save_file.puts "\nParsed Data (will only be present if parse ran successfully):"
349
+ save_file.puts
350
+ if file
351
+ file.rewind
352
+ save_file.puts file.read
353
+ end
354
+ save_file.puts "\nUnparsed Data:"
355
+ save_file.puts
356
+ save_file.puts unparsed_data if unparsed_data
357
+ end
358
+ rescue Exception
359
+ # Oh well - we tried
360
+ debug_file = nil
361
+ end
362
+ debug_file
363
+ end
364
+
312
365
  # Iterates over each line of the io object and yields the keyword and
313
366
  # parameters
314
367
  #~ def parse_loop(
@@ -71,6 +71,30 @@ module Cosmos
71
71
 
72
72
  @@qt_boolean = Qt::Boolean.new
73
73
 
74
+ def _get_main_thread_gui
75
+ result = nil
76
+ Qt.execute_in_main_thread(true, 0.05) do
77
+ result = yield(get_cmd_tlm_gui_window())
78
+ end
79
+ return result
80
+ end
81
+
82
+ def save_file_dialog(directory = Cosmos::USERPATH, message = "Save File")
83
+ _get_main_thread_gui {|window| Qt::FileDialog.getSaveFileName(window, message, directory) }
84
+ end
85
+
86
+ def open_file_dialog(directory = Cosmos::USERPATH, message = "Open File")
87
+ _get_main_thread_gui {|window| Qt::FileDialog.getOpenFileName(window, message, directory) }
88
+ end
89
+
90
+ def open_files_dialog(directory = Cosmos::USERPATH, message = "Open File(s)")
91
+ _get_main_thread_gui {|window| Qt::FileDialog.getOpenFileNames(window, message, directory) }
92
+ end
93
+
94
+ def open_directory_dialog(directory = Cosmos::USERPATH, message = "Open Directory")
95
+ _get_main_thread_gui {|window| Qt::FileDialog.getExistingDirectory(window, message, directory) }
96
+ end
97
+
74
98
  def ask_string(question, blank_or_default = false, password = false)
75
99
  answer = ''
76
100
  if blank_or_default != true && blank_or_default != false
@@ -82,9 +106,7 @@ module Cosmos
82
106
  end
83
107
  loop do
84
108
  canceled = false
85
- Qt.execute_in_main_thread(true, 0.05) do
86
- window = nil
87
- window = get_cmd_tlm_gui_window() if get_cmd_tlm_gui_window()
109
+ _get_main_thread_gui do |window|
88
110
  # Create a special mutable QT variable that can return what button was pressed
89
111
  if password
90
112
  answer = Qt::InputDialog::getText(window, "Ask", question, Qt::LineEdit::Password, default, @@qt_boolean)
@@ -113,9 +135,7 @@ module Cosmos
113
135
 
114
136
  def prompt_dialog_box(title, message)
115
137
  result = nil
116
- Qt.execute_in_main_thread(true, 0.05) do
117
- window = nil
118
- window = get_cmd_tlm_gui_window() if get_cmd_tlm_gui_window()
138
+ _get_main_thread_gui do |window|
119
139
  msg = Qt::MessageBox.new(window)
120
140
  msg.setIcon(Qt::MessageBox::Warning)
121
141
  msg.setText(message)
@@ -149,9 +169,7 @@ module Cosmos
149
169
  def prompt_to_continue(string)
150
170
  loop do
151
171
  stop = false
152
- Qt.execute_in_main_thread(true, 0.05) do
153
- window = nil
154
- window = get_cmd_tlm_gui_window() if get_cmd_tlm_gui_window()
172
+ _get_main_thread_gui do |window|
155
173
  result = Qt::MessageBox::question(window,
156
174
  "COSMOS",
157
175
  "#{string}\n\nOK to Continue?",
@@ -175,11 +193,8 @@ module Cosmos
175
193
  def prompt_message_box(string, buttons)
176
194
  loop do
177
195
  result = nil
178
- Qt.execute_in_main_thread(true, 0.05) do
179
- window = nil
180
- window = get_cmd_tlm_gui_window() if get_cmd_tlm_gui_window()
196
+ _get_main_thread_gui do |window|
181
197
  msg = Qt::MessageBox.new(window)
182
-
183
198
  msg.setText(string)
184
199
  msg.setWindowTitle("Message Box")
185
200
  buttons.each {|text| msg.addButton(text, Qt::MessageBox::AcceptRole)}
@@ -250,9 +265,7 @@ module Cosmos
250
265
  end
251
266
 
252
267
  def _build_dialog(message)
253
- window = nil
254
- window = get_cmd_tlm_gui_window() if get_cmd_tlm_gui_window()
255
- dialog = Qt::Dialog.new(window)
268
+ dialog = Qt::Dialog.new(get_cmd_tlm_gui_window())
256
269
  dialog.setWindowTitle("Message Box")
257
270
  layout = Qt::VBoxLayout.new
258
271
  layout.setContentsMargins(0,0,0,0)
@@ -300,9 +313,7 @@ module Cosmos
300
313
  def get_scriptrunner_log_message(title_text = "Script Message Log Text Entry", prompt_text = 'Enter text to log to the script message log')
301
314
  answer = ""
302
315
  canceled = false
303
- Qt.execute_in_main_thread(true, 0.05) do
304
- window = nil
305
- window = get_cmd_tlm_gui_window() if get_cmd_tlm_gui_window()
316
+ _get_main_thread_gui do |window|
306
317
  # Create a special mutable QT variable that can return what button was pressed
307
318
  answer = Qt::InputDialog::getText(window, title_text, prompt_text, Qt::LineEdit::Normal, "", @@qt_boolean)
308
319
  # @@qt_boolean is nil if the user presses cancel in the dialog
@@ -316,7 +327,7 @@ module Cosmos
316
327
  end
317
328
  end
318
329
 
319
- def set_cmd_tlm_gui_window (window)
330
+ def set_cmd_tlm_gui_window(window)
320
331
  $cmd_tlm_gui_window = window
321
332
  end
322
333
 
@@ -25,6 +25,7 @@ module Cosmos
25
25
  # methods.
26
26
  class JsonDRb
27
27
  MINIMUM_REQUEST_TIME = 0.0001
28
+ FAST_READ = (RUBY_VERSION > "2.1")
28
29
 
29
30
  @@debug = false
30
31
 
@@ -47,6 +48,7 @@ module Cosmos
47
48
  @request_mutex = Mutex.new
48
49
  @client_sockets = []
49
50
  @client_threads = []
51
+ @client_pipe_writers = []
50
52
  @client_mutex = Mutex.new
51
53
  @thread_reader, @thread_writer = IO.pipe
52
54
  end
@@ -68,6 +70,9 @@ module Cosmos
68
70
  @client_sockets.each do |client_socket|
69
71
  Cosmos.close_socket(client_socket)
70
72
  end
73
+ @client_pipe_writers.each do |client_pipe_writer|
74
+ client_pipe_writer.write('.')
75
+ end
71
76
  client_threads = @client_threads.clone
72
77
  end
73
78
 
@@ -80,6 +85,7 @@ module Cosmos
80
85
  @client_mutex.synchronize do
81
86
  @client_threads.clear
82
87
  @client_sockets.clear
88
+ @client_pipe_writers.clear
83
89
  end
84
90
  end
85
91
 
@@ -95,6 +101,7 @@ module Cosmos
95
101
  # CmdTlmServer.
96
102
  def start_service(hostname = nil, port = nil, object = nil)
97
103
  if hostname and port and object
104
+ @thread_reader, @thread_writer = IO.pipe
98
105
  @object = object
99
106
  hostname = '127.0.0.1'.freeze if (hostname.to_s.upcase == 'LOCALHOST'.freeze)
100
107
 
@@ -125,14 +132,7 @@ module Cosmos
125
132
  rescue Errno::EAGAIN, Errno::ECONNABORTED, Errno::EINTR, Errno::EWOULDBLOCK
126
133
  read_ready, _ = IO.select([@listen_socket, @thread_reader])
127
134
  if read_ready and read_ready.include?(@thread_reader)
128
- begin
129
- # Thread should be killed - Cleanout thread_reader first
130
- # Don't let this break anything else though
131
- @thread_reader.read(1)
132
- rescue Exception
133
- # Oh well - create a clean pipe in case we need one
134
- @thread_reader, @thread_writer = IO.pipe
135
- end
135
+ # Thread should be killed
136
136
  break
137
137
  else
138
138
  retry
@@ -191,9 +191,10 @@ module Cosmos
191
191
  # @param socket [Socket] The socket to the client
192
192
  # @param data [String] Binary data which has already been read from the
193
193
  # socket.
194
+ # @param pipe_reader [IO.pipe] Used to break out of select
194
195
  # @return [String] The request message
195
- def self.receive_message(socket, data)
196
- self.get_at_least_x_bytes_of_data(socket, data, 4)
196
+ def self.receive_message(socket, data, pipe_reader)
197
+ self.get_at_least_x_bytes_of_data(socket, data, 4, pipe_reader)
197
198
  if data.length >= 4
198
199
  length = data[0..3].unpack('N'.freeze)[0]
199
200
  data.replace(data[4..-1])
@@ -201,7 +202,7 @@ module Cosmos
201
202
  return nil
202
203
  end
203
204
 
204
- self.get_at_least_x_bytes_of_data(socket, data, length)
205
+ self.get_at_least_x_bytes_of_data(socket, data, length, pipe_reader)
205
206
  if data.length >= length
206
207
  message = data[0..(length - 1)]
207
208
  data.replace(data[length..-1])
@@ -214,19 +215,24 @@ module Cosmos
214
215
  # @param socket [Socket] The socket to the client
215
216
  # @param current_data [String] Binary data read from the socket
216
217
  # @param required_num_bytes [Integer] The minimum number of bytes to read
218
+ # @param pipe_reader [IO.pipe] Used to break out of select
217
219
  # before returning
218
- def self.get_at_least_x_bytes_of_data(socket, current_data, required_num_bytes)
220
+ def self.get_at_least_x_bytes_of_data(socket, current_data, required_num_bytes, pipe_reader)
219
221
  while (current_data.length < required_num_bytes)
220
- begin
221
- data = socket.recv_nonblock(65535)
222
- if data.length == 0
223
- current_data.replace('')
224
- return
222
+ if FAST_READ
223
+ data = socket.read_nonblock(65535, exception: false)
224
+ raise EOFError, 'end of file reached' unless data
225
+ if data == :wait_readable
226
+ IO.fast_select([socket, pipe_reader], nil, nil, nil)
227
+ else
228
+ current_data << data
229
+ end
230
+ else
231
+ begin
232
+ current_data << socket.read_nonblock(65535)
233
+ rescue IO::WaitReadable
234
+ IO.fast_select([socket, pipe_reader], nil, nil, nil)
225
235
  end
226
- current_data << data
227
- rescue IO::WaitReadable
228
- IO.fast_select([socket], nil, nil, nil)
229
- retry
230
236
  end
231
237
  end
232
238
  end
@@ -278,19 +284,22 @@ module Cosmos
278
284
  socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_KEEPALIVE, 1)
279
285
 
280
286
  Thread.new(socket) do |my_socket|
287
+ pipe_reader, pipe_writer = IO.pipe
281
288
  @client_mutex.synchronize do
282
289
  @client_sockets << my_socket
283
290
  @client_threads << Thread.current
291
+ @client_pipe_writers << pipe_writer
284
292
  end
285
293
 
286
294
  data = ''
295
+
287
296
  begin
288
297
  while true
289
298
  begin
290
- request_data = JsonDRb.receive_message(my_socket, data)
299
+ request_data = JsonDRb.receive_message(my_socket, data, pipe_reader)
291
300
  start_time = Time.now
292
301
  @request_count += 1
293
- rescue Errno::ECONNRESET, Errno::ECONNABORTED, Errno::ENOTSOCK
302
+ rescue Errno::ECONNRESET, Errno::ECONNABORTED, Errno::ENOTSOCK, IOError
294
303
  # Socket was closed
295
304
  break
296
305
  end
@@ -309,6 +318,7 @@ module Cosmos
309
318
  Cosmos.close_socket(my_socket)
310
319
  @client_sockets.delete(my_socket)
311
320
  @client_threads.delete(Thread.current)
321
+ @client_pipe_writers.delete(pipe_writer)
312
322
  end
313
323
  end
314
324
  end