cosmos 3.0.1 → 3.1.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 (912) hide show
  1. checksums.yaml +4 -4
  2. data/.coveralls.yml +1 -0
  3. data/.gitignore +48 -48
  4. data/.travis.yml +7 -7
  5. data/CONTRIBUTING.txt +50 -50
  6. data/Gemfile +6 -6
  7. data/Guardfile +27 -27
  8. data/LICENSE.txt +879 -879
  9. data/Manifest.txt +1116 -1114
  10. data/README.md +109 -107
  11. data/Rakefile +214 -214
  12. data/autohotkey/config/data/diamond.STL +57 -57
  13. data/autohotkey/config/system/system.txt +34 -34
  14. data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  15. data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  16. data/autohotkey/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  17. data/autohotkey/config/targets/COSMOS/target.txt +5 -5
  18. data/autohotkey/config/targets/INST/cmd_tlm/inst_cmds.txt +121 -121
  19. data/autohotkey/config/targets/INST/cmd_tlm/inst_tlm.txt +247 -247
  20. data/autohotkey/config/targets/INST/cmd_tlm_server.txt +5 -5
  21. data/autohotkey/config/targets/INST/lib/example_limits_response.rb +30 -30
  22. data/autohotkey/config/targets/INST/lib/sim_inst.rb +305 -294
  23. data/autohotkey/config/targets/INST/screens/adcs.txt +46 -46
  24. data/autohotkey/config/targets/INST/screens/array.txt +7 -7
  25. data/autohotkey/config/targets/INST/screens/block.txt +8 -8
  26. data/autohotkey/config/targets/INST/screens/commanding.txt +30 -30
  27. data/autohotkey/config/targets/INST/screens/graphs.txt +14 -14
  28. data/autohotkey/config/targets/INST/screens/ground.txt +25 -25
  29. data/autohotkey/config/targets/INST/screens/health_status.txt +33 -33
  30. data/autohotkey/config/targets/INST/screens/hs.txt +49 -49
  31. data/autohotkey/config/targets/INST/screens/image.txt +21 -21
  32. data/autohotkey/config/targets/INST/screens/latest.txt +23 -23
  33. data/autohotkey/config/targets/INST/screens/mech.txt +25 -25
  34. data/autohotkey/config/targets/INST/screens/other.txt +25 -25
  35. data/autohotkey/config/targets/INST/screens/params.txt +25 -25
  36. data/autohotkey/config/targets/INST/screens/tabs.txt +68 -68
  37. data/autohotkey/config/targets/INST/target.txt +26 -26
  38. data/autohotkey/config/targets/META/cmd_tlm/meta_cmd.txt +10 -10
  39. data/autohotkey/config/targets/META/cmd_tlm/meta_tlm.txt +9 -9
  40. data/autohotkey/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
  41. data/autohotkey/config/targets/SYSTEM/screens/error.txt +11 -11
  42. data/autohotkey/config/tools/cmd_tlm_server/cmd_tlm_server.txt +22 -22
  43. data/autohotkey/config/tools/data_viewer/data_viewer.txt +11 -11
  44. data/autohotkey/config/tools/handbook_creator/handbook_creator.txt +49 -49
  45. data/autohotkey/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
  46. data/autohotkey/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  47. data/autohotkey/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  48. data/autohotkey/config/tools/handbook_creator/templates/header.html.erb +25 -25
  49. data/autohotkey/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  50. data/autohotkey/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  51. data/autohotkey/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  52. data/autohotkey/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  53. data/autohotkey/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  54. data/autohotkey/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  55. data/autohotkey/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
  56. data/autohotkey/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  57. data/autohotkey/config/tools/handbook_creator/templates/title.html.erb +1 -1
  58. data/autohotkey/config/tools/launcher/launcher.txt +38 -38
  59. data/autohotkey/config/tools/script_runner/script_runner.txt +3 -3
  60. data/autohotkey/config/tools/table_manager/ConfigTables_def.txt +8 -8
  61. data/autohotkey/config/tools/table_manager/OneDimensionalTable_def.txt +19 -19
  62. data/autohotkey/config/tools/table_manager/TwoDimensionalTable_def.txt +248 -248
  63. data/autohotkey/config/tools/test_runner/test_runner.txt +8 -8
  64. data/autohotkey/config/tools/test_runner/test_runner2.txt +11 -11
  65. data/autohotkey/config/tools/test_runner/test_runner3.txt +6 -6
  66. data/autohotkey/config/tools/test_runner/test_runner4.txt +1 -1
  67. data/autohotkey/config/tools/tlm_extractor/tlm_extractor.txt +13 -13
  68. data/autohotkey/config/tools/tlm_extractor/tlm_extractor2.txt +9 -9
  69. data/autohotkey/config/tools/tlm_grapher/bad.txt +50 -50
  70. data/autohotkey/config/tools/tlm_grapher/temp1-4.txt +51 -51
  71. data/autohotkey/config/tools/tlm_grapher/test2.txt +111 -111
  72. data/autohotkey/config/tools/tlm_viewer/tlm_viewer.txt +24 -24
  73. data/autohotkey/config/tools/tlm_viewer/tlm_viewer2.txt +4 -4
  74. data/autohotkey/config/tools/tlm_viewer/tlm_viewer3.txt +3 -3
  75. data/autohotkey/lib/example_background_task.rb +42 -42
  76. data/autohotkey/lib/user_version.rb +3 -3
  77. data/autohotkey/procedures/clear_util.rb +7 -7
  78. data/autohotkey/procedures/collect.rb +18 -18
  79. data/autohotkey/procedures/collect_util.rb +14 -14
  80. data/autohotkey/procedures/example_test.rb +67 -67
  81. data/autohotkey/procedures/example_test2.rb +74 -74
  82. data/autohotkey/procedures/script_test.rb +17 -17
  83. data/autohotkey/procedures/syntax_error.rb +18 -18
  84. data/autohotkey/tools/CmdExtractorAHK +16 -16
  85. data/autohotkey/tools/CmdSender +14 -14
  86. data/autohotkey/tools/CmdSenderAHK +18 -18
  87. data/autohotkey/tools/CmdTlmServer +14 -14
  88. data/autohotkey/tools/CmdTlmServerAHK +28 -28
  89. data/autohotkey/tools/CmdTlmServerAHK2 +17 -17
  90. data/autohotkey/tools/DataViewer +14 -14
  91. data/autohotkey/tools/DataViewerAHK +17 -17
  92. data/autohotkey/tools/HandbookCreatorAHK +20 -20
  93. data/autohotkey/tools/LauncherAHK +17 -17
  94. data/autohotkey/tools/LimitsMonitorAHK +20 -20
  95. data/autohotkey/tools/OpenGLBuilderAHK +20 -20
  96. data/autohotkey/tools/PacketViewer +14 -14
  97. data/autohotkey/tools/PacketViewerAHK +18 -18
  98. data/autohotkey/tools/PacketViewerAHK2 +17 -17
  99. data/autohotkey/tools/Replay +14 -14
  100. data/autohotkey/tools/Replay.bat +59 -59
  101. data/autohotkey/tools/ReplayAHK +17 -17
  102. data/autohotkey/tools/ScriptRunner +14 -14
  103. data/autohotkey/tools/ScriptRunnerAHK +20 -20
  104. data/autohotkey/tools/ScriptRunnerAHK2 +17 -17
  105. data/autohotkey/tools/TableManager +14 -14
  106. data/autohotkey/tools/TableManagerAHK +30 -30
  107. data/autohotkey/tools/TestRunner +15 -15
  108. data/autohotkey/tools/TestRunnerAHK +17 -17
  109. data/autohotkey/tools/TestRunnerAHK2 +17 -17
  110. data/autohotkey/tools/TestRunnerAHK3 +17 -17
  111. data/autohotkey/tools/TestRunnerAHK4 +17 -17
  112. data/autohotkey/tools/TlmExtractor +15 -15
  113. data/autohotkey/tools/TlmExtractorAHK +19 -19
  114. data/autohotkey/tools/TlmExtractorAHK2 +16 -16
  115. data/autohotkey/tools/TlmExtractorAHK3 +16 -16
  116. data/autohotkey/tools/TlmGrapher +14 -14
  117. data/autohotkey/tools/TlmGrapherAHK +19 -19
  118. data/autohotkey/tools/TlmGrapherAHK2 +23 -23
  119. data/autohotkey/tools/TlmGrapherAHK3 +17 -17
  120. data/autohotkey/tools/TlmGrapherAHK4 +17 -17
  121. data/autohotkey/tools/TlmViewer +14 -14
  122. data/autohotkey/tools/TlmViewerAHK +28 -28
  123. data/autohotkey/tools/TlmViewerAHK2 +18 -18
  124. data/autohotkey/tools/TlmViewerAHK3 +18 -18
  125. data/autohotkey/tools/TlmViewerAHK4 +18 -18
  126. data/autohotkey/tools/TlmViewerAHK5 +18 -18
  127. data/autohotkey/tools/autohotkey.rb +37 -37
  128. data/autohotkey/tools/cmd_extractor.ahk +27 -27
  129. data/autohotkey/tools/cmd_sender.ahk +182 -162
  130. data/autohotkey/tools/cmd_tlm_server.ahk +89 -89
  131. data/autohotkey/tools/cmd_tlm_server2.ahk +45 -45
  132. data/autohotkey/tools/data_viewer.ahk +135 -135
  133. data/autohotkey/tools/handbook_creator.ahk +23 -23
  134. data/autohotkey/tools/launcher.ahk +41 -41
  135. data/autohotkey/tools/limits_monitor.ahk +70 -70
  136. data/autohotkey/tools/open_gl_builder.ahk +134 -134
  137. data/autohotkey/tools/packet_viewer.ahk +143 -143
  138. data/autohotkey/tools/packet_viewer2.ahk +9 -9
  139. data/autohotkey/tools/replay.ahk +98 -98
  140. data/autohotkey/tools/script_runner.ahk +589 -589
  141. data/autohotkey/tools/script_runner2.ahk +34 -31
  142. data/autohotkey/tools/table_manager.ahk +220 -220
  143. data/autohotkey/tools/test_runner.ahk +262 -259
  144. data/autohotkey/tools/test_runner2.ahk +52 -52
  145. data/autohotkey/tools/test_runner3.ahk +13 -13
  146. data/autohotkey/tools/tlm_extractor.ahk +272 -272
  147. data/autohotkey/tools/tlm_grapher.ahk +642 -642
  148. data/autohotkey/tools/tlm_grapher2.ahk +115 -115
  149. data/autohotkey/tools/tlm_grapher3.ahk +24 -24
  150. data/autohotkey/tools/tlm_viewer.ahk +133 -133
  151. data/autohotkey/tools/tlm_viewer2.ahk +50 -49
  152. data/autohotkey/tools/tlm_viewer4.ahk +4 -4
  153. data/autohotkey/tools/tlm_viewer5.ahk +20 -20
  154. data/bin/cosmos +96 -96
  155. data/bin/cstol_converter +1166 -1166
  156. data/bin/rubysloc +85 -85
  157. data/cosmos.gemspec +98 -97
  158. data/data/about.txt +4 -4
  159. data/data/crc.txt +306 -305
  160. data/data/diamond.STL +57 -57
  161. data/data/legal.txt +9 -9
  162. data/demo/Gemfile +6 -6
  163. data/demo/Launcher +15 -15
  164. data/demo/Launcher.bat +59 -59
  165. data/demo/Rakefile +61 -61
  166. data/demo/config/data/crc.txt +222 -206
  167. data/demo/config/data/diamond.STL +57 -57
  168. data/demo/config/data/meta_init.txt +4 -4
  169. data/demo/config/system/system.txt +34 -34
  170. data/demo/config/system/system2.txt +33 -33
  171. data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  172. data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  173. data/demo/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  174. data/demo/config/targets/COSMOS/screens/limits_change.txt +20 -20
  175. data/demo/config/targets/COSMOS/screens/version.txt +19 -19
  176. data/demo/config/targets/COSMOS/target.txt +11 -11
  177. data/demo/config/targets/EXAMPLE/cmd_tlm/example_cmds.txt +2 -2
  178. data/demo/config/targets/EXAMPLE/cmd_tlm/example_tlm.txt +3 -3
  179. data/demo/config/targets/EXAMPLE/cmd_tlm_server.txt +6 -6
  180. data/demo/config/targets/EXAMPLE/lib/example_interface.rb +22 -22
  181. data/demo/config/targets/EXAMPLE/target.txt +6 -6
  182. data/demo/config/targets/INST/cmd_tlm/inst_cmds.txt +121 -121
  183. data/demo/config/targets/INST/cmd_tlm/inst_tlm.txt +247 -247
  184. data/demo/config/targets/INST/cmd_tlm_server.txt +5 -5
  185. data/demo/config/targets/INST/lib/example_limits_response.rb +30 -30
  186. data/demo/config/targets/INST/lib/sim_inst.rb +305 -294
  187. data/demo/config/targets/INST/screens/adcs.txt +46 -46
  188. data/demo/config/targets/INST/screens/array.txt +15 -15
  189. data/demo/config/targets/INST/screens/block.txt +8 -8
  190. data/demo/config/targets/INST/screens/commanding.txt +30 -30
  191. data/demo/config/targets/INST/screens/graphs.txt +14 -14
  192. data/demo/config/targets/INST/screens/ground.txt +25 -25
  193. data/demo/config/targets/INST/screens/hs.txt +44 -44
  194. data/demo/config/targets/INST/screens/latest.txt +23 -23
  195. data/demo/config/targets/INST/screens/other.txt +29 -29
  196. data/demo/config/targets/INST/screens/tabs.txt +70 -70
  197. data/demo/config/targets/INST/target.txt +33 -33
  198. data/demo/config/targets/META/cmd_tlm/meta_cmd.txt +10 -10
  199. data/demo/config/targets/META/cmd_tlm/meta_tlm.txt +13 -13
  200. data/demo/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
  201. data/demo/config/targets/SYSTEM/cmd_tlm/override.txt +29 -29
  202. data/demo/config/targets/SYSTEM/screens/status.txt +12 -12
  203. data/demo/config/targets/TEMPLATED/cmd_tlm/templated_cmds.txt +13 -12
  204. data/demo/config/targets/TEMPLATED/cmd_tlm/templated_tlm.txt +3 -3
  205. data/demo/config/targets/TEMPLATED/cmd_tlm_server.txt +6 -6
  206. data/demo/config/targets/TEMPLATED/lib/templated_interface.rb +54 -48
  207. data/demo/config/targets/TEMPLATED/target.txt +6 -6
  208. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server.txt +33 -33
  209. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server2.txt +29 -29
  210. data/demo/config/tools/data_viewer/data_viewer.txt +11 -11
  211. data/demo/config/tools/handbook_creator/handbook_creator.txt +66 -66
  212. data/demo/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
  213. data/demo/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  214. data/demo/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  215. data/demo/config/tools/handbook_creator/templates/header.html.erb +25 -25
  216. data/demo/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  217. data/demo/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  218. data/demo/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  219. data/demo/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  220. data/demo/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  221. data/demo/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  222. data/demo/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
  223. data/demo/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  224. data/demo/config/tools/handbook_creator/templates/title.html.erb +1 -1
  225. data/demo/config/tools/launcher/launcher.txt +45 -45
  226. data/demo/config/tools/launcher/launcher2.txt +45 -45
  227. data/demo/config/tools/script_runner/script_runner.txt +3 -3
  228. data/demo/config/tools/table_manager/ConfigTables_def.txt +8 -8
  229. data/demo/config/tools/table_manager/ExampleTableDefinition.txt +24 -24
  230. data/demo/config/tools/table_manager/MCConfigurationTable_fsw1_def.txt +25 -25
  231. data/demo/config/tools/table_manager/MCConfigurationTable_fsw2_def.txt +25 -25
  232. data/demo/config/tools/table_manager/PPSSelectionTable_def.txt +8 -8
  233. data/demo/config/tools/table_manager/TLMMonitoringTable_def.txt +248 -248
  234. data/demo/config/tools/test_runner/test_runner.txt +17 -17
  235. data/demo/config/tools/tlm_extractor/tlm_extractor.txt +13 -13
  236. data/demo/config/tools/tlm_extractor/tlm_extractor2.txt +2 -2
  237. data/demo/config/tools/tlm_extractor/tlm_extractor3.txt +2 -2
  238. data/demo/config/tools/tlm_extractor/tlm_extractor4.txt +2 -2
  239. data/demo/config/tools/tlm_viewer/tlm_viewer.txt +41 -41
  240. data/demo/lib/example_background_task.rb +57 -52
  241. data/demo/lib/example_target.rb +113 -108
  242. data/demo/lib/scpi_target.rb +74 -74
  243. data/demo/lib/user_version.rb +3 -3
  244. data/demo/procedures/checks.rb +11 -11
  245. data/demo/procedures/clear_util.rb +7 -7
  246. data/demo/procedures/collect.rb +18 -18
  247. data/demo/procedures/collect_util.rb +14 -14
  248. data/demo/procedures/cosmos_api_test.rb +293 -293
  249. data/demo/procedures/disconnect.rb +29 -29
  250. data/demo/procedures/example_test.rb +182 -182
  251. data/demo/procedures/plot_test.rb +8 -8
  252. data/demo/procedures/run_example_test.rb +3 -3
  253. data/demo/procedures/test.rb +51 -51
  254. data/demo/tools/CmdExtractor +15 -15
  255. data/demo/tools/CmdExtractor.bat +59 -59
  256. data/demo/tools/CmdSender +15 -15
  257. data/demo/tools/CmdSender.bat +59 -59
  258. data/demo/tools/CmdTlmServer +15 -15
  259. data/demo/tools/CmdTlmServer.bat +59 -59
  260. data/demo/tools/DataViewer +15 -15
  261. data/demo/tools/DataViewer.bat +59 -59
  262. data/demo/tools/ExampleTarget +15 -15
  263. data/demo/tools/ExampleTarget.bat +59 -59
  264. data/demo/tools/HandbookCreator +15 -15
  265. data/demo/tools/HandbookCreator.bat +61 -61
  266. data/demo/tools/Launcher +15 -15
  267. data/demo/tools/Launcher.bat +59 -59
  268. data/demo/tools/LimitsMonitor +15 -15
  269. data/demo/tools/LimitsMonitor.bat +59 -59
  270. data/demo/tools/OpenGLBuilder +15 -15
  271. data/demo/tools/OpenGLBuilder.bat +59 -59
  272. data/demo/tools/PacketViewer +15 -15
  273. data/demo/tools/PacketViewer.bat +59 -59
  274. data/demo/tools/Replay +15 -15
  275. data/demo/tools/Replay.bat +59 -59
  276. data/demo/tools/ScpiTarget +15 -15
  277. data/demo/tools/ScpiTarget.bat +59 -59
  278. data/demo/tools/ScriptRunner +15 -15
  279. data/demo/tools/ScriptRunner.bat +59 -59
  280. data/demo/tools/TableManager +15 -15
  281. data/demo/tools/TableManager.bat +59 -59
  282. data/demo/tools/TestRunner +15 -15
  283. data/demo/tools/TestRunner.bat +59 -59
  284. data/demo/tools/TlmExtractor +15 -15
  285. data/demo/tools/TlmExtractor.bat +59 -59
  286. data/demo/tools/TlmGrapher +15 -15
  287. data/demo/tools/TlmGrapher.bat +59 -59
  288. data/demo/tools/TlmViewer +15 -15
  289. data/demo/tools/TlmViewer.bat +59 -59
  290. data/demo/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
  291. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +15 -15
  292. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +6 -6
  293. data/demo/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
  294. data/demo/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +15 -15
  295. data/demo/tools/mac/CmdSender.app/Contents/MacOS/main.sh +6 -6
  296. data/demo/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
  297. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +15 -15
  298. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +6 -6
  299. data/demo/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
  300. data/demo/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +15 -15
  301. data/demo/tools/mac/DataViewer.app/Contents/MacOS/main.sh +6 -6
  302. data/demo/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
  303. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +15 -15
  304. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +6 -6
  305. data/demo/tools/mac/Launcher.app/Contents/Info.plist +38 -38
  306. data/demo/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +15 -15
  307. data/demo/tools/mac/Launcher.app/Contents/MacOS/main.sh +6 -6
  308. data/demo/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
  309. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +15 -15
  310. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +6 -6
  311. data/demo/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
  312. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +15 -15
  313. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +6 -6
  314. data/demo/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
  315. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +15 -15
  316. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +6 -6
  317. data/demo/tools/mac/Replay.app/Contents/Info.plist +38 -38
  318. data/demo/tools/mac/Replay.app/Contents/MacOS/Replay.rb +15 -15
  319. data/demo/tools/mac/Replay.app/Contents/MacOS/main.sh +6 -6
  320. data/demo/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
  321. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +15 -15
  322. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +6 -6
  323. data/demo/tools/mac/TableManager.app/Contents/Info.plist +38 -38
  324. data/demo/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +15 -15
  325. data/demo/tools/mac/TableManager.app/Contents/MacOS/main.sh +6 -6
  326. data/demo/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
  327. data/demo/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +15 -15
  328. data/demo/tools/mac/TestRunner.app/Contents/MacOS/main.sh +6 -6
  329. data/demo/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
  330. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +15 -15
  331. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +6 -6
  332. data/demo/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
  333. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +15 -15
  334. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +6 -6
  335. data/demo/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
  336. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +15 -15
  337. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +6 -6
  338. data/ext/cosmos/ext/array/array.c +111 -111
  339. data/ext/cosmos/ext/array/extconf.rb +13 -13
  340. data/ext/cosmos/ext/buffered_file/buffered_file.c +167 -167
  341. data/ext/cosmos/ext/buffered_file/extconf.rb +13 -13
  342. data/ext/cosmos/ext/config_parser/config_parser.c +237 -237
  343. data/ext/cosmos/ext/config_parser/extconf.rb +13 -13
  344. data/ext/cosmos/ext/cosmos_io/cosmos_io.c +117 -117
  345. data/ext/cosmos/ext/cosmos_io/extconf.rb +13 -13
  346. data/ext/cosmos/ext/crc/crc.c +341 -341
  347. data/ext/cosmos/ext/crc/extconf.rb +12 -12
  348. data/ext/cosmos/ext/line_graph/extconf.rb +13 -13
  349. data/ext/cosmos/ext/line_graph/line_graph.c +501 -501
  350. data/ext/cosmos/ext/low_fragmentation_array/extconf.rb +12 -12
  351. data/ext/cosmos/ext/low_fragmentation_array/low_fragmentation_array.c +261 -261
  352. data/ext/cosmos/ext/packet/extconf.rb +13 -13
  353. data/ext/cosmos/ext/packet/packet.c +339 -339
  354. data/ext/cosmos/ext/platform/extconf.rb +13 -13
  355. data/ext/cosmos/ext/platform/platform.c +81 -81
  356. data/ext/cosmos/ext/polynomial_conversion/extconf.rb +13 -13
  357. data/ext/cosmos/ext/polynomial_conversion/polynomial_conversion.c +73 -73
  358. data/ext/cosmos/ext/string/extconf.rb +13 -13
  359. data/ext/cosmos/ext/string/string.c +49 -49
  360. data/ext/cosmos/ext/structure/structure.c +894 -894
  361. data/ext/cosmos/ext/tabbed_plots_config/extconf.rb +13 -13
  362. data/ext/cosmos/ext/tabbed_plots_config/tabbed_plots_config.c +51 -51
  363. data/ext/cosmos/ext/telemetry/extconf.rb +13 -13
  364. data/ext/cosmos/ext/telemetry/telemetry.c +306 -306
  365. data/ext/mkrf_conf.rb +40 -40
  366. data/install/Gemfile +6 -6
  367. data/install/Launcher +14 -14
  368. data/install/Launcher.bat +59 -59
  369. data/install/Rakefile +61 -61
  370. data/install/config/data/crc.txt +134 -133
  371. data/install/config/system/system.txt +29 -29
  372. data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  373. data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  374. data/install/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  375. data/install/config/targets/COSMOS/screens/limits_change.txt +20 -20
  376. data/install/config/targets/COSMOS/screens/version.txt +19 -19
  377. data/install/config/targets/COSMOS/target.txt +8 -8
  378. data/install/config/tools/cmd_tlm_server/cmd_tlm_server.txt +2 -2
  379. data/install/config/tools/data_viewer/data_viewer.txt +3 -3
  380. data/install/config/tools/handbook_creator/handbook_creator.txt +49 -49
  381. data/install/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
  382. data/install/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  383. data/install/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  384. data/install/config/tools/handbook_creator/templates/header.html.erb +25 -25
  385. data/install/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  386. data/install/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  387. data/install/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  388. data/install/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  389. data/install/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  390. data/install/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  391. data/install/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
  392. data/install/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  393. data/install/config/tools/handbook_creator/templates/title.html.erb +1 -1
  394. data/install/config/tools/launcher/launcher.txt +39 -39
  395. data/install/config/tools/script_runner/script_runner.txt +3 -3
  396. data/install/config/tools/test_runner/test_runner.txt +8 -8
  397. data/install/config/tools/tlm_viewer/tlm_viewer.txt +5 -5
  398. data/install/lib/user_version.rb +3 -3
  399. data/install/tools/CmdExtractor +15 -15
  400. data/install/tools/CmdExtractor.bat +59 -59
  401. data/install/tools/CmdSender +15 -15
  402. data/install/tools/CmdSender.bat +59 -59
  403. data/install/tools/CmdTlmServer +15 -15
  404. data/install/tools/CmdTlmServer.bat +59 -59
  405. data/install/tools/DataViewer +15 -15
  406. data/install/tools/DataViewer.bat +59 -59
  407. data/install/tools/HandbookCreator +15 -15
  408. data/install/tools/HandbookCreator.bat +61 -61
  409. data/install/tools/Launcher +15 -15
  410. data/install/tools/Launcher.bat +59 -59
  411. data/install/tools/LimitsMonitor +15 -15
  412. data/install/tools/LimitsMonitor.bat +59 -59
  413. data/install/tools/OpenGLBuilder +15 -15
  414. data/install/tools/OpenGLBuilder.bat +59 -59
  415. data/install/tools/PacketViewer +15 -15
  416. data/install/tools/PacketViewer.bat +59 -59
  417. data/install/tools/Replay +15 -15
  418. data/install/tools/Replay.bat +59 -59
  419. data/install/tools/ScriptRunner +15 -15
  420. data/install/tools/ScriptRunner.bat +59 -59
  421. data/install/tools/TableManager +15 -15
  422. data/install/tools/TableManager.bat +59 -59
  423. data/install/tools/TestRunner +15 -15
  424. data/install/tools/TestRunner.bat +59 -59
  425. data/install/tools/TlmExtractor +15 -15
  426. data/install/tools/TlmExtractor.bat +59 -59
  427. data/install/tools/TlmGrapher +15 -15
  428. data/install/tools/TlmGrapher.bat +59 -59
  429. data/install/tools/TlmViewer +15 -15
  430. data/install/tools/TlmViewer.bat +59 -59
  431. data/install/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
  432. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +15 -15
  433. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +6 -6
  434. data/install/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
  435. data/install/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +15 -15
  436. data/install/tools/mac/CmdSender.app/Contents/MacOS/main.sh +6 -6
  437. data/install/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
  438. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +15 -15
  439. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +6 -6
  440. data/install/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
  441. data/install/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +15 -15
  442. data/install/tools/mac/DataViewer.app/Contents/MacOS/main.sh +6 -6
  443. data/install/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
  444. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +15 -15
  445. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +6 -6
  446. data/install/tools/mac/Launcher.app/Contents/Info.plist +38 -38
  447. data/install/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +15 -15
  448. data/install/tools/mac/Launcher.app/Contents/MacOS/main.sh +6 -6
  449. data/install/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
  450. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +15 -15
  451. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +6 -6
  452. data/install/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
  453. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +15 -15
  454. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +6 -6
  455. data/install/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
  456. data/install/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +15 -15
  457. data/install/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +6 -6
  458. data/install/tools/mac/Replay.app/Contents/Info.plist +38 -38
  459. data/install/tools/mac/Replay.app/Contents/MacOS/Replay.rb +15 -15
  460. data/install/tools/mac/Replay.app/Contents/MacOS/main.sh +6 -6
  461. data/install/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
  462. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +15 -15
  463. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +6 -6
  464. data/install/tools/mac/TableManager.app/Contents/Info.plist +38 -38
  465. data/install/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +15 -15
  466. data/install/tools/mac/TableManager.app/Contents/MacOS/main.sh +6 -6
  467. data/install/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
  468. data/install/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +15 -15
  469. data/install/tools/mac/TestRunner.app/Contents/MacOS/main.sh +6 -6
  470. data/install/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
  471. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +15 -15
  472. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +6 -6
  473. data/install/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
  474. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +15 -15
  475. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +6 -6
  476. data/install/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
  477. data/install/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +15 -15
  478. data/install/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +6 -6
  479. data/lib/cosmos.rb +63 -63
  480. data/lib/cosmos/ccsds/ccsds_packet.rb +63 -63
  481. data/lib/cosmos/ccsds/ccsds_parser.rb +143 -143
  482. data/lib/cosmos/config/config_parser.rb +324 -324
  483. data/lib/cosmos/conversions.rb +13 -13
  484. data/lib/cosmos/conversions/conversion.rb +47 -47
  485. data/lib/cosmos/conversions/generic_conversion.rb +55 -55
  486. data/lib/cosmos/conversions/new_packet_log_conversion.rb +45 -45
  487. data/lib/cosmos/conversions/polynomial_conversion.rb +57 -57
  488. data/lib/cosmos/conversions/processor_conversion.rb +46 -46
  489. data/lib/cosmos/conversions/received_count_conversion.rb +33 -33
  490. data/lib/cosmos/conversions/received_time_formatted_conversion.rb +37 -37
  491. data/lib/cosmos/conversions/received_time_seconds_conversion.rb +37 -37
  492. data/lib/cosmos/conversions/segmented_polynomial_conversion.rb +128 -128
  493. data/lib/cosmos/conversions/unix_time_conversion.rb +50 -50
  494. data/lib/cosmos/conversions/unix_time_formatted_conversion.rb +44 -44
  495. data/lib/cosmos/conversions/unix_time_seconds_conversion.rb +44 -44
  496. data/lib/cosmos/core_ext.rb +18 -18
  497. data/lib/cosmos/core_ext/array.rb +354 -354
  498. data/lib/cosmos/core_ext/class.rb +51 -51
  499. data/lib/cosmos/core_ext/cosmos_io.rb +29 -29
  500. data/lib/cosmos/core_ext/exception.rb +52 -52
  501. data/lib/cosmos/core_ext/file.rb +75 -75
  502. data/lib/cosmos/core_ext/hash.rb +28 -28
  503. data/lib/cosmos/core_ext/io.rb +75 -75
  504. data/lib/cosmos/core_ext/kernel.rb +38 -38
  505. data/lib/cosmos/core_ext/math.rb +119 -119
  506. data/lib/cosmos/core_ext/matrix.rb +146 -146
  507. data/lib/cosmos/core_ext/objectspace.rb +29 -29
  508. data/lib/cosmos/core_ext/range.rb +22 -22
  509. data/lib/cosmos/core_ext/socket.rb +32 -32
  510. data/lib/cosmos/core_ext/string.rb +310 -310
  511. data/lib/cosmos/core_ext/stringio.rb +24 -24
  512. data/lib/cosmos/core_ext/time.rb +446 -446
  513. data/lib/cosmos/gui/choosers/combobox_chooser.rb +130 -130
  514. data/lib/cosmos/gui/choosers/file_chooser.rb +68 -68
  515. data/lib/cosmos/gui/choosers/float_chooser.rb +82 -82
  516. data/lib/cosmos/gui/choosers/integer_chooser.rb +80 -80
  517. data/lib/cosmos/gui/choosers/string_chooser.rb +53 -53
  518. data/lib/cosmos/gui/choosers/telemetry_chooser.rb +317 -317
  519. data/lib/cosmos/gui/dialogs/about_dialog.rb +128 -128
  520. data/lib/cosmos/gui/dialogs/calendar_dialog.rb +136 -136
  521. data/lib/cosmos/gui/dialogs/cmd_details_dialog.rb +52 -52
  522. data/lib/cosmos/gui/dialogs/cmd_tlm_raw_dialog.rb +149 -149
  523. data/lib/cosmos/gui/dialogs/details_dialog.rb +174 -174
  524. data/lib/cosmos/gui/dialogs/exception_dialog.rb +97 -97
  525. data/lib/cosmos/gui/dialogs/exception_list_dialog.rb +59 -59
  526. data/lib/cosmos/gui/dialogs/find_replace_dialog.rb +196 -196
  527. data/lib/cosmos/gui/dialogs/legal_dialog.rb +169 -168
  528. data/lib/cosmos/gui/dialogs/packet_log_dialog.rb +118 -118
  529. data/lib/cosmos/gui/dialogs/progress_dialog.rb +270 -262
  530. data/lib/cosmos/gui/dialogs/pry_dialog.rb +165 -161
  531. data/lib/cosmos/gui/dialogs/scroll_text_dialog.rb +37 -37
  532. data/lib/cosmos/gui/dialogs/select_dialog.rb +54 -54
  533. data/lib/cosmos/gui/dialogs/set_tlm_dialog.rb +131 -131
  534. data/lib/cosmos/gui/dialogs/splash.rb +113 -113
  535. data/lib/cosmos/gui/dialogs/tlm_details_dialog.rb +206 -206
  536. data/lib/cosmos/gui/dialogs/tlm_edit_dialog.rb +81 -81
  537. data/lib/cosmos/gui/line_graph/line_graph.rb +456 -456
  538. data/lib/cosmos/gui/line_graph/line_graph_dialog.rb +34 -34
  539. data/lib/cosmos/gui/line_graph/line_graph_drawing.rb +494 -494
  540. data/lib/cosmos/gui/line_graph/line_graph_popups.rb +116 -116
  541. data/lib/cosmos/gui/line_graph/line_graph_scaling.rb +460 -460
  542. data/lib/cosmos/gui/line_graph/line_graph_script.rb +26 -26
  543. data/lib/cosmos/gui/line_graph/lines.rb +290 -290
  544. data/lib/cosmos/gui/line_graph/overview_graph.rb +459 -459
  545. data/lib/cosmos/gui/opengl/earth_model.rb +22 -22
  546. data/lib/cosmos/gui/opengl/gl_bounds.rb +67 -67
  547. data/lib/cosmos/gui/opengl/gl_light.rb +39 -39
  548. data/lib/cosmos/gui/opengl/gl_material.rb +29 -29
  549. data/lib/cosmos/gui/opengl/gl_scene.rb +72 -72
  550. data/lib/cosmos/gui/opengl/gl_shape.rb +146 -146
  551. data/lib/cosmos/gui/opengl/gl_viewer.rb +724 -712
  552. data/lib/cosmos/gui/opengl/gl_viewport.rb +35 -35
  553. data/lib/cosmos/gui/opengl/moon_model.rb +22 -22
  554. data/lib/cosmos/gui/opengl/opengl.rb +8 -8
  555. data/lib/cosmos/gui/opengl/stl_reader.rb +211 -211
  556. data/lib/cosmos/gui/opengl/stl_shape.rb +124 -124
  557. data/lib/cosmos/gui/opengl/texture_mapped_sphere.rb +202 -202
  558. data/lib/cosmos/gui/qt.rb +813 -786
  559. data/lib/cosmos/gui/qt_tool.rb +378 -373
  560. data/lib/cosmos/gui/text/completion.rb +381 -381
  561. data/lib/cosmos/gui/text/completion_line_edit.rb +30 -30
  562. data/lib/cosmos/gui/text/completion_text_edit.rb +179 -179
  563. data/lib/cosmos/gui/text/ruby_editor.rb +395 -395
  564. data/lib/cosmos/gui/utilities/screenshot.rb +25 -25
  565. data/lib/cosmos/gui/utilities/script_module_gui.rb +203 -203
  566. data/lib/cosmos/gui/widgets/full_text_search_line_edit.rb +161 -161
  567. data/lib/cosmos/gui/widgets/packet_log_frame.rb +305 -305
  568. data/lib/cosmos/gui/widgets/realtime_button_bar.rb +98 -98
  569. data/lib/cosmos/interfaces.rb +11 -11
  570. data/lib/cosmos/interfaces/cmd_tlm_server_interface.rb +153 -149
  571. data/lib/cosmos/interfaces/interface.rb +213 -213
  572. data/lib/cosmos/interfaces/linc_interface.rb +360 -360
  573. data/lib/cosmos/interfaces/serial_interface.rb +76 -76
  574. data/lib/cosmos/interfaces/simulated_target_interface.rb +129 -128
  575. data/lib/cosmos/interfaces/stream_interface.rb +156 -156
  576. data/lib/cosmos/interfaces/tcpip_client_interface.rb +60 -60
  577. data/lib/cosmos/interfaces/tcpip_server_interface.rb +154 -154
  578. data/lib/cosmos/interfaces/udp_interface.rb +173 -173
  579. data/lib/cosmos/io/buffered_file.rb +11 -11
  580. data/lib/cosmos/io/cosmos_snmp.rb +50 -50
  581. data/lib/cosmos/io/io_multiplexer.rb +89 -89
  582. data/lib/cosmos/io/json_drb.rb +344 -320
  583. data/lib/cosmos/io/json_drb_object.rb +137 -137
  584. data/lib/cosmos/io/json_rpc.rb +365 -365
  585. data/lib/cosmos/io/posix_serial_driver.rb +145 -145
  586. data/lib/cosmos/io/raw_logger.rb +174 -174
  587. data/lib/cosmos/io/raw_logger_pair.rb +71 -71
  588. data/lib/cosmos/io/serial_driver.rb +85 -85
  589. data/lib/cosmos/io/stderr.rb +36 -36
  590. data/lib/cosmos/io/stdout.rb +36 -36
  591. data/lib/cosmos/io/tcpip_server.rb +583 -532
  592. data/lib/cosmos/io/udp_sockets.rb +152 -152
  593. data/lib/cosmos/io/win32_serial_driver.rb +147 -147
  594. data/lib/cosmos/packet_logs.rb +6 -6
  595. data/lib/cosmos/packet_logs/meta_packet_log_writer.rb +107 -107
  596. data/lib/cosmos/packet_logs/packet_log_reader.rb +441 -439
  597. data/lib/cosmos/packet_logs/packet_log_writer.rb +321 -309
  598. data/lib/cosmos/packet_logs/packet_log_writer_pair.rb +30 -30
  599. data/lib/cosmos/packets/binary_accessor.rb +921 -921
  600. data/lib/cosmos/packets/commands.rb +291 -291
  601. data/lib/cosmos/packets/limits.rb +263 -263
  602. data/lib/cosmos/packets/limits_response.rb +38 -38
  603. data/lib/cosmos/packets/packet.rb +714 -699
  604. data/lib/cosmos/packets/packet_config.rb +1034 -1034
  605. data/lib/cosmos/packets/packet_item.rb +317 -317
  606. data/lib/cosmos/packets/packet_item_limits.rb +128 -128
  607. data/lib/cosmos/packets/structure.rb +421 -386
  608. data/lib/cosmos/packets/structure_item.rb +233 -233
  609. data/lib/cosmos/packets/telemetry.rb +317 -317
  610. data/lib/cosmos/processors.rb +6 -6
  611. data/lib/cosmos/processors/new_packet_log_processor.rb +34 -34
  612. data/lib/cosmos/processors/processor.rb +71 -71
  613. data/lib/cosmos/processors/statistics_processor.rb +65 -65
  614. data/lib/cosmos/processors/watermark_processor.rb +44 -44
  615. data/lib/cosmos/script.rb +9 -9
  616. data/lib/cosmos/script/extract.rb +115 -115
  617. data/lib/cosmos/script/script.rb +1513 -1493
  618. data/lib/cosmos/streams/burst_stream_protocol.rb +25 -25
  619. data/lib/cosmos/streams/fixed_stream_protocol.rb +111 -111
  620. data/lib/cosmos/streams/length_stream_protocol.rb +140 -140
  621. data/lib/cosmos/streams/preidentified_stream_protocol.rb +118 -118
  622. data/lib/cosmos/streams/serial_stream.rb +152 -143
  623. data/lib/cosmos/streams/stream.rb +57 -57
  624. data/lib/cosmos/streams/stream_protocol.rb +369 -369
  625. data/lib/cosmos/streams/tcpip_client_stream.rb +77 -77
  626. data/lib/cosmos/streams/tcpip_socket_stream.rb +139 -139
  627. data/lib/cosmos/streams/template_stream_protocol.rb +140 -140
  628. data/lib/cosmos/streams/terminated_stream_protocol.rb +81 -81
  629. data/lib/cosmos/system.rb +4 -4
  630. data/lib/cosmos/system/system.rb +558 -558
  631. data/lib/cosmos/system/target.rb +178 -178
  632. data/lib/cosmos/tools/cmd_extractor/cmd_extractor.rb +254 -253
  633. data/lib/cosmos/tools/cmd_sender/cmd_sender.rb +716 -716
  634. data/lib/cosmos/tools/cmd_sender/cmd_sender_item_delegate.rb +77 -77
  635. data/lib/cosmos/tools/cmd_sender/cmd_sender_text_edit.rb +70 -70
  636. data/lib/cosmos/tools/cmd_tlm_server/api.rb +936 -940
  637. data/lib/cosmos/tools/cmd_tlm_server/background_task.rb +46 -46
  638. data/lib/cosmos/tools/cmd_tlm_server/background_tasks.rb +67 -63
  639. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +511 -497
  640. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_config.rb +241 -241
  641. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +1033 -1008
  642. data/lib/cosmos/tools/cmd_tlm_server/commanding.rb +112 -112
  643. data/lib/cosmos/tools/cmd_tlm_server/connections.rb +176 -176
  644. data/lib/cosmos/tools/cmd_tlm_server/interface_thread.rb +241 -221
  645. data/lib/cosmos/tools/cmd_tlm_server/interfaces.rb +127 -127
  646. data/lib/cosmos/tools/cmd_tlm_server/packet_logging.rb +132 -132
  647. data/lib/cosmos/tools/cmd_tlm_server/router_thread.rb +66 -66
  648. data/lib/cosmos/tools/cmd_tlm_server/routers.rb +97 -97
  649. data/lib/cosmos/tools/data_viewer/data_viewer.rb +628 -600
  650. data/lib/cosmos/tools/data_viewer/data_viewer_component.rb +167 -167
  651. data/lib/cosmos/tools/data_viewer/dump_component.rb +40 -40
  652. data/lib/cosmos/tools/handbook_creator/handbook_creator.rb +149 -149
  653. data/lib/cosmos/tools/handbook_creator/handbook_creator_config.rb +360 -360
  654. data/lib/cosmos/tools/launcher/launcher.rb +184 -184
  655. data/lib/cosmos/tools/launcher/launcher_config.rb +175 -167
  656. data/lib/cosmos/tools/launcher/launcher_multitool.rb +40 -41
  657. data/lib/cosmos/tools/launcher/launcher_tool.rb +104 -104
  658. data/lib/cosmos/tools/limits_monitor/limits_monitor.rb +796 -768
  659. data/lib/cosmos/tools/opengl_builder/opengl_builder.rb +416 -416
  660. data/lib/cosmos/tools/opengl_builder/scene_config.rb +118 -118
  661. data/lib/cosmos/tools/packet_viewer/packet_viewer.rb +525 -525
  662. data/lib/cosmos/tools/replay/replay.rb +495 -488
  663. data/lib/cosmos/tools/replay/replay_server.rb +91 -91
  664. data/lib/cosmos/tools/script_runner/script_audit.rb +147 -139
  665. data/lib/cosmos/tools/script_runner/script_runner.rb +914 -914
  666. data/lib/cosmos/tools/script_runner/script_runner_config.rb +40 -40
  667. data/lib/cosmos/tools/script_runner/script_runner_frame.rb +1892 -1859
  668. data/lib/cosmos/tools/table_manager/table.rb +70 -70
  669. data/lib/cosmos/tools/table_manager/table_config.rb +764 -764
  670. data/lib/cosmos/tools/table_manager/table_item.rb +74 -74
  671. data/lib/cosmos/tools/table_manager/table_manager.rb +1065 -1065
  672. data/lib/cosmos/tools/table_manager/table_manager_core.rb +539 -539
  673. data/lib/cosmos/tools/test_runner/results_writer.rb +283 -283
  674. data/lib/cosmos/tools/test_runner/test.rb +480 -480
  675. data/lib/cosmos/tools/test_runner/test_runner.rb +1157 -1157
  676. data/lib/cosmos/tools/test_runner/test_runner_chooser.rb +338 -338
  677. data/lib/cosmos/tools/tlm_extractor/text_item_chooser.rb +60 -60
  678. data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +1008 -1008
  679. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_config.rb +371 -371
  680. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_processor.rb +60 -60
  681. data/lib/cosmos/tools/tlm_grapher/data_object_adders/housekeeping_data_object_adder.rb +75 -75
  682. data/lib/cosmos/tools/tlm_grapher/data_object_adders/singlexy_data_object_adder.rb +44 -44
  683. data/lib/cosmos/tools/tlm_grapher/data_object_adders/xy_data_object_adder.rb +94 -94
  684. data/lib/cosmos/tools/tlm_grapher/data_object_editors/data_object_editor.rb +61 -61
  685. data/lib/cosmos/tools/tlm_grapher/data_object_editors/housekeeping_data_object_editor.rb +180 -180
  686. data/lib/cosmos/tools/tlm_grapher/data_object_editors/linegraph_data_object_editor.rb +141 -141
  687. data/lib/cosmos/tools/tlm_grapher/data_object_editors/singlexy_data_object_editor.rb +30 -30
  688. data/lib/cosmos/tools/tlm_grapher/data_object_editors/xy_data_object_editor.rb +173 -173
  689. data/lib/cosmos/tools/tlm_grapher/data_objects/data_object.rb +177 -177
  690. data/lib/cosmos/tools/tlm_grapher/data_objects/housekeeping_data_object.rb +412 -409
  691. data/lib/cosmos/tools/tlm_grapher/data_objects/linegraph_data_object.rb +176 -176
  692. data/lib/cosmos/tools/tlm_grapher/data_objects/singlexy_data_object.rb +25 -25
  693. data/lib/cosmos/tools/tlm_grapher/data_objects/xy_data_object.rb +323 -320
  694. data/lib/cosmos/tools/tlm_grapher/plot_editors/linegraph_plot_editor.rb +181 -181
  695. data/lib/cosmos/tools/tlm_grapher/plot_editors/plot_editor.rb +28 -28
  696. data/lib/cosmos/tools/tlm_grapher/plot_editors/singlexy_plot_editor.rb +30 -30
  697. data/lib/cosmos/tools/tlm_grapher/plot_editors/xy_plot_editor.rb +59 -59
  698. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/linegraph_plot_gui_object.rb +172 -172
  699. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/singlexy_plot_gui_object.rb +27 -27
  700. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/xy_plot_gui_object.rb +74 -74
  701. data/lib/cosmos/tools/tlm_grapher/plots/linegraph_plot.rb +201 -201
  702. data/lib/cosmos/tools/tlm_grapher/plots/plot.rb +69 -69
  703. data/lib/cosmos/tools/tlm_grapher/plots/singlexy_plot.rb +20 -20
  704. data/lib/cosmos/tools/tlm_grapher/plots/xy_plot.rb +61 -61
  705. data/lib/cosmos/tools/tlm_grapher/tabbed_plots/overview_tabbed_plots.rb +1278 -1278
  706. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_config.rb +430 -430
  707. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_data_object_editor.rb +107 -107
  708. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_logfile_thread.rb +111 -95
  709. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_plot_editor.rb +101 -101
  710. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_realtime_thread.rb +72 -66
  711. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tab.rb +57 -57
  712. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tool.rb +1004 -1004
  713. data/lib/cosmos/tools/tlm_grapher/tlm_grapher.rb +87 -87
  714. data/lib/cosmos/tools/tlm_viewer/screen.rb +486 -458
  715. data/lib/cosmos/tools/tlm_viewer/tlm_viewer.rb +563 -544
  716. data/lib/cosmos/tools/tlm_viewer/tlm_viewer_config.rb +287 -287
  717. data/lib/cosmos/tools/tlm_viewer/widgets.rb +53 -53
  718. data/lib/cosmos/tools/tlm_viewer/widgets/aging_widget.rb +110 -110
  719. data/lib/cosmos/tools/tlm_viewer/widgets/array_widget.rb +70 -70
  720. data/lib/cosmos/tools/tlm_viewer/widgets/block_widget.rb +61 -61
  721. data/lib/cosmos/tools/tlm_viewer/widgets/button_widget.rb +39 -39
  722. data/lib/cosmos/tools/tlm_viewer/widgets/canvas_widget.rb +62 -62
  723. data/lib/cosmos/tools/tlm_viewer/widgets/canvasimage_widget.rb +41 -41
  724. data/lib/cosmos/tools/tlm_viewer/widgets/canvasimagevalue_widget.rb +57 -57
  725. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabel_widget.rb +37 -37
  726. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabelvalue_widget.rb +56 -56
  727. data/lib/cosmos/tools/tlm_viewer/widgets/canvasline_widget.rb +55 -55
  728. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslinevalue_widget.rb +66 -66
  729. data/lib/cosmos/tools/tlm_viewer/widgets/canvasvalue_widget.rb +124 -124
  730. data/lib/cosmos/tools/tlm_viewer/widgets/checkbutton_widget.rb +31 -31
  731. data/lib/cosmos/tools/tlm_viewer/widgets/combobox_widget.rb +30 -30
  732. data/lib/cosmos/tools/tlm_viewer/widgets/formatfontvalue_widget.rb +36 -36
  733. data/lib/cosmos/tools/tlm_viewer/widgets/formatvalue_widget.rb +35 -35
  734. data/lib/cosmos/tools/tlm_viewer/widgets/horizontal_widget.rb +27 -27
  735. data/lib/cosmos/tools/tlm_viewer/widgets/horizontalbox_widget.rb +31 -31
  736. data/lib/cosmos/tools/tlm_viewer/widgets/horizontalline_widget.rb +26 -26
  737. data/lib/cosmos/tools/tlm_viewer/widgets/label_widget.rb +29 -29
  738. data/lib/cosmos/tools/tlm_viewer/widgets/labelformatvalue_widget.rb +39 -39
  739. data/lib/cosmos/tools/tlm_viewer/widgets/labelprogressbar_widget.rb +38 -38
  740. data/lib/cosmos/tools/tlm_viewer/widgets/labeltrendlimitsbar_widget.rb +38 -38
  741. data/lib/cosmos/tools/tlm_viewer/widgets/labelvalue_widget.rb +39 -39
  742. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluedesc_widget.rb +42 -42
  743. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluelimitsbar_widget.rb +37 -37
  744. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluerangebar_widget.rb +37 -37
  745. data/lib/cosmos/tools/tlm_viewer/widgets/layout_widget.rb +34 -34
  746. data/lib/cosmos/tools/tlm_viewer/widgets/limitsbar_widget.rb +178 -178
  747. data/lib/cosmos/tools/tlm_viewer/widgets/linegraph_widget.rb +54 -54
  748. data/lib/cosmos/tools/tlm_viewer/widgets/matrixbycolumns_widget.rb +47 -47
  749. data/lib/cosmos/tools/tlm_viewer/widgets/multi_widget.rb +116 -116
  750. data/lib/cosmos/tools/tlm_viewer/widgets/progressbar_widget.rb +34 -34
  751. data/lib/cosmos/tools/tlm_viewer/widgets/radiobutton_widget.rb +30 -30
  752. data/lib/cosmos/tools/tlm_viewer/widgets/rangebar_widget.rb +57 -57
  753. data/lib/cosmos/tools/tlm_viewer/widgets/screenshotbutton_widget.rb +34 -34
  754. data/lib/cosmos/tools/tlm_viewer/widgets/scrollwindow_widget.rb +35 -35
  755. data/lib/cosmos/tools/tlm_viewer/widgets/sectionheader_widget.rb +33 -33
  756. data/lib/cosmos/tools/tlm_viewer/widgets/tabbook_widget.rb +26 -26
  757. data/lib/cosmos/tools/tlm_viewer/widgets/tabitem_widget.rb +28 -28
  758. data/lib/cosmos/tools/tlm_viewer/widgets/textbox_widget.rb +47 -47
  759. data/lib/cosmos/tools/tlm_viewer/widgets/textfield_widget.rb +26 -26
  760. data/lib/cosmos/tools/tlm_viewer/widgets/timegraph_widget.rb +88 -88
  761. data/lib/cosmos/tools/tlm_viewer/widgets/title_widget.rb +27 -27
  762. data/lib/cosmos/tools/tlm_viewer/widgets/trendbar_widget.rb +130 -130
  763. data/lib/cosmos/tools/tlm_viewer/widgets/trendlimitsbar_widget.rb +46 -46
  764. data/lib/cosmos/tools/tlm_viewer/widgets/value_widget.rb +43 -43
  765. data/lib/cosmos/tools/tlm_viewer/widgets/valuelimitsbar_widget.rb +37 -37
  766. data/lib/cosmos/tools/tlm_viewer/widgets/valuerangebar_widget.rb +37 -37
  767. data/lib/cosmos/tools/tlm_viewer/widgets/vertical_widget.rb +35 -35
  768. data/lib/cosmos/tools/tlm_viewer/widgets/verticalbox_widget.rb +37 -37
  769. data/lib/cosmos/tools/tlm_viewer/widgets/widget.rb +257 -257
  770. data/lib/cosmos/top_level.rb +647 -596
  771. data/lib/cosmos/utilities.rb +11 -10
  772. data/lib/cosmos/utilities/crc.rb +166 -166
  773. data/lib/cosmos/utilities/csv.rb +83 -83
  774. data/lib/cosmos/utilities/logger.rb +137 -137
  775. data/lib/cosmos/utilities/low_fragmentation_array.rb +11 -11
  776. data/lib/cosmos/utilities/message_log.rb +74 -74
  777. data/lib/cosmos/utilities/quaternion.rb +258 -258
  778. data/lib/cosmos/utilities/ruby_lex_utils.rb +313 -313
  779. data/lib/cosmos/utilities/simulated_target.rb +99 -99
  780. data/lib/cosmos/utilities/sleeper.rb +44 -0
  781. data/lib/cosmos/version.rb +12 -12
  782. data/lib/cosmos/win32/excel.rb +66 -66
  783. data/lib/cosmos/win32/win32.rb +387 -387
  784. data/lib/cosmos/win32/win32_main.rb +311 -311
  785. data/roodi.yml +24 -24
  786. data/run_gui_tests.bat +32 -32
  787. data/spec/ccsds/ccsds_packet_spec.rb +67 -67
  788. data/spec/ccsds/ccsds_parser_spec.rb +148 -148
  789. data/spec/config/config_parser_spec.rb +322 -322
  790. data/spec/conversions/conversion_spec.rb +31 -31
  791. data/spec/conversions/generic_conversion_spec.rb +45 -45
  792. data/spec/conversions/new_packet_log_conversion_spec.rb +39 -39
  793. data/spec/conversions/polynomial_conversion_spec.rb +40 -40
  794. data/spec/conversions/processor_conversion_spec.rb +45 -45
  795. data/spec/conversions/received_count_conversion_spec.rb +43 -43
  796. data/spec/conversions/received_time_formatted_conversion_spec.rb +49 -49
  797. data/spec/conversions/received_time_seconds_conversion_spec.rb +50 -50
  798. data/spec/conversions/segmented_polynomial_conversion_spec.rb +51 -51
  799. data/spec/conversions/unix_time_formatted_conversion_spec.rb +74 -74
  800. data/spec/conversions/unix_time_seconds_conversion_spec.rb +76 -76
  801. data/spec/core_ext/array_spec.rb +186 -186
  802. data/spec/core_ext/class_spec.rb +36 -36
  803. data/spec/core_ext/cosmos_io_spec.rb +77 -77
  804. data/spec/core_ext/exception_spec.rb +91 -91
  805. data/spec/core_ext/file_spec.rb +72 -72
  806. data/spec/core_ext/hash_spec.rb +24 -24
  807. data/spec/core_ext/io_spec.rb +46 -46
  808. data/spec/core_ext/kernel_spec.rb +54 -54
  809. data/spec/core_ext/math_spec.rb +116 -116
  810. data/spec/core_ext/matrix_spec.rb +66 -66
  811. data/spec/core_ext/objectspace_spec.rb +29 -29
  812. data/spec/core_ext/range_spec.rb +21 -21
  813. data/spec/core_ext/socket_spec.rb +32 -32
  814. data/spec/core_ext/string_spec.rb +223 -223
  815. data/spec/core_ext/stringio_spec.rb +21 -21
  816. data/spec/core_ext/time_spec.rb +151 -151
  817. data/spec/gui/line_graph/line_clip_spec.rb +322 -322
  818. data/spec/install/config/system/system.txt +33 -33
  819. data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  820. data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  821. data/spec/install/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  822. data/spec/install/config/targets/COSMOS/screens/limits_change.txt +20 -20
  823. data/spec/install/config/targets/COSMOS/screens/version.txt +19 -19
  824. data/spec/install/config/targets/COSMOS/target.txt +5 -5
  825. data/spec/install/config/targets/INST/cmd_tlm/inst_cmd_linc.txt +30 -30
  826. data/spec/install/config/targets/INST/cmd_tlm/inst_cmds.txt +111 -111
  827. data/spec/install/config/targets/INST/cmd_tlm/inst_tlm.txt +236 -236
  828. data/spec/install/config/targets/INST/cmd_tlm/inst_tlm_linc.txt +25 -25
  829. data/spec/install/config/targets/INST/cmd_tlm_server.txt +5 -5
  830. data/spec/install/config/targets/INST/lib/sim_inst.rb +305 -294
  831. data/spec/install/config/targets/INST/target.txt +10 -10
  832. data/spec/install/config/targets/META/cmd_tlm/meta_cmd.txt +4 -4
  833. data/spec/install/config/targets/META/cmd_tlm/meta_tlm.txt +4 -4
  834. data/spec/install/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
  835. data/spec/interfaces/cmd_tlm_server_interface_spec.rb +150 -150
  836. data/spec/interfaces/interface_spec.rb +130 -131
  837. data/spec/interfaces/linc_interface_spec.rb +199 -199
  838. data/spec/interfaces/serial_interface_spec.rb +56 -56
  839. data/spec/interfaces/simulated_target_interface_spec.rb +128 -128
  840. data/spec/interfaces/stream_interface_spec.rb +157 -157
  841. data/spec/interfaces/tcpip_client_interface_spec.rb +54 -54
  842. data/spec/interfaces/tcpip_server_interface_spec.rb +151 -151
  843. data/spec/interfaces/udp_interface_spec.rb +175 -177
  844. data/spec/io/buffered_file_spec.rb +113 -113
  845. data/spec/io/io_multiplexer_spec.rb +94 -94
  846. data/spec/io/json_drb_object_spec.rb +99 -99
  847. data/spec/io/json_drb_spec.rb +311 -311
  848. data/spec/io/json_rpc_spec.rb +264 -264
  849. data/spec/io/raw_logger_pair_spec.rb +76 -76
  850. data/spec/io/raw_logger_spec.rb +133 -133
  851. data/spec/io/serial_driver_spec.rb +61 -61
  852. data/spec/io/stderr_spec.rb +32 -32
  853. data/spec/io/stdout_spec.rb +32 -32
  854. data/spec/io/tcpip_server_spec.rb +338 -338
  855. data/spec/io/udp_sockets_spec.rb +94 -94
  856. data/spec/io/win32_serial_driver_spec.rb +88 -88
  857. data/spec/packet_logs/meta_packet_log_writer_spec.rb +170 -170
  858. data/spec/packet_logs/packet_log_reader_spec.rb +408 -408
  859. data/spec/packet_logs/packet_log_writer_pair_spec.rb +30 -30
  860. data/spec/packet_logs/packet_log_writer_spec.rb +223 -223
  861. data/spec/packets/binary_accessor_spec.rb +2073 -2073
  862. data/spec/packets/commands_spec.rb +369 -369
  863. data/spec/packets/limits_response_spec.rb +25 -25
  864. data/spec/packets/limits_spec.rb +326 -326
  865. data/spec/packets/packet_config_spec.rb +1620 -1620
  866. data/spec/packets/packet_item_limits_spec.rb +161 -161
  867. data/spec/packets/packet_item_spec.rb +386 -386
  868. data/spec/packets/packet_spec.rb +1057 -949
  869. data/spec/packets/structure_item_spec.rb +195 -195
  870. data/spec/packets/structure_spec.rb +419 -419
  871. data/spec/packets/telemetry_spec.rb +535 -535
  872. data/spec/processors/new_packet_log_processor_spec.rb +39 -39
  873. data/spec/processors/processor_spec.rb +55 -55
  874. data/spec/processors/statistics_processor_spec.rb +60 -60
  875. data/spec/processors/watermark_processor_spec.rb +51 -51
  876. data/spec/script/script_spec.rb +654 -654
  877. data/spec/spec_helper.rb +154 -148
  878. data/spec/streams/burst_stream_protocol_spec.rb +32 -32
  879. data/spec/streams/fixed_stream_protocol_spec.rb +110 -110
  880. data/spec/streams/length_stream_protocol_spec.rb +297 -297
  881. data/spec/streams/preidentified_stream_protocol_spec.rb +118 -118
  882. data/spec/streams/serial_stream_spec.rb +105 -105
  883. data/spec/streams/stream_protocol_spec.rb +332 -332
  884. data/spec/streams/stream_spec.rb +29 -29
  885. data/spec/streams/tcpip_client_stream_spec.rb +54 -54
  886. data/spec/streams/tcpip_socket_stream_spec.rb +146 -146
  887. data/spec/streams/template_stream_protocol_spec.rb +151 -151
  888. data/spec/streams/terminated_stream_protocol_spec.rb +123 -123
  889. data/spec/system/system_spec.rb +645 -645
  890. data/spec/system/target_spec.rb +248 -248
  891. data/spec/tools/cmd_tlm_server/api_spec.rb +1087 -1113
  892. data/spec/tools/cmd_tlm_server/background_task_spec.rb +32 -32
  893. data/spec/tools/cmd_tlm_server/background_tasks_spec.rb +81 -81
  894. data/spec/tools/cmd_tlm_server/cmd_tlm_server_config_spec.rb +411 -411
  895. data/spec/tools/cmd_tlm_server/cmd_tlm_server_spec.rb +415 -415
  896. data/spec/tools/cmd_tlm_server/commanding_spec.rb +123 -123
  897. data/spec/tools/cmd_tlm_server/connections_spec.rb +147 -147
  898. data/spec/tools/cmd_tlm_server/interface_thread_spec.rb +306 -306
  899. data/spec/tools/cmd_tlm_server/interfaces_spec.rb +252 -238
  900. data/spec/tools/cmd_tlm_server/packet_logging_spec.rb +143 -143
  901. data/spec/tools/cmd_tlm_server/router_thread_spec.rb +98 -101
  902. data/spec/tools/cmd_tlm_server/routers_spec.rb +223 -208
  903. data/spec/top_level/top_level_spec.rb +334 -321
  904. data/spec/utilities/crc_spec.rb +45 -45
  905. data/spec/utilities/csv_spec.rb +97 -97
  906. data/spec/utilities/logger_spec.rb +102 -102
  907. data/spec/utilities/message_log_spec.rb +89 -89
  908. data/spec/utilities/quaternion_spec.rb +107 -107
  909. data/spec/utilities/ruby_lex_utils_spec.rb +86 -86
  910. data/tasks/manifest.rake +22 -22
  911. data/tasks/spec.rake +23 -23
  912. metadata +18 -2
@@ -1,213 +1,213 @@
1
- # encoding: ascii-8bit
2
-
3
- # Copyright 2014 Ball Aerospace & Technologies Corp.
4
- # All Rights Reserved.
5
- #
6
- # This program is free software; you can modify and/or redistribute it
7
- # under the terms of the GNU General Public License
8
- # as published by the Free Software Foundation; version 3 with
9
- # attribution addendums as found in the LICENSE.txt
10
-
11
- require 'cosmos/tools/cmd_tlm_server/api'
12
- require 'cosmos/io/raw_logger_pair'
13
-
14
- module Cosmos
15
-
16
- # Defines all the attributes and methods common to all interface classes
17
- # used by COSMOS.
18
- class Interface
19
-
20
- include Api
21
-
22
- # @return [String] Name of the interface
23
- attr_reader :name
24
-
25
- # @return [Array<String>] Array of target names associated with this interface
26
- attr_accessor :target_names
27
-
28
- # @return [Thread] Thread reading from the interface
29
- attr_accessor :thread
30
-
31
- # @return [Boolean] Flag indicating if the interface should be connected
32
- # to on startup
33
- attr_accessor :connect_on_startup
34
-
35
- # @return [Boolean] Flag indicating if the interface should automatically
36
- # reconnect after losing connection
37
- attr_accessor :auto_reconnect
38
-
39
- # @return [Integer[ Delay between reconnect attempts
40
- attr_accessor :reconnect_delay
41
-
42
- # @return [Boolean] Flag indicating if the user is allowed to disconnect
43
- # this interface
44
- attr_accessor :disable_disconnect
45
-
46
- # @return [Array] Array of packet logger classes for this interface
47
- attr_accessor :packet_log_writer_pairs
48
-
49
- # @return [RawLoggerPair] RawLoggerPair instance or nil
50
- attr_accessor :raw_logger_pair
51
-
52
- # @return [Array<Routers>] Array of routers that receive packets
53
- # read from the interface
54
- attr_accessor :routers
55
-
56
- # @return [Integer] The number of packets read from this interface
57
- attr_accessor :read_count
58
-
59
- # @return [Integer] The number of packets written to this interface
60
- attr_accessor :write_count
61
-
62
- # @return [Integer] The number of bytes read from this interface
63
- attr_accessor :bytes_read
64
-
65
- # @return [Integer] The number of bytes written to this interface
66
- attr_accessor :bytes_written
67
-
68
- # @return [Integer] The number of active clients
69
- # (when used as a Router)
70
- attr_accessor :num_clients
71
-
72
- # @return [Integer] The number of packets in the read queue
73
- # (when used as a Router)
74
- attr_accessor :read_queue_size
75
-
76
- # @return [Integer] The number of packets in the write queue
77
- # (when used as a Router)
78
- attr_accessor :write_queue_size
79
-
80
- # @return [Array<Interface>] Array of interfaces to route packets to
81
- # (when used as a Router)
82
- attr_accessor :interfaces
83
-
84
- # Initialize default attribute values
85
- def initialize
86
- @name = self.class.to_s
87
- @target_names = []
88
- @thread = nil
89
- @connect_on_startup = true
90
- @auto_reconnect = true
91
- @reconnect_delay = 5.0
92
- @disable_disconnect = false
93
- @packet_log_writer_pairs = []
94
- @raw_logger_pair = RawLoggerPair.new(@name)
95
- @routers = []
96
- @read_count = 0
97
- @write_count = 0
98
- @bytes_read = 0
99
- @bytes_written = 0
100
- @num_clients = 0
101
- @read_queue_size = 0
102
- @write_queue_size = 0
103
- @interfaces = []
104
- @read_allowed = true
105
- @write_allowed = true
106
- @write_raw_allowed = true
107
- end
108
-
109
- # Connects the interface to its target(s). Must be implemented by a
110
- # subclass.
111
- def connect
112
- raise "Interface connect method not implemented"
113
- end
114
-
115
- # Indicates if the interface is connected to its target(s) or not. Must be
116
- # implemented by a subclass.
117
- def connected?
118
- raise "Interface connected? method not implemented"
119
- end
120
-
121
- # Disconnects the interface from its target(s). Must be implemented by a
122
- # subclass.
123
- def disconnect
124
- raise "Interface disconnect method not implemented"
125
- end
126
-
127
- # Retrieves the next packet from the interface. Must be implemented by a
128
- # subclass.
129
- def read
130
- raise "Interface read method not implemented"
131
- end
132
-
133
- # Method to send a packet on the interface. Must be implemented by a
134
- # subclass.
135
- def write(packet)
136
- raise "Interface write method not implemented"
137
- end
138
-
139
- # Writes preformatted data onto the interface. Malformed data may cause
140
- # problems. Must be implemented by a subclass.
141
- def write_raw(data)
142
- raise "Interface write_raw method not implemented"
143
- end
144
-
145
- # @return [Boolean] Whether reading is allowed
146
- def read_allowed?
147
- @read_allowed
148
- end
149
-
150
- # @return [Boolean] Whether writing is allowed
151
- def write_allowed?
152
- @write_allowed
153
- end
154
-
155
- # @return [Boolean] Whether writing raw data over the interface is allowed
156
- def write_raw_allowed?
157
- @write_raw_allowed
158
- end
159
-
160
- # Start raw logging for this interface
161
- def start_raw_logging
162
- @raw_logger_pair.start if @raw_logger_pair
163
- end
164
-
165
- # Stop raw logging for this interface
166
- def stop_raw_logging
167
- @raw_logger_pair.stop if @raw_logger_pair
168
- end
169
-
170
- # Set the interface name
171
- def name=(name)
172
- @name = name.to_s.clone
173
- @raw_logger_pair.name = name if @raw_logger_pair
174
- end
175
-
176
- # Copy settings from this interface to another interface. All instance
177
- # variables are copied except for thread, num_clients, read_queue_size,
178
- # and write_queue_size since these are all specific to the operation of the
179
- # interface rather than its instantiation.
180
- #
181
- # @param other_interface [Interface] The other interface to copy to
182
- def copy_to(other_interface)
183
- other_interface.name = self.name.clone
184
- other_interface.target_names = self.target_names.clone
185
- # The other interface has its own Thread
186
- other_interface.connect_on_startup = self.connect_on_startup
187
- other_interface.auto_reconnect = self.auto_reconnect
188
- other_interface.reconnect_delay = self.reconnect_delay
189
- other_interface.disable_disconnect = self.disable_disconnect
190
- other_interface.packet_log_writer_pairs = self.packet_log_writer_pairs.clone
191
- other_interface.routers = self.routers.clone
192
- other_interface.read_count = self.read_count
193
- other_interface.write_count = self.write_count
194
- other_interface.bytes_read = self.bytes_read
195
- other_interface.bytes_written = self.bytes_written
196
- other_interface.raw_logger_pair = self.raw_logger_pair.clone if self.raw_logger_pair
197
- # num_clients is per interface so don't copy
198
- # read_queue_size is the number of packets in the queue so don't copy
199
- # write_queue_size is the number of packets in the queue so don't copy
200
- other_interface.interfaces = self.interfaces.clone
201
- end
202
-
203
- # This method is called by the CmdTlmServer after each read packet is
204
- # identified. It can be used to perform custom processing/monitoring as
205
- # each packet is received by the CmdTlmServer.
206
- #
207
- # @param packet [Packet] The identified packet read from the interface
208
- def post_identify_packet(packet)
209
- end
210
-
211
- end # class Interface
212
-
213
- end # module Cosmos
1
+ # encoding: ascii-8bit
2
+
3
+ # Copyright 2014 Ball Aerospace & Technologies Corp.
4
+ # All Rights Reserved.
5
+ #
6
+ # This program is free software; you can modify and/or redistribute it
7
+ # under the terms of the GNU General Public License
8
+ # as published by the Free Software Foundation; version 3 with
9
+ # attribution addendums as found in the LICENSE.txt
10
+
11
+ require 'cosmos/tools/cmd_tlm_server/api'
12
+ require 'cosmos/io/raw_logger_pair'
13
+
14
+ module Cosmos
15
+
16
+ # Defines all the attributes and methods common to all interface classes
17
+ # used by COSMOS.
18
+ class Interface
19
+
20
+ include Api
21
+
22
+ # @return [String] Name of the interface
23
+ attr_reader :name
24
+
25
+ # @return [Array<String>] Array of target names associated with this interface
26
+ attr_accessor :target_names
27
+
28
+ # @return [Thread] Thread reading from the interface
29
+ attr_accessor :thread
30
+
31
+ # @return [Boolean] Flag indicating if the interface should be connected
32
+ # to on startup
33
+ attr_accessor :connect_on_startup
34
+
35
+ # @return [Boolean] Flag indicating if the interface should automatically
36
+ # reconnect after losing connection
37
+ attr_accessor :auto_reconnect
38
+
39
+ # @return [Integer[ Delay between reconnect attempts
40
+ attr_accessor :reconnect_delay
41
+
42
+ # @return [Boolean] Flag indicating if the user is allowed to disconnect
43
+ # this interface
44
+ attr_accessor :disable_disconnect
45
+
46
+ # @return [Array] Array of packet logger classes for this interface
47
+ attr_accessor :packet_log_writer_pairs
48
+
49
+ # @return [RawLoggerPair] RawLoggerPair instance or nil
50
+ attr_accessor :raw_logger_pair
51
+
52
+ # @return [Array<Routers>] Array of routers that receive packets
53
+ # read from the interface
54
+ attr_accessor :routers
55
+
56
+ # @return [Integer] The number of packets read from this interface
57
+ attr_accessor :read_count
58
+
59
+ # @return [Integer] The number of packets written to this interface
60
+ attr_accessor :write_count
61
+
62
+ # @return [Integer] The number of bytes read from this interface
63
+ attr_accessor :bytes_read
64
+
65
+ # @return [Integer] The number of bytes written to this interface
66
+ attr_accessor :bytes_written
67
+
68
+ # @return [Integer] The number of active clients
69
+ # (when used as a Router)
70
+ attr_accessor :num_clients
71
+
72
+ # @return [Integer] The number of packets in the read queue
73
+ # (when used as a Router)
74
+ attr_accessor :read_queue_size
75
+
76
+ # @return [Integer] The number of packets in the write queue
77
+ # (when used as a Router)
78
+ attr_accessor :write_queue_size
79
+
80
+ # @return [Array<Interface>] Array of interfaces to route packets to
81
+ # (when used as a Router)
82
+ attr_accessor :interfaces
83
+
84
+ # Initialize default attribute values
85
+ def initialize
86
+ @name = self.class.to_s
87
+ @target_names = []
88
+ @thread = nil
89
+ @connect_on_startup = true
90
+ @auto_reconnect = true
91
+ @reconnect_delay = 5.0
92
+ @disable_disconnect = false
93
+ @packet_log_writer_pairs = []
94
+ @raw_logger_pair = RawLoggerPair.new(@name)
95
+ @routers = []
96
+ @read_count = 0
97
+ @write_count = 0
98
+ @bytes_read = 0
99
+ @bytes_written = 0
100
+ @num_clients = 0
101
+ @read_queue_size = 0
102
+ @write_queue_size = 0
103
+ @interfaces = []
104
+ @read_allowed = true
105
+ @write_allowed = true
106
+ @write_raw_allowed = true
107
+ end
108
+
109
+ # Connects the interface to its target(s). Must be implemented by a
110
+ # subclass.
111
+ def connect
112
+ raise "Interface connect method not implemented"
113
+ end
114
+
115
+ # Indicates if the interface is connected to its target(s) or not. Must be
116
+ # implemented by a subclass.
117
+ def connected?
118
+ raise "Interface connected? method not implemented"
119
+ end
120
+
121
+ # Disconnects the interface from its target(s). Must be implemented by a
122
+ # subclass.
123
+ def disconnect
124
+ raise "Interface disconnect method not implemented"
125
+ end
126
+
127
+ # Retrieves the next packet from the interface. Must be implemented by a
128
+ # subclass.
129
+ def read
130
+ raise "Interface read method not implemented"
131
+ end
132
+
133
+ # Method to send a packet on the interface. Must be implemented by a
134
+ # subclass.
135
+ def write(packet)
136
+ raise "Interface write method not implemented"
137
+ end
138
+
139
+ # Writes preformatted data onto the interface. Malformed data may cause
140
+ # problems. Must be implemented by a subclass.
141
+ def write_raw(data)
142
+ raise "Interface write_raw method not implemented"
143
+ end
144
+
145
+ # @return [Boolean] Whether reading is allowed
146
+ def read_allowed?
147
+ @read_allowed
148
+ end
149
+
150
+ # @return [Boolean] Whether writing is allowed
151
+ def write_allowed?
152
+ @write_allowed
153
+ end
154
+
155
+ # @return [Boolean] Whether writing raw data over the interface is allowed
156
+ def write_raw_allowed?
157
+ @write_raw_allowed
158
+ end
159
+
160
+ # Start raw logging for this interface
161
+ def start_raw_logging
162
+ @raw_logger_pair.start if @raw_logger_pair
163
+ end
164
+
165
+ # Stop raw logging for this interface
166
+ def stop_raw_logging
167
+ @raw_logger_pair.stop if @raw_logger_pair
168
+ end
169
+
170
+ # Set the interface name
171
+ def name=(name)
172
+ @name = name.to_s.clone
173
+ @raw_logger_pair.name = name if @raw_logger_pair
174
+ end
175
+
176
+ # Copy settings from this interface to another interface. All instance
177
+ # variables are copied except for thread, num_clients, read_queue_size,
178
+ # and write_queue_size since these are all specific to the operation of the
179
+ # interface rather than its instantiation.
180
+ #
181
+ # @param other_interface [Interface] The other interface to copy to
182
+ def copy_to(other_interface)
183
+ other_interface.name = self.name.clone
184
+ other_interface.target_names = self.target_names.clone
185
+ # The other interface has its own Thread
186
+ other_interface.connect_on_startup = self.connect_on_startup
187
+ other_interface.auto_reconnect = self.auto_reconnect
188
+ other_interface.reconnect_delay = self.reconnect_delay
189
+ other_interface.disable_disconnect = self.disable_disconnect
190
+ other_interface.packet_log_writer_pairs = self.packet_log_writer_pairs.clone
191
+ other_interface.routers = self.routers.clone
192
+ other_interface.read_count = self.read_count
193
+ other_interface.write_count = self.write_count
194
+ other_interface.bytes_read = self.bytes_read
195
+ other_interface.bytes_written = self.bytes_written
196
+ other_interface.raw_logger_pair = self.raw_logger_pair.clone if self.raw_logger_pair
197
+ # num_clients is per interface so don't copy
198
+ # read_queue_size is the number of packets in the queue so don't copy
199
+ # write_queue_size is the number of packets in the queue so don't copy
200
+ other_interface.interfaces = self.interfaces.clone
201
+ end
202
+
203
+ # This method is called by the CmdTlmServer after each read packet is
204
+ # identified. It can be used to perform custom processing/monitoring as
205
+ # each packet is received by the CmdTlmServer.
206
+ #
207
+ # @param packet [Packet] The identified packet read from the interface
208
+ def post_identify_packet(packet)
209
+ end
210
+
211
+ end # class Interface
212
+
213
+ end # module Cosmos
@@ -1,360 +1,360 @@
1
- # encoding: ascii-8bit
2
-
3
- # Copyright 2014 Ball Aerospace & Technologies Corp.
4
- # All Rights Reserved.
5
- #
6
- # This program is free software; you can modify and/or redistribute it
7
- # under the terms of the GNU General Public License
8
- # as published by the Free Software Foundation; version 3 with
9
- # attribution addendums as found in the LICENSE.txt
10
-
11
- require 'cosmos/interfaces/tcpip_client_interface'
12
- require 'uuidtools'
13
-
14
- module Cosmos
15
-
16
- # Interface for connecting to Ball Aerospace LINC Labview targets
17
- class LincInterface < TcpipClientInterface
18
- # The maximum number of handshake responses we can wait for at a time.
19
- # We don't ever expect to get close to this but we need to limit it
20
- # to ensure the Array doesn't grow out of control.
21
- MAX_CONCURRENT_HANDSHAKES = 100
22
-
23
- def initialize(
24
- hostname,
25
- port,
26
- handshake_enabled = true,
27
- response_timeout = 5.0,
28
- read_timeout = nil,
29
- write_timeout = 5.0,
30
- length_bitoffset = 0,
31
- length_bitsize = 16,
32
- length_value_offset = 4,
33
- fieldname_guid = 'HDR_GUID',
34
- endianness = 'BIG_ENDIAN',
35
- fieldname_cmd_length = 'HDR_LENGTH'
36
- )
37
- # Initialize Super Class
38
- super(hostname, port, port, write_timeout, read_timeout, 'LENGTH',
39
- length_bitoffset, length_bitsize, length_value_offset, 1, endianness, 0, nil, nil)
40
-
41
- # Configuration Settings
42
- @handshake_enabled = ConfigParser.handle_true_false(handshake_enabled)
43
- @response_timeout = response_timeout.to_f
44
- @length_value_offset = Integer(length_value_offset)
45
- @fieldname_guid = ConfigParser.handle_nil(fieldname_guid)
46
- @fieldname_cmd_length = ConfigParser.handle_nil(fieldname_cmd_length)
47
-
48
- # Other instance variables
49
- @ignored_error_codes = []
50
- @handshakes = []
51
- @handshakes_mutex = Mutex.new
52
- @handshakes_resource = ConditionVariable.new
53
-
54
- # Call this once now because the first time is slow
55
- UUIDTools::UUID.random_create.raw
56
- end # def initialize
57
-
58
- def connect
59
- # Packet definitions need to be retrieved here because @target_names is not filled in until after initialize
60
- @handshake_packet = System.telemetry.packet(@target_names[0], 'HANDSHAKE')
61
- @error_packet = System.telemetry.packet(@target_names[0], 'ERROR')
62
-
63
- # Handle not defining the interface configuration commands (May not want to support this functionality)
64
- begin
65
- @error_ignore_command = nil
66
- @error_ignore_command = System.commands.packet(@target_names[0], 'COSMOS_ERROR_IGNORE')
67
- rescue
68
- end
69
- begin
70
- @error_handle_command = nil
71
- @error_handle_command = System.commands.packet(@target_names[0], 'COSMOS_ERROR_HANDLE')
72
- rescue
73
- end
74
- begin
75
- @handshake_enable_command = nil
76
- @handshake_enable_command = System.commands.packet(@target_names[0], 'COSMOS_HANDSHAKE_EN')
77
- rescue
78
- end
79
- begin
80
- @handshake_disable_command = nil
81
- @handshake_disable_command = System.commands.packet(@target_names[0], 'COSMOS_HANDSHAKE_DS')
82
- rescue
83
- end
84
-
85
- @handshakes_mutex.synchronize do
86
- @handshakes = []
87
- end
88
-
89
- # Actually connect
90
- super()
91
- end
92
-
93
- def write(packet)
94
- ######################################
95
- # Commands handled in the COSMOS interface not the LINC target
96
- ######################################
97
-
98
- if @error_ignore_command and @error_ignore_command.identify?(packet.buffer(false))
99
- linc_cmd = @error_ignore_command.clone
100
- linc_cmd.buffer = packet.buffer
101
- code = linc_cmd.read('CODE')
102
- @ignored_error_codes << code unless @ignored_error_codes.include? code
103
- return
104
- end
105
-
106
- if @error_handle_command and @error_handle_command.identify?(packet.buffer(false))
107
- linc_cmd = @error_handle_command.clone
108
- linc_cmd.buffer = packet.buffer
109
- code = linc_cmd.read('CODE')
110
- @ignored_error_codes.delete(code) if @ignored_error_codes.include? code
111
- return
112
- end
113
-
114
- if @handshake_enable_command and @handshake_enable_command.identify?(packet.buffer(false))
115
- @handshake_enabled = true
116
- return
117
- end
118
-
119
- if @handshake_disable_command and @handshake_disable_command.identify?(packet.buffer(false))
120
- @handshake_enabled = false
121
- return
122
- end
123
-
124
- # Verify we are connected to the LINC target
125
- if connected?()
126
- # Add a GUID to the GUID field if its defined
127
- if @fieldname_guid
128
- if not packet.read(@fieldname_guid) =~ /[\x01-\xFF]/
129
- # The GUID has not been set already (it has all \x00 values), so make a new one.
130
- # This enables a router GUI to make the GUIDs so it can process handshakes too.
131
- my_guid = UUIDTools::UUID.random_create.raw
132
- packet.write(@fieldname_guid, my_guid, :RAW)
133
- else
134
- my_guid = packet.read(@fieldname_guid)
135
- end
136
- end
137
-
138
- # Fix the length field to handle the cases where a variable length packet
139
- # is defined. COSMOS does not do this automatically.
140
- if @fieldname_cmd_length
141
- my_length = packet.length - @length_value_offset
142
- packet.write(@fieldname_cmd_length, my_length, :RAW)
143
- end
144
-
145
- # Always take the mutex (even if we aren't handshaking)
146
- @handshakes_mutex.synchronize do
147
-
148
- # Send the command
149
- super(packet)
150
-
151
- # Wait for the response if handshaking
152
- if @handshake_enabled
153
- begin
154
- my_handshake = nil
155
-
156
- # The time after which we will give up waiting for a response
157
- deadline = Time.now + @response_timeout
158
-
159
- # Loop until we find our response
160
- while my_handshake.nil?
161
- # How long should we wait in this loop. We could get notified
162
- # multiple times for handshakes that aren't ours so we need to
163
- # recalculate the wait time each time.
164
- to_wait = deadline - Time.now
165
-
166
- # If there is no more time to wait then this is a timeout so we break
167
- # out of the loop looking for handshakes
168
- if to_wait <= 0
169
- raise "Timeout waiting for handshake from #{System.commands.format(packet, System.targets[@target_names[0]].ignored_parameters)}"
170
- end
171
-
172
- # Wait until the telemetry side signals that there is a new handshake to check or timeout.
173
- # This releases the mutex until the telemetry side signals us
174
- @handshakes_resource.wait(@handshakes_mutex, to_wait)
175
- # We now have the mutex again
176
-
177
- # Loop if we have timed out so we can handle the timeout with common code
178
- next if (deadline - Time.now) <= 0
179
-
180
- if @fieldname_guid
181
- # A GUID means it's an asychronous packet type.
182
- # So look at the list of incoming handshakes and pick off (deleting)
183
- # the handshake from the list if it's for this command.
184
- #
185
- # The mutex is required because the telemetry task
186
- # could enqueue a response between the index lookup and the slice
187
- # function which would remove the wrong response. FAIL!
188
- my_handshake_index = @handshakes.index {|hs| hs.get_cmd_guid(@fieldname_guid) == my_guid}
189
- my_handshake = @handshakes.slice!(my_handshake_index) if my_handshake_index
190
- else
191
- # This is the synchronous version
192
- my_handshake = @handshakes.pop
193
- end
194
- end # while my_handshake.nil?
195
-
196
- # Handle handshake warnings and errors
197
- if my_handshake.handshake.read('STATUS') == "OK" and my_handshake.handshake.read('CODE') != 0
198
- unless @ignored_error_codes.include? my_handshake.handshake.read('CODE')
199
- Logger.warn "Warning sending command (#{my_handshake.handshake.read('CODE')}): #{my_handshake.error_source}"
200
- end
201
- elsif my_handshake.handshake.read('STATUS') == "ERROR"
202
- unless @ignored_error_codes.include? my_handshake.handshake.read('CODE')
203
- raise "Error sending command (#{my_handshake.handshake.read('CODE')}): #{my_handshake.error_source}"
204
- end
205
- end
206
- rescue Exception => err
207
- # If anything goes wrong after successfully writing the packet to the LINC target
208
- # ensure that the packet gets updated in the CVT and logged to the packet log writer.
209
- # COSMOS normally only does this if write returns successfully
210
- if packet.identified?
211
- command = System.commands.packet(packet.target_name, packet.packet_name)
212
- else
213
- command = System.commands.packet('UNKNOWN', 'UNKNOWN')
214
- end
215
- command.buffer = packet.buffer
216
-
217
- @packet_log_writer_pairs.each do |packet_log_writer_pair|
218
- packet_log_writer_pair.cmd_log_writer.write(packet)
219
- end
220
-
221
- raise err
222
- end
223
- end # if @handshake_enabled
224
- end # @handshakes_mutex.synchronize
225
- else
226
- raise "Interface not connected"
227
- end # if connected
228
-
229
- end # def write
230
-
231
- def read
232
- packet = super()
233
- if packet
234
- if @handshake_packet.identify?(packet.buffer(false))
235
- handshake_packet = @handshake_packet.clone
236
- handshake_packet.buffer = packet.buffer
237
- my_handshake = LincHandshake.new(handshake_packet, @target_names[0])
238
-
239
- if handshake_packet.read('origin') == "LCL"
240
- # Update the current value table for this command
241
- command = System.commands.packet(my_handshake.identified_command.target_name, my_handshake.identified_command.packet_name)
242
- command.received_time = my_handshake.identified_command.received_time
243
- command.buffer = my_handshake.identified_command.buffer
244
- command.received_count += 1
245
-
246
- # Put a log of the command onto the server for the user to see
247
- Logger.info("External Command: " + System.commands.format(my_handshake.identified_command, System.targets[@target_names[0]].ignored_parameters))
248
-
249
- # Log the command to the command log(s)
250
- @packet_log_writer_pairs.each do |packet_log_writer_pair|
251
- packet_log_writer_pair.cmd_log_writer.write(my_handshake.identified_command)
252
- end
253
- else
254
- # This is a remote packet (sent from here).
255
- # Add to the array of handshake packet responses (only if handshakes are enabled).
256
- # The mutex is required by the command task due to the way it
257
- # first looks up the handshake before removing it.
258
- if @handshake_enabled
259
- @handshakes_mutex.synchronize do
260
- @handshakes.push(my_handshake)
261
- if @handshakes.length > MAX_CONCURRENT_HANDSHAKES
262
- len = @handshakes.length
263
- @handshakes = []
264
- raise "The handshakes response array has grown to #{len}. Clearing all handshakes!"
265
- end
266
- # Tell all waiting commands to take a look
267
- @handshakes_resource.broadcast
268
- end # @handshakes_mutex.synchronize
269
- end # if @handshake_enabled
270
-
271
- end # if handshake_packet.read('origin') == "LCL"
272
- end # @handshake_packet.identify?(packet.buffer(false))
273
- end # if packet
274
-
275
- return packet
276
- end
277
-
278
- end # class LincInterface
279
-
280
- # The LincHandshake class is used only by the LincInterface. It processes the handshake and
281
- # helps with finding the information regarding the internal command.
282
- class LincHandshake
283
- attr_accessor :handshake
284
- attr_accessor :identified_command
285
- attr_accessor :error_source
286
-
287
- def initialize(handshake, interface_target_name)
288
- @handshake = handshake
289
-
290
- # Interpret the command field of the handshake packet
291
- # Where DATA is defined as:
292
- # 1 byte target name length
293
- # X byte target name
294
- # 1 byte packet name length
295
- # X byte packet name
296
- # 4 byte packet data length
297
- # X byte packet data
298
- # 4 byte error source length
299
- # X byte error source
300
- data = handshake.read('DATA')
301
- raise "Data field too short for target name length" if data.length == 0
302
-
303
- # Get target name length
304
- target_name_length = data[0..0].unpack('C')[0]
305
- raise "Invalid target name length" if target_name_length == 0
306
- data = data[1..-1]
307
-
308
- # get target name
309
- raise "Data field too short for target name" if data.length < target_name_length
310
- # target_name = data[0..(target_name_length - 1)] # Unused
311
- data = data[target_name_length..-1]
312
-
313
- # get packet name length
314
- raise "Data field too short for packet name length" if data.length == 0
315
- packet_name_length = data[0..0].unpack('C')[0]
316
- raise "Invalid packet name length" if packet_name_length == 0
317
- data = data[1..-1]
318
-
319
- # get packet name
320
- raise "Data field too short for packet name" if data.length < packet_name_length
321
- packet_name = data[0..(packet_name_length - 1)]
322
- data = data[packet_name_length..-1]
323
-
324
- # get packet data length
325
- raise "Data field too short for packet data length" if data.length < 4
326
- packet_data_length = data[0..3].unpack('N')[0]
327
- raise "Invalid data length" if packet_data_length == 0
328
- data = data[4..-1]
329
-
330
- # get packet data
331
- raise "Data field too short for packet data" if data.length < packet_data_length
332
- packet_data = data[0..(packet_data_length - 1)]
333
- data = data[packet_data_length..-1]
334
-
335
- # get error source length
336
- raise "Data field too short for error source length" if data.length < 4
337
- error_source_length = data[0..3].unpack('N')[0]
338
- # note it is OK to have a 0 source length
339
- data = data[4..-1]
340
-
341
- # get error source - store on object
342
- if error_source_length > 0
343
- @error_source = data[0..(error_source_length - 1)]
344
- else
345
- @error_source = ''
346
- end
347
-
348
- # make packet - store on object as a defined packet of type command that this handshakes
349
- @identified_command = System.commands.packet(interface_target_name, packet_name).clone
350
- @identified_command.buffer = packet_data
351
- @identified_command.received_time = Time.at(handshake.read('TIME_SECONDS'), handshake.read('TIME_MICROSECONDS'))
352
- end
353
-
354
- def get_cmd_guid(fieldname_guid)
355
- return @identified_command.read(fieldname_guid)
356
- end
357
-
358
- end # class LincHandshake
359
-
360
- end # module Cosmos
1
+ # encoding: ascii-8bit
2
+
3
+ # Copyright 2014 Ball Aerospace & Technologies Corp.
4
+ # All Rights Reserved.
5
+ #
6
+ # This program is free software; you can modify and/or redistribute it
7
+ # under the terms of the GNU General Public License
8
+ # as published by the Free Software Foundation; version 3 with
9
+ # attribution addendums as found in the LICENSE.txt
10
+
11
+ require 'cosmos/interfaces/tcpip_client_interface'
12
+ require 'uuidtools'
13
+
14
+ module Cosmos
15
+
16
+ # Interface for connecting to Ball Aerospace LINC Labview targets
17
+ class LincInterface < TcpipClientInterface
18
+ # The maximum number of handshake responses we can wait for at a time.
19
+ # We don't ever expect to get close to this but we need to limit it
20
+ # to ensure the Array doesn't grow out of control.
21
+ MAX_CONCURRENT_HANDSHAKES = 100
22
+
23
+ def initialize(
24
+ hostname,
25
+ port,
26
+ handshake_enabled = true,
27
+ response_timeout = 5.0,
28
+ read_timeout = nil,
29
+ write_timeout = 5.0,
30
+ length_bitoffset = 0,
31
+ length_bitsize = 16,
32
+ length_value_offset = 4,
33
+ fieldname_guid = 'HDR_GUID',
34
+ endianness = 'BIG_ENDIAN',
35
+ fieldname_cmd_length = 'HDR_LENGTH'
36
+ )
37
+ # Initialize Super Class
38
+ super(hostname, port, port, write_timeout, read_timeout, 'LENGTH',
39
+ length_bitoffset, length_bitsize, length_value_offset, 1, endianness, 0, nil, nil)
40
+
41
+ # Configuration Settings
42
+ @handshake_enabled = ConfigParser.handle_true_false(handshake_enabled)
43
+ @response_timeout = response_timeout.to_f
44
+ @length_value_offset = Integer(length_value_offset)
45
+ @fieldname_guid = ConfigParser.handle_nil(fieldname_guid)
46
+ @fieldname_cmd_length = ConfigParser.handle_nil(fieldname_cmd_length)
47
+
48
+ # Other instance variables
49
+ @ignored_error_codes = []
50
+ @handshakes = []
51
+ @handshakes_mutex = Mutex.new
52
+ @handshakes_resource = ConditionVariable.new
53
+
54
+ # Call this once now because the first time is slow
55
+ UUIDTools::UUID.random_create.raw
56
+ end # def initialize
57
+
58
+ def connect
59
+ # Packet definitions need to be retrieved here because @target_names is not filled in until after initialize
60
+ @handshake_packet = System.telemetry.packet(@target_names[0], 'HANDSHAKE')
61
+ @error_packet = System.telemetry.packet(@target_names[0], 'ERROR')
62
+
63
+ # Handle not defining the interface configuration commands (May not want to support this functionality)
64
+ begin
65
+ @error_ignore_command = nil
66
+ @error_ignore_command = System.commands.packet(@target_names[0], 'COSMOS_ERROR_IGNORE')
67
+ rescue
68
+ end
69
+ begin
70
+ @error_handle_command = nil
71
+ @error_handle_command = System.commands.packet(@target_names[0], 'COSMOS_ERROR_HANDLE')
72
+ rescue
73
+ end
74
+ begin
75
+ @handshake_enable_command = nil
76
+ @handshake_enable_command = System.commands.packet(@target_names[0], 'COSMOS_HANDSHAKE_EN')
77
+ rescue
78
+ end
79
+ begin
80
+ @handshake_disable_command = nil
81
+ @handshake_disable_command = System.commands.packet(@target_names[0], 'COSMOS_HANDSHAKE_DS')
82
+ rescue
83
+ end
84
+
85
+ @handshakes_mutex.synchronize do
86
+ @handshakes = []
87
+ end
88
+
89
+ # Actually connect
90
+ super()
91
+ end
92
+
93
+ def write(packet)
94
+ ######################################
95
+ # Commands handled in the COSMOS interface not the LINC target
96
+ ######################################
97
+
98
+ if @error_ignore_command and @error_ignore_command.identify?(packet.buffer(false))
99
+ linc_cmd = @error_ignore_command.clone
100
+ linc_cmd.buffer = packet.buffer
101
+ code = linc_cmd.read('CODE')
102
+ @ignored_error_codes << code unless @ignored_error_codes.include? code
103
+ return
104
+ end
105
+
106
+ if @error_handle_command and @error_handle_command.identify?(packet.buffer(false))
107
+ linc_cmd = @error_handle_command.clone
108
+ linc_cmd.buffer = packet.buffer
109
+ code = linc_cmd.read('CODE')
110
+ @ignored_error_codes.delete(code) if @ignored_error_codes.include? code
111
+ return
112
+ end
113
+
114
+ if @handshake_enable_command and @handshake_enable_command.identify?(packet.buffer(false))
115
+ @handshake_enabled = true
116
+ return
117
+ end
118
+
119
+ if @handshake_disable_command and @handshake_disable_command.identify?(packet.buffer(false))
120
+ @handshake_enabled = false
121
+ return
122
+ end
123
+
124
+ # Verify we are connected to the LINC target
125
+ if connected?()
126
+ # Add a GUID to the GUID field if its defined
127
+ if @fieldname_guid
128
+ if not packet.read(@fieldname_guid) =~ /[\x01-\xFF]/
129
+ # The GUID has not been set already (it has all \x00 values), so make a new one.
130
+ # This enables a router GUI to make the GUIDs so it can process handshakes too.
131
+ my_guid = UUIDTools::UUID.random_create.raw
132
+ packet.write(@fieldname_guid, my_guid, :RAW)
133
+ else
134
+ my_guid = packet.read(@fieldname_guid)
135
+ end
136
+ end
137
+
138
+ # Fix the length field to handle the cases where a variable length packet
139
+ # is defined. COSMOS does not do this automatically.
140
+ if @fieldname_cmd_length
141
+ my_length = packet.length - @length_value_offset
142
+ packet.write(@fieldname_cmd_length, my_length, :RAW)
143
+ end
144
+
145
+ # Always take the mutex (even if we aren't handshaking)
146
+ @handshakes_mutex.synchronize do
147
+
148
+ # Send the command
149
+ super(packet)
150
+
151
+ # Wait for the response if handshaking
152
+ if @handshake_enabled
153
+ begin
154
+ my_handshake = nil
155
+
156
+ # The time after which we will give up waiting for a response
157
+ deadline = Time.now + @response_timeout
158
+
159
+ # Loop until we find our response
160
+ while my_handshake.nil?
161
+ # How long should we wait in this loop. We could get notified
162
+ # multiple times for handshakes that aren't ours so we need to
163
+ # recalculate the wait time each time.
164
+ to_wait = deadline - Time.now
165
+
166
+ # If there is no more time to wait then this is a timeout so we break
167
+ # out of the loop looking for handshakes
168
+ if to_wait <= 0
169
+ raise "Timeout waiting for handshake from #{System.commands.format(packet, System.targets[@target_names[0]].ignored_parameters)}"
170
+ end
171
+
172
+ # Wait until the telemetry side signals that there is a new handshake to check or timeout.
173
+ # This releases the mutex until the telemetry side signals us
174
+ @handshakes_resource.wait(@handshakes_mutex, to_wait)
175
+ # We now have the mutex again
176
+
177
+ # Loop if we have timed out so we can handle the timeout with common code
178
+ next if (deadline - Time.now) <= 0
179
+
180
+ if @fieldname_guid
181
+ # A GUID means it's an asychronous packet type.
182
+ # So look at the list of incoming handshakes and pick off (deleting)
183
+ # the handshake from the list if it's for this command.
184
+ #
185
+ # The mutex is required because the telemetry task
186
+ # could enqueue a response between the index lookup and the slice
187
+ # function which would remove the wrong response. FAIL!
188
+ my_handshake_index = @handshakes.index {|hs| hs.get_cmd_guid(@fieldname_guid) == my_guid}
189
+ my_handshake = @handshakes.slice!(my_handshake_index) if my_handshake_index
190
+ else
191
+ # This is the synchronous version
192
+ my_handshake = @handshakes.pop
193
+ end
194
+ end # while my_handshake.nil?
195
+
196
+ # Handle handshake warnings and errors
197
+ if my_handshake.handshake.read('STATUS') == "OK" and my_handshake.handshake.read('CODE') != 0
198
+ unless @ignored_error_codes.include? my_handshake.handshake.read('CODE')
199
+ Logger.warn "Warning sending command (#{my_handshake.handshake.read('CODE')}): #{my_handshake.error_source}"
200
+ end
201
+ elsif my_handshake.handshake.read('STATUS') == "ERROR"
202
+ unless @ignored_error_codes.include? my_handshake.handshake.read('CODE')
203
+ raise "Error sending command (#{my_handshake.handshake.read('CODE')}): #{my_handshake.error_source}"
204
+ end
205
+ end
206
+ rescue Exception => err
207
+ # If anything goes wrong after successfully writing the packet to the LINC target
208
+ # ensure that the packet gets updated in the CVT and logged to the packet log writer.
209
+ # COSMOS normally only does this if write returns successfully
210
+ if packet.identified?
211
+ command = System.commands.packet(packet.target_name, packet.packet_name)
212
+ else
213
+ command = System.commands.packet('UNKNOWN', 'UNKNOWN')
214
+ end
215
+ command.buffer = packet.buffer
216
+
217
+ @packet_log_writer_pairs.each do |packet_log_writer_pair|
218
+ packet_log_writer_pair.cmd_log_writer.write(packet)
219
+ end
220
+
221
+ raise err
222
+ end
223
+ end # if @handshake_enabled
224
+ end # @handshakes_mutex.synchronize
225
+ else
226
+ raise "Interface not connected"
227
+ end # if connected
228
+
229
+ end # def write
230
+
231
+ def read
232
+ packet = super()
233
+ if packet
234
+ if @handshake_packet.identify?(packet.buffer(false))
235
+ handshake_packet = @handshake_packet.clone
236
+ handshake_packet.buffer = packet.buffer
237
+ my_handshake = LincHandshake.new(handshake_packet, @target_names[0])
238
+
239
+ if handshake_packet.read('origin') == "LCL"
240
+ # Update the current value table for this command
241
+ command = System.commands.packet(my_handshake.identified_command.target_name, my_handshake.identified_command.packet_name)
242
+ command.received_time = my_handshake.identified_command.received_time
243
+ command.buffer = my_handshake.identified_command.buffer
244
+ command.received_count += 1
245
+
246
+ # Put a log of the command onto the server for the user to see
247
+ Logger.info("External Command: " + System.commands.format(my_handshake.identified_command, System.targets[@target_names[0]].ignored_parameters))
248
+
249
+ # Log the command to the command log(s)
250
+ @packet_log_writer_pairs.each do |packet_log_writer_pair|
251
+ packet_log_writer_pair.cmd_log_writer.write(my_handshake.identified_command)
252
+ end
253
+ else
254
+ # This is a remote packet (sent from here).
255
+ # Add to the array of handshake packet responses (only if handshakes are enabled).
256
+ # The mutex is required by the command task due to the way it
257
+ # first looks up the handshake before removing it.
258
+ if @handshake_enabled
259
+ @handshakes_mutex.synchronize do
260
+ @handshakes.push(my_handshake)
261
+ if @handshakes.length > MAX_CONCURRENT_HANDSHAKES
262
+ len = @handshakes.length
263
+ @handshakes = []
264
+ raise "The handshakes response array has grown to #{len}. Clearing all handshakes!"
265
+ end
266
+ # Tell all waiting commands to take a look
267
+ @handshakes_resource.broadcast
268
+ end # @handshakes_mutex.synchronize
269
+ end # if @handshake_enabled
270
+
271
+ end # if handshake_packet.read('origin') == "LCL"
272
+ end # @handshake_packet.identify?(packet.buffer(false))
273
+ end # if packet
274
+
275
+ return packet
276
+ end
277
+
278
+ end # class LincInterface
279
+
280
+ # The LincHandshake class is used only by the LincInterface. It processes the handshake and
281
+ # helps with finding the information regarding the internal command.
282
+ class LincHandshake
283
+ attr_accessor :handshake
284
+ attr_accessor :identified_command
285
+ attr_accessor :error_source
286
+
287
+ def initialize(handshake, interface_target_name)
288
+ @handshake = handshake
289
+
290
+ # Interpret the command field of the handshake packet
291
+ # Where DATA is defined as:
292
+ # 1 byte target name length
293
+ # X byte target name
294
+ # 1 byte packet name length
295
+ # X byte packet name
296
+ # 4 byte packet data length
297
+ # X byte packet data
298
+ # 4 byte error source length
299
+ # X byte error source
300
+ data = handshake.read('DATA')
301
+ raise "Data field too short for target name length" if data.length == 0
302
+
303
+ # Get target name length
304
+ target_name_length = data[0..0].unpack('C')[0]
305
+ raise "Invalid target name length" if target_name_length == 0
306
+ data = data[1..-1]
307
+
308
+ # get target name
309
+ raise "Data field too short for target name" if data.length < target_name_length
310
+ # target_name = data[0..(target_name_length - 1)] # Unused
311
+ data = data[target_name_length..-1]
312
+
313
+ # get packet name length
314
+ raise "Data field too short for packet name length" if data.length == 0
315
+ packet_name_length = data[0..0].unpack('C')[0]
316
+ raise "Invalid packet name length" if packet_name_length == 0
317
+ data = data[1..-1]
318
+
319
+ # get packet name
320
+ raise "Data field too short for packet name" if data.length < packet_name_length
321
+ packet_name = data[0..(packet_name_length - 1)]
322
+ data = data[packet_name_length..-1]
323
+
324
+ # get packet data length
325
+ raise "Data field too short for packet data length" if data.length < 4
326
+ packet_data_length = data[0..3].unpack('N')[0]
327
+ raise "Invalid data length" if packet_data_length == 0
328
+ data = data[4..-1]
329
+
330
+ # get packet data
331
+ raise "Data field too short for packet data" if data.length < packet_data_length
332
+ packet_data = data[0..(packet_data_length - 1)]
333
+ data = data[packet_data_length..-1]
334
+
335
+ # get error source length
336
+ raise "Data field too short for error source length" if data.length < 4
337
+ error_source_length = data[0..3].unpack('N')[0]
338
+ # note it is OK to have a 0 source length
339
+ data = data[4..-1]
340
+
341
+ # get error source - store on object
342
+ if error_source_length > 0
343
+ @error_source = data[0..(error_source_length - 1)]
344
+ else
345
+ @error_source = ''
346
+ end
347
+
348
+ # make packet - store on object as a defined packet of type command that this handshakes
349
+ @identified_command = System.commands.packet(interface_target_name, packet_name).clone
350
+ @identified_command.buffer = packet_data
351
+ @identified_command.received_time = Time.at(handshake.read('TIME_SECONDS'), handshake.read('TIME_MICROSECONDS'))
352
+ end
353
+
354
+ def get_cmd_guid(fieldname_guid)
355
+ return @identified_command.read(fieldname_guid)
356
+ end
357
+
358
+ end # class LincHandshake
359
+
360
+ end # module Cosmos