cosmos 3.5.1 → 3.5.2

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 (1158) hide show
  1. checksums.yaml +4 -4
  2. data/.coveralls.yml +1 -1
  3. data/.gitattributes +3 -3
  4. data/.gitignore +48 -48
  5. data/.travis.yml +8 -8
  6. data/CONTRIBUTING.txt +50 -50
  7. data/Gemfile +10 -10
  8. data/Guardfile +27 -27
  9. data/LICENSE.txt +879 -879
  10. data/Manifest.txt +1414 -1414
  11. data/README.md +111 -111
  12. data/Rakefile +218 -214
  13. data/autohotkey/config/data/diamond.STL +57 -57
  14. data/autohotkey/config/system/system.txt +34 -34
  15. data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  16. data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  17. data/autohotkey/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  18. data/autohotkey/config/targets/COSMOS/target.txt +5 -5
  19. data/autohotkey/config/targets/INST/cmd_tlm/inst_cmds.txt +121 -121
  20. data/autohotkey/config/targets/INST/cmd_tlm/inst_tlm.txt +270 -270
  21. data/autohotkey/config/targets/INST/cmd_tlm_server.txt +5 -5
  22. data/autohotkey/config/targets/INST/lib/example_limits_response.rb +30 -30
  23. data/autohotkey/config/targets/INST/lib/sim_inst.rb +305 -305
  24. data/autohotkey/config/targets/INST/screens/adcs.txt +46 -46
  25. data/autohotkey/config/targets/INST/screens/array.txt +7 -7
  26. data/autohotkey/config/targets/INST/screens/block.txt +8 -8
  27. data/autohotkey/config/targets/INST/screens/commanding.txt +30 -30
  28. data/autohotkey/config/targets/INST/screens/graphs.txt +14 -14
  29. data/autohotkey/config/targets/INST/screens/ground.txt +25 -25
  30. data/autohotkey/config/targets/INST/screens/health_status.txt +33 -33
  31. data/autohotkey/config/targets/INST/screens/hs.txt +49 -49
  32. data/autohotkey/config/targets/INST/screens/image.txt +21 -21
  33. data/autohotkey/config/targets/INST/screens/latest.txt +23 -23
  34. data/autohotkey/config/targets/INST/screens/mech.txt +25 -25
  35. data/autohotkey/config/targets/INST/screens/other.txt +25 -25
  36. data/autohotkey/config/targets/INST/screens/params.txt +25 -25
  37. data/autohotkey/config/targets/INST/screens/tabs.txt +68 -68
  38. data/autohotkey/config/targets/INST/target.txt +26 -26
  39. data/autohotkey/config/targets/META/cmd_tlm/meta_cmd.txt +10 -10
  40. data/autohotkey/config/targets/META/cmd_tlm/meta_tlm.txt +9 -9
  41. data/autohotkey/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
  42. data/autohotkey/config/targets/SYSTEM/screens/error.txt +11 -11
  43. data/autohotkey/config/tools/cmd_tlm_server/cmd_tlm_server.txt +22 -22
  44. data/autohotkey/config/tools/data_viewer/data_viewer.txt +11 -11
  45. data/autohotkey/config/tools/handbook_creator/handbook_creator.txt +49 -49
  46. data/autohotkey/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
  47. data/autohotkey/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  48. data/autohotkey/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  49. data/autohotkey/config/tools/handbook_creator/templates/header.html.erb +25 -25
  50. data/autohotkey/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  51. data/autohotkey/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  52. data/autohotkey/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  53. data/autohotkey/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  54. data/autohotkey/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  55. data/autohotkey/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  56. data/autohotkey/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
  57. data/autohotkey/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  58. data/autohotkey/config/tools/handbook_creator/templates/title.html.erb +1 -1
  59. data/autohotkey/config/tools/launcher/launcher.txt +38 -38
  60. data/autohotkey/config/tools/script_runner/script_runner.txt +3 -3
  61. data/autohotkey/config/tools/table_manager/ConfigTables_def.txt +8 -8
  62. data/autohotkey/config/tools/table_manager/OneDimensionalTable_def.txt +19 -19
  63. data/autohotkey/config/tools/table_manager/TwoDimensionalTable_def.txt +248 -248
  64. data/autohotkey/config/tools/test_runner/test_runner.txt +8 -8
  65. data/autohotkey/config/tools/test_runner/test_runner2.txt +11 -11
  66. data/autohotkey/config/tools/test_runner/test_runner3.txt +6 -6
  67. data/autohotkey/config/tools/test_runner/test_runner4.txt +1 -1
  68. data/autohotkey/config/tools/tlm_extractor/tlm_extractor.txt +13 -13
  69. data/autohotkey/config/tools/tlm_extractor/tlm_extractor2.txt +9 -9
  70. data/autohotkey/config/tools/tlm_grapher/bad.txt +50 -50
  71. data/autohotkey/config/tools/tlm_grapher/temp1-4.txt +51 -51
  72. data/autohotkey/config/tools/tlm_grapher/test2.txt +111 -111
  73. data/autohotkey/config/tools/tlm_viewer/tlm_viewer.txt +24 -24
  74. data/autohotkey/config/tools/tlm_viewer/tlm_viewer2.txt +4 -4
  75. data/autohotkey/config/tools/tlm_viewer/tlm_viewer3.txt +3 -3
  76. data/autohotkey/lib/example_background_task.rb +42 -42
  77. data/autohotkey/lib/user_version.rb +3 -3
  78. data/autohotkey/procedures/clear_util.rb +7 -7
  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 +24 -24
  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/ReplayAHK +17 -17
  101. data/autohotkey/tools/ScriptRunner +14 -14
  102. data/autohotkey/tools/ScriptRunnerAHK +20 -20
  103. data/autohotkey/tools/ScriptRunnerAHK2 +17 -17
  104. data/autohotkey/tools/TableManager +14 -14
  105. data/autohotkey/tools/TableManagerAHK +30 -30
  106. data/autohotkey/tools/TestRunner +15 -15
  107. data/autohotkey/tools/TestRunnerAHK +17 -17
  108. data/autohotkey/tools/TestRunnerAHK2 +17 -17
  109. data/autohotkey/tools/TestRunnerAHK3 +17 -17
  110. data/autohotkey/tools/TestRunnerAHK4 +17 -17
  111. data/autohotkey/tools/TestRunnerAHK5 +17 -17
  112. data/autohotkey/tools/TestRunnerAHK6 +17 -17
  113. data/autohotkey/tools/TlmExtractor +15 -15
  114. data/autohotkey/tools/TlmExtractorAHK +19 -19
  115. data/autohotkey/tools/TlmExtractorAHK2 +16 -16
  116. data/autohotkey/tools/TlmExtractorAHK3 +16 -16
  117. data/autohotkey/tools/TlmGrapher +14 -14
  118. data/autohotkey/tools/TlmGrapherAHK +19 -19
  119. data/autohotkey/tools/TlmGrapherAHK2 +23 -23
  120. data/autohotkey/tools/TlmGrapherAHK3 +17 -17
  121. data/autohotkey/tools/TlmGrapherAHK4 +17 -17
  122. data/autohotkey/tools/TlmViewer +14 -14
  123. data/autohotkey/tools/TlmViewerAHK +28 -28
  124. data/autohotkey/tools/TlmViewerAHK2 +22 -22
  125. data/autohotkey/tools/TlmViewerAHK3 +23 -23
  126. data/autohotkey/tools/TlmViewerAHK4 +22 -22
  127. data/autohotkey/tools/TlmViewerAHK5 +18 -18
  128. data/autohotkey/tools/autohotkey.rb +37 -37
  129. data/autohotkey/tools/cmd_extractor.ahk +33 -33
  130. data/autohotkey/tools/cmd_sender.ahk +182 -182
  131. data/autohotkey/tools/cmd_tlm_server.ahk +90 -90
  132. data/autohotkey/tools/cmd_tlm_server2.ahk +45 -45
  133. data/autohotkey/tools/data_viewer.ahk +141 -141
  134. data/autohotkey/tools/handbook_creator.ahk +32 -32
  135. data/autohotkey/tools/launcher.ahk +41 -41
  136. data/autohotkey/tools/limits_monitor.ahk +123 -123
  137. data/autohotkey/tools/open_gl_builder.ahk +134 -134
  138. data/autohotkey/tools/packet_viewer.ahk +196 -196
  139. data/autohotkey/tools/packet_viewer2.ahk +9 -9
  140. data/autohotkey/tools/replay.ahk +104 -104
  141. data/autohotkey/tools/script_runner.ahk +589 -589
  142. data/autohotkey/tools/script_runner2.ahk +38 -38
  143. data/autohotkey/tools/table_manager.ahk +220 -220
  144. data/autohotkey/tools/test_runner.ahk +262 -262
  145. data/autohotkey/tools/test_runner2.ahk +53 -53
  146. data/autohotkey/tools/test_runner3.ahk +13 -13
  147. data/autohotkey/tools/test_runner5.ahk +8 -8
  148. data/autohotkey/tools/test_runner6.ahk +5 -5
  149. data/autohotkey/tools/tlm_extractor.ahk +296 -296
  150. data/autohotkey/tools/tlm_grapher.ahk +660 -660
  151. data/autohotkey/tools/tlm_grapher2.ahk +115 -115
  152. data/autohotkey/tools/tlm_grapher3.ahk +24 -24
  153. data/autohotkey/tools/tlm_viewer.ahk +133 -133
  154. data/autohotkey/tools/tlm_viewer2.ahk +50 -50
  155. data/autohotkey/tools/tlm_viewer4.ahk +4 -4
  156. data/autohotkey/tools/tlm_viewer5.ahk +20 -20
  157. data/bin/cosmos +96 -96
  158. data/bin/cstol_converter +1166 -1166
  159. data/bin/rubysloc +85 -85
  160. data/cosmos.gemspec +99 -99
  161. data/data/about.txt +4 -4
  162. data/data/crc.txt +326 -326
  163. data/data/diamond.STL +57 -57
  164. data/data/legal.txt +9 -9
  165. data/demo/Gemfile +10 -10
  166. data/demo/Launcher +16 -16
  167. data/demo/Launcher.bat +0 -0
  168. data/demo/Rakefile +77 -77
  169. data/demo/config/data/crc.txt +224 -226
  170. data/demo/config/data/diamond.STL +57 -57
  171. data/demo/config/data/meta_init.txt +4 -4
  172. data/demo/config/system/system.txt +35 -35
  173. data/demo/config/system/system2.txt +33 -33
  174. data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  175. data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  176. data/demo/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  177. data/demo/config/targets/COSMOS/screens/limits_change.txt +20 -20
  178. data/demo/config/targets/COSMOS/screens/version.txt +19 -19
  179. data/demo/config/targets/COSMOS/target.txt +11 -11
  180. data/demo/config/targets/EXAMPLE/cmd_tlm/example_cmds.txt +2 -2
  181. data/demo/config/targets/EXAMPLE/cmd_tlm/example_tlm.txt +5 -5
  182. data/demo/config/targets/EXAMPLE/cmd_tlm_server.txt +6 -6
  183. data/demo/config/targets/EXAMPLE/lib/example_interface.rb +22 -22
  184. data/demo/config/targets/EXAMPLE/target.txt +6 -6
  185. data/demo/config/targets/INST/cmd_tlm/inst_cmds.txt +121 -121
  186. data/demo/config/targets/INST/cmd_tlm/inst_tlm.txt +247 -247
  187. data/demo/config/targets/INST/cmd_tlm_server.txt +5 -5
  188. data/demo/config/targets/INST/lib/example_limits_response.rb +30 -30
  189. data/demo/config/targets/INST/lib/sim_inst.rb +305 -305
  190. data/demo/config/targets/INST/screens/adcs.txt +46 -46
  191. data/demo/config/targets/INST/screens/array.txt +15 -15
  192. data/demo/config/targets/INST/screens/block.txt +8 -8
  193. data/demo/config/targets/INST/screens/commanding.txt +30 -30
  194. data/demo/config/targets/INST/screens/graphs.txt +14 -14
  195. data/demo/config/targets/INST/screens/ground.txt +25 -25
  196. data/demo/config/targets/INST/screens/hs.txt +44 -44
  197. data/demo/config/targets/INST/screens/latest.txt +23 -23
  198. data/demo/config/targets/INST/screens/other.txt +29 -29
  199. data/demo/config/targets/INST/screens/tabs.txt +70 -70
  200. data/demo/config/targets/INST/target.txt +33 -33
  201. data/demo/config/targets/META/cmd_tlm/meta_cmd.txt +10 -10
  202. data/demo/config/targets/META/cmd_tlm/meta_tlm.txt +13 -13
  203. data/demo/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
  204. data/demo/config/targets/SYSTEM/cmd_tlm/override.txt +29 -29
  205. data/demo/config/targets/SYSTEM/screens/status.txt +12 -12
  206. data/demo/config/targets/TEMPLATED/cmd_tlm/templated_cmds.txt +13 -13
  207. data/demo/config/targets/TEMPLATED/cmd_tlm/templated_tlm.txt +3 -3
  208. data/demo/config/targets/TEMPLATED/cmd_tlm_server.txt +6 -6
  209. data/demo/config/targets/TEMPLATED/lib/templated_interface.rb +56 -56
  210. data/demo/config/targets/TEMPLATED/target.txt +6 -6
  211. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server.txt +39 -39
  212. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server2.txt +34 -34
  213. data/demo/config/tools/data_viewer/data_viewer.txt +11 -11
  214. data/demo/config/tools/handbook_creator/handbook_creator.txt +66 -66
  215. data/demo/config/tools/handbook_creator/templates/command_packets.html.erb +88 -88
  216. data/demo/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  217. data/demo/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  218. data/demo/config/tools/handbook_creator/templates/header.html.erb +25 -25
  219. data/demo/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  220. data/demo/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  221. data/demo/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  222. data/demo/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  223. data/demo/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  224. data/demo/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  225. data/demo/config/tools/handbook_creator/templates/telemetry_packets.html.erb +82 -82
  226. data/demo/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  227. data/demo/config/tools/handbook_creator/templates/title.html.erb +1 -1
  228. data/demo/config/tools/launcher/launcher.txt +45 -45
  229. data/demo/config/tools/launcher/launcher2.txt +45 -45
  230. data/demo/config/tools/script_runner/script_runner.txt +3 -3
  231. data/demo/config/tools/table_manager/ConfigTables_def.txt +8 -8
  232. data/demo/config/tools/table_manager/ExampleTableDefinition.txt +24 -24
  233. data/demo/config/tools/table_manager/MCConfigurationTable_fsw1_def.txt +25 -25
  234. data/demo/config/tools/table_manager/MCConfigurationTable_fsw2_def.txt +25 -25
  235. data/demo/config/tools/table_manager/PPSSelectionTable_def.txt +8 -8
  236. data/demo/config/tools/table_manager/TLMMonitoringTable_def.txt +248 -248
  237. data/demo/config/tools/test_runner/test_runner.txt +17 -17
  238. data/demo/config/tools/tlm_extractor/tlm_extractor.txt +13 -13
  239. data/demo/config/tools/tlm_extractor/tlm_extractor2.txt +2 -2
  240. data/demo/config/tools/tlm_extractor/tlm_extractor3.txt +2 -2
  241. data/demo/config/tools/tlm_extractor/tlm_extractor4.txt +2 -2
  242. data/demo/config/tools/tlm_viewer/tlm_viewer.txt +41 -41
  243. data/demo/lib/example_background_task.rb +57 -57
  244. data/demo/lib/example_target.rb +113 -113
  245. data/demo/lib/scpi_target.rb +74 -74
  246. data/demo/lib/user_version.rb +3 -3
  247. data/demo/procedures/checks.rb +11 -11
  248. data/demo/procedures/clear_util.rb +7 -7
  249. data/demo/procedures/collect.rb +18 -18
  250. data/demo/procedures/collect_util.rb +14 -14
  251. data/demo/procedures/cosmos_api_test.rb +293 -293
  252. data/demo/procedures/disconnect.rb +29 -29
  253. data/demo/procedures/example_test.rb +183 -183
  254. data/demo/procedures/plot_test.rb +8 -8
  255. data/demo/procedures/run_example_test.rb +3 -3
  256. data/demo/procedures/test.rb +51 -51
  257. data/demo/tools/CmdExtractor +16 -16
  258. data/demo/tools/CmdExtractor.bat +0 -0
  259. data/demo/tools/CmdSender +16 -16
  260. data/demo/tools/CmdSender.bat +0 -0
  261. data/demo/tools/CmdTlmServer +16 -16
  262. data/demo/tools/CmdTlmServer.bat +0 -0
  263. data/demo/tools/DataViewer +16 -16
  264. data/demo/tools/DataViewer.bat +0 -0
  265. data/demo/tools/ExampleTarget +16 -16
  266. data/demo/tools/ExampleTarget.bat +0 -0
  267. data/demo/tools/HandbookCreator +16 -16
  268. data/demo/tools/HandbookCreator.bat +0 -0
  269. data/demo/tools/Launcher +16 -16
  270. data/demo/tools/Launcher.bat +0 -0
  271. data/demo/tools/LimitsMonitor +16 -16
  272. data/demo/tools/LimitsMonitor.bat +0 -0
  273. data/demo/tools/OpenGLBuilder +16 -16
  274. data/demo/tools/OpenGLBuilder.bat +0 -0
  275. data/demo/tools/PacketViewer +16 -16
  276. data/demo/tools/PacketViewer.bat +0 -0
  277. data/demo/tools/Replay +16 -16
  278. data/demo/tools/Replay.bat +0 -0
  279. data/demo/tools/ScpiTarget +16 -16
  280. data/demo/tools/ScpiTarget.bat +0 -0
  281. data/demo/tools/ScriptRunner +16 -16
  282. data/demo/tools/ScriptRunner.bat +0 -0
  283. data/demo/tools/TableManager +16 -16
  284. data/demo/tools/TableManager.bat +0 -0
  285. data/demo/tools/TestRunner +16 -16
  286. data/demo/tools/TestRunner.bat +0 -0
  287. data/demo/tools/TlmExtractor +16 -16
  288. data/demo/tools/TlmExtractor.bat +0 -0
  289. data/demo/tools/TlmGrapher +16 -16
  290. data/demo/tools/TlmGrapher.bat +0 -0
  291. data/demo/tools/TlmViewer +16 -16
  292. data/demo/tools/TlmViewer.bat +0 -0
  293. data/demo/tools/ToolLaunch.bat +14 -5
  294. data/demo/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
  295. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +16 -16
  296. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +10 -10
  297. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/tool_launch.rb +38 -38
  298. data/demo/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
  299. data/demo/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +16 -16
  300. data/demo/tools/mac/CmdSender.app/Contents/MacOS/main.sh +10 -10
  301. data/demo/tools/mac/CmdSender.app/Contents/MacOS/tool_launch.rb +38 -38
  302. data/demo/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
  303. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +16 -16
  304. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +10 -10
  305. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/tool_launch.rb +38 -38
  306. data/demo/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
  307. data/demo/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +16 -16
  308. data/demo/tools/mac/DataViewer.app/Contents/MacOS/main.sh +10 -10
  309. data/demo/tools/mac/DataViewer.app/Contents/MacOS/tool_launch.rb +38 -38
  310. data/demo/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
  311. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +16 -16
  312. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +10 -10
  313. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/tool_launch.rb +38 -38
  314. data/demo/tools/mac/Launcher.app/Contents/Info.plist +38 -38
  315. data/demo/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +16 -16
  316. data/demo/tools/mac/Launcher.app/Contents/MacOS/main.sh +10 -10
  317. data/demo/tools/mac/Launcher.app/Contents/MacOS/tool_launch.rb +38 -38
  318. data/demo/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
  319. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +16 -16
  320. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +10 -10
  321. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/tool_launch.rb +38 -38
  322. data/demo/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
  323. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +16 -16
  324. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +10 -10
  325. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/tool_launch.rb +38 -38
  326. data/demo/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
  327. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +16 -16
  328. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +10 -10
  329. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/tool_launch.rb +38 -38
  330. data/demo/tools/mac/Replay.app/Contents/Info.plist +38 -38
  331. data/demo/tools/mac/Replay.app/Contents/MacOS/Replay.rb +16 -16
  332. data/demo/tools/mac/Replay.app/Contents/MacOS/main.sh +10 -10
  333. data/demo/tools/mac/Replay.app/Contents/MacOS/tool_launch.rb +38 -38
  334. data/demo/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
  335. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +16 -16
  336. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +10 -10
  337. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/tool_launch.rb +38 -38
  338. data/demo/tools/mac/TableManager.app/Contents/Info.plist +38 -38
  339. data/demo/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +16 -16
  340. data/demo/tools/mac/TableManager.app/Contents/MacOS/main.sh +10 -10
  341. data/demo/tools/mac/TableManager.app/Contents/MacOS/tool_launch.rb +38 -38
  342. data/demo/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
  343. data/demo/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +16 -16
  344. data/demo/tools/mac/TestRunner.app/Contents/MacOS/main.sh +10 -10
  345. data/demo/tools/mac/TestRunner.app/Contents/MacOS/tool_launch.rb +38 -38
  346. data/demo/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
  347. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +16 -16
  348. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +10 -10
  349. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/tool_launch.rb +38 -38
  350. data/demo/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
  351. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +16 -16
  352. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +10 -10
  353. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/tool_launch.rb +38 -38
  354. data/demo/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
  355. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +16 -16
  356. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +10 -10
  357. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/tool_launch.rb +38 -38
  358. data/demo/tools/tool_launch.rb +38 -38
  359. data/ext/cosmos/ext/array/array.c +111 -111
  360. data/ext/cosmos/ext/array/extconf.rb +13 -13
  361. data/ext/cosmos/ext/buffered_file/buffered_file.c +167 -167
  362. data/ext/cosmos/ext/buffered_file/extconf.rb +13 -13
  363. data/ext/cosmos/ext/config_parser/config_parser.c +237 -237
  364. data/ext/cosmos/ext/config_parser/extconf.rb +13 -13
  365. data/ext/cosmos/ext/cosmos_io/cosmos_io.c +117 -117
  366. data/ext/cosmos/ext/cosmos_io/extconf.rb +13 -13
  367. data/ext/cosmos/ext/crc/crc.c +341 -341
  368. data/ext/cosmos/ext/crc/extconf.rb +12 -12
  369. data/ext/cosmos/ext/line_graph/extconf.rb +13 -13
  370. data/ext/cosmos/ext/line_graph/line_graph.c +501 -501
  371. data/ext/cosmos/ext/low_fragmentation_array/extconf.rb +12 -12
  372. data/ext/cosmos/ext/low_fragmentation_array/low_fragmentation_array.c +265 -265
  373. data/ext/cosmos/ext/packet/extconf.rb +13 -13
  374. data/ext/cosmos/ext/packet/packet.c +339 -339
  375. data/ext/cosmos/ext/platform/extconf.rb +13 -13
  376. data/ext/cosmos/ext/platform/platform.c +101 -101
  377. data/ext/cosmos/ext/polynomial_conversion/extconf.rb +13 -13
  378. data/ext/cosmos/ext/polynomial_conversion/polynomial_conversion.c +73 -73
  379. data/ext/cosmos/ext/string/extconf.rb +13 -13
  380. data/ext/cosmos/ext/string/string.c +49 -49
  381. data/ext/cosmos/ext/structure/structure.c +1428 -1428
  382. data/ext/cosmos/ext/tabbed_plots_config/extconf.rb +13 -13
  383. data/ext/cosmos/ext/tabbed_plots_config/tabbed_plots_config.c +51 -51
  384. data/ext/cosmos/ext/telemetry/extconf.rb +13 -13
  385. data/ext/cosmos/ext/telemetry/telemetry.c +307 -307
  386. data/ext/mkrf_conf.rb +40 -40
  387. data/install/Gemfile +10 -10
  388. data/install/Launcher +16 -16
  389. data/install/Launcher.bat +0 -0
  390. data/install/Rakefile +77 -77
  391. data/install/config/data/crc.txt +151 -151
  392. data/install/config/system/system.txt +29 -29
  393. data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  394. data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  395. data/install/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  396. data/install/config/targets/COSMOS/screens/limits_change.txt +20 -20
  397. data/install/config/targets/COSMOS/screens/version.txt +19 -19
  398. data/install/config/targets/COSMOS/target.txt +8 -8
  399. data/install/config/tools/cmd_tlm_server/cmd_tlm_server.txt +2 -2
  400. data/install/config/tools/data_viewer/data_viewer.txt +3 -3
  401. data/install/config/tools/handbook_creator/handbook_creator.txt +49 -49
  402. data/install/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
  403. data/install/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  404. data/install/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  405. data/install/config/tools/handbook_creator/templates/header.html.erb +25 -25
  406. data/install/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  407. data/install/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  408. data/install/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  409. data/install/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  410. data/install/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  411. data/install/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  412. data/install/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
  413. data/install/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  414. data/install/config/tools/handbook_creator/templates/title.html.erb +1 -1
  415. data/install/config/tools/launcher/launcher.txt +40 -40
  416. data/install/config/tools/script_runner/script_runner.txt +3 -3
  417. data/install/config/tools/test_runner/test_runner.txt +8 -8
  418. data/install/config/tools/tlm_viewer/tlm_viewer.txt +5 -5
  419. data/install/lib/user_version.rb +3 -3
  420. data/install/tools/CmdExtractor +16 -16
  421. data/install/tools/CmdExtractor.bat +0 -0
  422. data/install/tools/CmdSender +16 -16
  423. data/install/tools/CmdSender.bat +0 -0
  424. data/install/tools/CmdTlmServer +16 -16
  425. data/install/tools/CmdTlmServer.bat +0 -0
  426. data/install/tools/DataViewer +16 -16
  427. data/install/tools/DataViewer.bat +0 -0
  428. data/install/tools/HandbookCreator +16 -16
  429. data/install/tools/HandbookCreator.bat +0 -0
  430. data/install/tools/Launcher +16 -16
  431. data/install/tools/Launcher.bat +0 -0
  432. data/install/tools/LimitsMonitor +16 -16
  433. data/install/tools/LimitsMonitor.bat +0 -0
  434. data/install/tools/OpenGLBuilder +16 -16
  435. data/install/tools/OpenGLBuilder.bat +0 -0
  436. data/install/tools/PacketViewer +16 -16
  437. data/install/tools/PacketViewer.bat +0 -0
  438. data/install/tools/Replay +16 -16
  439. data/install/tools/Replay.bat +0 -0
  440. data/install/tools/ScriptRunner +16 -16
  441. data/install/tools/ScriptRunner.bat +0 -0
  442. data/install/tools/TableManager +16 -16
  443. data/install/tools/TableManager.bat +0 -0
  444. data/install/tools/TestRunner +16 -16
  445. data/install/tools/TestRunner.bat +0 -0
  446. data/install/tools/TlmExtractor +16 -16
  447. data/install/tools/TlmExtractor.bat +0 -0
  448. data/install/tools/TlmGrapher +16 -16
  449. data/install/tools/TlmGrapher.bat +0 -0
  450. data/install/tools/TlmViewer +16 -16
  451. data/install/tools/TlmViewer.bat +0 -0
  452. data/install/tools/ToolLaunch.bat +14 -5
  453. data/install/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
  454. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +16 -16
  455. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +10 -10
  456. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/tool_launch.rb +38 -38
  457. data/install/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
  458. data/install/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +16 -16
  459. data/install/tools/mac/CmdSender.app/Contents/MacOS/main.sh +10 -10
  460. data/install/tools/mac/CmdSender.app/Contents/MacOS/tool_launch.rb +38 -38
  461. data/install/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
  462. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +16 -16
  463. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +10 -10
  464. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/tool_launch.rb +38 -38
  465. data/install/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
  466. data/install/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +16 -16
  467. data/install/tools/mac/DataViewer.app/Contents/MacOS/main.sh +10 -10
  468. data/install/tools/mac/DataViewer.app/Contents/MacOS/tool_launch.rb +38 -38
  469. data/install/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
  470. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +16 -16
  471. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +10 -10
  472. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/tool_launch.rb +38 -38
  473. data/install/tools/mac/Launcher.app/Contents/Info.plist +38 -38
  474. data/install/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +16 -16
  475. data/install/tools/mac/Launcher.app/Contents/MacOS/main.sh +10 -10
  476. data/install/tools/mac/Launcher.app/Contents/MacOS/tool_launch.rb +38 -38
  477. data/install/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
  478. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +16 -16
  479. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +10 -10
  480. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/tool_launch.rb +38 -38
  481. data/install/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
  482. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +16 -16
  483. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +10 -10
  484. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/tool_launch.rb +38 -38
  485. data/install/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
  486. data/install/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +16 -16
  487. data/install/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +10 -10
  488. data/install/tools/mac/PacketViewer.app/Contents/MacOS/tool_launch.rb +38 -38
  489. data/install/tools/mac/Replay.app/Contents/Info.plist +38 -38
  490. data/install/tools/mac/Replay.app/Contents/MacOS/Replay.rb +16 -16
  491. data/install/tools/mac/Replay.app/Contents/MacOS/main.sh +10 -10
  492. data/install/tools/mac/Replay.app/Contents/MacOS/tool_launch.rb +38 -38
  493. data/install/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
  494. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +16 -16
  495. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +10 -10
  496. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/tool_launch.rb +38 -38
  497. data/install/tools/mac/TableManager.app/Contents/Info.plist +38 -38
  498. data/install/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +16 -16
  499. data/install/tools/mac/TableManager.app/Contents/MacOS/main.sh +10 -10
  500. data/install/tools/mac/TableManager.app/Contents/MacOS/tool_launch.rb +38 -38
  501. data/install/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
  502. data/install/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +16 -16
  503. data/install/tools/mac/TestRunner.app/Contents/MacOS/main.sh +10 -10
  504. data/install/tools/mac/TestRunner.app/Contents/MacOS/tool_launch.rb +38 -38
  505. data/install/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
  506. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +16 -16
  507. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +10 -10
  508. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/tool_launch.rb +38 -38
  509. data/install/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
  510. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +16 -16
  511. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +10 -10
  512. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/tool_launch.rb +38 -38
  513. data/install/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
  514. data/install/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +16 -16
  515. data/install/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +10 -10
  516. data/install/tools/mac/TlmViewer.app/Contents/MacOS/tool_launch.rb +38 -38
  517. data/install/tools/tool_launch.rb +38 -38
  518. data/lib/cosmos.rb +63 -63
  519. data/lib/cosmos/ccsds/ccsds_packet.rb +63 -63
  520. data/lib/cosmos/ccsds/ccsds_parser.rb +143 -143
  521. data/lib/cosmos/config/config_parser.rb +324 -324
  522. data/lib/cosmos/conversions.rb +13 -13
  523. data/lib/cosmos/conversions/conversion.rb +47 -47
  524. data/lib/cosmos/conversions/generic_conversion.rb +55 -55
  525. data/lib/cosmos/conversions/new_packet_log_conversion.rb +45 -45
  526. data/lib/cosmos/conversions/polynomial_conversion.rb +57 -57
  527. data/lib/cosmos/conversions/processor_conversion.rb +46 -46
  528. data/lib/cosmos/conversions/received_count_conversion.rb +33 -33
  529. data/lib/cosmos/conversions/received_time_formatted_conversion.rb +37 -37
  530. data/lib/cosmos/conversions/received_time_seconds_conversion.rb +37 -37
  531. data/lib/cosmos/conversions/segmented_polynomial_conversion.rb +128 -128
  532. data/lib/cosmos/conversions/unix_time_conversion.rb +50 -50
  533. data/lib/cosmos/conversions/unix_time_formatted_conversion.rb +44 -44
  534. data/lib/cosmos/conversions/unix_time_seconds_conversion.rb +44 -44
  535. data/lib/cosmos/core_ext.rb +18 -18
  536. data/lib/cosmos/core_ext/array.rb +354 -354
  537. data/lib/cosmos/core_ext/class.rb +51 -51
  538. data/lib/cosmos/core_ext/cosmos_io.rb +29 -29
  539. data/lib/cosmos/core_ext/exception.rb +52 -52
  540. data/lib/cosmos/core_ext/file.rb +75 -75
  541. data/lib/cosmos/core_ext/hash.rb +28 -28
  542. data/lib/cosmos/core_ext/io.rb +75 -75
  543. data/lib/cosmos/core_ext/kernel.rb +38 -38
  544. data/lib/cosmos/core_ext/math.rb +119 -119
  545. data/lib/cosmos/core_ext/matrix.rb +146 -146
  546. data/lib/cosmos/core_ext/objectspace.rb +29 -29
  547. data/lib/cosmos/core_ext/range.rb +22 -22
  548. data/lib/cosmos/core_ext/socket.rb +32 -32
  549. data/lib/cosmos/core_ext/string.rb +311 -311
  550. data/lib/cosmos/core_ext/stringio.rb +24 -24
  551. data/lib/cosmos/core_ext/time.rb +448 -448
  552. data/lib/cosmos/gui/choosers/combobox_chooser.rb +130 -130
  553. data/lib/cosmos/gui/choosers/file_chooser.rb +68 -68
  554. data/lib/cosmos/gui/choosers/float_chooser.rb +82 -82
  555. data/lib/cosmos/gui/choosers/integer_chooser.rb +80 -80
  556. data/lib/cosmos/gui/choosers/string_chooser.rb +53 -53
  557. data/lib/cosmos/gui/choosers/telemetry_chooser.rb +326 -326
  558. data/lib/cosmos/gui/dialogs/about_dialog.rb +137 -137
  559. data/lib/cosmos/gui/dialogs/calendar_dialog.rb +136 -136
  560. data/lib/cosmos/gui/dialogs/cmd_details_dialog.rb +52 -52
  561. data/lib/cosmos/gui/dialogs/cmd_tlm_raw_dialog.rb +149 -149
  562. data/lib/cosmos/gui/dialogs/details_dialog.rb +174 -174
  563. data/lib/cosmos/gui/dialogs/exception_dialog.rb +97 -97
  564. data/lib/cosmos/gui/dialogs/exception_list_dialog.rb +59 -59
  565. data/lib/cosmos/gui/dialogs/find_replace_dialog.rb +260 -260
  566. data/lib/cosmos/gui/dialogs/legal_dialog.rb +169 -169
  567. data/lib/cosmos/gui/dialogs/packet_log_dialog.rb +118 -118
  568. data/lib/cosmos/gui/dialogs/progress_dialog.rb +276 -276
  569. data/lib/cosmos/gui/dialogs/pry_dialog.rb +165 -165
  570. data/lib/cosmos/gui/dialogs/scroll_text_dialog.rb +37 -37
  571. data/lib/cosmos/gui/dialogs/select_dialog.rb +54 -54
  572. data/lib/cosmos/gui/dialogs/set_tlm_dialog.rb +131 -131
  573. data/lib/cosmos/gui/dialogs/splash.rb +135 -135
  574. data/lib/cosmos/gui/dialogs/tlm_details_dialog.rb +206 -206
  575. data/lib/cosmos/gui/dialogs/tlm_edit_dialog.rb +81 -81
  576. data/lib/cosmos/gui/line_graph/line_graph.rb +456 -456
  577. data/lib/cosmos/gui/line_graph/line_graph_dialog.rb +34 -34
  578. data/lib/cosmos/gui/line_graph/line_graph_drawing.rb +473 -473
  579. data/lib/cosmos/gui/line_graph/line_graph_popups.rb +116 -116
  580. data/lib/cosmos/gui/line_graph/line_graph_scaling.rb +451 -451
  581. data/lib/cosmos/gui/line_graph/line_graph_script.rb +26 -26
  582. data/lib/cosmos/gui/line_graph/lines.rb +290 -290
  583. data/lib/cosmos/gui/line_graph/overview_graph.rb +469 -469
  584. data/lib/cosmos/gui/opengl/earth_model.rb +22 -22
  585. data/lib/cosmos/gui/opengl/gl_bounds.rb +67 -67
  586. data/lib/cosmos/gui/opengl/gl_light.rb +39 -39
  587. data/lib/cosmos/gui/opengl/gl_material.rb +29 -29
  588. data/lib/cosmos/gui/opengl/gl_scene.rb +72 -72
  589. data/lib/cosmos/gui/opengl/gl_shape.rb +146 -146
  590. data/lib/cosmos/gui/opengl/gl_viewer.rb +724 -724
  591. data/lib/cosmos/gui/opengl/gl_viewport.rb +35 -35
  592. data/lib/cosmos/gui/opengl/moon_model.rb +22 -22
  593. data/lib/cosmos/gui/opengl/opengl.rb +8 -8
  594. data/lib/cosmos/gui/opengl/stl_reader.rb +211 -211
  595. data/lib/cosmos/gui/opengl/stl_shape.rb +124 -124
  596. data/lib/cosmos/gui/opengl/texture_mapped_sphere.rb +202 -202
  597. data/lib/cosmos/gui/qt.rb +860 -860
  598. data/lib/cosmos/gui/qt_tool.rb +380 -380
  599. data/lib/cosmos/gui/text/completion.rb +381 -381
  600. data/lib/cosmos/gui/text/completion_line_edit.rb +30 -30
  601. data/lib/cosmos/gui/text/completion_text_edit.rb +179 -179
  602. data/lib/cosmos/gui/text/ruby_editor.rb +415 -415
  603. data/lib/cosmos/gui/utilities/screenshot.rb +25 -25
  604. data/lib/cosmos/gui/utilities/script_module_gui.rb +330 -330
  605. data/lib/cosmos/gui/widgets/full_text_search_line_edit.rb +161 -161
  606. data/lib/cosmos/gui/widgets/packet_log_frame.rb +305 -305
  607. data/lib/cosmos/gui/widgets/realtime_button_bar.rb +98 -98
  608. data/lib/cosmos/interfaces.rb +11 -11
  609. data/lib/cosmos/interfaces/cmd_tlm_server_interface.rb +153 -153
  610. data/lib/cosmos/interfaces/interface.rb +225 -225
  611. data/lib/cosmos/interfaces/linc_interface.rb +360 -360
  612. data/lib/cosmos/interfaces/serial_interface.rb +76 -76
  613. data/lib/cosmos/interfaces/simulated_target_interface.rb +129 -129
  614. data/lib/cosmos/interfaces/stream_interface.rb +136 -136
  615. data/lib/cosmos/interfaces/tcpip_client_interface.rb +60 -60
  616. data/lib/cosmos/interfaces/tcpip_server_interface.rb +164 -164
  617. data/lib/cosmos/interfaces/udp_interface.rb +161 -161
  618. data/lib/cosmos/io/buffered_file.rb +11 -11
  619. data/lib/cosmos/io/cosmos_snmp.rb +50 -50
  620. data/lib/cosmos/io/io_multiplexer.rb +89 -89
  621. data/lib/cosmos/io/json_drb.rb +376 -376
  622. data/lib/cosmos/io/json_drb_object.rb +198 -198
  623. data/lib/cosmos/io/json_rpc.rb +365 -365
  624. data/lib/cosmos/io/posix_serial_driver.rb +145 -145
  625. data/lib/cosmos/io/raw_logger.rb +174 -174
  626. data/lib/cosmos/io/raw_logger_pair.rb +71 -71
  627. data/lib/cosmos/io/serial_driver.rb +85 -85
  628. data/lib/cosmos/io/stderr.rb +36 -36
  629. data/lib/cosmos/io/stdout.rb +36 -36
  630. data/lib/cosmos/io/tcpip_server.rb +571 -571
  631. data/lib/cosmos/io/udp_sockets.rb +152 -152
  632. data/lib/cosmos/io/win32_serial_driver.rb +145 -145
  633. data/lib/cosmos/packet_logs.rb +7 -7
  634. data/lib/cosmos/packet_logs/ccsds_log_reader.rb +104 -104
  635. data/lib/cosmos/packet_logs/meta_packet_log_writer.rb +107 -107
  636. data/lib/cosmos/packet_logs/packet_log_reader.rb +450 -450
  637. data/lib/cosmos/packet_logs/packet_log_writer.rb +323 -323
  638. data/lib/cosmos/packet_logs/packet_log_writer_pair.rb +30 -30
  639. data/lib/cosmos/packets/binary_accessor.rb +634 -634
  640. data/lib/cosmos/packets/commands.rb +293 -293
  641. data/lib/cosmos/packets/limits.rb +267 -267
  642. data/lib/cosmos/packets/limits_response.rb +38 -38
  643. data/lib/cosmos/packets/packet.rb +786 -786
  644. data/lib/cosmos/packets/packet_config.rb +482 -482
  645. data/lib/cosmos/packets/packet_item.rb +317 -317
  646. data/lib/cosmos/packets/packet_item_limits.rb +128 -128
  647. data/lib/cosmos/packets/parsers/format_string_parser.rb +58 -58
  648. data/lib/cosmos/packets/parsers/limits_parser.rb +146 -146
  649. data/lib/cosmos/packets/parsers/limits_response_parser.rb +52 -52
  650. data/lib/cosmos/packets/parsers/macro_parser.rb +116 -116
  651. data/lib/cosmos/packets/parsers/packet_item_parser.rb +215 -215
  652. data/lib/cosmos/packets/parsers/packet_parser.rb +123 -123
  653. data/lib/cosmos/packets/parsers/processor_parser.rb +63 -63
  654. data/lib/cosmos/packets/parsers/state_parser.rb +116 -116
  655. data/lib/cosmos/packets/structure.rb +458 -458
  656. data/lib/cosmos/packets/structure_item.rb +233 -233
  657. data/lib/cosmos/packets/telemetry.rb +350 -350
  658. data/lib/cosmos/processors.rb +6 -6
  659. data/lib/cosmos/processors/new_packet_log_processor.rb +34 -34
  660. data/lib/cosmos/processors/processor.rb +71 -71
  661. data/lib/cosmos/processors/statistics_processor.rb +65 -65
  662. data/lib/cosmos/processors/watermark_processor.rb +44 -44
  663. data/lib/cosmos/script.rb +9 -9
  664. data/lib/cosmos/script/cmd_tlm_server.rb +110 -110
  665. data/lib/cosmos/script/commands.rb +184 -184
  666. data/lib/cosmos/script/extract.rb +123 -123
  667. data/lib/cosmos/script/limits.rb +114 -114
  668. data/lib/cosmos/script/script.rb +76 -76
  669. data/lib/cosmos/script/scripting.rb +897 -897
  670. data/lib/cosmos/script/telemetry.rb +174 -174
  671. data/lib/cosmos/script/tools.rb +138 -138
  672. data/lib/cosmos/streams/burst_stream_protocol.rb +25 -25
  673. data/lib/cosmos/streams/fixed_stream_protocol.rb +111 -111
  674. data/lib/cosmos/streams/length_stream_protocol.rb +140 -140
  675. data/lib/cosmos/streams/preidentified_stream_protocol.rb +118 -118
  676. data/lib/cosmos/streams/serial_stream.rb +157 -157
  677. data/lib/cosmos/streams/stream.rb +63 -63
  678. data/lib/cosmos/streams/stream_protocol.rb +373 -373
  679. data/lib/cosmos/streams/tcpip_client_stream.rb +113 -113
  680. data/lib/cosmos/streams/tcpip_socket_stream.rb +143 -143
  681. data/lib/cosmos/streams/template_stream_protocol.rb +140 -140
  682. data/lib/cosmos/streams/terminated_stream_protocol.rb +81 -81
  683. data/lib/cosmos/system.rb +4 -4
  684. data/lib/cosmos/system/system.rb +618 -618
  685. data/lib/cosmos/system/target.rb +197 -197
  686. data/lib/cosmos/tools/cmd_extractor/cmd_extractor.rb +255 -255
  687. data/lib/cosmos/tools/cmd_sender/cmd_sender.rb +717 -717
  688. data/lib/cosmos/tools/cmd_sender/cmd_sender_item_delegate.rb +77 -77
  689. data/lib/cosmos/tools/cmd_sender/cmd_sender_text_edit.rb +70 -70
  690. data/lib/cosmos/tools/cmd_tlm_server/api.rb +1034 -1034
  691. data/lib/cosmos/tools/cmd_tlm_server/background_task.rb +46 -46
  692. data/lib/cosmos/tools/cmd_tlm_server/background_tasks.rb +67 -67
  693. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +515 -515
  694. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_config.rb +253 -253
  695. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +408 -408
  696. data/lib/cosmos/tools/cmd_tlm_server/commanding.rb +112 -112
  697. data/lib/cosmos/tools/cmd_tlm_server/connections.rb +175 -175
  698. data/lib/cosmos/tools/cmd_tlm_server/gui/interfaces_tab.rb +200 -200
  699. data/lib/cosmos/tools/cmd_tlm_server/gui/logging_tab.rb +176 -176
  700. data/lib/cosmos/tools/cmd_tlm_server/gui/packets_tab.rb +150 -150
  701. data/lib/cosmos/tools/cmd_tlm_server/gui/status_tab.rb +244 -244
  702. data/lib/cosmos/tools/cmd_tlm_server/gui/targets_tab.rb +90 -90
  703. data/lib/cosmos/tools/cmd_tlm_server/interface_thread.rb +266 -266
  704. data/lib/cosmos/tools/cmd_tlm_server/interfaces.rb +127 -127
  705. data/lib/cosmos/tools/cmd_tlm_server/packet_logging.rb +132 -132
  706. data/lib/cosmos/tools/cmd_tlm_server/router_thread.rb +66 -66
  707. data/lib/cosmos/tools/cmd_tlm_server/routers.rb +97 -97
  708. data/lib/cosmos/tools/data_viewer/data_viewer.rb +621 -621
  709. data/lib/cosmos/tools/data_viewer/data_viewer_component.rb +134 -134
  710. data/lib/cosmos/tools/data_viewer/dump_component.rb +40 -40
  711. data/lib/cosmos/tools/handbook_creator/handbook_creator.rb +156 -156
  712. data/lib/cosmos/tools/handbook_creator/handbook_creator_config.rb +382 -382
  713. data/lib/cosmos/tools/launcher/launcher.rb +188 -188
  714. data/lib/cosmos/tools/launcher/launcher_config.rb +256 -256
  715. data/lib/cosmos/tools/launcher/launcher_multitool.rb +40 -40
  716. data/lib/cosmos/tools/launcher/launcher_tool.rb +116 -116
  717. data/lib/cosmos/tools/limits_monitor/limits_monitor.rb +837 -837
  718. data/lib/cosmos/tools/opengl_builder/opengl_builder.rb +416 -416
  719. data/lib/cosmos/tools/opengl_builder/scene_config.rb +118 -118
  720. data/lib/cosmos/tools/packet_viewer/packet_viewer.rb +542 -542
  721. data/lib/cosmos/tools/replay/replay.rb +501 -501
  722. data/lib/cosmos/tools/replay/replay_server.rb +91 -91
  723. data/lib/cosmos/tools/script_runner/script_audit.rb +147 -147
  724. data/lib/cosmos/tools/script_runner/script_runner.rb +922 -922
  725. data/lib/cosmos/tools/script_runner/script_runner_config.rb +40 -40
  726. data/lib/cosmos/tools/script_runner/script_runner_frame.rb +1798 -1798
  727. data/lib/cosmos/tools/table_manager/table.rb +70 -70
  728. data/lib/cosmos/tools/table_manager/table_config.rb +764 -764
  729. data/lib/cosmos/tools/table_manager/table_item.rb +74 -74
  730. data/lib/cosmos/tools/table_manager/table_manager.rb +1065 -1065
  731. data/lib/cosmos/tools/table_manager/table_manager_core.rb +539 -539
  732. data/lib/cosmos/tools/test_runner/results_writer.rb +283 -283
  733. data/lib/cosmos/tools/test_runner/test.rb +539 -539
  734. data/lib/cosmos/tools/test_runner/test_runner.rb +1189 -1189
  735. data/lib/cosmos/tools/test_runner/test_runner_chooser.rb +341 -341
  736. data/lib/cosmos/tools/tlm_extractor/text_item_chooser.rb +60 -60
  737. data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +1016 -1016
  738. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_config.rb +371 -371
  739. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_processor.rb +60 -60
  740. data/lib/cosmos/tools/tlm_grapher/data_object_adders/housekeeping_data_object_adder.rb +75 -75
  741. data/lib/cosmos/tools/tlm_grapher/data_object_adders/singlexy_data_object_adder.rb +44 -44
  742. data/lib/cosmos/tools/tlm_grapher/data_object_adders/xy_data_object_adder.rb +95 -95
  743. data/lib/cosmos/tools/tlm_grapher/data_object_editors/data_object_editor.rb +61 -61
  744. data/lib/cosmos/tools/tlm_grapher/data_object_editors/housekeeping_data_object_editor.rb +181 -181
  745. data/lib/cosmos/tools/tlm_grapher/data_object_editors/linegraph_data_object_editor.rb +141 -141
  746. data/lib/cosmos/tools/tlm_grapher/data_object_editors/singlexy_data_object_editor.rb +30 -30
  747. data/lib/cosmos/tools/tlm_grapher/data_object_editors/xy_data_object_editor.rb +174 -174
  748. data/lib/cosmos/tools/tlm_grapher/data_objects/data_object.rb +193 -193
  749. data/lib/cosmos/tools/tlm_grapher/data_objects/housekeeping_data_object.rb +407 -407
  750. data/lib/cosmos/tools/tlm_grapher/data_objects/linegraph_data_object.rb +176 -176
  751. data/lib/cosmos/tools/tlm_grapher/data_objects/singlexy_data_object.rb +25 -25
  752. data/lib/cosmos/tools/tlm_grapher/data_objects/xy_data_object.rb +323 -323
  753. data/lib/cosmos/tools/tlm_grapher/plot_editors/linegraph_plot_editor.rb +181 -181
  754. data/lib/cosmos/tools/tlm_grapher/plot_editors/plot_editor.rb +28 -28
  755. data/lib/cosmos/tools/tlm_grapher/plot_editors/singlexy_plot_editor.rb +30 -30
  756. data/lib/cosmos/tools/tlm_grapher/plot_editors/xy_plot_editor.rb +59 -59
  757. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/linegraph_plot_gui_object.rb +172 -172
  758. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/singlexy_plot_gui_object.rb +27 -27
  759. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/xy_plot_gui_object.rb +74 -74
  760. data/lib/cosmos/tools/tlm_grapher/plots/linegraph_plot.rb +201 -201
  761. data/lib/cosmos/tools/tlm_grapher/plots/plot.rb +69 -69
  762. data/lib/cosmos/tools/tlm_grapher/plots/singlexy_plot.rb +20 -20
  763. data/lib/cosmos/tools/tlm_grapher/plots/xy_plot.rb +61 -61
  764. data/lib/cosmos/tools/tlm_grapher/tabbed_plots/overview_tabbed_plots.rb +1291 -1291
  765. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_config.rb +430 -430
  766. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_data_object_editor.rb +107 -107
  767. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_logfile_thread.rb +114 -114
  768. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_plot_editor.rb +101 -101
  769. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_realtime_thread.rb +78 -78
  770. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tab.rb +57 -57
  771. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tool.rb +1004 -1004
  772. data/lib/cosmos/tools/tlm_grapher/tlm_grapher.rb +87 -87
  773. data/lib/cosmos/tools/tlm_viewer/screen.rb +486 -486
  774. data/lib/cosmos/tools/tlm_viewer/tlm_viewer.rb +561 -561
  775. data/lib/cosmos/tools/tlm_viewer/tlm_viewer_config.rb +290 -290
  776. data/lib/cosmos/tools/tlm_viewer/widgets.rb +53 -53
  777. data/lib/cosmos/tools/tlm_viewer/widgets/aging_widget.rb +110 -110
  778. data/lib/cosmos/tools/tlm_viewer/widgets/array_widget.rb +66 -66
  779. data/lib/cosmos/tools/tlm_viewer/widgets/block_widget.rb +57 -57
  780. data/lib/cosmos/tools/tlm_viewer/widgets/button_widget.rb +39 -39
  781. data/lib/cosmos/tools/tlm_viewer/widgets/canvas_widget.rb +62 -62
  782. data/lib/cosmos/tools/tlm_viewer/widgets/canvasimage_widget.rb +41 -41
  783. data/lib/cosmos/tools/tlm_viewer/widgets/canvasimagevalue_widget.rb +57 -57
  784. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabel_widget.rb +37 -37
  785. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabelvalue_widget.rb +56 -56
  786. data/lib/cosmos/tools/tlm_viewer/widgets/canvasline_widget.rb +55 -55
  787. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslinevalue_widget.rb +66 -66
  788. data/lib/cosmos/tools/tlm_viewer/widgets/canvasvalue_widget.rb +124 -124
  789. data/lib/cosmos/tools/tlm_viewer/widgets/checkbutton_widget.rb +31 -31
  790. data/lib/cosmos/tools/tlm_viewer/widgets/combobox_widget.rb +30 -30
  791. data/lib/cosmos/tools/tlm_viewer/widgets/formatfontvalue_widget.rb +36 -36
  792. data/lib/cosmos/tools/tlm_viewer/widgets/formatvalue_widget.rb +35 -35
  793. data/lib/cosmos/tools/tlm_viewer/widgets/horizontal_widget.rb +27 -27
  794. data/lib/cosmos/tools/tlm_viewer/widgets/horizontalbox_widget.rb +31 -31
  795. data/lib/cosmos/tools/tlm_viewer/widgets/horizontalline_widget.rb +26 -26
  796. data/lib/cosmos/tools/tlm_viewer/widgets/label_widget.rb +29 -29
  797. data/lib/cosmos/tools/tlm_viewer/widgets/labelformatvalue_widget.rb +39 -39
  798. data/lib/cosmos/tools/tlm_viewer/widgets/labelprogressbar_widget.rb +38 -38
  799. data/lib/cosmos/tools/tlm_viewer/widgets/labeltrendlimitsbar_widget.rb +38 -38
  800. data/lib/cosmos/tools/tlm_viewer/widgets/labelvalue_widget.rb +39 -39
  801. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluedesc_widget.rb +42 -42
  802. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluelimitsbar_widget.rb +37 -37
  803. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluerangebar_widget.rb +37 -37
  804. data/lib/cosmos/tools/tlm_viewer/widgets/layout_widget.rb +34 -34
  805. data/lib/cosmos/tools/tlm_viewer/widgets/limitsbar_widget.rb +178 -178
  806. data/lib/cosmos/tools/tlm_viewer/widgets/linegraph_widget.rb +54 -54
  807. data/lib/cosmos/tools/tlm_viewer/widgets/matrixbycolumns_widget.rb +47 -47
  808. data/lib/cosmos/tools/tlm_viewer/widgets/multi_widget.rb +116 -116
  809. data/lib/cosmos/tools/tlm_viewer/widgets/progressbar_widget.rb +34 -34
  810. data/lib/cosmos/tools/tlm_viewer/widgets/radiobutton_widget.rb +30 -30
  811. data/lib/cosmos/tools/tlm_viewer/widgets/rangebar_widget.rb +57 -57
  812. data/lib/cosmos/tools/tlm_viewer/widgets/screenshotbutton_widget.rb +34 -34
  813. data/lib/cosmos/tools/tlm_viewer/widgets/scrollwindow_widget.rb +35 -35
  814. data/lib/cosmos/tools/tlm_viewer/widgets/sectionheader_widget.rb +33 -33
  815. data/lib/cosmos/tools/tlm_viewer/widgets/tabbook_widget.rb +26 -26
  816. data/lib/cosmos/tools/tlm_viewer/widgets/tabitem_widget.rb +28 -28
  817. data/lib/cosmos/tools/tlm_viewer/widgets/textbox_widget.rb +47 -47
  818. data/lib/cosmos/tools/tlm_viewer/widgets/textfield_widget.rb +26 -26
  819. data/lib/cosmos/tools/tlm_viewer/widgets/timegraph_widget.rb +88 -88
  820. data/lib/cosmos/tools/tlm_viewer/widgets/title_widget.rb +27 -27
  821. data/lib/cosmos/tools/tlm_viewer/widgets/trendbar_widget.rb +130 -130
  822. data/lib/cosmos/tools/tlm_viewer/widgets/trendlimitsbar_widget.rb +46 -46
  823. data/lib/cosmos/tools/tlm_viewer/widgets/value_widget.rb +43 -43
  824. data/lib/cosmos/tools/tlm_viewer/widgets/valuelimitsbar_widget.rb +37 -37
  825. data/lib/cosmos/tools/tlm_viewer/widgets/valuerangebar_widget.rb +37 -37
  826. data/lib/cosmos/tools/tlm_viewer/widgets/vertical_widget.rb +35 -35
  827. data/lib/cosmos/tools/tlm_viewer/widgets/verticalbox_widget.rb +37 -37
  828. data/lib/cosmos/tools/tlm_viewer/widgets/widget.rb +257 -257
  829. data/lib/cosmos/top_level.rb +759 -759
  830. data/lib/cosmos/utilities.rb +11 -11
  831. data/lib/cosmos/utilities/crc.rb +166 -166
  832. data/lib/cosmos/utilities/csv.rb +83 -83
  833. data/lib/cosmos/utilities/logger.rb +137 -137
  834. data/lib/cosmos/utilities/low_fragmentation_array.rb +11 -11
  835. data/lib/cosmos/utilities/message_log.rb +79 -79
  836. data/lib/cosmos/utilities/quaternion.rb +258 -258
  837. data/lib/cosmos/utilities/ruby_lex_utils.rb +313 -313
  838. data/lib/cosmos/utilities/simulated_target.rb +99 -99
  839. data/lib/cosmos/utilities/sleeper.rb +44 -44
  840. data/lib/cosmos/version.rb +12 -12
  841. data/lib/cosmos/win32/excel.rb +66 -66
  842. data/lib/cosmos/win32/win32.rb +387 -387
  843. data/lib/cosmos/win32/win32_main.rb +321 -321
  844. data/roodi.yml +24 -24
  845. data/run_gui_tests.bat +0 -0
  846. data/spec/ccsds/ccsds_packet_spec.rb +67 -67
  847. data/spec/ccsds/ccsds_parser_spec.rb +148 -148
  848. data/spec/config/config_parser_spec.rb +322 -322
  849. data/spec/conversions/conversion_spec.rb +31 -31
  850. data/spec/conversions/generic_conversion_spec.rb +45 -45
  851. data/spec/conversions/new_packet_log_conversion_spec.rb +39 -39
  852. data/spec/conversions/polynomial_conversion_spec.rb +40 -40
  853. data/spec/conversions/processor_conversion_spec.rb +45 -45
  854. data/spec/conversions/received_count_conversion_spec.rb +43 -43
  855. data/spec/conversions/received_time_formatted_conversion_spec.rb +49 -49
  856. data/spec/conversions/received_time_seconds_conversion_spec.rb +50 -50
  857. data/spec/conversions/segmented_polynomial_conversion_spec.rb +51 -51
  858. data/spec/conversions/unix_time_formatted_conversion_spec.rb +74 -74
  859. data/spec/conversions/unix_time_seconds_conversion_spec.rb +76 -76
  860. data/spec/core_ext/array_spec.rb +186 -186
  861. data/spec/core_ext/class_spec.rb +36 -36
  862. data/spec/core_ext/cosmos_io_spec.rb +77 -77
  863. data/spec/core_ext/exception_spec.rb +91 -91
  864. data/spec/core_ext/file_spec.rb +72 -72
  865. data/spec/core_ext/hash_spec.rb +24 -24
  866. data/spec/core_ext/io_spec.rb +46 -46
  867. data/spec/core_ext/kernel_spec.rb +54 -54
  868. data/spec/core_ext/math_spec.rb +116 -116
  869. data/spec/core_ext/matrix_spec.rb +66 -66
  870. data/spec/core_ext/objectspace_spec.rb +29 -29
  871. data/spec/core_ext/range_spec.rb +21 -21
  872. data/spec/core_ext/socket_spec.rb +32 -32
  873. data/spec/core_ext/string_spec.rb +223 -223
  874. data/spec/core_ext/stringio_spec.rb +21 -21
  875. data/spec/core_ext/time_spec.rb +202 -202
  876. data/spec/gui/line_graph/line_clip_spec.rb +322 -322
  877. data/spec/gui/qt_spec.rb +102 -102
  878. data/spec/install/config/system/system.txt +33 -33
  879. data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  880. data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  881. data/spec/install/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  882. data/spec/install/config/targets/COSMOS/screens/limits_change.txt +20 -20
  883. data/spec/install/config/targets/COSMOS/screens/version.txt +19 -19
  884. data/spec/install/config/targets/COSMOS/target.txt +5 -5
  885. data/spec/install/config/targets/INST/cmd_tlm/inst_cmd_linc.txt +30 -30
  886. data/spec/install/config/targets/INST/cmd_tlm/inst_cmds.txt +111 -111
  887. data/spec/install/config/targets/INST/cmd_tlm/inst_tlm.txt +236 -236
  888. data/spec/install/config/targets/INST/cmd_tlm/inst_tlm_linc.txt +25 -25
  889. data/spec/install/config/targets/INST/cmd_tlm_server.txt +5 -5
  890. data/spec/install/config/targets/INST/lib/sim_inst.rb +305 -305
  891. data/spec/install/config/targets/INST/target.txt +10 -10
  892. data/spec/install/config/targets/META/cmd_tlm/meta_cmd.txt +4 -4
  893. data/spec/install/config/targets/META/cmd_tlm/meta_tlm.txt +4 -4
  894. data/spec/install/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
  895. data/spec/interfaces/cmd_tlm_server_interface_spec.rb +150 -150
  896. data/spec/interfaces/interface_spec.rb +130 -130
  897. data/spec/interfaces/linc_interface_spec.rb +259 -259
  898. data/spec/interfaces/serial_interface_spec.rb +56 -56
  899. data/spec/interfaces/simulated_target_interface_spec.rb +128 -128
  900. data/spec/interfaces/stream_interface_spec.rb +157 -157
  901. data/spec/interfaces/tcpip_client_interface_spec.rb +55 -55
  902. data/spec/interfaces/tcpip_server_interface_spec.rb +160 -160
  903. data/spec/interfaces/udp_interface_spec.rb +175 -175
  904. data/spec/io/buffered_file_spec.rb +113 -113
  905. data/spec/io/io_multiplexer_spec.rb +94 -94
  906. data/spec/io/json_drb_object_spec.rb +119 -119
  907. data/spec/io/json_drb_spec.rb +311 -311
  908. data/spec/io/json_rpc_spec.rb +264 -264
  909. data/spec/io/raw_logger_pair_spec.rb +76 -76
  910. data/spec/io/raw_logger_spec.rb +133 -133
  911. data/spec/io/serial_driver_spec.rb +60 -60
  912. data/spec/io/stderr_spec.rb +32 -32
  913. data/spec/io/stdout_spec.rb +32 -32
  914. data/spec/io/tcpip_server_spec.rb +338 -338
  915. data/spec/io/udp_sockets_spec.rb +94 -94
  916. data/spec/io/win32_serial_driver_spec.rb +88 -88
  917. data/spec/packet_logs/meta_packet_log_writer_spec.rb +170 -170
  918. data/spec/packet_logs/packet_log_reader_spec.rb +468 -468
  919. data/spec/packet_logs/packet_log_writer_pair_spec.rb +30 -30
  920. data/spec/packet_logs/packet_log_writer_spec.rb +225 -225
  921. data/spec/packets/binary_accessor_spec.rb +2326 -2326
  922. data/spec/packets/commands_spec.rb +369 -369
  923. data/spec/packets/limits_response_spec.rb +25 -25
  924. data/spec/packets/limits_spec.rb +344 -344
  925. data/spec/packets/packet_config_spec.rb +805 -805
  926. data/spec/packets/packet_item_limits_spec.rb +161 -161
  927. data/spec/packets/packet_item_spec.rb +386 -386
  928. data/spec/packets/packet_spec.rb +1317 -1317
  929. data/spec/packets/parsers/format_string_parser_spec.rb +122 -122
  930. data/spec/packets/parsers/limits_parser_spec.rb +282 -282
  931. data/spec/packets/parsers/limits_response_parser_spec.rb +149 -149
  932. data/spec/packets/parsers/macro_parser_spec.rb +212 -212
  933. data/spec/packets/parsers/packet_item_parser_spec.rb +306 -306
  934. data/spec/packets/parsers/packet_parser_spec.rb +99 -99
  935. data/spec/packets/parsers/processor_parser_spec.rb +114 -114
  936. data/spec/packets/parsers/state_parser_spec.rb +156 -156
  937. data/spec/packets/structure_item_spec.rb +195 -195
  938. data/spec/packets/structure_spec.rb +565 -565
  939. data/spec/packets/telemetry_spec.rb +578 -578
  940. data/spec/processors/new_packet_log_processor_spec.rb +39 -39
  941. data/spec/processors/processor_spec.rb +55 -55
  942. data/spec/processors/statistics_processor_spec.rb +60 -60
  943. data/spec/processors/watermark_processor_spec.rb +51 -51
  944. data/spec/script/cmd_tlm_server_spec.rb +110 -110
  945. data/spec/script/commands_disconnect_spec.rb +270 -270
  946. data/spec/script/commands_spec.rb +302 -302
  947. data/spec/script/limits_spec.rb +153 -153
  948. data/spec/script/script_spec.rb +86 -86
  949. data/spec/script/scripting_spec.rb +440 -440
  950. data/spec/script/telemetry_spec.rb +165 -165
  951. data/spec/script/tools_spec.rb +117 -117
  952. data/spec/spec_helper.rb +190 -190
  953. data/spec/streams/burst_stream_protocol_spec.rb +32 -32
  954. data/spec/streams/fixed_stream_protocol_spec.rb +113 -113
  955. data/spec/streams/length_stream_protocol_spec.rb +300 -300
  956. data/spec/streams/preidentified_stream_protocol_spec.rb +121 -121
  957. data/spec/streams/serial_stream_spec.rb +117 -117
  958. data/spec/streams/stream_protocol_spec.rb +346 -346
  959. data/spec/streams/stream_spec.rb +30 -30
  960. data/spec/streams/tcpip_client_stream_spec.rb +57 -57
  961. data/spec/streams/tcpip_socket_stream_spec.rb +193 -193
  962. data/spec/streams/template_stream_protocol_spec.rb +156 -156
  963. data/spec/streams/terminated_stream_protocol_spec.rb +127 -127
  964. data/spec/system/system_spec.rb +665 -665
  965. data/spec/system/target_spec.rb +250 -250
  966. data/spec/tools/cmd_tlm_server/api_spec.rb +1117 -1117
  967. data/spec/tools/cmd_tlm_server/background_task_spec.rb +32 -32
  968. data/spec/tools/cmd_tlm_server/background_tasks_spec.rb +81 -81
  969. data/spec/tools/cmd_tlm_server/cmd_tlm_server_config_spec.rb +453 -453
  970. data/spec/tools/cmd_tlm_server/cmd_tlm_server_spec.rb +415 -415
  971. data/spec/tools/cmd_tlm_server/commanding_spec.rb +151 -151
  972. data/spec/tools/cmd_tlm_server/connections_spec.rb +235 -235
  973. data/spec/tools/cmd_tlm_server/interface_thread_spec.rb +306 -306
  974. data/spec/tools/cmd_tlm_server/interfaces_spec.rb +252 -252
  975. data/spec/tools/cmd_tlm_server/packet_logging_spec.rb +143 -143
  976. data/spec/tools/cmd_tlm_server/router_thread_spec.rb +151 -151
  977. data/spec/tools/cmd_tlm_server/routers_spec.rb +223 -223
  978. data/spec/tools/launcher/launcher_config_spec.rb +464 -464
  979. data/spec/top_level/top_level_spec.rb +334 -334
  980. data/spec/utilities/crc_spec.rb +45 -45
  981. data/spec/utilities/csv_spec.rb +97 -97
  982. data/spec/utilities/logger_spec.rb +102 -102
  983. data/spec/utilities/message_log_spec.rb +89 -89
  984. data/spec/utilities/quaternion_spec.rb +107 -107
  985. data/spec/utilities/ruby_lex_utils_spec.rb +86 -86
  986. data/tasks/manifest.rake +22 -22
  987. data/tasks/spec.rake +23 -23
  988. data/test/benchmarks/binary_accessor_benchmark.rb +14 -14
  989. data/test/benchmarks/gsub_benchmark.rb +152 -152
  990. data/test/benchmarks/is_a_benchmark.rb +34 -34
  991. data/test/performance/PACKETS.bat +0 -0
  992. data/test/performance/Rakefile +77 -77
  993. data/test/performance/THREADS.bat +0 -0
  994. data/test/performance/config/data/crc.txt +196 -196
  995. data/test/performance/config/data/diamond.STL +57 -57
  996. data/test/performance/config/data/meta_init.txt +4 -4
  997. data/test/performance/config/system/system_packets.txt +39 -39
  998. data/test/performance/config/system/system_threads.txt +59 -59
  999. data/test/performance/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +46 -46
  1000. data/test/performance/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  1001. data/test/performance/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  1002. data/test/performance/config/targets/COSMOS/screens/limits_change.txt +20 -20
  1003. data/test/performance/config/targets/COSMOS/screens/version.txt +19 -19
  1004. data/test/performance/config/targets/COSMOS/target.txt +11 -11
  1005. data/test/performance/config/targets/PACKET/cmd_tlm/packet_cmds.txt +20 -20
  1006. data/test/performance/config/targets/PACKET/cmd_tlm/packet_tlm.txt +98 -98
  1007. data/test/performance/config/targets/PACKET/cmd_tlm_server.txt +6 -6
  1008. data/test/performance/config/targets/PACKET/lib/packet_interface.rb +22 -22
  1009. data/test/performance/config/targets/PACKET/lib/packet_limits_response.rb +24 -24
  1010. data/test/performance/config/targets/PACKET/screens/status.txt +25 -25
  1011. data/test/performance/config/targets/PACKET/target.txt +28 -28
  1012. data/test/performance/config/targets/SYSTEM/screens/status.txt +12 -12
  1013. data/test/performance/config/targets/THREAD/cmd_tlm/thread_cmds.txt +17 -17
  1014. data/test/performance/config/targets/THREAD/cmd_tlm/thread_tlm.txt +18 -18
  1015. data/test/performance/config/targets/THREAD/cmd_tlm_server.txt +6 -6
  1016. data/test/performance/config/targets/THREAD/lib/thread_interface.rb +22 -22
  1017. data/test/performance/config/targets/THREAD/screens/status.txt +25 -25
  1018. data/test/performance/config/targets/THREAD/target.txt +6 -6
  1019. data/test/performance/config/tools/cmd_tlm_server/cmd_tlm_server_packets.txt +28 -28
  1020. data/test/performance/config/tools/cmd_tlm_server/cmd_tlm_server_threads.txt +68 -68
  1021. data/test/performance/config/tools/data_viewer/data_viewer.txt +11 -11
  1022. data/test/performance/config/tools/handbook_creator/handbook_creator.txt +66 -66
  1023. data/test/performance/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
  1024. data/test/performance/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  1025. data/test/performance/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  1026. data/test/performance/config/tools/handbook_creator/templates/header.html.erb +25 -25
  1027. data/test/performance/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  1028. data/test/performance/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  1029. data/test/performance/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  1030. data/test/performance/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  1031. data/test/performance/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  1032. data/test/performance/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  1033. data/test/performance/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
  1034. data/test/performance/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  1035. data/test/performance/config/tools/handbook_creator/templates/title.html.erb +1 -1
  1036. data/test/performance/config/tools/launcher/launcher_packets.txt +34 -34
  1037. data/test/performance/config/tools/launcher/launcher_threads.txt +83 -83
  1038. data/test/performance/config/tools/script_runner/script_runner.txt +3 -3
  1039. data/test/performance/config/tools/table_manager/ConfigTables_def.txt +8 -8
  1040. data/test/performance/config/tools/table_manager/ExampleTableDefinition.txt +24 -24
  1041. data/test/performance/config/tools/table_manager/MCConfigurationTable_fsw1_def.txt +25 -25
  1042. data/test/performance/config/tools/table_manager/MCConfigurationTable_fsw2_def.txt +25 -25
  1043. data/test/performance/config/tools/table_manager/PPSSelectionTable_def.txt +8 -8
  1044. data/test/performance/config/tools/table_manager/TLMMonitoringTable_def.txt +248 -248
  1045. data/test/performance/config/tools/test_runner/test_runner.txt +17 -17
  1046. data/test/performance/config/tools/tlm_extractor/tlm_extractor.txt +13 -13
  1047. data/test/performance/config/tools/tlm_extractor/tlm_extractor2.txt +2 -2
  1048. data/test/performance/config/tools/tlm_extractor/tlm_extractor3.txt +2 -2
  1049. data/test/performance/config/tools/tlm_extractor/tlm_extractor4.txt +2 -2
  1050. data/test/performance/config/tools/tlm_grapher/tlm_grapher.txt +204 -204
  1051. data/test/performance/config/tools/tlm_viewer/tlm_viewer.txt +13 -13
  1052. data/test/performance/lib/packet_target.rb +126 -126
  1053. data/test/performance/lib/thread_target.rb +120 -120
  1054. data/test/performance/lib/user_version.rb +3 -3
  1055. data/test/performance/procedures/checks.rb +11 -11
  1056. data/test/performance/procedures/clear_util.rb +7 -7
  1057. data/test/performance/procedures/collect.rb +18 -18
  1058. data/test/performance/procedures/collect_util.rb +14 -14
  1059. data/test/performance/procedures/cosmos_api_test.rb +293 -293
  1060. data/test/performance/procedures/disconnect.rb +29 -29
  1061. data/test/performance/procedures/example_test.rb +182 -182
  1062. data/test/performance/procedures/plot_test.rb +8 -8
  1063. data/test/performance/procedures/procedure.rb +2 -2
  1064. data/test/performance/procedures/run_example_test.rb +3 -3
  1065. data/test/performance/procedures/test.rb +51 -51
  1066. data/test/performance/tools/CmdExtractor +14 -14
  1067. data/test/performance/tools/CmdExtractor.bat +0 -0
  1068. data/test/performance/tools/CmdSender +14 -14
  1069. data/test/performance/tools/CmdSender.bat +0 -0
  1070. data/test/performance/tools/CmdTlmServer +16 -16
  1071. data/test/performance/tools/CmdTlmServer.bat +0 -0
  1072. data/test/performance/tools/CmdTlmServerMemProf +20 -20
  1073. data/test/performance/tools/CmdTlmServerMemProf.bat +0 -0
  1074. data/test/performance/tools/DataViewer +14 -14
  1075. data/test/performance/tools/DataViewer.bat +0 -0
  1076. data/test/performance/tools/HandbookCreator +14 -14
  1077. data/test/performance/tools/HandbookCreator.bat +0 -0
  1078. data/test/performance/tools/Launcher +14 -14
  1079. data/test/performance/tools/Launcher.bat +0 -0
  1080. data/test/performance/tools/LimitsMonitor +14 -14
  1081. data/test/performance/tools/LimitsMonitor.bat +0 -0
  1082. data/test/performance/tools/OpenGLBuilder +14 -14
  1083. data/test/performance/tools/OpenGLBuilder.bat +0 -0
  1084. data/test/performance/tools/PacketTarget +14 -14
  1085. data/test/performance/tools/PacketTarget.bat +0 -0
  1086. data/test/performance/tools/PacketViewer +14 -14
  1087. data/test/performance/tools/PacketViewer.bat +0 -0
  1088. data/test/performance/tools/Replay +14 -14
  1089. data/test/performance/tools/Replay.bat +0 -0
  1090. data/test/performance/tools/ScpiTarget +14 -14
  1091. data/test/performance/tools/ScpiTarget.bat +0 -0
  1092. data/test/performance/tools/ScriptRunner +14 -14
  1093. data/test/performance/tools/ScriptRunner.bat +0 -0
  1094. data/test/performance/tools/TableManager +14 -14
  1095. data/test/performance/tools/TableManager.bat +0 -0
  1096. data/test/performance/tools/TestRunner +14 -14
  1097. data/test/performance/tools/TestRunner.bat +0 -0
  1098. data/test/performance/tools/ThreadTarget +14 -14
  1099. data/test/performance/tools/ThreadTarget.bat +0 -0
  1100. data/test/performance/tools/TlmExtractor +14 -14
  1101. data/test/performance/tools/TlmExtractor.bat +0 -0
  1102. data/test/performance/tools/TlmGrapher +14 -14
  1103. data/test/performance/tools/TlmGrapher.bat +0 -0
  1104. data/test/performance/tools/TlmGrapherMemProf +19 -19
  1105. data/test/performance/tools/TlmGrapherMemProf.bat +0 -0
  1106. data/test/performance/tools/TlmViewer +14 -14
  1107. data/test/performance/tools/TlmViewer.bat +0 -0
  1108. data/test/performance/tools/TlmViewerMemProf +19 -19
  1109. data/test/performance/tools/TlmViewerMemProf.bat +0 -0
  1110. data/test/performance/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
  1111. data/test/performance/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +15 -15
  1112. data/test/performance/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +6 -6
  1113. data/test/performance/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
  1114. data/test/performance/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +15 -15
  1115. data/test/performance/tools/mac/CmdSender.app/Contents/MacOS/main.sh +6 -6
  1116. data/test/performance/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
  1117. data/test/performance/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +15 -15
  1118. data/test/performance/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +6 -6
  1119. data/test/performance/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
  1120. data/test/performance/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +15 -15
  1121. data/test/performance/tools/mac/DataViewer.app/Contents/MacOS/main.sh +6 -6
  1122. data/test/performance/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
  1123. data/test/performance/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +15 -15
  1124. data/test/performance/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +6 -6
  1125. data/test/performance/tools/mac/Launcher.app/Contents/Info.plist +38 -38
  1126. data/test/performance/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +15 -15
  1127. data/test/performance/tools/mac/Launcher.app/Contents/MacOS/main.sh +6 -6
  1128. data/test/performance/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
  1129. data/test/performance/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +15 -15
  1130. data/test/performance/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +6 -6
  1131. data/test/performance/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
  1132. data/test/performance/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +15 -15
  1133. data/test/performance/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +6 -6
  1134. data/test/performance/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
  1135. data/test/performance/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +15 -15
  1136. data/test/performance/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +6 -6
  1137. data/test/performance/tools/mac/Replay.app/Contents/Info.plist +38 -38
  1138. data/test/performance/tools/mac/Replay.app/Contents/MacOS/Replay.rb +15 -15
  1139. data/test/performance/tools/mac/Replay.app/Contents/MacOS/main.sh +6 -6
  1140. data/test/performance/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
  1141. data/test/performance/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +15 -15
  1142. data/test/performance/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +6 -6
  1143. data/test/performance/tools/mac/TableManager.app/Contents/Info.plist +38 -38
  1144. data/test/performance/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +15 -15
  1145. data/test/performance/tools/mac/TableManager.app/Contents/MacOS/main.sh +6 -6
  1146. data/test/performance/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
  1147. data/test/performance/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +15 -15
  1148. data/test/performance/tools/mac/TestRunner.app/Contents/MacOS/main.sh +6 -6
  1149. data/test/performance/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
  1150. data/test/performance/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +15 -15
  1151. data/test/performance/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +6 -6
  1152. data/test/performance/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
  1153. data/test/performance/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +15 -15
  1154. data/test/performance/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +6 -6
  1155. data/test/performance/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
  1156. data/test/performance/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +15 -15
  1157. data/test/performance/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +6 -6
  1158. metadata +3 -3
@@ -1,50 +1,50 @@
1
- SetWinDelay 500
2
- SetKeyDelay 10
3
-
4
- Sleep 1000
5
- WinActivate Screen
6
- Sleep 2000
7
- Send {Tab}
8
- Sleep 500
9
- Send {Enter}
10
-
11
- Sleep 2000
12
- Run ruby.exe %A_ScriptDir%/CmdTlmServer
13
- Sleep 2000
14
- Run ruby.exe %A_ScriptDir%/ScriptRunner -w 600 -t 600
15
-
16
- WinWaitActive Script
17
- Send display("INST ADCS"){Enter}
18
- Send wait 2{Enter}
19
- Send clear("INST ADCS"){Enter}
20
- Sleep 500
21
- Click 400 90
22
-
23
- ; Allow the script time to run
24
- Sleep 5000
25
-
26
- WinActivate Script
27
- Send ^q
28
- Sleep 500
29
- Send n
30
-
31
- ; Close down command and telemetry server
32
- WinActivate Command and Telemetry Server
33
- Send ^q
34
- Sleep 500
35
- Send {Enter}
36
-
37
- ; Quit Telemetry Viewer
38
- WinActivate Telemetry
39
- Sleep 500
40
- Send ^q
41
- Sleep 500
42
- Send y
43
-
44
- ; Quit Telemetry Viewer
45
- WinActivate Telemetry
46
- Sleep 500
47
- Send ^q
48
- Sleep 500
49
- Send y
50
-
1
+ SetWinDelay 500
2
+ SetKeyDelay 10
3
+
4
+ Sleep 1000
5
+ WinActivate Screen
6
+ Sleep 2000
7
+ Send {Tab}
8
+ Sleep 500
9
+ Send {Enter}
10
+
11
+ Sleep 2000
12
+ Run ruby.exe %A_ScriptDir%/CmdTlmServer
13
+ Sleep 2000
14
+ Run ruby.exe %A_ScriptDir%/ScriptRunner -w 600 -t 600
15
+
16
+ WinWaitActive Script
17
+ Send display("INST ADCS"){Enter}
18
+ Send wait 2{Enter}
19
+ Send clear("INST ADCS"){Enter}
20
+ Sleep 500
21
+ Click 400 90
22
+
23
+ ; Allow the script time to run
24
+ Sleep 5000
25
+
26
+ WinActivate Script
27
+ Send ^q
28
+ Sleep 500
29
+ Send n
30
+
31
+ ; Close down command and telemetry server
32
+ WinActivate Command and Telemetry Server
33
+ Send ^q
34
+ Sleep 500
35
+ Send {Enter}
36
+
37
+ ; Quit Telemetry Viewer
38
+ WinActivate Telemetry
39
+ Sleep 500
40
+ Send ^q
41
+ Sleep 500
42
+ Send y
43
+
44
+ ; Quit Telemetry Viewer
45
+ WinActivate Telemetry
46
+ Sleep 500
47
+ Send ^q
48
+ Sleep 500
49
+ Send y
50
+
@@ -1,4 +1,4 @@
1
- WinWaitActive Error
2
- Sleep 500
3
- Send {Enter}
4
-
1
+ WinWaitActive Error
2
+ Sleep 500
3
+ Send {Enter}
4
+
@@ -1,20 +1,20 @@
1
- SetWinDelay 500
2
- SetKeyDelay 10
3
-
4
- Sleep 2000
5
- Run ruby.exe %A_ScriptDir%/CmdTlmServer
6
- WinActivate "INST ADCS"
7
- Sleep 4000
8
-
9
- ; Close down command and telemetry server
10
- WinActivate Command and Telemetry Server
11
- Send ^q
12
- Sleep 500
13
- Send {Enter}
14
-
15
- ; Quit Telemetry Viewer
16
- WinActivate "INST ADCS"
17
- Sleep 2000
18
- Click 497 10 ; Close the window
19
- Sleep 500
20
-
1
+ SetWinDelay 500
2
+ SetKeyDelay 10
3
+
4
+ Sleep 2000
5
+ Run ruby.exe %A_ScriptDir%/CmdTlmServer
6
+ WinActivate "INST ADCS"
7
+ Sleep 4000
8
+
9
+ ; Close down command and telemetry server
10
+ WinActivate Command and Telemetry Server
11
+ Send ^q
12
+ Sleep 500
13
+ Send {Enter}
14
+
15
+ ; Quit Telemetry Viewer
16
+ WinActivate "INST ADCS"
17
+ Sleep 2000
18
+ Click 497 10 ; Close the window
19
+ Sleep 500
20
+
data/bin/cosmos CHANGED
@@ -1,96 +1,96 @@
1
- #!/usr/bin/env ruby
2
- # encoding: ascii-8bit
3
-
4
- # Copyright 2014 Ball Aerospace & Technologies Corp.
5
- # All Rights Reserved.
6
- #
7
- # This program is free software; you can modify and/or redistribute it
8
- # under the terms of the GNU General Public License
9
- # as published by the Free Software Foundation; version 3 with
10
- # attribution addendums as found in the LICENSE.txt
11
-
12
- # This file will handle COSMOS tasks such as instantiating a new project
13
-
14
- require 'cosmos'
15
- require 'fileutils'
16
- require 'find'
17
-
18
- # Prints the usage text for the cosmos executable
19
- def print_usage
20
- puts "Usage:"
21
- puts " cosmos help # Displays this information"
22
- puts " cosmos install directory_name # Creates a barebones COSMOS user directory"
23
- puts " cosmos demo directory_name # Creates a demo COSMOS user directory"
24
- puts " cosmos docs # Launches the documentation server"
25
- puts ""
26
- puts "Other Tools included with COSMOS:"
27
- puts " rubysloc # Counts Ruby SLOC recursively"
28
- puts " cstol_converter # Converts all *.prc files recursively to COSMOS"
29
- puts ""
30
- end
31
-
32
- def install(install_type, install_folder)
33
- dir_name = ARGV[1]
34
- unless dir_name.nil?
35
- puts "Attempting COSMOS #{install_type} Installation to: #{dir_name}"
36
-
37
- #Determine if directory exists
38
- unless File.directory?(dir_name)
39
- #Create Directory
40
- FileUtils.makedirs(dir_name, {:verbose => true})
41
-
42
- #Copy files from gem install directory into new project
43
- FileUtils.cp_r(File.join(::Cosmos::PATH, install_folder, '.'), dir_name, {:verbose => true})
44
-
45
- puts "Complete"
46
- else
47
- puts "ERROR: Directory #{dir_name} already exists... aborting"
48
- end
49
- else
50
- puts "ERROR: Directory must be given to install to"
51
- end
52
- end
53
-
54
- if not ARGV[0].nil? # argument(s) given
55
-
56
- # Handle each task
57
- case ARGV[0].downcase
58
- when 'docs'
59
- thread = Thread.new do
60
- system('yard server --gems')
61
- end
62
- sleep 3
63
- Cosmos.open_in_web_browser('http://localhost:8808/docs/cosmos/frames')
64
- thread.join
65
-
66
- when 'install'
67
- ####################################
68
- # Create a COSMOS barebones user directory
69
- ####################################
70
- install('', 'install')
71
-
72
- when 'demo'
73
- ####################################
74
- # Create a COSMOS demo user directory
75
- ####################################
76
- install('Demo', 'demo')
77
-
78
- when 'help'
79
- ####################################
80
- # Print Usage
81
- ####################################
82
-
83
- print_usage()
84
-
85
- else # Unknown task
86
- ####################################
87
- # Unknown task
88
- ####################################
89
-
90
- puts "Unknown task: #{ARGV[0]}\n"
91
- print_usage()
92
- end
93
-
94
- else # No arguments given
95
- print_usage()
96
- end
1
+ #!/usr/bin/env ruby
2
+ # encoding: ascii-8bit
3
+
4
+ # Copyright 2014 Ball Aerospace & Technologies Corp.
5
+ # All Rights Reserved.
6
+ #
7
+ # This program is free software; you can modify and/or redistribute it
8
+ # under the terms of the GNU General Public License
9
+ # as published by the Free Software Foundation; version 3 with
10
+ # attribution addendums as found in the LICENSE.txt
11
+
12
+ # This file will handle COSMOS tasks such as instantiating a new project
13
+
14
+ require 'cosmos'
15
+ require 'fileutils'
16
+ require 'find'
17
+
18
+ # Prints the usage text for the cosmos executable
19
+ def print_usage
20
+ puts "Usage:"
21
+ puts " cosmos help # Displays this information"
22
+ puts " cosmos install directory_name # Creates a barebones COSMOS user directory"
23
+ puts " cosmos demo directory_name # Creates a demo COSMOS user directory"
24
+ puts " cosmos docs # Launches the documentation server"
25
+ puts ""
26
+ puts "Other Tools included with COSMOS:"
27
+ puts " rubysloc # Counts Ruby SLOC recursively"
28
+ puts " cstol_converter # Converts all *.prc files recursively to COSMOS"
29
+ puts ""
30
+ end
31
+
32
+ def install(install_type, install_folder)
33
+ dir_name = ARGV[1]
34
+ unless dir_name.nil?
35
+ puts "Attempting COSMOS #{install_type} Installation to: #{dir_name}"
36
+
37
+ #Determine if directory exists
38
+ unless File.directory?(dir_name)
39
+ #Create Directory
40
+ FileUtils.makedirs(dir_name, {:verbose => true})
41
+
42
+ #Copy files from gem install directory into new project
43
+ FileUtils.cp_r(File.join(::Cosmos::PATH, install_folder, '.'), dir_name, {:verbose => true})
44
+
45
+ puts "Complete"
46
+ else
47
+ puts "ERROR: Directory #{dir_name} already exists... aborting"
48
+ end
49
+ else
50
+ puts "ERROR: Directory must be given to install to"
51
+ end
52
+ end
53
+
54
+ if not ARGV[0].nil? # argument(s) given
55
+
56
+ # Handle each task
57
+ case ARGV[0].downcase
58
+ when 'docs'
59
+ thread = Thread.new do
60
+ system('yard server --gems')
61
+ end
62
+ sleep 3
63
+ Cosmos.open_in_web_browser('http://localhost:8808/docs/cosmos/frames')
64
+ thread.join
65
+
66
+ when 'install'
67
+ ####################################
68
+ # Create a COSMOS barebones user directory
69
+ ####################################
70
+ install('', 'install')
71
+
72
+ when 'demo'
73
+ ####################################
74
+ # Create a COSMOS demo user directory
75
+ ####################################
76
+ install('Demo', 'demo')
77
+
78
+ when 'help'
79
+ ####################################
80
+ # Print Usage
81
+ ####################################
82
+
83
+ print_usage()
84
+
85
+ else # Unknown task
86
+ ####################################
87
+ # Unknown task
88
+ ####################################
89
+
90
+ puts "Unknown task: #{ARGV[0]}\n"
91
+ print_usage()
92
+ end
93
+
94
+ else # No arguments given
95
+ print_usage()
96
+ end
@@ -1,1166 +1,1166 @@
1
- #!/usr/bin/env ruby
2
- # encoding: ascii-8bit
3
-
4
- # Copyright 2014 Ball Aerospace & Technologies Corp.
5
- # All Rights Reserved.
6
- #
7
- # This program is free software; you can modify and/or redistribute it
8
- # under the terms of the GNU General Public License
9
- # as published by the Free Software Foundation; version 3 with
10
- # attribution addendums as found in the LICENSE.txt
11
-
12
- # This file converts OASIS CSTOL files to COSMOS scripts
13
-
14
- require 'cosmos'
15
- require 'cosmos/script'
16
- require 'cosmos/system'
17
-
18
- # TODO: capitalized string from ask statement may not match expression (gmi.rb:70)
19
- # TODO: handle V, C other units specifications...
20
- # TODO: handle unary operators (-1, not - 1) => although Ruby handles this fine
21
-
22
- def parse_cmd(words)
23
- # Convert the part that's common to all commands
24
- str = "cmd(\"" + words[1].upcase + " " + words[2].upcase
25
-
26
- # If it has parameters
27
- if words.length == 5
28
- str = str + " " + parse_id(words[4], true, false, true, true)
29
-
30
- elsif words.length > 5
31
- str = str + " with"
32
-
33
- # Join the rest of the list and remove the commas
34
- args = words[4..-1].join(" ").split(",")
35
- args.length.times do |i|
36
- # Only prepend comma if it is not the first argument pair
37
- if i != 0
38
- str = str + ","
39
- end
40
- params = args[i].split(" ")
41
-
42
- str = str + " " + params[0].upcase + " " + parse_id(params[1],true, false, true)
43
- end
44
- end
45
- str = str + "\")"
46
- end
47
-
48
- def parse_cond_operator(op, is_set_tlm = false)
49
- str = ""
50
- # Convert CSTOL operators into Ruby operators
51
- if op.match("/=")
52
- str = " != "
53
- elsif op.match(">=")
54
- str = " >= "
55
- elsif op.match("<=")
56
- str = " <= "
57
- elsif op.match(">")
58
- str = " > "
59
- elsif op.match("<")
60
- str = " < "
61
- elsif op.match("=")
62
- str = " == "
63
- if is_set_tlm
64
- str = " = "
65
- end
66
- elsif op.match(/VS/i)
67
- str = " == "
68
- end
69
- str
70
- end
71
-
72
- def parse_expression(vars, quoted=false, in_eval=false)
73
- i=0
74
- str = ""
75
- finished = false
76
- # Make sure there are spaces around the operators
77
- if vars.length > 1
78
- vars = vars.join(" ")
79
- else
80
- vars = vars.to_s
81
- end
82
- vars = vars.gsub("(", " ( ")
83
- vars = vars.gsub(")", " ) ")
84
- vars = vars.gsub("+", " + ")
85
- vars = vars.gsub("-", " - ")
86
- vars = vars.gsub("*", " * ")
87
- vars = vars.gsub("==", " == ")
88
- vars = vars.gsub("/=", " /= ")
89
- vars = vars.gsub("<=", " <= ")
90
- vars = vars.gsub(">=", " >= ")
91
- vars = vars.gsub(";", " ; ")
92
- # Add spaces around single character operators (/ < >)
93
- offset = 0
94
- while((idx = vars.index(/[\/<>][^=]/,offset)) != nil)
95
- # Add space before and after operator and increment offset
96
- vars = vars.insert(idx," ")
97
- vars = vars.insert(idx+2," ")
98
- offset = idx + 2
99
- end
100
- # Add spaces around single = operator (not /=, ==, <=, or >=)
101
- offset = 0
102
- while((idx = vars.index(/[^\/=<>]=[^=]/,offset)) != nil)
103
- # Add space before and after operator and increment offset
104
- vars = vars.insert(idx+1," ")
105
- vars = vars.insert(idx+3," ")
106
- offset = idx + 3
107
- end
108
-
109
- # Split the expression on spaces
110
- vars = vars.split(" ")
111
-
112
- last = nil
113
- while (vars[i] != nil and finished != true)
114
- case vars[i].tr('[]"', '')
115
- when "("
116
- if quoted == false
117
- str = str + "("
118
- end
119
-
120
- when ")"
121
- if quoted == false
122
- str = str + ")"
123
- end
124
-
125
- when /\bOR\b/i
126
- str = str + " || "
127
-
128
- when /\bAND\b/i
129
- str = str + " && "
130
-
131
- when /\b\$[0-9]\b/ # $0, $1, etc are function inputs
132
- str = str + "inVar" + vars[0][1..-1]
133
-
134
- when /\$/ # $varName
135
- str = str + parse_id(vars[i].tr('[]"', ''),quoted,in_eval)
136
-
137
- when /RAW/i
138
- if quoted
139
- str = str + "tlm_raw('" + parse_tlm_item(vars[i+1..i+2]) + "')"
140
- else
141
- str = str + "tlm_raw(\"" + parse_tlm_item(vars[i+1..i+2]) + "\")"
142
- end
143
- i = i + 2
144
- when /x#[0-9a-fA-F]+/i # Hex number
145
- str = str + parse_id(vars[i].tr('[]"', ''),quoted)
146
- when /b#[0-1]+/i # Binary number
147
- str = str + parse_id(vars[i].tr('[]"', ''),quoted)
148
-
149
- when /(\AVS\z|=|\/=|>|>=|<|<=)/ # Conditional operator
150
- str = str + parse_cond_operator(vars[i])
151
- when /(\+|-|\*|\/)/ # Arithmetic operator
152
- str = str + " " + vars[i].tr('[]"', '') + " "
153
-
154
- # Verfies Number followed immediately by units
155
- when /\dDN\z|\ddn\z|\dDEG\z|\ddeg\z|\dRAD\z|\drad\z|\dV\z|\dA\z|\dv\z|\da\z|\dc\z|\dC\z|\df\z|\dF\z|\dDPS\z|\dM\z|\dMPS\z|\dm\z|\dmps\z/ # Checks for decimal/degrees/volts and amps
156
- temp = vars[i].tr('[]"', '')
157
- temp = temp.gsub(/DN\z|dn\z|DEG\z|deg\z|RAD\z|rad\z|V\z|A\z|v\z|a\z|c\z|C\z|f\z|F\z|DPS\z|M\z|MPS\z|m\z|mps\z/, '')
158
- if temp.match(/[a-zA-Z]/)
159
- str = str + parse_id(vars[i].tr('[]"', ''),quoted)
160
- else
161
- str = str + temp
162
- end
163
-
164
- # Verifies units are standalone
165
- when last != '=' && /DN\z|dn\z|DEG\z|deg\z|RAD\z|rad\z|V\z|A\z|v\z|a\z|c\z|C\z|f\z|F\z|DPS\z|M\z|MPS\z|m\z|mps\z/ # Checks for decimal/degrees/volts and amps
166
- # Verify it is not a target
167
- if(vars[i] != nil and $targetList.include?(vars[i].tr('[]"', '').upcase))
168
- if quoted
169
- str = str + "tlm('" + parse_tlm_item(vars[i..i+1]) + "')"
170
- else
171
- str = str + "tlm(\"" + parse_tlm_item(vars[i..i+1]) + "\")"
172
- end
173
- i = i + 1
174
- else
175
- str = str + parse_id(vars[i].tr('[]"', ''),quoted)
176
- end
177
- when /[0-9]*:[0-9]*:[0-9]+/ # Timestamp
178
- str = str + parse_time(vars[i].tr('[]"', ''))
179
-
180
- when /\dE/ # Floating point
181
- temp_number = vars[i].tr('E', '').to_f * 10**vars[i+2].to_f
182
- str = str + "#{temp_number}"
183
- finished = true
184
- when /\d/ # Decimal number
185
- str = str + parse_id(vars[i].tr('[]"', ''),quoted)
186
-
187
- when /\w/ # Must stay low on the list to avoid matching other items
188
- # Check this keyword against the list of targets
189
- if(vars[i] != nil and $targetList.include?(vars[i].tr('[]"', '').upcase))
190
- if quoted
191
- str = str + "tlm('" + parse_tlm_item(vars[i..i+1]) + "')"
192
- else
193
- str = str + "tlm(\"" + parse_tlm_item(vars[i..i+1]) + "\")"
194
- end
195
- i += 1
196
-
197
- # If it is not a target, then it must be a string or other identifier
198
- else
199
- str = str + parse_id(vars[i].tr('[]"', ''), quoted, false, false, false, false)
200
- end
201
-
202
- # Other cases not handled
203
- # else
204
- # str = str + " # TODO unsupported: " + vars[i].tr('[]"', '')
205
- end # case
206
- last = vars[i].tr('[]"', '')
207
- i += 1
208
- end # while
209
- str
210
- end
211
-
212
- def parse_id(id, quoted=false, in_eval=false, in_command=false, in_single_command = false, units = true)
213
- str = ""
214
- # Remove parentheses
215
- if id.index("(") == 0
216
- id = id[1..-1]
217
- end
218
- if id.index(")") == id.length - 1
219
- id = id[0..-2]
220
- end
221
-
222
- if id.match(/\$\w/) # $varName
223
- id[1,1] = id[1,1].downcase
224
- if quoted and !in_eval
225
- str = "'\#{" + id[1..-1] + "}'"
226
- else
227
-
228
- str = id[1..-1]
229
- end
230
-
231
- elsif (id.match(/^"/) != nil and
232
- id.match(/"$/) != nil) # Starts and ends with a quote
233
- if quoted
234
- str = "'" + id.upcase[1..-2] + "'"
235
- else
236
- str = id.upcase
237
- end
238
-
239
- elsif id.match(/x#[A-Fa-f0-9]+DN/i) # Hex number with DN
240
- str = "0x" + id[2..-3]
241
-
242
- elsif id.match(/x#[0-9a-fA-F]+/i) # Hex number
243
- str = "0x" + id[2..-1]
244
-
245
- elsif id.match(/b#[0-1]+DN/i) # Binary number with DN
246
- str = "0b" + id[2..-3]
247
-
248
- elsif id.match(/b#[0-1]+/i) # Binary number
249
- str = "0b" + id[2..-1]
250
-
251
- elsif id.match(/\d+DN/i) or id.match(/-\d+DN/i) # Decimal number with DN
252
- str = id[0..-3]
253
- elsif id.match(/\AVS\z|\Avs\z/)
254
- str = str + " == "
255
-
256
- # Verifies extensions with a decimal number followed by a unit
257
- elsif units && id.match(/\dDN|\ddn|\dDEG|\ddeg|\dRAD|\drad|\dV|\dA|\dv|\da|\dc|\dC|\df|\dF|\dDPS|\dM\z|\dMPS\z|\dm\z|\dmps\z/)
258
- temp = id.gsub(/DN\z|dn\z|DEG\z|deg\z|RAD\z|rad\z|V\z|A\z|v\z|a\z|c\z|C\z|f\z|F\z|DPS\z|M\z|MPS\z|m\z|mps\z/, '')
259
- if in_command and temp.match(/[a-zA-Z]/)
260
- str = str + "\'" + id.upcase + "\'"
261
- # if filtered words still contain letter, then it is not a number
262
- elsif temp.match(/[a-zA-Z]/)
263
- str = str + id
264
- else
265
- str = str + temp
266
- end
267
- elsif id.match(/\dE\+\d/) # Floating point
268
- id = id.gsub('+', ' + ')
269
- temp_num_arr = id.split(' ')
270
- temp_number = temp_num_arr[0].tr('E', '').to_f * 10**temp_num_arr[2].to_f
271
- str = str + "#{temp_number}"
272
- elsif id.match(/\A\d/) or id.match(/\A-\d/) # starts with Decimal number
273
- str = id
274
- # Verifies extensions with a decimal number followed by a unit
275
- # that is by itself separated by whitespace
276
- elsif units && id.match(/\ADN\z|\Adn\z|\ADEG\z|\Adeg\z|\ARAD\z|\Arad\z|\AV\z|\AA\z|\Av\z|\Aa\z|\Ac\z|\AC\z|\Af\z|\AF\z|\ADPS\z|\AM\z|\AMPS\z|\Am\z|\Amps\z/)
277
- temp = id.gsub(/DN\z|dn\z|DEG\z|deg\z|RAD\z|rad\z|V\z|A\z|v\z|a\z|c\z|C\z|f\z|F\z|DPS\z|M\z|MPS\z|m\z|mps\z/, '')
278
- if in_command
279
- str = str + "\'" + id.upcase + "\'"
280
- else
281
- str = str + temp
282
- end
283
- elsif id.match(/\w/) # Any other word
284
- # If it's quoted still need quotes for comparison
285
- if in_single_command
286
- str = id.upcase
287
- elsif quoted
288
- str = "\'" + id.upcase + "\'"
289
- else
290
- str = "\"" + id.tr('\\', '').upcase + "\""
291
- end
292
- else
293
- str = id
294
- end
295
- end
296
-
297
- def parse_macro(words)
298
- # Call the macro with the first parameter as binding
299
- str = words[0] + "(binding"
300
-
301
- # Add all arguments in a loop
302
- (words.length-1).times do |i|
303
- str = str + ", " + parse_id(words[i+1])
304
- end
305
- str = str + ")"
306
- end
307
-
308
- def parse_time(time)
309
- # If this is a timestamp
310
- if time.match(/[0-9]*:[0-9]*:[0-9]+/) # Timestamp
311
- # Split on colons to separate hours/minutes/seconds
312
- tok = time.split(":")
313
-
314
- # If the first two tokens are empty, set to 0 (ex. ::10 is a valid time)
315
- if tok[0] == ""
316
- tok[0] = "0"
317
- end
318
- if tok[1] == ""
319
- tok[1] = "0"
320
- end
321
-
322
- # Compute the number of seconds
323
- secs = (3600*tok[0].to_i + 60*tok[1].to_i + tok[2].to_i).to_s
324
-
325
- # Other cases not handled
326
- else
327
- secs = "# TODO unsupported: " + time
328
- end
329
- end
330
-
331
- def parse_tlm_item(tlm)
332
- # Remove preceeding parentheses
333
- if tlm[0].index("(") == 0
334
- tlm[0] = tlm[0][1..-1]
335
- end
336
-
337
- # If there are two telemetry items (target and mnemonic)
338
- if tlm.length == 2
339
- begin
340
- str = tlm[0].tr('[]"', '').upcase + " " + Cosmos::System.telemetry.newest_packet(tlm[0].tr('[]"', '').upcase,tlm[1].tr('[]"', '').upcase).packet_name + " " + tlm[1].tr('[]"', '').upcase
341
- rescue
342
- str = "# TODO unknown TLM: " + tlm.to_s
343
- end
344
-
345
- # Other cases not handled
346
- else
347
- str = "# TODO unsupported: " + tlm.to_s
348
- end
349
- end
350
-
351
- def parse_line(full_line, loc_out_file, wait_check_flag=false)
352
- line = ""
353
- comment = ""
354
- str = ""
355
-
356
- # Handle any empty lines
357
- if full_line == nil || full_line.strip == ""
358
- loc_out_file.puts full_line
359
- return
360
- end
361
-
362
- # Detemine the location of any comments in this line
363
- commentIdx = full_line.index(";")
364
-
365
- # If we found a comment operator
366
- if commentIdx != nil
367
- # If there's text to pull out before the ;
368
- if commentIdx != 0
369
- line = full_line[0..(commentIdx-1)].rstrip
370
- end
371
- # If there's text to pull out after the ;
372
- if commentIdx != full_line.length - 1
373
- comment = "#" + full_line[(commentIdx+1)..-1]
374
- end
375
- else
376
- # No comment operator so use the entire line
377
- line = full_line.rstrip
378
- end
379
-
380
- # Determine the number of spaces to indent this line by finding the first
381
- # non-whitespace character
382
- numSpaces = full_line.index(/\S/)
383
- numSpaces.times {str = str + " "}
384
-
385
- # Handle lines with only comments
386
- if line == nil or line == ""
387
- loc_out_file.puts str + comment
388
- return
389
- end
390
-
391
- # Redundant substitutions are done for comparators
392
- line = line.gsub("==", " == ")
393
- line = line.gsub("/=", " /= ")
394
- line = line.gsub("<=", " <= ")
395
- line = line.gsub(">=", " >= ")
396
- line = line.gsub(/(\w)(=)(\w)/, '\1 = \3')
397
- line = line.gsub(/(\w)(=)(\d)/, '\1 = \3')
398
- line = line.gsub(/(\w)(=)(-)/, ' = -')
399
- line = line.gsub(/(\w)(=)(\s)/, '\1 = \3')
400
- line = line.gsub(/(\s)(=)(\w)/, '\1 = \3')
401
-
402
- # Split the line into tokens by spaces, if no spaces between equals sign add them
403
- words = line.split(" ")
404
-
405
- # Check for old CSTOL labels which have a trailing colon
406
- if words[0][-1] == ':'
407
- loc_out_file.puts "# #{line}"
408
- return
409
- end
410
-
411
- # if wait_check flag is activated ensure that the next line is a check otherwise infinite loop
412
- if wait_check_flag and words[0].downcase != 'check'
413
- return ""
414
- end
415
-
416
- case words[0].downcase
417
- when "endproc"
418
- if $inFunction
419
- str += "end\n#{$inFunction}(#{$inFunctionParams.join(',')})" if $inFunction
420
- $inFunction = nil
421
- end
422
-
423
- when "ask"
424
- str = str + parse_id(words[1]) + " = ask(" + words[2]
425
- (words.length-3).times do |i|
426
- str = str + " " + words[i+3]
427
- end
428
- str = str + ")"
429
-
430
- when "begin"
431
- # Don't need to do anything with this keyword, so exit unless there's
432
- # a comment to print
433
- if comment == ""
434
- return
435
- end
436
-
437
- when "check"
438
-
439
- # If the next word starts with the raw keyword
440
- if words[1].match(/\A(raw)/i)
441
- # If the line contains a colon, parse out the range and use tolerance
442
- if line.match(":")
443
- vsIdx = line.index("VS")
444
- vsIdx = line.index("vs") if vsIdx == nil
445
- colIdx = line.index(":")
446
- lowRange = line[(vsIdx+2)..(colIdx-1)]
447
- highRange = line[(colIdx+1)..-1]
448
- str = str + "check_tolerance_raw(\"" + parse_tlm_item(words[2..3]) +
449
- "\", ((" + parse_expression([highRange],false) + ") + (" +
450
- parse_expression([lowRange],false) +
451
- ")) / 2," + " ((" + parse_expression([highRange],false) + ") - (" +
452
- parse_expression([lowRange],false) + "))/2)"
453
- else
454
- if wait_check_flag
455
- if @wait_match_string == "\"" + parse_tlm_item(words[2..3]) +
456
- parse_cond_operator(words[4]) + parse_expression(words[5..-1],true) + "\""
457
- @verify_wait_check = true
458
- # exit function with true flag, and skips check statement next parse
459
- return " "
460
- end
461
- end
462
- str = str + "check_raw(\"" + parse_tlm_item(words[2..3]) +
463
- parse_cond_operator(words[4]) + parse_expression(words[5..-1],true) +
464
- "\")"
465
- end
466
-
467
- # If the next word starts with a variable indicator
468
- elsif words[1].match(/\$/)
469
- # If the line contains a colon, make check expression formatted to
470
- # check against a defined range
471
- if line.match(":")
472
- vsIdx = line.index("VS")
473
- vsIdx = line.index("vs") if vsIdx == nil
474
- colIdx = line.index(":")
475
- lowRange = line[(vsIdx+2)..(colIdx-1)]
476
- highRange = line[(colIdx+1)..-1]
477
- str = str + "check_expression(\"(" +
478
- parse_expression([words[1]],true) + " >= (" +
479
- parse_expression([lowRange],true) + ")) and (" +
480
- parse_expression([words[1]],true) + " <= (" +
481
- parse_expression([highRange],true) + "))\")"
482
- else
483
- str = str + "check_expression(\"" +
484
- parse_expression(words[1..-1],true) + "\")"
485
- end
486
-
487
- # If the next word doesn't start with raw
488
- elsif words[1].match(/\w/)
489
- # If the line contains a colon, parse out the range and use tolerance
490
- if line.match(":")
491
- vsIdx = line.index("VS")
492
- vsIdx = line.index("vs") if vsIdx == nil
493
- colIdx = line.index(":")
494
- lowRange = line[(vsIdx+2)..(colIdx-1)]
495
- highRange = line[(colIdx+1)..-1]
496
- str = str + "check_tolerance(\"" +
497
- parse_tlm_item(words[1..2]) + "\", ((" +
498
- parse_expression([highRange],false) + ") + (" +
499
- parse_expression([lowRange],false) + ")) / 2, ((" +
500
- parse_expression([highRange],false) + ") - (" +
501
- parse_expression([lowRange],false) + "))/2)"
502
- else
503
- if (words[3])
504
- # if single integer comparison or variable, just parse single (for negative integer cases)
505
- if words.length <= 6
506
- if wait_check_flag
507
- if @wait_match_string == "\"" + parse_tlm_item(words[1..2]) + parse_cond_operator(words[3]) + parse_id(words[4],true) + "\""
508
- @verify_wait_check = true
509
- # exit function with true flag, and skips check statement next parse
510
- return ""
511
- end
512
- else
513
- str = str + "check(\"" + parse_tlm_item(words[1..2]) +
514
- parse_cond_operator(words[3]) + parse_id(words[4],true) +
515
- "\")"
516
- end
517
- else
518
- str = str + "check(\"" + parse_tlm_item(words[1..2]) +
519
- parse_cond_operator(words[3]) + parse_expression(words[4..-1],true) +
520
- "\")"
521
- end
522
- else
523
- str = str + "check(\"" + parse_tlm_item(words[1..2]) +
524
- "\")"
525
- end
526
- end
527
- end
528
-
529
- when "cmd"
530
- str = str + parse_cmd(words)
531
-
532
- when "set"
533
- str = str + parse_cmd(words)
534
-
535
- when "declare"
536
- # If the next word is input, ignore the line
537
- if words.length >= 2 and words[1].match(/input/i)
538
- if $inFunction
539
- $inFunctionParams << "\"#{words[4].upcase}\""
540
- else
541
- str = str + "# SCL Ignored: " + line
542
- end
543
-
544
- # If it is a defined enum list, ignore definitions
545
- elsif (words.length >= 6 and
546
- words[4..-1].join(" ").match(/[A-Z]+\s+[A-Z]+(,\s*[A-Z]+)+/i))
547
- str = str + parse_id(words[2]) + " " + words[3] + " " +
548
- parse_id(words[4])
549
-
550
- # If it is a defined range (one and only one colon), ignore range
551
- elsif (words.length >= 6 and
552
- words[4..-1].join(" ").count(":") == 1)
553
- str = str + parse_id(words[2]) + " " + words[3] + " " +
554
- parse_id(words[4])
555
-
556
- # Parse the expression
557
- elsif words.length >= 5
558
- str = str + parse_id(words[2]) + " " + words[3] + " " +
559
- parse_expression(words[4..-1])
560
-
561
- else
562
- str = str + "# TODO unsupported: " + line
563
- end
564
-
565
- when "else"
566
- # Only an else
567
- if words.length == 1
568
- str = str + "else"
569
-
570
- # 'Else if' statement
571
- elsif words.length >= 2 and words[1].match(/if/i)
572
- str = str + "elsif " + parse_expression(words[2..-1])
573
-
574
- # Other cases not handled
575
- else
576
- str = str + "# TODO unsupported: " + line
577
- end
578
-
579
- when "end"
580
- # End of an if statement
581
- if words[1].match(/if/i)
582
- str = str + "end"
583
-
584
- # End of a procedure with arguments
585
- elsif words[1].match(/proc/i) && $inFunction
586
- str += "end\n#{$inFunction}(#{$inFunctionParams.join(',')})"
587
-
588
- # End of a procedure without arguments
589
- elsif words[1].match(/proc/i) && !$inFunction
590
- str = str + "# SCL Ignored: " + line
591
-
592
- # End of a loop
593
- elsif words[1].match(/loop/i)
594
- str = str + "end"
595
-
596
- # End of a macro
597
- elsif words[1].match(/macro/i)
598
- str = str + "# SCL Ignored: " + line
599
-
600
- # Other cases not handled
601
- else
602
- str = str + "# TODO unsupported: " + line
603
- end
604
-
605
- when "endif"
606
- str = str + "end"
607
-
608
- when "escape"
609
- str = str + "break"
610
-
611
- when "goto"
612
- # Ignore typical goto for skipping the header section
613
- if words.length == 2 and words[1].match(/start_here/i)
614
- str = str + "# SCL Ignored: " + line
615
-
616
- # Other cases not handled
617
- else
618
- str = str + "# TODO unsupported: " + line
619
- end
620
-
621
- when "if"
622
- str = str + "if " + parse_expression(words[1..-1])
623
-
624
- when "let"
625
- # If we're assigning a telemetry point
626
- if $targetList.include?(words[1].upcase)
627
- # If there is no space between the equal sign reparse string
628
- str = str + "set_tlm(\"" + parse_tlm_item(words[1..2]) +
629
- parse_cond_operator(words[3], true) + parse_id(words[4],true) + "\")"
630
- else
631
- # there's no spaces between declaration
632
- str = str + parse_id(words[1]) + " " + words[2] + " " +
633
- parse_expression(words[3..-1])
634
- end
635
-
636
- when "lock"
637
- # Ignore database commands
638
- str = str + "# SCL Ignored: " + line
639
-
640
- when "loop"
641
- # TODO not sure if this is wise, for some files the loop is infinite and
642
- # there's no exist case
643
- if words[1] == nil
644
- str = str + "# TODO Possible inifinite loop case check script file" +
645
- "\n" + str + "while(true)"
646
- else
647
- str = str + words[1] + ".times do |i|"
648
- end
649
-
650
- when "macro"
651
- str = str + ("# SCL Ignored: " + line)
652
- $macroName = words[1].upcase
653
- $macroNumArgs = 0
654
- i = 2
655
- while ((nextWord = words[i]) != nil)
656
- case nextWord
657
- when /\$/
658
- $macroNumArgs = $macroNumArgs + 1
659
- end
660
- i = i + 1
661
- end
662
-
663
- when "new_mac"
664
- # Ignore OASIS commands
665
- str = str + "# SCL Ignored: " + line
666
-
667
- when "new_proc"
668
- # Ignore OASIS commands
669
- str = str + "# SCL Ignored: " + line
670
-
671
- when "proc"
672
- # Process procedures without arguments as scripts
673
- if words.length == 2
674
- # Set a global so we know how to close this function
675
- $inFunction = nil
676
-
677
- # Process procedures with arguments as functions
678
- else
679
- # Split the list of arguments on commas
680
- listWords = words[2..-1].join().split(",")
681
-
682
- # Print the function name and the first argument
683
- str = str + "def " + words[1].downcase + "(" + parse_id(listWords[0])
684
-
685
- # Print the remaining arguments preceeded by a separator
686
- (listWords.length-1).times do |i|
687
- str = str + ", " + parse_id(listWords[i+1])
688
- end
689
- str = str + ")"
690
-
691
- # Set a global so we know how to close this function
692
- $inFunction = words[1].downcase
693
- $inFunctionParams = []
694
- end
695
-
696
- when "record"
697
- # Record messages without a label
698
- if words.length == 2 and words[1].match(/messages/i)
699
- str = str + "start_logging()\n"
700
- numSpaces.times {str = str + " "}
701
- str = str + "start_new_server_message_log()"
702
-
703
- # Record message with a label
704
- elsif words.length == 3 and words[1].match(/messages/i)
705
- str = str + "set_log_label(" + words[2] + ")\n"
706
- numSpaces.times {str = str + " "}
707
- str = str + "start_logging()\n"
708
- numSpaces.times {str = str + " "}
709
- str = str + "start_new_server_message_log()"
710
-
711
- # Other cases not handled
712
- else
713
- str = str + "# TODO unsupported: " + line
714
- end
715
-
716
- when "restore"
717
- # Ignore database commands
718
- str = str + "# SCL Ignored: " + line
719
- when "run"
720
- temp = words[1..-1].to_s
721
- temp = temp.tr(',[]\"', '')
722
- # removes the quotes symbol remnants
723
- temp = temp.gsub('\\', '')
724
- temp = temp.gsub(/\\\z/, '')
725
- str = str + "system(\'" + temp + "\')"
726
- when "start"
727
- # Process procedures without arguments as scripts
728
- if words.length == 2
729
- str = str + "start(\"" + words[1].downcase + ".rb\")"
730
-
731
- # Process procedures with arguments as functions
732
- else
733
- # Add the statement to require the function
734
- str = str + "require_utility(\"" + words[1].downcase + ".rb\")\n"
735
- numSpaces.times {str = str + " "}
736
-
737
- # Split the list of arguments on commas
738
- listWords = words[2..-1].join().split(",")
739
- listWords.map! do |word|
740
- if word.match(/[0-9]*:[0-9]*:[0-9]+/) # Timestamp
741
- parse_time(word)
742
- else
743
- word
744
- end
745
- end
746
-
747
- # Print the function name and the first argument
748
- str = str + words[1].downcase + "(" + parse_id(listWords[0])
749
-
750
- # Print the remaining arguments preceeded by a separator
751
- (listWords.length-1).times do |i|
752
- str = str + ", " + parse_id(listWords[i+1])
753
- end
754
- str = str + ")"
755
- end
756
-
757
- when "start_here:"
758
- # Ignore typical starting point label
759
- str = str + "# SCL Ignored: " + line
760
-
761
- when "stop"
762
- # Ignore calls to stop logging since COSMOS stops logging with each start
763
- str = str + "# SCL Ignored: " + line
764
-
765
- when "unlock"
766
- # Ignore database commands
767
- str = str + "# SCL Ignored: " + line
768
-
769
- when "update"
770
- # Ignore database commands
771
- str = str + "# SCL Ignored: " + line
772
-
773
- when "wait"
774
- # add a space incase there's no space between or and parantheses
775
- line = line.gsub(')or', ') or')
776
- words = line.split(' ')
777
- # Only a wait
778
- if words.length == 1
779
- str = str + "wait()"
780
-
781
- # Waiting for length of time
782
- elsif words[1].match(/[0-9]*:[0-9]*:[0-9]+/)
783
- str = str + "wait(" + parse_time(words[1]) + ")"
784
-
785
- # Waiting for a variable of time
786
- elsif words.length == 2 and words[1].match(/\$/)
787
- str = str + "wait(" + parse_id(words[1]) + ")"
788
-
789
- # Waiting for an expression [or for a time]
790
- elsif words.length > 2 and words[1].match(/\$/)
791
- # Get index of 'OR FOR' if it exists by the 'FOR' keyword
792
- idx = words.index("FOR")
793
- if idx == nil
794
- idx = words.index("for")
795
- end
796
-
797
- # If there is a timeout
798
- if idx != nil
799
- str = str + "wait_expression(\"" +
800
- parse_expression(words[1..(idx-2)],true) + "\", " +
801
- parse_expression([words[idx+1]]) + ")"
802
-
803
- # No timeout given, so insert a default timeout
804
- else
805
- str = str + "wait_expression(\"" +
806
- parse_expression(words[1..-1],true) + "\", " +
807
- parse_time("::30") + ")"
808
- end
809
-
810
- # If the next word starts with the raw keyword
811
- elsif words[1].match(/[\(]*(raw)/i)
812
- # Get index of 'OR FOR' if it exists by the 'FOR' keyword
813
- idx = words.index("FOR")
814
- if idx == nil
815
- idx = words.index("for")
816
- end
817
-
818
- # If there is a timeout
819
- if idx != nil
820
- # If the first part is a complex expression
821
- if (words[1..(idx-2)].include?("OR") ||
822
- words[1..(idx-2)].include?("or") ||
823
- words[1..(idx-2)].include?("AND") ||
824
- words[1..(idx-2)].include?("and"))
825
- str = str + "wait_expression(\"" +
826
- parse_expression(words[1..(idx-2)],true) + "\", "
827
-
828
- # If it is a single telemetry item
829
- else
830
- @wait_match_string = "\"" + parse_tlm_item(words[2..3]) +
831
- parse_cond_operator(words[4]) +
832
- parse_expression(words[5..(idx-2)],true) + "\""
833
- @verify_wait_check = false
834
-
835
- parse_line(@data_by_lines[@universal_index+1], @out_file, true)
836
-
837
- if @verify_wait_check == true
838
- str = str + "wait_check_raw(\"" + parse_tlm_item(words[2..3]) +
839
- parse_cond_operator(words[4]) +
840
- parse_expression(words[5..(idx-2)],true) + "\", "
841
- else
842
- str = str + "wait_raw(\"" + parse_tlm_item(words[2..3]) +
843
- parse_cond_operator(words[4]) +
844
- parse_expression(words[5..(idx-2)],true) + "\", "
845
- end
846
- end
847
-
848
- # Parse the timeout
849
- str = str + parse_expression([words[idx+1]])
850
-
851
- # If there is no timeout given
852
- else
853
- # If it is a complex expression
854
- if (words[1..-1].include?("OR") || words[1..-1].include?("or") ||
855
- words[1..-1].include?("AND") || words[1..-1].include?("and"))
856
- str = str + "wait_expression(\"" +
857
- parse_expression(words[1..-1],true) + "\", "
858
-
859
- # If it is a single telemetry item
860
- else
861
- @wait_match_string = "\"" + parse_tlm_item(words[2..3]) +
862
- parse_cond_operator(words[4]) + parse_id(words[5],true) + "\""
863
- @verify_wait_check = false
864
-
865
- parse_line(@data_by_lines[@universal_index+1], @out_file, true)
866
-
867
- if @verify_wait_check == true
868
- str = str + "wait_check_raw(\"" + parse_tlm_item(words[2..3]) +
869
- parse_cond_operator(words[4]) + parse_id(words[5],true) + "\", "
870
- else
871
- str = str + "wait_raw(\"" + parse_tlm_item(words[2..3]) +
872
- parse_cond_operator(words[4]) + parse_id(words[5],true) + "\", "
873
- end
874
- end
875
-
876
- # Insert a default timeout
877
- str = str + parse_time("::30")
878
- end
879
- str = str + ")"
880
-
881
- # If the next word doesn't start with raw
882
- elsif words[1].match(/[\(]*\w/)
883
- # Get index of 'OR FOR' if it exists by the 'FOR' keyword
884
- idx = words.index("FOR")
885
- if idx == nil
886
- idx = words.index("for")
887
- end
888
-
889
- # If there is a timeout
890
- if idx != nil
891
- # If the first part is a complex expression
892
- if (words[1..(idx-2)].include?("OR") ||
893
- words[1..(idx-2)].include?("or") ||
894
- words[1..(idx-2)].include?("AND") ||
895
- words[1..(idx-2)].include?("and"))
896
- str = str + "wait_expression(\"" +
897
- parse_expression(words[1..(idx-2)],true) + "\", "
898
-
899
- # If it is a single telemetry item
900
- else
901
- @wait_match_string = "\"" + parse_tlm_item(words[1..2]) +
902
- parse_cond_operator(words[3]) + parse_id(words[4],true) + "\""
903
- @verify_wait_check = false
904
-
905
- parse_line(@data_by_lines[@universal_index+1], @out_file, true)
906
-
907
- if @verify_wait_check == true
908
- str = str + "wait_check(\"" + parse_tlm_item(words[1..2]) +
909
- parse_cond_operator(words[3]) + parse_id(words[4],true) + "\", "
910
- else
911
- str = str + "wait(\"" + parse_tlm_item(words[1..2]) +
912
- parse_cond_operator(words[3]) + parse_id(words[4],true) + "\", "
913
- end
914
- end
915
-
916
- # Parse the timeout
917
- str = str + parse_expression([words[idx+1]])
918
-
919
- # If there is no timeout given
920
- else
921
- # If it is a complex expression
922
- if (words[1..-1].include?("OR") || words[1..-1].include?("or") ||
923
- words[1..-1].include?("AND") || words[1..-1].include?("and"))
924
- str = str + "wait_expression(\"" +
925
- parse_expression(words[1..-1],true) + "\", "
926
-
927
- # If it is a single telemetry item
928
- else
929
- @wait_match_string = "\"" + parse_tlm_item(words[1..2]) +
930
- parse_cond_operator(words[3]) + parse_id(words[4],true) + "\""
931
- @verify_wait_check = false
932
-
933
- parse_line(@data_by_lines[@universal_index+1], @out_file, true)
934
-
935
- if @verify_wait_check == true
936
- str = str + "wait_check(\"" + parse_tlm_item(words[1..2]) +
937
- parse_cond_operator(words[3]) + parse_id(words[4],true) + "\", "
938
- else
939
- str = str + "wait(\"" + parse_tlm_item(words[1..2]) +
940
- parse_cond_operator(words[3]) + parse_id(words[4],true) + "\", "
941
- end
942
- end
943
-
944
- # Insert a default timeout
945
- str = str + parse_time("::30")
946
- end
947
- str = str + ")"
948
-
949
- else
950
- str = str + "# TODO unsupported: " + line
951
- end
952
-
953
- when "write"
954
- # Write the command and first word
955
- str = str + "puts(" + words[1]
956
-
957
- # Consolidate a " , to ",
958
- rem = words[2..-1].join(" ")
959
- quoteSpaceIdx = rem.index("\" ,")
960
- if quoteSpaceIdx != nil
961
- rem = rem[0..(quoteSpaceIdx)] + rem[(quoteSpaceIdx+2)..-1]
962
- end
963
-
964
- # Find the closing quote
965
- quoteIdx = rem.index("\",")
966
-
967
- # If there was a closing quote
968
- if (quoteIdx != nil and quoteIdx != rem.length - 1)
969
- # Write the characters up until the quote
970
- str = str + rem[0..quoteIdx-1]
971
-
972
- # Parse the rest after the ", as a quoted expression
973
- expr = rem[(quoteIdx+2)..-1]
974
- if expr.class == String
975
- # There might be yet another quoted section
976
- quoteIdx = expr.index("\"")
977
- remainder = ''
978
- if quoteIdx
979
- remainder = expr[quoteIdx+1..-2]
980
- expr = expr[0..quoteIdx-1].strip
981
- expr = expr[0..-2] if expr[-1] == ','
982
- end
983
- str = str + " \#{#{parse_expression([expr],true,true)}}#{remainder}\""
984
- else
985
- puts "****************** NOT STRING ******************"
986
- str = str + " \#{" + parse_expression(expr,true,true) + "}\""
987
- end
988
-
989
- # If there was no closing quote
990
- else
991
- words[2..-1].each do |word|
992
- str = str + " " + word.to_s
993
- end
994
- end
995
- str = str + ")"
996
-
997
- else
998
- # If this keyword is contained in the list of macros
999
- if $macroList != nil and $macroList.include?(words[0].upcase)
1000
- str = str + parse_macro(words)
1001
-
1002
- # Other keywords not handled
1003
- else
1004
- str = str + "# TODO unsupported: " + line
1005
- end
1006
- end
1007
- # Implicit end of case statement
1008
-
1009
- # Write the code and comment to the output file
1010
- if comment == ""
1011
- loc_out_file.puts str
1012
- else
1013
- loc_out_file.puts str + " " + comment
1014
- end
1015
- end
1016
-
1017
- ################################################################################
1018
- ##### BEGIN SCRIPT ######
1019
- ################################################################################
1020
-
1021
- require 'ostruct'
1022
- require 'optparse'
1023
-
1024
- options = OpenStruct.new
1025
- options.file = nil
1026
-
1027
- opts = OptionParser.new do |opts|
1028
- opts.banner = "Usage: cstol_converter [optional filenames]"
1029
- opts.separator ""
1030
- opts.separator "By default it will parse all macros (*.mac) and CSTOLS (*.prc)"
1031
- opts.separator "recursively starting in the current working directory"
1032
- opts.separator ""
1033
- # Create the help and version options
1034
- opts.on("-h", "--help", "Show this message") do
1035
- puts opts
1036
- exit
1037
- end
1038
- end
1039
-
1040
- begin
1041
- opts.parse!(ARGV)
1042
- rescue => err
1043
- puts err
1044
- puts opts
1045
- exit
1046
- end
1047
-
1048
- mac_files = []
1049
- prc_files = []
1050
- if ARGV[0]
1051
- ARGV.each do |filename|
1052
- prc_files << filename
1053
- end
1054
- else
1055
- # Find all macros
1056
- mac_files = Dir["**/*.mac"]
1057
- # Find all procedures
1058
- prc_files = Dir["**/*.prc"]
1059
- end
1060
-
1061
- # List of targets found in the CSTOL files
1062
- $targetList = Cosmos::System.targets.keys
1063
-
1064
- # Process all macros first
1065
- unless mac_files.empty?
1066
- puts "*****************************************************"
1067
- macros_file = File.open("macrosAutoGen.rb","w")
1068
- mac_files.each do |file|
1069
- puts " Parsing MAC file: " + file
1070
-
1071
- # Parse each line in the macro file
1072
- File.open(file,"r") do |infile|
1073
- out_file = File.open(File.join(Dir.pwd, file[0..-5] + "_macro.rb"), "w")
1074
- infile.each do |line|
1075
- parse_line(line,@out_file)
1076
- end
1077
- @out_file.close
1078
- end
1079
-
1080
- # Create a Ruby macro file that evaluates the macro in the callers context
1081
- macros_file.print "#{$macroName}_SRC =
1082
- open(\"#{file[0..-5]}_macro.rb\"){ |f|\n f.sysread(f.stat().size())\n}\n\n"
1083
- macros_file.print "def #{$macroName}(locBinding"
1084
- $macroNumArgs.times { |num|
1085
- macros_file.print ",macVar#{num+1}"
1086
- }
1087
- macros_file.print ")\n"
1088
- $macroNumArgs.times { |num|
1089
- macros_file.print " eval(\"inVar#{num+1} = \#{macVar#{num+1}}\",locBinding)\n"
1090
- }
1091
- macros_file.print " eval(#{$macroName}_SRC,locBinding)\n"
1092
- macros_file.print "end\n\n"
1093
-
1094
- # Append this macro to the master list of macros
1095
- if $macroList == nil
1096
- $macroList = [$macroName]
1097
- else
1098
- $macroList = $macroList.concat([$macroName])
1099
- end
1100
- end
1101
- macros_file.close
1102
- end
1103
-
1104
- if prc_files.empty?
1105
- puts "No *.prc files found"
1106
- else
1107
- puts "*****************************************************"
1108
-
1109
- # Process all procedures next
1110
- prc_files.each do |file|
1111
- puts " Parsing PRC file: " + file
1112
-
1113
- # Open each procedure
1114
- File.open(file,"r") do |infile|
1115
- # Open its equivalent Ruby output file
1116
- @out_file = File.open(File.join(Dir.pwd, File.basename(file)[0..-5] + ".rb"), "w")
1117
-
1118
- # Read the entire file in first in order to compress line continuations
1119
- @data = ""
1120
- matched_quotes = true
1121
- infile.each do |line|
1122
- # Check for matching quotes on this line
1123
- num_quotes = line.scan(/("|[^\\]")/).size
1124
- if num_quotes % 2 == 1
1125
- matched_quotes = !matched_quotes
1126
- end
1127
-
1128
- # If the last non-whitespace character is the line continuation char
1129
- if line.match(/&\s*$/)
1130
- # Remove the continuation char and returns to join with next line
1131
- idx = line.rindex("&")
1132
- @data = @data + line[0..(idx-1)]
1133
- elsif matched_quotes == false
1134
- # If the unmatched string uses the non-standard underscore char
1135
- if line.match(/_\s*$/)
1136
- # Remove the trailing underscore
1137
- idx = line.rindex("_")
1138
- line = line[0..(idx-1)]
1139
- end
1140
- # Remove the returns from this line to join with next line
1141
- @data = @data + line.rstrip
1142
- else
1143
- # Leave it alone
1144
- @data = @data + line
1145
- end
1146
- end
1147
-
1148
- @universal_index = 0
1149
- @data_by_lines = @data.lines.to_a
1150
- # Parse each line in the file
1151
- @data_by_lines.each do |line|
1152
- if @verify_wait_check == true
1153
- # Skip line
1154
- @verify_wait_check = false
1155
- else
1156
- parse_line(@data_by_lines[@universal_index], @out_file)
1157
- end
1158
- @universal_index += 1
1159
- end
1160
-
1161
- # Close the file
1162
- @out_file.close
1163
- end
1164
- end
1165
- end
1166
-
1
+ #!/usr/bin/env ruby
2
+ # encoding: ascii-8bit
3
+
4
+ # Copyright 2014 Ball Aerospace & Technologies Corp.
5
+ # All Rights Reserved.
6
+ #
7
+ # This program is free software; you can modify and/or redistribute it
8
+ # under the terms of the GNU General Public License
9
+ # as published by the Free Software Foundation; version 3 with
10
+ # attribution addendums as found in the LICENSE.txt
11
+
12
+ # This file converts OASIS CSTOL files to COSMOS scripts
13
+
14
+ require 'cosmos'
15
+ require 'cosmos/script'
16
+ require 'cosmos/system'
17
+
18
+ # TODO: capitalized string from ask statement may not match expression (gmi.rb:70)
19
+ # TODO: handle V, C other units specifications...
20
+ # TODO: handle unary operators (-1, not - 1) => although Ruby handles this fine
21
+
22
+ def parse_cmd(words)
23
+ # Convert the part that's common to all commands
24
+ str = "cmd(\"" + words[1].upcase + " " + words[2].upcase
25
+
26
+ # If it has parameters
27
+ if words.length == 5
28
+ str = str + " " + parse_id(words[4], true, false, true, true)
29
+
30
+ elsif words.length > 5
31
+ str = str + " with"
32
+
33
+ # Join the rest of the list and remove the commas
34
+ args = words[4..-1].join(" ").split(",")
35
+ args.length.times do |i|
36
+ # Only prepend comma if it is not the first argument pair
37
+ if i != 0
38
+ str = str + ","
39
+ end
40
+ params = args[i].split(" ")
41
+
42
+ str = str + " " + params[0].upcase + " " + parse_id(params[1],true, false, true)
43
+ end
44
+ end
45
+ str = str + "\")"
46
+ end
47
+
48
+ def parse_cond_operator(op, is_set_tlm = false)
49
+ str = ""
50
+ # Convert CSTOL operators into Ruby operators
51
+ if op.match("/=")
52
+ str = " != "
53
+ elsif op.match(">=")
54
+ str = " >= "
55
+ elsif op.match("<=")
56
+ str = " <= "
57
+ elsif op.match(">")
58
+ str = " > "
59
+ elsif op.match("<")
60
+ str = " < "
61
+ elsif op.match("=")
62
+ str = " == "
63
+ if is_set_tlm
64
+ str = " = "
65
+ end
66
+ elsif op.match(/VS/i)
67
+ str = " == "
68
+ end
69
+ str
70
+ end
71
+
72
+ def parse_expression(vars, quoted=false, in_eval=false)
73
+ i=0
74
+ str = ""
75
+ finished = false
76
+ # Make sure there are spaces around the operators
77
+ if vars.length > 1
78
+ vars = vars.join(" ")
79
+ else
80
+ vars = vars.to_s
81
+ end
82
+ vars = vars.gsub("(", " ( ")
83
+ vars = vars.gsub(")", " ) ")
84
+ vars = vars.gsub("+", " + ")
85
+ vars = vars.gsub("-", " - ")
86
+ vars = vars.gsub("*", " * ")
87
+ vars = vars.gsub("==", " == ")
88
+ vars = vars.gsub("/=", " /= ")
89
+ vars = vars.gsub("<=", " <= ")
90
+ vars = vars.gsub(">=", " >= ")
91
+ vars = vars.gsub(";", " ; ")
92
+ # Add spaces around single character operators (/ < >)
93
+ offset = 0
94
+ while((idx = vars.index(/[\/<>][^=]/,offset)) != nil)
95
+ # Add space before and after operator and increment offset
96
+ vars = vars.insert(idx," ")
97
+ vars = vars.insert(idx+2," ")
98
+ offset = idx + 2
99
+ end
100
+ # Add spaces around single = operator (not /=, ==, <=, or >=)
101
+ offset = 0
102
+ while((idx = vars.index(/[^\/=<>]=[^=]/,offset)) != nil)
103
+ # Add space before and after operator and increment offset
104
+ vars = vars.insert(idx+1," ")
105
+ vars = vars.insert(idx+3," ")
106
+ offset = idx + 3
107
+ end
108
+
109
+ # Split the expression on spaces
110
+ vars = vars.split(" ")
111
+
112
+ last = nil
113
+ while (vars[i] != nil and finished != true)
114
+ case vars[i].tr('[]"', '')
115
+ when "("
116
+ if quoted == false
117
+ str = str + "("
118
+ end
119
+
120
+ when ")"
121
+ if quoted == false
122
+ str = str + ")"
123
+ end
124
+
125
+ when /\bOR\b/i
126
+ str = str + " || "
127
+
128
+ when /\bAND\b/i
129
+ str = str + " && "
130
+
131
+ when /\b\$[0-9]\b/ # $0, $1, etc are function inputs
132
+ str = str + "inVar" + vars[0][1..-1]
133
+
134
+ when /\$/ # $varName
135
+ str = str + parse_id(vars[i].tr('[]"', ''),quoted,in_eval)
136
+
137
+ when /RAW/i
138
+ if quoted
139
+ str = str + "tlm_raw('" + parse_tlm_item(vars[i+1..i+2]) + "')"
140
+ else
141
+ str = str + "tlm_raw(\"" + parse_tlm_item(vars[i+1..i+2]) + "\")"
142
+ end
143
+ i = i + 2
144
+ when /x#[0-9a-fA-F]+/i # Hex number
145
+ str = str + parse_id(vars[i].tr('[]"', ''),quoted)
146
+ when /b#[0-1]+/i # Binary number
147
+ str = str + parse_id(vars[i].tr('[]"', ''),quoted)
148
+
149
+ when /(\AVS\z|=|\/=|>|>=|<|<=)/ # Conditional operator
150
+ str = str + parse_cond_operator(vars[i])
151
+ when /(\+|-|\*|\/)/ # Arithmetic operator
152
+ str = str + " " + vars[i].tr('[]"', '') + " "
153
+
154
+ # Verfies Number followed immediately by units
155
+ when /\dDN\z|\ddn\z|\dDEG\z|\ddeg\z|\dRAD\z|\drad\z|\dV\z|\dA\z|\dv\z|\da\z|\dc\z|\dC\z|\df\z|\dF\z|\dDPS\z|\dM\z|\dMPS\z|\dm\z|\dmps\z/ # Checks for decimal/degrees/volts and amps
156
+ temp = vars[i].tr('[]"', '')
157
+ temp = temp.gsub(/DN\z|dn\z|DEG\z|deg\z|RAD\z|rad\z|V\z|A\z|v\z|a\z|c\z|C\z|f\z|F\z|DPS\z|M\z|MPS\z|m\z|mps\z/, '')
158
+ if temp.match(/[a-zA-Z]/)
159
+ str = str + parse_id(vars[i].tr('[]"', ''),quoted)
160
+ else
161
+ str = str + temp
162
+ end
163
+
164
+ # Verifies units are standalone
165
+ when last != '=' && /DN\z|dn\z|DEG\z|deg\z|RAD\z|rad\z|V\z|A\z|v\z|a\z|c\z|C\z|f\z|F\z|DPS\z|M\z|MPS\z|m\z|mps\z/ # Checks for decimal/degrees/volts and amps
166
+ # Verify it is not a target
167
+ if(vars[i] != nil and $targetList.include?(vars[i].tr('[]"', '').upcase))
168
+ if quoted
169
+ str = str + "tlm('" + parse_tlm_item(vars[i..i+1]) + "')"
170
+ else
171
+ str = str + "tlm(\"" + parse_tlm_item(vars[i..i+1]) + "\")"
172
+ end
173
+ i = i + 1
174
+ else
175
+ str = str + parse_id(vars[i].tr('[]"', ''),quoted)
176
+ end
177
+ when /[0-9]*:[0-9]*:[0-9]+/ # Timestamp
178
+ str = str + parse_time(vars[i].tr('[]"', ''))
179
+
180
+ when /\dE/ # Floating point
181
+ temp_number = vars[i].tr('E', '').to_f * 10**vars[i+2].to_f
182
+ str = str + "#{temp_number}"
183
+ finished = true
184
+ when /\d/ # Decimal number
185
+ str = str + parse_id(vars[i].tr('[]"', ''),quoted)
186
+
187
+ when /\w/ # Must stay low on the list to avoid matching other items
188
+ # Check this keyword against the list of targets
189
+ if(vars[i] != nil and $targetList.include?(vars[i].tr('[]"', '').upcase))
190
+ if quoted
191
+ str = str + "tlm('" + parse_tlm_item(vars[i..i+1]) + "')"
192
+ else
193
+ str = str + "tlm(\"" + parse_tlm_item(vars[i..i+1]) + "\")"
194
+ end
195
+ i += 1
196
+
197
+ # If it is not a target, then it must be a string or other identifier
198
+ else
199
+ str = str + parse_id(vars[i].tr('[]"', ''), quoted, false, false, false, false)
200
+ end
201
+
202
+ # Other cases not handled
203
+ # else
204
+ # str = str + " # TODO unsupported: " + vars[i].tr('[]"', '')
205
+ end # case
206
+ last = vars[i].tr('[]"', '')
207
+ i += 1
208
+ end # while
209
+ str
210
+ end
211
+
212
+ def parse_id(id, quoted=false, in_eval=false, in_command=false, in_single_command = false, units = true)
213
+ str = ""
214
+ # Remove parentheses
215
+ if id.index("(") == 0
216
+ id = id[1..-1]
217
+ end
218
+ if id.index(")") == id.length - 1
219
+ id = id[0..-2]
220
+ end
221
+
222
+ if id.match(/\$\w/) # $varName
223
+ id[1,1] = id[1,1].downcase
224
+ if quoted and !in_eval
225
+ str = "'\#{" + id[1..-1] + "}'"
226
+ else
227
+
228
+ str = id[1..-1]
229
+ end
230
+
231
+ elsif (id.match(/^"/) != nil and
232
+ id.match(/"$/) != nil) # Starts and ends with a quote
233
+ if quoted
234
+ str = "'" + id.upcase[1..-2] + "'"
235
+ else
236
+ str = id.upcase
237
+ end
238
+
239
+ elsif id.match(/x#[A-Fa-f0-9]+DN/i) # Hex number with DN
240
+ str = "0x" + id[2..-3]
241
+
242
+ elsif id.match(/x#[0-9a-fA-F]+/i) # Hex number
243
+ str = "0x" + id[2..-1]
244
+
245
+ elsif id.match(/b#[0-1]+DN/i) # Binary number with DN
246
+ str = "0b" + id[2..-3]
247
+
248
+ elsif id.match(/b#[0-1]+/i) # Binary number
249
+ str = "0b" + id[2..-1]
250
+
251
+ elsif id.match(/\d+DN/i) or id.match(/-\d+DN/i) # Decimal number with DN
252
+ str = id[0..-3]
253
+ elsif id.match(/\AVS\z|\Avs\z/)
254
+ str = str + " == "
255
+
256
+ # Verifies extensions with a decimal number followed by a unit
257
+ elsif units && id.match(/\dDN|\ddn|\dDEG|\ddeg|\dRAD|\drad|\dV|\dA|\dv|\da|\dc|\dC|\df|\dF|\dDPS|\dM\z|\dMPS\z|\dm\z|\dmps\z/)
258
+ temp = id.gsub(/DN\z|dn\z|DEG\z|deg\z|RAD\z|rad\z|V\z|A\z|v\z|a\z|c\z|C\z|f\z|F\z|DPS\z|M\z|MPS\z|m\z|mps\z/, '')
259
+ if in_command and temp.match(/[a-zA-Z]/)
260
+ str = str + "\'" + id.upcase + "\'"
261
+ # if filtered words still contain letter, then it is not a number
262
+ elsif temp.match(/[a-zA-Z]/)
263
+ str = str + id
264
+ else
265
+ str = str + temp
266
+ end
267
+ elsif id.match(/\dE\+\d/) # Floating point
268
+ id = id.gsub('+', ' + ')
269
+ temp_num_arr = id.split(' ')
270
+ temp_number = temp_num_arr[0].tr('E', '').to_f * 10**temp_num_arr[2].to_f
271
+ str = str + "#{temp_number}"
272
+ elsif id.match(/\A\d/) or id.match(/\A-\d/) # starts with Decimal number
273
+ str = id
274
+ # Verifies extensions with a decimal number followed by a unit
275
+ # that is by itself separated by whitespace
276
+ elsif units && id.match(/\ADN\z|\Adn\z|\ADEG\z|\Adeg\z|\ARAD\z|\Arad\z|\AV\z|\AA\z|\Av\z|\Aa\z|\Ac\z|\AC\z|\Af\z|\AF\z|\ADPS\z|\AM\z|\AMPS\z|\Am\z|\Amps\z/)
277
+ temp = id.gsub(/DN\z|dn\z|DEG\z|deg\z|RAD\z|rad\z|V\z|A\z|v\z|a\z|c\z|C\z|f\z|F\z|DPS\z|M\z|MPS\z|m\z|mps\z/, '')
278
+ if in_command
279
+ str = str + "\'" + id.upcase + "\'"
280
+ else
281
+ str = str + temp
282
+ end
283
+ elsif id.match(/\w/) # Any other word
284
+ # If it's quoted still need quotes for comparison
285
+ if in_single_command
286
+ str = id.upcase
287
+ elsif quoted
288
+ str = "\'" + id.upcase + "\'"
289
+ else
290
+ str = "\"" + id.tr('\\', '').upcase + "\""
291
+ end
292
+ else
293
+ str = id
294
+ end
295
+ end
296
+
297
+ def parse_macro(words)
298
+ # Call the macro with the first parameter as binding
299
+ str = words[0] + "(binding"
300
+
301
+ # Add all arguments in a loop
302
+ (words.length-1).times do |i|
303
+ str = str + ", " + parse_id(words[i+1])
304
+ end
305
+ str = str + ")"
306
+ end
307
+
308
+ def parse_time(time)
309
+ # If this is a timestamp
310
+ if time.match(/[0-9]*:[0-9]*:[0-9]+/) # Timestamp
311
+ # Split on colons to separate hours/minutes/seconds
312
+ tok = time.split(":")
313
+
314
+ # If the first two tokens are empty, set to 0 (ex. ::10 is a valid time)
315
+ if tok[0] == ""
316
+ tok[0] = "0"
317
+ end
318
+ if tok[1] == ""
319
+ tok[1] = "0"
320
+ end
321
+
322
+ # Compute the number of seconds
323
+ secs = (3600*tok[0].to_i + 60*tok[1].to_i + tok[2].to_i).to_s
324
+
325
+ # Other cases not handled
326
+ else
327
+ secs = "# TODO unsupported: " + time
328
+ end
329
+ end
330
+
331
+ def parse_tlm_item(tlm)
332
+ # Remove preceeding parentheses
333
+ if tlm[0].index("(") == 0
334
+ tlm[0] = tlm[0][1..-1]
335
+ end
336
+
337
+ # If there are two telemetry items (target and mnemonic)
338
+ if tlm.length == 2
339
+ begin
340
+ str = tlm[0].tr('[]"', '').upcase + " " + Cosmos::System.telemetry.newest_packet(tlm[0].tr('[]"', '').upcase,tlm[1].tr('[]"', '').upcase).packet_name + " " + tlm[1].tr('[]"', '').upcase
341
+ rescue
342
+ str = "# TODO unknown TLM: " + tlm.to_s
343
+ end
344
+
345
+ # Other cases not handled
346
+ else
347
+ str = "# TODO unsupported: " + tlm.to_s
348
+ end
349
+ end
350
+
351
+ def parse_line(full_line, loc_out_file, wait_check_flag=false)
352
+ line = ""
353
+ comment = ""
354
+ str = ""
355
+
356
+ # Handle any empty lines
357
+ if full_line == nil || full_line.strip == ""
358
+ loc_out_file.puts full_line
359
+ return
360
+ end
361
+
362
+ # Detemine the location of any comments in this line
363
+ commentIdx = full_line.index(";")
364
+
365
+ # If we found a comment operator
366
+ if commentIdx != nil
367
+ # If there's text to pull out before the ;
368
+ if commentIdx != 0
369
+ line = full_line[0..(commentIdx-1)].rstrip
370
+ end
371
+ # If there's text to pull out after the ;
372
+ if commentIdx != full_line.length - 1
373
+ comment = "#" + full_line[(commentIdx+1)..-1]
374
+ end
375
+ else
376
+ # No comment operator so use the entire line
377
+ line = full_line.rstrip
378
+ end
379
+
380
+ # Determine the number of spaces to indent this line by finding the first
381
+ # non-whitespace character
382
+ numSpaces = full_line.index(/\S/)
383
+ numSpaces.times {str = str + " "}
384
+
385
+ # Handle lines with only comments
386
+ if line == nil or line == ""
387
+ loc_out_file.puts str + comment
388
+ return
389
+ end
390
+
391
+ # Redundant substitutions are done for comparators
392
+ line = line.gsub("==", " == ")
393
+ line = line.gsub("/=", " /= ")
394
+ line = line.gsub("<=", " <= ")
395
+ line = line.gsub(">=", " >= ")
396
+ line = line.gsub(/(\w)(=)(\w)/, '\1 = \3')
397
+ line = line.gsub(/(\w)(=)(\d)/, '\1 = \3')
398
+ line = line.gsub(/(\w)(=)(-)/, ' = -')
399
+ line = line.gsub(/(\w)(=)(\s)/, '\1 = \3')
400
+ line = line.gsub(/(\s)(=)(\w)/, '\1 = \3')
401
+
402
+ # Split the line into tokens by spaces, if no spaces between equals sign add them
403
+ words = line.split(" ")
404
+
405
+ # Check for old CSTOL labels which have a trailing colon
406
+ if words[0][-1] == ':'
407
+ loc_out_file.puts "# #{line}"
408
+ return
409
+ end
410
+
411
+ # if wait_check flag is activated ensure that the next line is a check otherwise infinite loop
412
+ if wait_check_flag and words[0].downcase != 'check'
413
+ return ""
414
+ end
415
+
416
+ case words[0].downcase
417
+ when "endproc"
418
+ if $inFunction
419
+ str += "end\n#{$inFunction}(#{$inFunctionParams.join(',')})" if $inFunction
420
+ $inFunction = nil
421
+ end
422
+
423
+ when "ask"
424
+ str = str + parse_id(words[1]) + " = ask(" + words[2]
425
+ (words.length-3).times do |i|
426
+ str = str + " " + words[i+3]
427
+ end
428
+ str = str + ")"
429
+
430
+ when "begin"
431
+ # Don't need to do anything with this keyword, so exit unless there's
432
+ # a comment to print
433
+ if comment == ""
434
+ return
435
+ end
436
+
437
+ when "check"
438
+
439
+ # If the next word starts with the raw keyword
440
+ if words[1].match(/\A(raw)/i)
441
+ # If the line contains a colon, parse out the range and use tolerance
442
+ if line.match(":")
443
+ vsIdx = line.index("VS")
444
+ vsIdx = line.index("vs") if vsIdx == nil
445
+ colIdx = line.index(":")
446
+ lowRange = line[(vsIdx+2)..(colIdx-1)]
447
+ highRange = line[(colIdx+1)..-1]
448
+ str = str + "check_tolerance_raw(\"" + parse_tlm_item(words[2..3]) +
449
+ "\", ((" + parse_expression([highRange],false) + ") + (" +
450
+ parse_expression([lowRange],false) +
451
+ ")) / 2," + " ((" + parse_expression([highRange],false) + ") - (" +
452
+ parse_expression([lowRange],false) + "))/2)"
453
+ else
454
+ if wait_check_flag
455
+ if @wait_match_string == "\"" + parse_tlm_item(words[2..3]) +
456
+ parse_cond_operator(words[4]) + parse_expression(words[5..-1],true) + "\""
457
+ @verify_wait_check = true
458
+ # exit function with true flag, and skips check statement next parse
459
+ return " "
460
+ end
461
+ end
462
+ str = str + "check_raw(\"" + parse_tlm_item(words[2..3]) +
463
+ parse_cond_operator(words[4]) + parse_expression(words[5..-1],true) +
464
+ "\")"
465
+ end
466
+
467
+ # If the next word starts with a variable indicator
468
+ elsif words[1].match(/\$/)
469
+ # If the line contains a colon, make check expression formatted to
470
+ # check against a defined range
471
+ if line.match(":")
472
+ vsIdx = line.index("VS")
473
+ vsIdx = line.index("vs") if vsIdx == nil
474
+ colIdx = line.index(":")
475
+ lowRange = line[(vsIdx+2)..(colIdx-1)]
476
+ highRange = line[(colIdx+1)..-1]
477
+ str = str + "check_expression(\"(" +
478
+ parse_expression([words[1]],true) + " >= (" +
479
+ parse_expression([lowRange],true) + ")) and (" +
480
+ parse_expression([words[1]],true) + " <= (" +
481
+ parse_expression([highRange],true) + "))\")"
482
+ else
483
+ str = str + "check_expression(\"" +
484
+ parse_expression(words[1..-1],true) + "\")"
485
+ end
486
+
487
+ # If the next word doesn't start with raw
488
+ elsif words[1].match(/\w/)
489
+ # If the line contains a colon, parse out the range and use tolerance
490
+ if line.match(":")
491
+ vsIdx = line.index("VS")
492
+ vsIdx = line.index("vs") if vsIdx == nil
493
+ colIdx = line.index(":")
494
+ lowRange = line[(vsIdx+2)..(colIdx-1)]
495
+ highRange = line[(colIdx+1)..-1]
496
+ str = str + "check_tolerance(\"" +
497
+ parse_tlm_item(words[1..2]) + "\", ((" +
498
+ parse_expression([highRange],false) + ") + (" +
499
+ parse_expression([lowRange],false) + ")) / 2, ((" +
500
+ parse_expression([highRange],false) + ") - (" +
501
+ parse_expression([lowRange],false) + "))/2)"
502
+ else
503
+ if (words[3])
504
+ # if single integer comparison or variable, just parse single (for negative integer cases)
505
+ if words.length <= 6
506
+ if wait_check_flag
507
+ if @wait_match_string == "\"" + parse_tlm_item(words[1..2]) + parse_cond_operator(words[3]) + parse_id(words[4],true) + "\""
508
+ @verify_wait_check = true
509
+ # exit function with true flag, and skips check statement next parse
510
+ return ""
511
+ end
512
+ else
513
+ str = str + "check(\"" + parse_tlm_item(words[1..2]) +
514
+ parse_cond_operator(words[3]) + parse_id(words[4],true) +
515
+ "\")"
516
+ end
517
+ else
518
+ str = str + "check(\"" + parse_tlm_item(words[1..2]) +
519
+ parse_cond_operator(words[3]) + parse_expression(words[4..-1],true) +
520
+ "\")"
521
+ end
522
+ else
523
+ str = str + "check(\"" + parse_tlm_item(words[1..2]) +
524
+ "\")"
525
+ end
526
+ end
527
+ end
528
+
529
+ when "cmd"
530
+ str = str + parse_cmd(words)
531
+
532
+ when "set"
533
+ str = str + parse_cmd(words)
534
+
535
+ when "declare"
536
+ # If the next word is input, ignore the line
537
+ if words.length >= 2 and words[1].match(/input/i)
538
+ if $inFunction
539
+ $inFunctionParams << "\"#{words[4].upcase}\""
540
+ else
541
+ str = str + "# SCL Ignored: " + line
542
+ end
543
+
544
+ # If it is a defined enum list, ignore definitions
545
+ elsif (words.length >= 6 and
546
+ words[4..-1].join(" ").match(/[A-Z]+\s+[A-Z]+(,\s*[A-Z]+)+/i))
547
+ str = str + parse_id(words[2]) + " " + words[3] + " " +
548
+ parse_id(words[4])
549
+
550
+ # If it is a defined range (one and only one colon), ignore range
551
+ elsif (words.length >= 6 and
552
+ words[4..-1].join(" ").count(":") == 1)
553
+ str = str + parse_id(words[2]) + " " + words[3] + " " +
554
+ parse_id(words[4])
555
+
556
+ # Parse the expression
557
+ elsif words.length >= 5
558
+ str = str + parse_id(words[2]) + " " + words[3] + " " +
559
+ parse_expression(words[4..-1])
560
+
561
+ else
562
+ str = str + "# TODO unsupported: " + line
563
+ end
564
+
565
+ when "else"
566
+ # Only an else
567
+ if words.length == 1
568
+ str = str + "else"
569
+
570
+ # 'Else if' statement
571
+ elsif words.length >= 2 and words[1].match(/if/i)
572
+ str = str + "elsif " + parse_expression(words[2..-1])
573
+
574
+ # Other cases not handled
575
+ else
576
+ str = str + "# TODO unsupported: " + line
577
+ end
578
+
579
+ when "end"
580
+ # End of an if statement
581
+ if words[1].match(/if/i)
582
+ str = str + "end"
583
+
584
+ # End of a procedure with arguments
585
+ elsif words[1].match(/proc/i) && $inFunction
586
+ str += "end\n#{$inFunction}(#{$inFunctionParams.join(',')})"
587
+
588
+ # End of a procedure without arguments
589
+ elsif words[1].match(/proc/i) && !$inFunction
590
+ str = str + "# SCL Ignored: " + line
591
+
592
+ # End of a loop
593
+ elsif words[1].match(/loop/i)
594
+ str = str + "end"
595
+
596
+ # End of a macro
597
+ elsif words[1].match(/macro/i)
598
+ str = str + "# SCL Ignored: " + line
599
+
600
+ # Other cases not handled
601
+ else
602
+ str = str + "# TODO unsupported: " + line
603
+ end
604
+
605
+ when "endif"
606
+ str = str + "end"
607
+
608
+ when "escape"
609
+ str = str + "break"
610
+
611
+ when "goto"
612
+ # Ignore typical goto for skipping the header section
613
+ if words.length == 2 and words[1].match(/start_here/i)
614
+ str = str + "# SCL Ignored: " + line
615
+
616
+ # Other cases not handled
617
+ else
618
+ str = str + "# TODO unsupported: " + line
619
+ end
620
+
621
+ when "if"
622
+ str = str + "if " + parse_expression(words[1..-1])
623
+
624
+ when "let"
625
+ # If we're assigning a telemetry point
626
+ if $targetList.include?(words[1].upcase)
627
+ # If there is no space between the equal sign reparse string
628
+ str = str + "set_tlm(\"" + parse_tlm_item(words[1..2]) +
629
+ parse_cond_operator(words[3], true) + parse_id(words[4],true) + "\")"
630
+ else
631
+ # there's no spaces between declaration
632
+ str = str + parse_id(words[1]) + " " + words[2] + " " +
633
+ parse_expression(words[3..-1])
634
+ end
635
+
636
+ when "lock"
637
+ # Ignore database commands
638
+ str = str + "# SCL Ignored: " + line
639
+
640
+ when "loop"
641
+ # TODO not sure if this is wise, for some files the loop is infinite and
642
+ # there's no exist case
643
+ if words[1] == nil
644
+ str = str + "# TODO Possible inifinite loop case check script file" +
645
+ "\n" + str + "while(true)"
646
+ else
647
+ str = str + words[1] + ".times do |i|"
648
+ end
649
+
650
+ when "macro"
651
+ str = str + ("# SCL Ignored: " + line)
652
+ $macroName = words[1].upcase
653
+ $macroNumArgs = 0
654
+ i = 2
655
+ while ((nextWord = words[i]) != nil)
656
+ case nextWord
657
+ when /\$/
658
+ $macroNumArgs = $macroNumArgs + 1
659
+ end
660
+ i = i + 1
661
+ end
662
+
663
+ when "new_mac"
664
+ # Ignore OASIS commands
665
+ str = str + "# SCL Ignored: " + line
666
+
667
+ when "new_proc"
668
+ # Ignore OASIS commands
669
+ str = str + "# SCL Ignored: " + line
670
+
671
+ when "proc"
672
+ # Process procedures without arguments as scripts
673
+ if words.length == 2
674
+ # Set a global so we know how to close this function
675
+ $inFunction = nil
676
+
677
+ # Process procedures with arguments as functions
678
+ else
679
+ # Split the list of arguments on commas
680
+ listWords = words[2..-1].join().split(",")
681
+
682
+ # Print the function name and the first argument
683
+ str = str + "def " + words[1].downcase + "(" + parse_id(listWords[0])
684
+
685
+ # Print the remaining arguments preceeded by a separator
686
+ (listWords.length-1).times do |i|
687
+ str = str + ", " + parse_id(listWords[i+1])
688
+ end
689
+ str = str + ")"
690
+
691
+ # Set a global so we know how to close this function
692
+ $inFunction = words[1].downcase
693
+ $inFunctionParams = []
694
+ end
695
+
696
+ when "record"
697
+ # Record messages without a label
698
+ if words.length == 2 and words[1].match(/messages/i)
699
+ str = str + "start_logging()\n"
700
+ numSpaces.times {str = str + " "}
701
+ str = str + "start_new_server_message_log()"
702
+
703
+ # Record message with a label
704
+ elsif words.length == 3 and words[1].match(/messages/i)
705
+ str = str + "set_log_label(" + words[2] + ")\n"
706
+ numSpaces.times {str = str + " "}
707
+ str = str + "start_logging()\n"
708
+ numSpaces.times {str = str + " "}
709
+ str = str + "start_new_server_message_log()"
710
+
711
+ # Other cases not handled
712
+ else
713
+ str = str + "# TODO unsupported: " + line
714
+ end
715
+
716
+ when "restore"
717
+ # Ignore database commands
718
+ str = str + "# SCL Ignored: " + line
719
+ when "run"
720
+ temp = words[1..-1].to_s
721
+ temp = temp.tr(',[]\"', '')
722
+ # removes the quotes symbol remnants
723
+ temp = temp.gsub('\\', '')
724
+ temp = temp.gsub(/\\\z/, '')
725
+ str = str + "system(\'" + temp + "\')"
726
+ when "start"
727
+ # Process procedures without arguments as scripts
728
+ if words.length == 2
729
+ str = str + "start(\"" + words[1].downcase + ".rb\")"
730
+
731
+ # Process procedures with arguments as functions
732
+ else
733
+ # Add the statement to require the function
734
+ str = str + "require_utility(\"" + words[1].downcase + ".rb\")\n"
735
+ numSpaces.times {str = str + " "}
736
+
737
+ # Split the list of arguments on commas
738
+ listWords = words[2..-1].join().split(",")
739
+ listWords.map! do |word|
740
+ if word.match(/[0-9]*:[0-9]*:[0-9]+/) # Timestamp
741
+ parse_time(word)
742
+ else
743
+ word
744
+ end
745
+ end
746
+
747
+ # Print the function name and the first argument
748
+ str = str + words[1].downcase + "(" + parse_id(listWords[0])
749
+
750
+ # Print the remaining arguments preceeded by a separator
751
+ (listWords.length-1).times do |i|
752
+ str = str + ", " + parse_id(listWords[i+1])
753
+ end
754
+ str = str + ")"
755
+ end
756
+
757
+ when "start_here:"
758
+ # Ignore typical starting point label
759
+ str = str + "# SCL Ignored: " + line
760
+
761
+ when "stop"
762
+ # Ignore calls to stop logging since COSMOS stops logging with each start
763
+ str = str + "# SCL Ignored: " + line
764
+
765
+ when "unlock"
766
+ # Ignore database commands
767
+ str = str + "# SCL Ignored: " + line
768
+
769
+ when "update"
770
+ # Ignore database commands
771
+ str = str + "# SCL Ignored: " + line
772
+
773
+ when "wait"
774
+ # add a space incase there's no space between or and parantheses
775
+ line = line.gsub(')or', ') or')
776
+ words = line.split(' ')
777
+ # Only a wait
778
+ if words.length == 1
779
+ str = str + "wait()"
780
+
781
+ # Waiting for length of time
782
+ elsif words[1].match(/[0-9]*:[0-9]*:[0-9]+/)
783
+ str = str + "wait(" + parse_time(words[1]) + ")"
784
+
785
+ # Waiting for a variable of time
786
+ elsif words.length == 2 and words[1].match(/\$/)
787
+ str = str + "wait(" + parse_id(words[1]) + ")"
788
+
789
+ # Waiting for an expression [or for a time]
790
+ elsif words.length > 2 and words[1].match(/\$/)
791
+ # Get index of 'OR FOR' if it exists by the 'FOR' keyword
792
+ idx = words.index("FOR")
793
+ if idx == nil
794
+ idx = words.index("for")
795
+ end
796
+
797
+ # If there is a timeout
798
+ if idx != nil
799
+ str = str + "wait_expression(\"" +
800
+ parse_expression(words[1..(idx-2)],true) + "\", " +
801
+ parse_expression([words[idx+1]]) + ")"
802
+
803
+ # No timeout given, so insert a default timeout
804
+ else
805
+ str = str + "wait_expression(\"" +
806
+ parse_expression(words[1..-1],true) + "\", " +
807
+ parse_time("::30") + ")"
808
+ end
809
+
810
+ # If the next word starts with the raw keyword
811
+ elsif words[1].match(/[\(]*(raw)/i)
812
+ # Get index of 'OR FOR' if it exists by the 'FOR' keyword
813
+ idx = words.index("FOR")
814
+ if idx == nil
815
+ idx = words.index("for")
816
+ end
817
+
818
+ # If there is a timeout
819
+ if idx != nil
820
+ # If the first part is a complex expression
821
+ if (words[1..(idx-2)].include?("OR") ||
822
+ words[1..(idx-2)].include?("or") ||
823
+ words[1..(idx-2)].include?("AND") ||
824
+ words[1..(idx-2)].include?("and"))
825
+ str = str + "wait_expression(\"" +
826
+ parse_expression(words[1..(idx-2)],true) + "\", "
827
+
828
+ # If it is a single telemetry item
829
+ else
830
+ @wait_match_string = "\"" + parse_tlm_item(words[2..3]) +
831
+ parse_cond_operator(words[4]) +
832
+ parse_expression(words[5..(idx-2)],true) + "\""
833
+ @verify_wait_check = false
834
+
835
+ parse_line(@data_by_lines[@universal_index+1], @out_file, true)
836
+
837
+ if @verify_wait_check == true
838
+ str = str + "wait_check_raw(\"" + parse_tlm_item(words[2..3]) +
839
+ parse_cond_operator(words[4]) +
840
+ parse_expression(words[5..(idx-2)],true) + "\", "
841
+ else
842
+ str = str + "wait_raw(\"" + parse_tlm_item(words[2..3]) +
843
+ parse_cond_operator(words[4]) +
844
+ parse_expression(words[5..(idx-2)],true) + "\", "
845
+ end
846
+ end
847
+
848
+ # Parse the timeout
849
+ str = str + parse_expression([words[idx+1]])
850
+
851
+ # If there is no timeout given
852
+ else
853
+ # If it is a complex expression
854
+ if (words[1..-1].include?("OR") || words[1..-1].include?("or") ||
855
+ words[1..-1].include?("AND") || words[1..-1].include?("and"))
856
+ str = str + "wait_expression(\"" +
857
+ parse_expression(words[1..-1],true) + "\", "
858
+
859
+ # If it is a single telemetry item
860
+ else
861
+ @wait_match_string = "\"" + parse_tlm_item(words[2..3]) +
862
+ parse_cond_operator(words[4]) + parse_id(words[5],true) + "\""
863
+ @verify_wait_check = false
864
+
865
+ parse_line(@data_by_lines[@universal_index+1], @out_file, true)
866
+
867
+ if @verify_wait_check == true
868
+ str = str + "wait_check_raw(\"" + parse_tlm_item(words[2..3]) +
869
+ parse_cond_operator(words[4]) + parse_id(words[5],true) + "\", "
870
+ else
871
+ str = str + "wait_raw(\"" + parse_tlm_item(words[2..3]) +
872
+ parse_cond_operator(words[4]) + parse_id(words[5],true) + "\", "
873
+ end
874
+ end
875
+
876
+ # Insert a default timeout
877
+ str = str + parse_time("::30")
878
+ end
879
+ str = str + ")"
880
+
881
+ # If the next word doesn't start with raw
882
+ elsif words[1].match(/[\(]*\w/)
883
+ # Get index of 'OR FOR' if it exists by the 'FOR' keyword
884
+ idx = words.index("FOR")
885
+ if idx == nil
886
+ idx = words.index("for")
887
+ end
888
+
889
+ # If there is a timeout
890
+ if idx != nil
891
+ # If the first part is a complex expression
892
+ if (words[1..(idx-2)].include?("OR") ||
893
+ words[1..(idx-2)].include?("or") ||
894
+ words[1..(idx-2)].include?("AND") ||
895
+ words[1..(idx-2)].include?("and"))
896
+ str = str + "wait_expression(\"" +
897
+ parse_expression(words[1..(idx-2)],true) + "\", "
898
+
899
+ # If it is a single telemetry item
900
+ else
901
+ @wait_match_string = "\"" + parse_tlm_item(words[1..2]) +
902
+ parse_cond_operator(words[3]) + parse_id(words[4],true) + "\""
903
+ @verify_wait_check = false
904
+
905
+ parse_line(@data_by_lines[@universal_index+1], @out_file, true)
906
+
907
+ if @verify_wait_check == true
908
+ str = str + "wait_check(\"" + parse_tlm_item(words[1..2]) +
909
+ parse_cond_operator(words[3]) + parse_id(words[4],true) + "\", "
910
+ else
911
+ str = str + "wait(\"" + parse_tlm_item(words[1..2]) +
912
+ parse_cond_operator(words[3]) + parse_id(words[4],true) + "\", "
913
+ end
914
+ end
915
+
916
+ # Parse the timeout
917
+ str = str + parse_expression([words[idx+1]])
918
+
919
+ # If there is no timeout given
920
+ else
921
+ # If it is a complex expression
922
+ if (words[1..-1].include?("OR") || words[1..-1].include?("or") ||
923
+ words[1..-1].include?("AND") || words[1..-1].include?("and"))
924
+ str = str + "wait_expression(\"" +
925
+ parse_expression(words[1..-1],true) + "\", "
926
+
927
+ # If it is a single telemetry item
928
+ else
929
+ @wait_match_string = "\"" + parse_tlm_item(words[1..2]) +
930
+ parse_cond_operator(words[3]) + parse_id(words[4],true) + "\""
931
+ @verify_wait_check = false
932
+
933
+ parse_line(@data_by_lines[@universal_index+1], @out_file, true)
934
+
935
+ if @verify_wait_check == true
936
+ str = str + "wait_check(\"" + parse_tlm_item(words[1..2]) +
937
+ parse_cond_operator(words[3]) + parse_id(words[4],true) + "\", "
938
+ else
939
+ str = str + "wait(\"" + parse_tlm_item(words[1..2]) +
940
+ parse_cond_operator(words[3]) + parse_id(words[4],true) + "\", "
941
+ end
942
+ end
943
+
944
+ # Insert a default timeout
945
+ str = str + parse_time("::30")
946
+ end
947
+ str = str + ")"
948
+
949
+ else
950
+ str = str + "# TODO unsupported: " + line
951
+ end
952
+
953
+ when "write"
954
+ # Write the command and first word
955
+ str = str + "puts(" + words[1]
956
+
957
+ # Consolidate a " , to ",
958
+ rem = words[2..-1].join(" ")
959
+ quoteSpaceIdx = rem.index("\" ,")
960
+ if quoteSpaceIdx != nil
961
+ rem = rem[0..(quoteSpaceIdx)] + rem[(quoteSpaceIdx+2)..-1]
962
+ end
963
+
964
+ # Find the closing quote
965
+ quoteIdx = rem.index("\",")
966
+
967
+ # If there was a closing quote
968
+ if (quoteIdx != nil and quoteIdx != rem.length - 1)
969
+ # Write the characters up until the quote
970
+ str = str + rem[0..quoteIdx-1]
971
+
972
+ # Parse the rest after the ", as a quoted expression
973
+ expr = rem[(quoteIdx+2)..-1]
974
+ if expr.class == String
975
+ # There might be yet another quoted section
976
+ quoteIdx = expr.index("\"")
977
+ remainder = ''
978
+ if quoteIdx
979
+ remainder = expr[quoteIdx+1..-2]
980
+ expr = expr[0..quoteIdx-1].strip
981
+ expr = expr[0..-2] if expr[-1] == ','
982
+ end
983
+ str = str + " \#{#{parse_expression([expr],true,true)}}#{remainder}\""
984
+ else
985
+ puts "****************** NOT STRING ******************"
986
+ str = str + " \#{" + parse_expression(expr,true,true) + "}\""
987
+ end
988
+
989
+ # If there was no closing quote
990
+ else
991
+ words[2..-1].each do |word|
992
+ str = str + " " + word.to_s
993
+ end
994
+ end
995
+ str = str + ")"
996
+
997
+ else
998
+ # If this keyword is contained in the list of macros
999
+ if $macroList != nil and $macroList.include?(words[0].upcase)
1000
+ str = str + parse_macro(words)
1001
+
1002
+ # Other keywords not handled
1003
+ else
1004
+ str = str + "# TODO unsupported: " + line
1005
+ end
1006
+ end
1007
+ # Implicit end of case statement
1008
+
1009
+ # Write the code and comment to the output file
1010
+ if comment == ""
1011
+ loc_out_file.puts str
1012
+ else
1013
+ loc_out_file.puts str + " " + comment
1014
+ end
1015
+ end
1016
+
1017
+ ################################################################################
1018
+ ##### BEGIN SCRIPT ######
1019
+ ################################################################################
1020
+
1021
+ require 'ostruct'
1022
+ require 'optparse'
1023
+
1024
+ options = OpenStruct.new
1025
+ options.file = nil
1026
+
1027
+ opts = OptionParser.new do |opts|
1028
+ opts.banner = "Usage: cstol_converter [optional filenames]"
1029
+ opts.separator ""
1030
+ opts.separator "By default it will parse all macros (*.mac) and CSTOLS (*.prc)"
1031
+ opts.separator "recursively starting in the current working directory"
1032
+ opts.separator ""
1033
+ # Create the help and version options
1034
+ opts.on("-h", "--help", "Show this message") do
1035
+ puts opts
1036
+ exit
1037
+ end
1038
+ end
1039
+
1040
+ begin
1041
+ opts.parse!(ARGV)
1042
+ rescue => err
1043
+ puts err
1044
+ puts opts
1045
+ exit
1046
+ end
1047
+
1048
+ mac_files = []
1049
+ prc_files = []
1050
+ if ARGV[0]
1051
+ ARGV.each do |filename|
1052
+ prc_files << filename
1053
+ end
1054
+ else
1055
+ # Find all macros
1056
+ mac_files = Dir["**/*.mac"]
1057
+ # Find all procedures
1058
+ prc_files = Dir["**/*.prc"]
1059
+ end
1060
+
1061
+ # List of targets found in the CSTOL files
1062
+ $targetList = Cosmos::System.targets.keys
1063
+
1064
+ # Process all macros first
1065
+ unless mac_files.empty?
1066
+ puts "*****************************************************"
1067
+ macros_file = File.open("macrosAutoGen.rb","w")
1068
+ mac_files.each do |file|
1069
+ puts " Parsing MAC file: " + file
1070
+
1071
+ # Parse each line in the macro file
1072
+ File.open(file,"r") do |infile|
1073
+ out_file = File.open(File.join(Dir.pwd, file[0..-5] + "_macro.rb"), "w")
1074
+ infile.each do |line|
1075
+ parse_line(line,@out_file)
1076
+ end
1077
+ @out_file.close
1078
+ end
1079
+
1080
+ # Create a Ruby macro file that evaluates the macro in the callers context
1081
+ macros_file.print "#{$macroName}_SRC =
1082
+ open(\"#{file[0..-5]}_macro.rb\"){ |f|\n f.sysread(f.stat().size())\n}\n\n"
1083
+ macros_file.print "def #{$macroName}(locBinding"
1084
+ $macroNumArgs.times { |num|
1085
+ macros_file.print ",macVar#{num+1}"
1086
+ }
1087
+ macros_file.print ")\n"
1088
+ $macroNumArgs.times { |num|
1089
+ macros_file.print " eval(\"inVar#{num+1} = \#{macVar#{num+1}}\",locBinding)\n"
1090
+ }
1091
+ macros_file.print " eval(#{$macroName}_SRC,locBinding)\n"
1092
+ macros_file.print "end\n\n"
1093
+
1094
+ # Append this macro to the master list of macros
1095
+ if $macroList == nil
1096
+ $macroList = [$macroName]
1097
+ else
1098
+ $macroList = $macroList.concat([$macroName])
1099
+ end
1100
+ end
1101
+ macros_file.close
1102
+ end
1103
+
1104
+ if prc_files.empty?
1105
+ puts "No *.prc files found"
1106
+ else
1107
+ puts "*****************************************************"
1108
+
1109
+ # Process all procedures next
1110
+ prc_files.each do |file|
1111
+ puts " Parsing PRC file: " + file
1112
+
1113
+ # Open each procedure
1114
+ File.open(file,"r") do |infile|
1115
+ # Open its equivalent Ruby output file
1116
+ @out_file = File.open(File.join(Dir.pwd, File.basename(file)[0..-5] + ".rb"), "w")
1117
+
1118
+ # Read the entire file in first in order to compress line continuations
1119
+ @data = ""
1120
+ matched_quotes = true
1121
+ infile.each do |line|
1122
+ # Check for matching quotes on this line
1123
+ num_quotes = line.scan(/("|[^\\]")/).size
1124
+ if num_quotes % 2 == 1
1125
+ matched_quotes = !matched_quotes
1126
+ end
1127
+
1128
+ # If the last non-whitespace character is the line continuation char
1129
+ if line.match(/&\s*$/)
1130
+ # Remove the continuation char and returns to join with next line
1131
+ idx = line.rindex("&")
1132
+ @data = @data + line[0..(idx-1)]
1133
+ elsif matched_quotes == false
1134
+ # If the unmatched string uses the non-standard underscore char
1135
+ if line.match(/_\s*$/)
1136
+ # Remove the trailing underscore
1137
+ idx = line.rindex("_")
1138
+ line = line[0..(idx-1)]
1139
+ end
1140
+ # Remove the returns from this line to join with next line
1141
+ @data = @data + line.rstrip
1142
+ else
1143
+ # Leave it alone
1144
+ @data = @data + line
1145
+ end
1146
+ end
1147
+
1148
+ @universal_index = 0
1149
+ @data_by_lines = @data.lines.to_a
1150
+ # Parse each line in the file
1151
+ @data_by_lines.each do |line|
1152
+ if @verify_wait_check == true
1153
+ # Skip line
1154
+ @verify_wait_check = false
1155
+ else
1156
+ parse_line(@data_by_lines[@universal_index], @out_file)
1157
+ end
1158
+ @universal_index += 1
1159
+ end
1160
+
1161
+ # Close the file
1162
+ @out_file.close
1163
+ end
1164
+ end
1165
+ end
1166
+