cosmos 3.0.1 → 3.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (912) hide show
  1. checksums.yaml +4 -4
  2. data/.coveralls.yml +1 -0
  3. data/.gitignore +48 -48
  4. data/.travis.yml +7 -7
  5. data/CONTRIBUTING.txt +50 -50
  6. data/Gemfile +6 -6
  7. data/Guardfile +27 -27
  8. data/LICENSE.txt +879 -879
  9. data/Manifest.txt +1116 -1114
  10. data/README.md +109 -107
  11. data/Rakefile +214 -214
  12. data/autohotkey/config/data/diamond.STL +57 -57
  13. data/autohotkey/config/system/system.txt +34 -34
  14. data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  15. data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  16. data/autohotkey/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  17. data/autohotkey/config/targets/COSMOS/target.txt +5 -5
  18. data/autohotkey/config/targets/INST/cmd_tlm/inst_cmds.txt +121 -121
  19. data/autohotkey/config/targets/INST/cmd_tlm/inst_tlm.txt +247 -247
  20. data/autohotkey/config/targets/INST/cmd_tlm_server.txt +5 -5
  21. data/autohotkey/config/targets/INST/lib/example_limits_response.rb +30 -30
  22. data/autohotkey/config/targets/INST/lib/sim_inst.rb +305 -294
  23. data/autohotkey/config/targets/INST/screens/adcs.txt +46 -46
  24. data/autohotkey/config/targets/INST/screens/array.txt +7 -7
  25. data/autohotkey/config/targets/INST/screens/block.txt +8 -8
  26. data/autohotkey/config/targets/INST/screens/commanding.txt +30 -30
  27. data/autohotkey/config/targets/INST/screens/graphs.txt +14 -14
  28. data/autohotkey/config/targets/INST/screens/ground.txt +25 -25
  29. data/autohotkey/config/targets/INST/screens/health_status.txt +33 -33
  30. data/autohotkey/config/targets/INST/screens/hs.txt +49 -49
  31. data/autohotkey/config/targets/INST/screens/image.txt +21 -21
  32. data/autohotkey/config/targets/INST/screens/latest.txt +23 -23
  33. data/autohotkey/config/targets/INST/screens/mech.txt +25 -25
  34. data/autohotkey/config/targets/INST/screens/other.txt +25 -25
  35. data/autohotkey/config/targets/INST/screens/params.txt +25 -25
  36. data/autohotkey/config/targets/INST/screens/tabs.txt +68 -68
  37. data/autohotkey/config/targets/INST/target.txt +26 -26
  38. data/autohotkey/config/targets/META/cmd_tlm/meta_cmd.txt +10 -10
  39. data/autohotkey/config/targets/META/cmd_tlm/meta_tlm.txt +9 -9
  40. data/autohotkey/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
  41. data/autohotkey/config/targets/SYSTEM/screens/error.txt +11 -11
  42. data/autohotkey/config/tools/cmd_tlm_server/cmd_tlm_server.txt +22 -22
  43. data/autohotkey/config/tools/data_viewer/data_viewer.txt +11 -11
  44. data/autohotkey/config/tools/handbook_creator/handbook_creator.txt +49 -49
  45. data/autohotkey/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
  46. data/autohotkey/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  47. data/autohotkey/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  48. data/autohotkey/config/tools/handbook_creator/templates/header.html.erb +25 -25
  49. data/autohotkey/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  50. data/autohotkey/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  51. data/autohotkey/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  52. data/autohotkey/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  53. data/autohotkey/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  54. data/autohotkey/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  55. data/autohotkey/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
  56. data/autohotkey/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  57. data/autohotkey/config/tools/handbook_creator/templates/title.html.erb +1 -1
  58. data/autohotkey/config/tools/launcher/launcher.txt +38 -38
  59. data/autohotkey/config/tools/script_runner/script_runner.txt +3 -3
  60. data/autohotkey/config/tools/table_manager/ConfigTables_def.txt +8 -8
  61. data/autohotkey/config/tools/table_manager/OneDimensionalTable_def.txt +19 -19
  62. data/autohotkey/config/tools/table_manager/TwoDimensionalTable_def.txt +248 -248
  63. data/autohotkey/config/tools/test_runner/test_runner.txt +8 -8
  64. data/autohotkey/config/tools/test_runner/test_runner2.txt +11 -11
  65. data/autohotkey/config/tools/test_runner/test_runner3.txt +6 -6
  66. data/autohotkey/config/tools/test_runner/test_runner4.txt +1 -1
  67. data/autohotkey/config/tools/tlm_extractor/tlm_extractor.txt +13 -13
  68. data/autohotkey/config/tools/tlm_extractor/tlm_extractor2.txt +9 -9
  69. data/autohotkey/config/tools/tlm_grapher/bad.txt +50 -50
  70. data/autohotkey/config/tools/tlm_grapher/temp1-4.txt +51 -51
  71. data/autohotkey/config/tools/tlm_grapher/test2.txt +111 -111
  72. data/autohotkey/config/tools/tlm_viewer/tlm_viewer.txt +24 -24
  73. data/autohotkey/config/tools/tlm_viewer/tlm_viewer2.txt +4 -4
  74. data/autohotkey/config/tools/tlm_viewer/tlm_viewer3.txt +3 -3
  75. data/autohotkey/lib/example_background_task.rb +42 -42
  76. data/autohotkey/lib/user_version.rb +3 -3
  77. data/autohotkey/procedures/clear_util.rb +7 -7
  78. data/autohotkey/procedures/collect.rb +18 -18
  79. data/autohotkey/procedures/collect_util.rb +14 -14
  80. data/autohotkey/procedures/example_test.rb +67 -67
  81. data/autohotkey/procedures/example_test2.rb +74 -74
  82. data/autohotkey/procedures/script_test.rb +17 -17
  83. data/autohotkey/procedures/syntax_error.rb +18 -18
  84. data/autohotkey/tools/CmdExtractorAHK +16 -16
  85. data/autohotkey/tools/CmdSender +14 -14
  86. data/autohotkey/tools/CmdSenderAHK +18 -18
  87. data/autohotkey/tools/CmdTlmServer +14 -14
  88. data/autohotkey/tools/CmdTlmServerAHK +28 -28
  89. data/autohotkey/tools/CmdTlmServerAHK2 +17 -17
  90. data/autohotkey/tools/DataViewer +14 -14
  91. data/autohotkey/tools/DataViewerAHK +17 -17
  92. data/autohotkey/tools/HandbookCreatorAHK +20 -20
  93. data/autohotkey/tools/LauncherAHK +17 -17
  94. data/autohotkey/tools/LimitsMonitorAHK +20 -20
  95. data/autohotkey/tools/OpenGLBuilderAHK +20 -20
  96. data/autohotkey/tools/PacketViewer +14 -14
  97. data/autohotkey/tools/PacketViewerAHK +18 -18
  98. data/autohotkey/tools/PacketViewerAHK2 +17 -17
  99. data/autohotkey/tools/Replay +14 -14
  100. data/autohotkey/tools/Replay.bat +59 -59
  101. data/autohotkey/tools/ReplayAHK +17 -17
  102. data/autohotkey/tools/ScriptRunner +14 -14
  103. data/autohotkey/tools/ScriptRunnerAHK +20 -20
  104. data/autohotkey/tools/ScriptRunnerAHK2 +17 -17
  105. data/autohotkey/tools/TableManager +14 -14
  106. data/autohotkey/tools/TableManagerAHK +30 -30
  107. data/autohotkey/tools/TestRunner +15 -15
  108. data/autohotkey/tools/TestRunnerAHK +17 -17
  109. data/autohotkey/tools/TestRunnerAHK2 +17 -17
  110. data/autohotkey/tools/TestRunnerAHK3 +17 -17
  111. data/autohotkey/tools/TestRunnerAHK4 +17 -17
  112. data/autohotkey/tools/TlmExtractor +15 -15
  113. data/autohotkey/tools/TlmExtractorAHK +19 -19
  114. data/autohotkey/tools/TlmExtractorAHK2 +16 -16
  115. data/autohotkey/tools/TlmExtractorAHK3 +16 -16
  116. data/autohotkey/tools/TlmGrapher +14 -14
  117. data/autohotkey/tools/TlmGrapherAHK +19 -19
  118. data/autohotkey/tools/TlmGrapherAHK2 +23 -23
  119. data/autohotkey/tools/TlmGrapherAHK3 +17 -17
  120. data/autohotkey/tools/TlmGrapherAHK4 +17 -17
  121. data/autohotkey/tools/TlmViewer +14 -14
  122. data/autohotkey/tools/TlmViewerAHK +28 -28
  123. data/autohotkey/tools/TlmViewerAHK2 +18 -18
  124. data/autohotkey/tools/TlmViewerAHK3 +18 -18
  125. data/autohotkey/tools/TlmViewerAHK4 +18 -18
  126. data/autohotkey/tools/TlmViewerAHK5 +18 -18
  127. data/autohotkey/tools/autohotkey.rb +37 -37
  128. data/autohotkey/tools/cmd_extractor.ahk +27 -27
  129. data/autohotkey/tools/cmd_sender.ahk +182 -162
  130. data/autohotkey/tools/cmd_tlm_server.ahk +89 -89
  131. data/autohotkey/tools/cmd_tlm_server2.ahk +45 -45
  132. data/autohotkey/tools/data_viewer.ahk +135 -135
  133. data/autohotkey/tools/handbook_creator.ahk +23 -23
  134. data/autohotkey/tools/launcher.ahk +41 -41
  135. data/autohotkey/tools/limits_monitor.ahk +70 -70
  136. data/autohotkey/tools/open_gl_builder.ahk +134 -134
  137. data/autohotkey/tools/packet_viewer.ahk +143 -143
  138. data/autohotkey/tools/packet_viewer2.ahk +9 -9
  139. data/autohotkey/tools/replay.ahk +98 -98
  140. data/autohotkey/tools/script_runner.ahk +589 -589
  141. data/autohotkey/tools/script_runner2.ahk +34 -31
  142. data/autohotkey/tools/table_manager.ahk +220 -220
  143. data/autohotkey/tools/test_runner.ahk +262 -259
  144. data/autohotkey/tools/test_runner2.ahk +52 -52
  145. data/autohotkey/tools/test_runner3.ahk +13 -13
  146. data/autohotkey/tools/tlm_extractor.ahk +272 -272
  147. data/autohotkey/tools/tlm_grapher.ahk +642 -642
  148. data/autohotkey/tools/tlm_grapher2.ahk +115 -115
  149. data/autohotkey/tools/tlm_grapher3.ahk +24 -24
  150. data/autohotkey/tools/tlm_viewer.ahk +133 -133
  151. data/autohotkey/tools/tlm_viewer2.ahk +50 -49
  152. data/autohotkey/tools/tlm_viewer4.ahk +4 -4
  153. data/autohotkey/tools/tlm_viewer5.ahk +20 -20
  154. data/bin/cosmos +96 -96
  155. data/bin/cstol_converter +1166 -1166
  156. data/bin/rubysloc +85 -85
  157. data/cosmos.gemspec +98 -97
  158. data/data/about.txt +4 -4
  159. data/data/crc.txt +306 -305
  160. data/data/diamond.STL +57 -57
  161. data/data/legal.txt +9 -9
  162. data/demo/Gemfile +6 -6
  163. data/demo/Launcher +15 -15
  164. data/demo/Launcher.bat +59 -59
  165. data/demo/Rakefile +61 -61
  166. data/demo/config/data/crc.txt +222 -206
  167. data/demo/config/data/diamond.STL +57 -57
  168. data/demo/config/data/meta_init.txt +4 -4
  169. data/demo/config/system/system.txt +34 -34
  170. data/demo/config/system/system2.txt +33 -33
  171. data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  172. data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  173. data/demo/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  174. data/demo/config/targets/COSMOS/screens/limits_change.txt +20 -20
  175. data/demo/config/targets/COSMOS/screens/version.txt +19 -19
  176. data/demo/config/targets/COSMOS/target.txt +11 -11
  177. data/demo/config/targets/EXAMPLE/cmd_tlm/example_cmds.txt +2 -2
  178. data/demo/config/targets/EXAMPLE/cmd_tlm/example_tlm.txt +3 -3
  179. data/demo/config/targets/EXAMPLE/cmd_tlm_server.txt +6 -6
  180. data/demo/config/targets/EXAMPLE/lib/example_interface.rb +22 -22
  181. data/demo/config/targets/EXAMPLE/target.txt +6 -6
  182. data/demo/config/targets/INST/cmd_tlm/inst_cmds.txt +121 -121
  183. data/demo/config/targets/INST/cmd_tlm/inst_tlm.txt +247 -247
  184. data/demo/config/targets/INST/cmd_tlm_server.txt +5 -5
  185. data/demo/config/targets/INST/lib/example_limits_response.rb +30 -30
  186. data/demo/config/targets/INST/lib/sim_inst.rb +305 -294
  187. data/demo/config/targets/INST/screens/adcs.txt +46 -46
  188. data/demo/config/targets/INST/screens/array.txt +15 -15
  189. data/demo/config/targets/INST/screens/block.txt +8 -8
  190. data/demo/config/targets/INST/screens/commanding.txt +30 -30
  191. data/demo/config/targets/INST/screens/graphs.txt +14 -14
  192. data/demo/config/targets/INST/screens/ground.txt +25 -25
  193. data/demo/config/targets/INST/screens/hs.txt +44 -44
  194. data/demo/config/targets/INST/screens/latest.txt +23 -23
  195. data/demo/config/targets/INST/screens/other.txt +29 -29
  196. data/demo/config/targets/INST/screens/tabs.txt +70 -70
  197. data/demo/config/targets/INST/target.txt +33 -33
  198. data/demo/config/targets/META/cmd_tlm/meta_cmd.txt +10 -10
  199. data/demo/config/targets/META/cmd_tlm/meta_tlm.txt +13 -13
  200. data/demo/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
  201. data/demo/config/targets/SYSTEM/cmd_tlm/override.txt +29 -29
  202. data/demo/config/targets/SYSTEM/screens/status.txt +12 -12
  203. data/demo/config/targets/TEMPLATED/cmd_tlm/templated_cmds.txt +13 -12
  204. data/demo/config/targets/TEMPLATED/cmd_tlm/templated_tlm.txt +3 -3
  205. data/demo/config/targets/TEMPLATED/cmd_tlm_server.txt +6 -6
  206. data/demo/config/targets/TEMPLATED/lib/templated_interface.rb +54 -48
  207. data/demo/config/targets/TEMPLATED/target.txt +6 -6
  208. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server.txt +33 -33
  209. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server2.txt +29 -29
  210. data/demo/config/tools/data_viewer/data_viewer.txt +11 -11
  211. data/demo/config/tools/handbook_creator/handbook_creator.txt +66 -66
  212. data/demo/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
  213. data/demo/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  214. data/demo/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  215. data/demo/config/tools/handbook_creator/templates/header.html.erb +25 -25
  216. data/demo/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  217. data/demo/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  218. data/demo/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  219. data/demo/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  220. data/demo/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  221. data/demo/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  222. data/demo/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
  223. data/demo/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  224. data/demo/config/tools/handbook_creator/templates/title.html.erb +1 -1
  225. data/demo/config/tools/launcher/launcher.txt +45 -45
  226. data/demo/config/tools/launcher/launcher2.txt +45 -45
  227. data/demo/config/tools/script_runner/script_runner.txt +3 -3
  228. data/demo/config/tools/table_manager/ConfigTables_def.txt +8 -8
  229. data/demo/config/tools/table_manager/ExampleTableDefinition.txt +24 -24
  230. data/demo/config/tools/table_manager/MCConfigurationTable_fsw1_def.txt +25 -25
  231. data/demo/config/tools/table_manager/MCConfigurationTable_fsw2_def.txt +25 -25
  232. data/demo/config/tools/table_manager/PPSSelectionTable_def.txt +8 -8
  233. data/demo/config/tools/table_manager/TLMMonitoringTable_def.txt +248 -248
  234. data/demo/config/tools/test_runner/test_runner.txt +17 -17
  235. data/demo/config/tools/tlm_extractor/tlm_extractor.txt +13 -13
  236. data/demo/config/tools/tlm_extractor/tlm_extractor2.txt +2 -2
  237. data/demo/config/tools/tlm_extractor/tlm_extractor3.txt +2 -2
  238. data/demo/config/tools/tlm_extractor/tlm_extractor4.txt +2 -2
  239. data/demo/config/tools/tlm_viewer/tlm_viewer.txt +41 -41
  240. data/demo/lib/example_background_task.rb +57 -52
  241. data/demo/lib/example_target.rb +113 -108
  242. data/demo/lib/scpi_target.rb +74 -74
  243. data/demo/lib/user_version.rb +3 -3
  244. data/demo/procedures/checks.rb +11 -11
  245. data/demo/procedures/clear_util.rb +7 -7
  246. data/demo/procedures/collect.rb +18 -18
  247. data/demo/procedures/collect_util.rb +14 -14
  248. data/demo/procedures/cosmos_api_test.rb +293 -293
  249. data/demo/procedures/disconnect.rb +29 -29
  250. data/demo/procedures/example_test.rb +182 -182
  251. data/demo/procedures/plot_test.rb +8 -8
  252. data/demo/procedures/run_example_test.rb +3 -3
  253. data/demo/procedures/test.rb +51 -51
  254. data/demo/tools/CmdExtractor +15 -15
  255. data/demo/tools/CmdExtractor.bat +59 -59
  256. data/demo/tools/CmdSender +15 -15
  257. data/demo/tools/CmdSender.bat +59 -59
  258. data/demo/tools/CmdTlmServer +15 -15
  259. data/demo/tools/CmdTlmServer.bat +59 -59
  260. data/demo/tools/DataViewer +15 -15
  261. data/demo/tools/DataViewer.bat +59 -59
  262. data/demo/tools/ExampleTarget +15 -15
  263. data/demo/tools/ExampleTarget.bat +59 -59
  264. data/demo/tools/HandbookCreator +15 -15
  265. data/demo/tools/HandbookCreator.bat +61 -61
  266. data/demo/tools/Launcher +15 -15
  267. data/demo/tools/Launcher.bat +59 -59
  268. data/demo/tools/LimitsMonitor +15 -15
  269. data/demo/tools/LimitsMonitor.bat +59 -59
  270. data/demo/tools/OpenGLBuilder +15 -15
  271. data/demo/tools/OpenGLBuilder.bat +59 -59
  272. data/demo/tools/PacketViewer +15 -15
  273. data/demo/tools/PacketViewer.bat +59 -59
  274. data/demo/tools/Replay +15 -15
  275. data/demo/tools/Replay.bat +59 -59
  276. data/demo/tools/ScpiTarget +15 -15
  277. data/demo/tools/ScpiTarget.bat +59 -59
  278. data/demo/tools/ScriptRunner +15 -15
  279. data/demo/tools/ScriptRunner.bat +59 -59
  280. data/demo/tools/TableManager +15 -15
  281. data/demo/tools/TableManager.bat +59 -59
  282. data/demo/tools/TestRunner +15 -15
  283. data/demo/tools/TestRunner.bat +59 -59
  284. data/demo/tools/TlmExtractor +15 -15
  285. data/demo/tools/TlmExtractor.bat +59 -59
  286. data/demo/tools/TlmGrapher +15 -15
  287. data/demo/tools/TlmGrapher.bat +59 -59
  288. data/demo/tools/TlmViewer +15 -15
  289. data/demo/tools/TlmViewer.bat +59 -59
  290. data/demo/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
  291. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +15 -15
  292. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +6 -6
  293. data/demo/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
  294. data/demo/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +15 -15
  295. data/demo/tools/mac/CmdSender.app/Contents/MacOS/main.sh +6 -6
  296. data/demo/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
  297. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +15 -15
  298. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +6 -6
  299. data/demo/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
  300. data/demo/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +15 -15
  301. data/demo/tools/mac/DataViewer.app/Contents/MacOS/main.sh +6 -6
  302. data/demo/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
  303. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +15 -15
  304. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +6 -6
  305. data/demo/tools/mac/Launcher.app/Contents/Info.plist +38 -38
  306. data/demo/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +15 -15
  307. data/demo/tools/mac/Launcher.app/Contents/MacOS/main.sh +6 -6
  308. data/demo/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
  309. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +15 -15
  310. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +6 -6
  311. data/demo/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
  312. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +15 -15
  313. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +6 -6
  314. data/demo/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
  315. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +15 -15
  316. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +6 -6
  317. data/demo/tools/mac/Replay.app/Contents/Info.plist +38 -38
  318. data/demo/tools/mac/Replay.app/Contents/MacOS/Replay.rb +15 -15
  319. data/demo/tools/mac/Replay.app/Contents/MacOS/main.sh +6 -6
  320. data/demo/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
  321. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +15 -15
  322. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +6 -6
  323. data/demo/tools/mac/TableManager.app/Contents/Info.plist +38 -38
  324. data/demo/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +15 -15
  325. data/demo/tools/mac/TableManager.app/Contents/MacOS/main.sh +6 -6
  326. data/demo/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
  327. data/demo/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +15 -15
  328. data/demo/tools/mac/TestRunner.app/Contents/MacOS/main.sh +6 -6
  329. data/demo/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
  330. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +15 -15
  331. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +6 -6
  332. data/demo/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
  333. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +15 -15
  334. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +6 -6
  335. data/demo/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
  336. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +15 -15
  337. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +6 -6
  338. data/ext/cosmos/ext/array/array.c +111 -111
  339. data/ext/cosmos/ext/array/extconf.rb +13 -13
  340. data/ext/cosmos/ext/buffered_file/buffered_file.c +167 -167
  341. data/ext/cosmos/ext/buffered_file/extconf.rb +13 -13
  342. data/ext/cosmos/ext/config_parser/config_parser.c +237 -237
  343. data/ext/cosmos/ext/config_parser/extconf.rb +13 -13
  344. data/ext/cosmos/ext/cosmos_io/cosmos_io.c +117 -117
  345. data/ext/cosmos/ext/cosmos_io/extconf.rb +13 -13
  346. data/ext/cosmos/ext/crc/crc.c +341 -341
  347. data/ext/cosmos/ext/crc/extconf.rb +12 -12
  348. data/ext/cosmos/ext/line_graph/extconf.rb +13 -13
  349. data/ext/cosmos/ext/line_graph/line_graph.c +501 -501
  350. data/ext/cosmos/ext/low_fragmentation_array/extconf.rb +12 -12
  351. data/ext/cosmos/ext/low_fragmentation_array/low_fragmentation_array.c +261 -261
  352. data/ext/cosmos/ext/packet/extconf.rb +13 -13
  353. data/ext/cosmos/ext/packet/packet.c +339 -339
  354. data/ext/cosmos/ext/platform/extconf.rb +13 -13
  355. data/ext/cosmos/ext/platform/platform.c +81 -81
  356. data/ext/cosmos/ext/polynomial_conversion/extconf.rb +13 -13
  357. data/ext/cosmos/ext/polynomial_conversion/polynomial_conversion.c +73 -73
  358. data/ext/cosmos/ext/string/extconf.rb +13 -13
  359. data/ext/cosmos/ext/string/string.c +49 -49
  360. data/ext/cosmos/ext/structure/structure.c +894 -894
  361. data/ext/cosmos/ext/tabbed_plots_config/extconf.rb +13 -13
  362. data/ext/cosmos/ext/tabbed_plots_config/tabbed_plots_config.c +51 -51
  363. data/ext/cosmos/ext/telemetry/extconf.rb +13 -13
  364. data/ext/cosmos/ext/telemetry/telemetry.c +306 -306
  365. data/ext/mkrf_conf.rb +40 -40
  366. data/install/Gemfile +6 -6
  367. data/install/Launcher +14 -14
  368. data/install/Launcher.bat +59 -59
  369. data/install/Rakefile +61 -61
  370. data/install/config/data/crc.txt +134 -133
  371. data/install/config/system/system.txt +29 -29
  372. data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  373. data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  374. data/install/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  375. data/install/config/targets/COSMOS/screens/limits_change.txt +20 -20
  376. data/install/config/targets/COSMOS/screens/version.txt +19 -19
  377. data/install/config/targets/COSMOS/target.txt +8 -8
  378. data/install/config/tools/cmd_tlm_server/cmd_tlm_server.txt +2 -2
  379. data/install/config/tools/data_viewer/data_viewer.txt +3 -3
  380. data/install/config/tools/handbook_creator/handbook_creator.txt +49 -49
  381. data/install/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
  382. data/install/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  383. data/install/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  384. data/install/config/tools/handbook_creator/templates/header.html.erb +25 -25
  385. data/install/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  386. data/install/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  387. data/install/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  388. data/install/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  389. data/install/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  390. data/install/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  391. data/install/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
  392. data/install/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  393. data/install/config/tools/handbook_creator/templates/title.html.erb +1 -1
  394. data/install/config/tools/launcher/launcher.txt +39 -39
  395. data/install/config/tools/script_runner/script_runner.txt +3 -3
  396. data/install/config/tools/test_runner/test_runner.txt +8 -8
  397. data/install/config/tools/tlm_viewer/tlm_viewer.txt +5 -5
  398. data/install/lib/user_version.rb +3 -3
  399. data/install/tools/CmdExtractor +15 -15
  400. data/install/tools/CmdExtractor.bat +59 -59
  401. data/install/tools/CmdSender +15 -15
  402. data/install/tools/CmdSender.bat +59 -59
  403. data/install/tools/CmdTlmServer +15 -15
  404. data/install/tools/CmdTlmServer.bat +59 -59
  405. data/install/tools/DataViewer +15 -15
  406. data/install/tools/DataViewer.bat +59 -59
  407. data/install/tools/HandbookCreator +15 -15
  408. data/install/tools/HandbookCreator.bat +61 -61
  409. data/install/tools/Launcher +15 -15
  410. data/install/tools/Launcher.bat +59 -59
  411. data/install/tools/LimitsMonitor +15 -15
  412. data/install/tools/LimitsMonitor.bat +59 -59
  413. data/install/tools/OpenGLBuilder +15 -15
  414. data/install/tools/OpenGLBuilder.bat +59 -59
  415. data/install/tools/PacketViewer +15 -15
  416. data/install/tools/PacketViewer.bat +59 -59
  417. data/install/tools/Replay +15 -15
  418. data/install/tools/Replay.bat +59 -59
  419. data/install/tools/ScriptRunner +15 -15
  420. data/install/tools/ScriptRunner.bat +59 -59
  421. data/install/tools/TableManager +15 -15
  422. data/install/tools/TableManager.bat +59 -59
  423. data/install/tools/TestRunner +15 -15
  424. data/install/tools/TestRunner.bat +59 -59
  425. data/install/tools/TlmExtractor +15 -15
  426. data/install/tools/TlmExtractor.bat +59 -59
  427. data/install/tools/TlmGrapher +15 -15
  428. data/install/tools/TlmGrapher.bat +59 -59
  429. data/install/tools/TlmViewer +15 -15
  430. data/install/tools/TlmViewer.bat +59 -59
  431. data/install/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
  432. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +15 -15
  433. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +6 -6
  434. data/install/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
  435. data/install/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +15 -15
  436. data/install/tools/mac/CmdSender.app/Contents/MacOS/main.sh +6 -6
  437. data/install/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
  438. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +15 -15
  439. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +6 -6
  440. data/install/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
  441. data/install/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +15 -15
  442. data/install/tools/mac/DataViewer.app/Contents/MacOS/main.sh +6 -6
  443. data/install/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
  444. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +15 -15
  445. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +6 -6
  446. data/install/tools/mac/Launcher.app/Contents/Info.plist +38 -38
  447. data/install/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +15 -15
  448. data/install/tools/mac/Launcher.app/Contents/MacOS/main.sh +6 -6
  449. data/install/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
  450. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +15 -15
  451. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +6 -6
  452. data/install/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
  453. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +15 -15
  454. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +6 -6
  455. data/install/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
  456. data/install/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +15 -15
  457. data/install/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +6 -6
  458. data/install/tools/mac/Replay.app/Contents/Info.plist +38 -38
  459. data/install/tools/mac/Replay.app/Contents/MacOS/Replay.rb +15 -15
  460. data/install/tools/mac/Replay.app/Contents/MacOS/main.sh +6 -6
  461. data/install/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
  462. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +15 -15
  463. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +6 -6
  464. data/install/tools/mac/TableManager.app/Contents/Info.plist +38 -38
  465. data/install/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +15 -15
  466. data/install/tools/mac/TableManager.app/Contents/MacOS/main.sh +6 -6
  467. data/install/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
  468. data/install/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +15 -15
  469. data/install/tools/mac/TestRunner.app/Contents/MacOS/main.sh +6 -6
  470. data/install/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
  471. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +15 -15
  472. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +6 -6
  473. data/install/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
  474. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +15 -15
  475. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +6 -6
  476. data/install/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
  477. data/install/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +15 -15
  478. data/install/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +6 -6
  479. data/lib/cosmos.rb +63 -63
  480. data/lib/cosmos/ccsds/ccsds_packet.rb +63 -63
  481. data/lib/cosmos/ccsds/ccsds_parser.rb +143 -143
  482. data/lib/cosmos/config/config_parser.rb +324 -324
  483. data/lib/cosmos/conversions.rb +13 -13
  484. data/lib/cosmos/conversions/conversion.rb +47 -47
  485. data/lib/cosmos/conversions/generic_conversion.rb +55 -55
  486. data/lib/cosmos/conversions/new_packet_log_conversion.rb +45 -45
  487. data/lib/cosmos/conversions/polynomial_conversion.rb +57 -57
  488. data/lib/cosmos/conversions/processor_conversion.rb +46 -46
  489. data/lib/cosmos/conversions/received_count_conversion.rb +33 -33
  490. data/lib/cosmos/conversions/received_time_formatted_conversion.rb +37 -37
  491. data/lib/cosmos/conversions/received_time_seconds_conversion.rb +37 -37
  492. data/lib/cosmos/conversions/segmented_polynomial_conversion.rb +128 -128
  493. data/lib/cosmos/conversions/unix_time_conversion.rb +50 -50
  494. data/lib/cosmos/conversions/unix_time_formatted_conversion.rb +44 -44
  495. data/lib/cosmos/conversions/unix_time_seconds_conversion.rb +44 -44
  496. data/lib/cosmos/core_ext.rb +18 -18
  497. data/lib/cosmos/core_ext/array.rb +354 -354
  498. data/lib/cosmos/core_ext/class.rb +51 -51
  499. data/lib/cosmos/core_ext/cosmos_io.rb +29 -29
  500. data/lib/cosmos/core_ext/exception.rb +52 -52
  501. data/lib/cosmos/core_ext/file.rb +75 -75
  502. data/lib/cosmos/core_ext/hash.rb +28 -28
  503. data/lib/cosmos/core_ext/io.rb +75 -75
  504. data/lib/cosmos/core_ext/kernel.rb +38 -38
  505. data/lib/cosmos/core_ext/math.rb +119 -119
  506. data/lib/cosmos/core_ext/matrix.rb +146 -146
  507. data/lib/cosmos/core_ext/objectspace.rb +29 -29
  508. data/lib/cosmos/core_ext/range.rb +22 -22
  509. data/lib/cosmos/core_ext/socket.rb +32 -32
  510. data/lib/cosmos/core_ext/string.rb +310 -310
  511. data/lib/cosmos/core_ext/stringio.rb +24 -24
  512. data/lib/cosmos/core_ext/time.rb +446 -446
  513. data/lib/cosmos/gui/choosers/combobox_chooser.rb +130 -130
  514. data/lib/cosmos/gui/choosers/file_chooser.rb +68 -68
  515. data/lib/cosmos/gui/choosers/float_chooser.rb +82 -82
  516. data/lib/cosmos/gui/choosers/integer_chooser.rb +80 -80
  517. data/lib/cosmos/gui/choosers/string_chooser.rb +53 -53
  518. data/lib/cosmos/gui/choosers/telemetry_chooser.rb +317 -317
  519. data/lib/cosmos/gui/dialogs/about_dialog.rb +128 -128
  520. data/lib/cosmos/gui/dialogs/calendar_dialog.rb +136 -136
  521. data/lib/cosmos/gui/dialogs/cmd_details_dialog.rb +52 -52
  522. data/lib/cosmos/gui/dialogs/cmd_tlm_raw_dialog.rb +149 -149
  523. data/lib/cosmos/gui/dialogs/details_dialog.rb +174 -174
  524. data/lib/cosmos/gui/dialogs/exception_dialog.rb +97 -97
  525. data/lib/cosmos/gui/dialogs/exception_list_dialog.rb +59 -59
  526. data/lib/cosmos/gui/dialogs/find_replace_dialog.rb +196 -196
  527. data/lib/cosmos/gui/dialogs/legal_dialog.rb +169 -168
  528. data/lib/cosmos/gui/dialogs/packet_log_dialog.rb +118 -118
  529. data/lib/cosmos/gui/dialogs/progress_dialog.rb +270 -262
  530. data/lib/cosmos/gui/dialogs/pry_dialog.rb +165 -161
  531. data/lib/cosmos/gui/dialogs/scroll_text_dialog.rb +37 -37
  532. data/lib/cosmos/gui/dialogs/select_dialog.rb +54 -54
  533. data/lib/cosmos/gui/dialogs/set_tlm_dialog.rb +131 -131
  534. data/lib/cosmos/gui/dialogs/splash.rb +113 -113
  535. data/lib/cosmos/gui/dialogs/tlm_details_dialog.rb +206 -206
  536. data/lib/cosmos/gui/dialogs/tlm_edit_dialog.rb +81 -81
  537. data/lib/cosmos/gui/line_graph/line_graph.rb +456 -456
  538. data/lib/cosmos/gui/line_graph/line_graph_dialog.rb +34 -34
  539. data/lib/cosmos/gui/line_graph/line_graph_drawing.rb +494 -494
  540. data/lib/cosmos/gui/line_graph/line_graph_popups.rb +116 -116
  541. data/lib/cosmos/gui/line_graph/line_graph_scaling.rb +460 -460
  542. data/lib/cosmos/gui/line_graph/line_graph_script.rb +26 -26
  543. data/lib/cosmos/gui/line_graph/lines.rb +290 -290
  544. data/lib/cosmos/gui/line_graph/overview_graph.rb +459 -459
  545. data/lib/cosmos/gui/opengl/earth_model.rb +22 -22
  546. data/lib/cosmos/gui/opengl/gl_bounds.rb +67 -67
  547. data/lib/cosmos/gui/opengl/gl_light.rb +39 -39
  548. data/lib/cosmos/gui/opengl/gl_material.rb +29 -29
  549. data/lib/cosmos/gui/opengl/gl_scene.rb +72 -72
  550. data/lib/cosmos/gui/opengl/gl_shape.rb +146 -146
  551. data/lib/cosmos/gui/opengl/gl_viewer.rb +724 -712
  552. data/lib/cosmos/gui/opengl/gl_viewport.rb +35 -35
  553. data/lib/cosmos/gui/opengl/moon_model.rb +22 -22
  554. data/lib/cosmos/gui/opengl/opengl.rb +8 -8
  555. data/lib/cosmos/gui/opengl/stl_reader.rb +211 -211
  556. data/lib/cosmos/gui/opengl/stl_shape.rb +124 -124
  557. data/lib/cosmos/gui/opengl/texture_mapped_sphere.rb +202 -202
  558. data/lib/cosmos/gui/qt.rb +813 -786
  559. data/lib/cosmos/gui/qt_tool.rb +378 -373
  560. data/lib/cosmos/gui/text/completion.rb +381 -381
  561. data/lib/cosmos/gui/text/completion_line_edit.rb +30 -30
  562. data/lib/cosmos/gui/text/completion_text_edit.rb +179 -179
  563. data/lib/cosmos/gui/text/ruby_editor.rb +395 -395
  564. data/lib/cosmos/gui/utilities/screenshot.rb +25 -25
  565. data/lib/cosmos/gui/utilities/script_module_gui.rb +203 -203
  566. data/lib/cosmos/gui/widgets/full_text_search_line_edit.rb +161 -161
  567. data/lib/cosmos/gui/widgets/packet_log_frame.rb +305 -305
  568. data/lib/cosmos/gui/widgets/realtime_button_bar.rb +98 -98
  569. data/lib/cosmos/interfaces.rb +11 -11
  570. data/lib/cosmos/interfaces/cmd_tlm_server_interface.rb +153 -149
  571. data/lib/cosmos/interfaces/interface.rb +213 -213
  572. data/lib/cosmos/interfaces/linc_interface.rb +360 -360
  573. data/lib/cosmos/interfaces/serial_interface.rb +76 -76
  574. data/lib/cosmos/interfaces/simulated_target_interface.rb +129 -128
  575. data/lib/cosmos/interfaces/stream_interface.rb +156 -156
  576. data/lib/cosmos/interfaces/tcpip_client_interface.rb +60 -60
  577. data/lib/cosmos/interfaces/tcpip_server_interface.rb +154 -154
  578. data/lib/cosmos/interfaces/udp_interface.rb +173 -173
  579. data/lib/cosmos/io/buffered_file.rb +11 -11
  580. data/lib/cosmos/io/cosmos_snmp.rb +50 -50
  581. data/lib/cosmos/io/io_multiplexer.rb +89 -89
  582. data/lib/cosmos/io/json_drb.rb +344 -320
  583. data/lib/cosmos/io/json_drb_object.rb +137 -137
  584. data/lib/cosmos/io/json_rpc.rb +365 -365
  585. data/lib/cosmos/io/posix_serial_driver.rb +145 -145
  586. data/lib/cosmos/io/raw_logger.rb +174 -174
  587. data/lib/cosmos/io/raw_logger_pair.rb +71 -71
  588. data/lib/cosmos/io/serial_driver.rb +85 -85
  589. data/lib/cosmos/io/stderr.rb +36 -36
  590. data/lib/cosmos/io/stdout.rb +36 -36
  591. data/lib/cosmos/io/tcpip_server.rb +583 -532
  592. data/lib/cosmos/io/udp_sockets.rb +152 -152
  593. data/lib/cosmos/io/win32_serial_driver.rb +147 -147
  594. data/lib/cosmos/packet_logs.rb +6 -6
  595. data/lib/cosmos/packet_logs/meta_packet_log_writer.rb +107 -107
  596. data/lib/cosmos/packet_logs/packet_log_reader.rb +441 -439
  597. data/lib/cosmos/packet_logs/packet_log_writer.rb +321 -309
  598. data/lib/cosmos/packet_logs/packet_log_writer_pair.rb +30 -30
  599. data/lib/cosmos/packets/binary_accessor.rb +921 -921
  600. data/lib/cosmos/packets/commands.rb +291 -291
  601. data/lib/cosmos/packets/limits.rb +263 -263
  602. data/lib/cosmos/packets/limits_response.rb +38 -38
  603. data/lib/cosmos/packets/packet.rb +714 -699
  604. data/lib/cosmos/packets/packet_config.rb +1034 -1034
  605. data/lib/cosmos/packets/packet_item.rb +317 -317
  606. data/lib/cosmos/packets/packet_item_limits.rb +128 -128
  607. data/lib/cosmos/packets/structure.rb +421 -386
  608. data/lib/cosmos/packets/structure_item.rb +233 -233
  609. data/lib/cosmos/packets/telemetry.rb +317 -317
  610. data/lib/cosmos/processors.rb +6 -6
  611. data/lib/cosmos/processors/new_packet_log_processor.rb +34 -34
  612. data/lib/cosmos/processors/processor.rb +71 -71
  613. data/lib/cosmos/processors/statistics_processor.rb +65 -65
  614. data/lib/cosmos/processors/watermark_processor.rb +44 -44
  615. data/lib/cosmos/script.rb +9 -9
  616. data/lib/cosmos/script/extract.rb +115 -115
  617. data/lib/cosmos/script/script.rb +1513 -1493
  618. data/lib/cosmos/streams/burst_stream_protocol.rb +25 -25
  619. data/lib/cosmos/streams/fixed_stream_protocol.rb +111 -111
  620. data/lib/cosmos/streams/length_stream_protocol.rb +140 -140
  621. data/lib/cosmos/streams/preidentified_stream_protocol.rb +118 -118
  622. data/lib/cosmos/streams/serial_stream.rb +152 -143
  623. data/lib/cosmos/streams/stream.rb +57 -57
  624. data/lib/cosmos/streams/stream_protocol.rb +369 -369
  625. data/lib/cosmos/streams/tcpip_client_stream.rb +77 -77
  626. data/lib/cosmos/streams/tcpip_socket_stream.rb +139 -139
  627. data/lib/cosmos/streams/template_stream_protocol.rb +140 -140
  628. data/lib/cosmos/streams/terminated_stream_protocol.rb +81 -81
  629. data/lib/cosmos/system.rb +4 -4
  630. data/lib/cosmos/system/system.rb +558 -558
  631. data/lib/cosmos/system/target.rb +178 -178
  632. data/lib/cosmos/tools/cmd_extractor/cmd_extractor.rb +254 -253
  633. data/lib/cosmos/tools/cmd_sender/cmd_sender.rb +716 -716
  634. data/lib/cosmos/tools/cmd_sender/cmd_sender_item_delegate.rb +77 -77
  635. data/lib/cosmos/tools/cmd_sender/cmd_sender_text_edit.rb +70 -70
  636. data/lib/cosmos/tools/cmd_tlm_server/api.rb +936 -940
  637. data/lib/cosmos/tools/cmd_tlm_server/background_task.rb +46 -46
  638. data/lib/cosmos/tools/cmd_tlm_server/background_tasks.rb +67 -63
  639. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +511 -497
  640. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_config.rb +241 -241
  641. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +1033 -1008
  642. data/lib/cosmos/tools/cmd_tlm_server/commanding.rb +112 -112
  643. data/lib/cosmos/tools/cmd_tlm_server/connections.rb +176 -176
  644. data/lib/cosmos/tools/cmd_tlm_server/interface_thread.rb +241 -221
  645. data/lib/cosmos/tools/cmd_tlm_server/interfaces.rb +127 -127
  646. data/lib/cosmos/tools/cmd_tlm_server/packet_logging.rb +132 -132
  647. data/lib/cosmos/tools/cmd_tlm_server/router_thread.rb +66 -66
  648. data/lib/cosmos/tools/cmd_tlm_server/routers.rb +97 -97
  649. data/lib/cosmos/tools/data_viewer/data_viewer.rb +628 -600
  650. data/lib/cosmos/tools/data_viewer/data_viewer_component.rb +167 -167
  651. data/lib/cosmos/tools/data_viewer/dump_component.rb +40 -40
  652. data/lib/cosmos/tools/handbook_creator/handbook_creator.rb +149 -149
  653. data/lib/cosmos/tools/handbook_creator/handbook_creator_config.rb +360 -360
  654. data/lib/cosmos/tools/launcher/launcher.rb +184 -184
  655. data/lib/cosmos/tools/launcher/launcher_config.rb +175 -167
  656. data/lib/cosmos/tools/launcher/launcher_multitool.rb +40 -41
  657. data/lib/cosmos/tools/launcher/launcher_tool.rb +104 -104
  658. data/lib/cosmos/tools/limits_monitor/limits_monitor.rb +796 -768
  659. data/lib/cosmos/tools/opengl_builder/opengl_builder.rb +416 -416
  660. data/lib/cosmos/tools/opengl_builder/scene_config.rb +118 -118
  661. data/lib/cosmos/tools/packet_viewer/packet_viewer.rb +525 -525
  662. data/lib/cosmos/tools/replay/replay.rb +495 -488
  663. data/lib/cosmos/tools/replay/replay_server.rb +91 -91
  664. data/lib/cosmos/tools/script_runner/script_audit.rb +147 -139
  665. data/lib/cosmos/tools/script_runner/script_runner.rb +914 -914
  666. data/lib/cosmos/tools/script_runner/script_runner_config.rb +40 -40
  667. data/lib/cosmos/tools/script_runner/script_runner_frame.rb +1892 -1859
  668. data/lib/cosmos/tools/table_manager/table.rb +70 -70
  669. data/lib/cosmos/tools/table_manager/table_config.rb +764 -764
  670. data/lib/cosmos/tools/table_manager/table_item.rb +74 -74
  671. data/lib/cosmos/tools/table_manager/table_manager.rb +1065 -1065
  672. data/lib/cosmos/tools/table_manager/table_manager_core.rb +539 -539
  673. data/lib/cosmos/tools/test_runner/results_writer.rb +283 -283
  674. data/lib/cosmos/tools/test_runner/test.rb +480 -480
  675. data/lib/cosmos/tools/test_runner/test_runner.rb +1157 -1157
  676. data/lib/cosmos/tools/test_runner/test_runner_chooser.rb +338 -338
  677. data/lib/cosmos/tools/tlm_extractor/text_item_chooser.rb +60 -60
  678. data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +1008 -1008
  679. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_config.rb +371 -371
  680. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_processor.rb +60 -60
  681. data/lib/cosmos/tools/tlm_grapher/data_object_adders/housekeeping_data_object_adder.rb +75 -75
  682. data/lib/cosmos/tools/tlm_grapher/data_object_adders/singlexy_data_object_adder.rb +44 -44
  683. data/lib/cosmos/tools/tlm_grapher/data_object_adders/xy_data_object_adder.rb +94 -94
  684. data/lib/cosmos/tools/tlm_grapher/data_object_editors/data_object_editor.rb +61 -61
  685. data/lib/cosmos/tools/tlm_grapher/data_object_editors/housekeeping_data_object_editor.rb +180 -180
  686. data/lib/cosmos/tools/tlm_grapher/data_object_editors/linegraph_data_object_editor.rb +141 -141
  687. data/lib/cosmos/tools/tlm_grapher/data_object_editors/singlexy_data_object_editor.rb +30 -30
  688. data/lib/cosmos/tools/tlm_grapher/data_object_editors/xy_data_object_editor.rb +173 -173
  689. data/lib/cosmos/tools/tlm_grapher/data_objects/data_object.rb +177 -177
  690. data/lib/cosmos/tools/tlm_grapher/data_objects/housekeeping_data_object.rb +412 -409
  691. data/lib/cosmos/tools/tlm_grapher/data_objects/linegraph_data_object.rb +176 -176
  692. data/lib/cosmos/tools/tlm_grapher/data_objects/singlexy_data_object.rb +25 -25
  693. data/lib/cosmos/tools/tlm_grapher/data_objects/xy_data_object.rb +323 -320
  694. data/lib/cosmos/tools/tlm_grapher/plot_editors/linegraph_plot_editor.rb +181 -181
  695. data/lib/cosmos/tools/tlm_grapher/plot_editors/plot_editor.rb +28 -28
  696. data/lib/cosmos/tools/tlm_grapher/plot_editors/singlexy_plot_editor.rb +30 -30
  697. data/lib/cosmos/tools/tlm_grapher/plot_editors/xy_plot_editor.rb +59 -59
  698. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/linegraph_plot_gui_object.rb +172 -172
  699. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/singlexy_plot_gui_object.rb +27 -27
  700. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/xy_plot_gui_object.rb +74 -74
  701. data/lib/cosmos/tools/tlm_grapher/plots/linegraph_plot.rb +201 -201
  702. data/lib/cosmos/tools/tlm_grapher/plots/plot.rb +69 -69
  703. data/lib/cosmos/tools/tlm_grapher/plots/singlexy_plot.rb +20 -20
  704. data/lib/cosmos/tools/tlm_grapher/plots/xy_plot.rb +61 -61
  705. data/lib/cosmos/tools/tlm_grapher/tabbed_plots/overview_tabbed_plots.rb +1278 -1278
  706. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_config.rb +430 -430
  707. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_data_object_editor.rb +107 -107
  708. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_logfile_thread.rb +111 -95
  709. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_plot_editor.rb +101 -101
  710. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_realtime_thread.rb +72 -66
  711. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tab.rb +57 -57
  712. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tool.rb +1004 -1004
  713. data/lib/cosmos/tools/tlm_grapher/tlm_grapher.rb +87 -87
  714. data/lib/cosmos/tools/tlm_viewer/screen.rb +486 -458
  715. data/lib/cosmos/tools/tlm_viewer/tlm_viewer.rb +563 -544
  716. data/lib/cosmos/tools/tlm_viewer/tlm_viewer_config.rb +287 -287
  717. data/lib/cosmos/tools/tlm_viewer/widgets.rb +53 -53
  718. data/lib/cosmos/tools/tlm_viewer/widgets/aging_widget.rb +110 -110
  719. data/lib/cosmos/tools/tlm_viewer/widgets/array_widget.rb +70 -70
  720. data/lib/cosmos/tools/tlm_viewer/widgets/block_widget.rb +61 -61
  721. data/lib/cosmos/tools/tlm_viewer/widgets/button_widget.rb +39 -39
  722. data/lib/cosmos/tools/tlm_viewer/widgets/canvas_widget.rb +62 -62
  723. data/lib/cosmos/tools/tlm_viewer/widgets/canvasimage_widget.rb +41 -41
  724. data/lib/cosmos/tools/tlm_viewer/widgets/canvasimagevalue_widget.rb +57 -57
  725. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabel_widget.rb +37 -37
  726. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabelvalue_widget.rb +56 -56
  727. data/lib/cosmos/tools/tlm_viewer/widgets/canvasline_widget.rb +55 -55
  728. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslinevalue_widget.rb +66 -66
  729. data/lib/cosmos/tools/tlm_viewer/widgets/canvasvalue_widget.rb +124 -124
  730. data/lib/cosmos/tools/tlm_viewer/widgets/checkbutton_widget.rb +31 -31
  731. data/lib/cosmos/tools/tlm_viewer/widgets/combobox_widget.rb +30 -30
  732. data/lib/cosmos/tools/tlm_viewer/widgets/formatfontvalue_widget.rb +36 -36
  733. data/lib/cosmos/tools/tlm_viewer/widgets/formatvalue_widget.rb +35 -35
  734. data/lib/cosmos/tools/tlm_viewer/widgets/horizontal_widget.rb +27 -27
  735. data/lib/cosmos/tools/tlm_viewer/widgets/horizontalbox_widget.rb +31 -31
  736. data/lib/cosmos/tools/tlm_viewer/widgets/horizontalline_widget.rb +26 -26
  737. data/lib/cosmos/tools/tlm_viewer/widgets/label_widget.rb +29 -29
  738. data/lib/cosmos/tools/tlm_viewer/widgets/labelformatvalue_widget.rb +39 -39
  739. data/lib/cosmos/tools/tlm_viewer/widgets/labelprogressbar_widget.rb +38 -38
  740. data/lib/cosmos/tools/tlm_viewer/widgets/labeltrendlimitsbar_widget.rb +38 -38
  741. data/lib/cosmos/tools/tlm_viewer/widgets/labelvalue_widget.rb +39 -39
  742. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluedesc_widget.rb +42 -42
  743. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluelimitsbar_widget.rb +37 -37
  744. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluerangebar_widget.rb +37 -37
  745. data/lib/cosmos/tools/tlm_viewer/widgets/layout_widget.rb +34 -34
  746. data/lib/cosmos/tools/tlm_viewer/widgets/limitsbar_widget.rb +178 -178
  747. data/lib/cosmos/tools/tlm_viewer/widgets/linegraph_widget.rb +54 -54
  748. data/lib/cosmos/tools/tlm_viewer/widgets/matrixbycolumns_widget.rb +47 -47
  749. data/lib/cosmos/tools/tlm_viewer/widgets/multi_widget.rb +116 -116
  750. data/lib/cosmos/tools/tlm_viewer/widgets/progressbar_widget.rb +34 -34
  751. data/lib/cosmos/tools/tlm_viewer/widgets/radiobutton_widget.rb +30 -30
  752. data/lib/cosmos/tools/tlm_viewer/widgets/rangebar_widget.rb +57 -57
  753. data/lib/cosmos/tools/tlm_viewer/widgets/screenshotbutton_widget.rb +34 -34
  754. data/lib/cosmos/tools/tlm_viewer/widgets/scrollwindow_widget.rb +35 -35
  755. data/lib/cosmos/tools/tlm_viewer/widgets/sectionheader_widget.rb +33 -33
  756. data/lib/cosmos/tools/tlm_viewer/widgets/tabbook_widget.rb +26 -26
  757. data/lib/cosmos/tools/tlm_viewer/widgets/tabitem_widget.rb +28 -28
  758. data/lib/cosmos/tools/tlm_viewer/widgets/textbox_widget.rb +47 -47
  759. data/lib/cosmos/tools/tlm_viewer/widgets/textfield_widget.rb +26 -26
  760. data/lib/cosmos/tools/tlm_viewer/widgets/timegraph_widget.rb +88 -88
  761. data/lib/cosmos/tools/tlm_viewer/widgets/title_widget.rb +27 -27
  762. data/lib/cosmos/tools/tlm_viewer/widgets/trendbar_widget.rb +130 -130
  763. data/lib/cosmos/tools/tlm_viewer/widgets/trendlimitsbar_widget.rb +46 -46
  764. data/lib/cosmos/tools/tlm_viewer/widgets/value_widget.rb +43 -43
  765. data/lib/cosmos/tools/tlm_viewer/widgets/valuelimitsbar_widget.rb +37 -37
  766. data/lib/cosmos/tools/tlm_viewer/widgets/valuerangebar_widget.rb +37 -37
  767. data/lib/cosmos/tools/tlm_viewer/widgets/vertical_widget.rb +35 -35
  768. data/lib/cosmos/tools/tlm_viewer/widgets/verticalbox_widget.rb +37 -37
  769. data/lib/cosmos/tools/tlm_viewer/widgets/widget.rb +257 -257
  770. data/lib/cosmos/top_level.rb +647 -596
  771. data/lib/cosmos/utilities.rb +11 -10
  772. data/lib/cosmos/utilities/crc.rb +166 -166
  773. data/lib/cosmos/utilities/csv.rb +83 -83
  774. data/lib/cosmos/utilities/logger.rb +137 -137
  775. data/lib/cosmos/utilities/low_fragmentation_array.rb +11 -11
  776. data/lib/cosmos/utilities/message_log.rb +74 -74
  777. data/lib/cosmos/utilities/quaternion.rb +258 -258
  778. data/lib/cosmos/utilities/ruby_lex_utils.rb +313 -313
  779. data/lib/cosmos/utilities/simulated_target.rb +99 -99
  780. data/lib/cosmos/utilities/sleeper.rb +44 -0
  781. data/lib/cosmos/version.rb +12 -12
  782. data/lib/cosmos/win32/excel.rb +66 -66
  783. data/lib/cosmos/win32/win32.rb +387 -387
  784. data/lib/cosmos/win32/win32_main.rb +311 -311
  785. data/roodi.yml +24 -24
  786. data/run_gui_tests.bat +32 -32
  787. data/spec/ccsds/ccsds_packet_spec.rb +67 -67
  788. data/spec/ccsds/ccsds_parser_spec.rb +148 -148
  789. data/spec/config/config_parser_spec.rb +322 -322
  790. data/spec/conversions/conversion_spec.rb +31 -31
  791. data/spec/conversions/generic_conversion_spec.rb +45 -45
  792. data/spec/conversions/new_packet_log_conversion_spec.rb +39 -39
  793. data/spec/conversions/polynomial_conversion_spec.rb +40 -40
  794. data/spec/conversions/processor_conversion_spec.rb +45 -45
  795. data/spec/conversions/received_count_conversion_spec.rb +43 -43
  796. data/spec/conversions/received_time_formatted_conversion_spec.rb +49 -49
  797. data/spec/conversions/received_time_seconds_conversion_spec.rb +50 -50
  798. data/spec/conversions/segmented_polynomial_conversion_spec.rb +51 -51
  799. data/spec/conversions/unix_time_formatted_conversion_spec.rb +74 -74
  800. data/spec/conversions/unix_time_seconds_conversion_spec.rb +76 -76
  801. data/spec/core_ext/array_spec.rb +186 -186
  802. data/spec/core_ext/class_spec.rb +36 -36
  803. data/spec/core_ext/cosmos_io_spec.rb +77 -77
  804. data/spec/core_ext/exception_spec.rb +91 -91
  805. data/spec/core_ext/file_spec.rb +72 -72
  806. data/spec/core_ext/hash_spec.rb +24 -24
  807. data/spec/core_ext/io_spec.rb +46 -46
  808. data/spec/core_ext/kernel_spec.rb +54 -54
  809. data/spec/core_ext/math_spec.rb +116 -116
  810. data/spec/core_ext/matrix_spec.rb +66 -66
  811. data/spec/core_ext/objectspace_spec.rb +29 -29
  812. data/spec/core_ext/range_spec.rb +21 -21
  813. data/spec/core_ext/socket_spec.rb +32 -32
  814. data/spec/core_ext/string_spec.rb +223 -223
  815. data/spec/core_ext/stringio_spec.rb +21 -21
  816. data/spec/core_ext/time_spec.rb +151 -151
  817. data/spec/gui/line_graph/line_clip_spec.rb +322 -322
  818. data/spec/install/config/system/system.txt +33 -33
  819. data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  820. data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  821. data/spec/install/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  822. data/spec/install/config/targets/COSMOS/screens/limits_change.txt +20 -20
  823. data/spec/install/config/targets/COSMOS/screens/version.txt +19 -19
  824. data/spec/install/config/targets/COSMOS/target.txt +5 -5
  825. data/spec/install/config/targets/INST/cmd_tlm/inst_cmd_linc.txt +30 -30
  826. data/spec/install/config/targets/INST/cmd_tlm/inst_cmds.txt +111 -111
  827. data/spec/install/config/targets/INST/cmd_tlm/inst_tlm.txt +236 -236
  828. data/spec/install/config/targets/INST/cmd_tlm/inst_tlm_linc.txt +25 -25
  829. data/spec/install/config/targets/INST/cmd_tlm_server.txt +5 -5
  830. data/spec/install/config/targets/INST/lib/sim_inst.rb +305 -294
  831. data/spec/install/config/targets/INST/target.txt +10 -10
  832. data/spec/install/config/targets/META/cmd_tlm/meta_cmd.txt +4 -4
  833. data/spec/install/config/targets/META/cmd_tlm/meta_tlm.txt +4 -4
  834. data/spec/install/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
  835. data/spec/interfaces/cmd_tlm_server_interface_spec.rb +150 -150
  836. data/spec/interfaces/interface_spec.rb +130 -131
  837. data/spec/interfaces/linc_interface_spec.rb +199 -199
  838. data/spec/interfaces/serial_interface_spec.rb +56 -56
  839. data/spec/interfaces/simulated_target_interface_spec.rb +128 -128
  840. data/spec/interfaces/stream_interface_spec.rb +157 -157
  841. data/spec/interfaces/tcpip_client_interface_spec.rb +54 -54
  842. data/spec/interfaces/tcpip_server_interface_spec.rb +151 -151
  843. data/spec/interfaces/udp_interface_spec.rb +175 -177
  844. data/spec/io/buffered_file_spec.rb +113 -113
  845. data/spec/io/io_multiplexer_spec.rb +94 -94
  846. data/spec/io/json_drb_object_spec.rb +99 -99
  847. data/spec/io/json_drb_spec.rb +311 -311
  848. data/spec/io/json_rpc_spec.rb +264 -264
  849. data/spec/io/raw_logger_pair_spec.rb +76 -76
  850. data/spec/io/raw_logger_spec.rb +133 -133
  851. data/spec/io/serial_driver_spec.rb +61 -61
  852. data/spec/io/stderr_spec.rb +32 -32
  853. data/spec/io/stdout_spec.rb +32 -32
  854. data/spec/io/tcpip_server_spec.rb +338 -338
  855. data/spec/io/udp_sockets_spec.rb +94 -94
  856. data/spec/io/win32_serial_driver_spec.rb +88 -88
  857. data/spec/packet_logs/meta_packet_log_writer_spec.rb +170 -170
  858. data/spec/packet_logs/packet_log_reader_spec.rb +408 -408
  859. data/spec/packet_logs/packet_log_writer_pair_spec.rb +30 -30
  860. data/spec/packet_logs/packet_log_writer_spec.rb +223 -223
  861. data/spec/packets/binary_accessor_spec.rb +2073 -2073
  862. data/spec/packets/commands_spec.rb +369 -369
  863. data/spec/packets/limits_response_spec.rb +25 -25
  864. data/spec/packets/limits_spec.rb +326 -326
  865. data/spec/packets/packet_config_spec.rb +1620 -1620
  866. data/spec/packets/packet_item_limits_spec.rb +161 -161
  867. data/spec/packets/packet_item_spec.rb +386 -386
  868. data/spec/packets/packet_spec.rb +1057 -949
  869. data/spec/packets/structure_item_spec.rb +195 -195
  870. data/spec/packets/structure_spec.rb +419 -419
  871. data/spec/packets/telemetry_spec.rb +535 -535
  872. data/spec/processors/new_packet_log_processor_spec.rb +39 -39
  873. data/spec/processors/processor_spec.rb +55 -55
  874. data/spec/processors/statistics_processor_spec.rb +60 -60
  875. data/spec/processors/watermark_processor_spec.rb +51 -51
  876. data/spec/script/script_spec.rb +654 -654
  877. data/spec/spec_helper.rb +154 -148
  878. data/spec/streams/burst_stream_protocol_spec.rb +32 -32
  879. data/spec/streams/fixed_stream_protocol_spec.rb +110 -110
  880. data/spec/streams/length_stream_protocol_spec.rb +297 -297
  881. data/spec/streams/preidentified_stream_protocol_spec.rb +118 -118
  882. data/spec/streams/serial_stream_spec.rb +105 -105
  883. data/spec/streams/stream_protocol_spec.rb +332 -332
  884. data/spec/streams/stream_spec.rb +29 -29
  885. data/spec/streams/tcpip_client_stream_spec.rb +54 -54
  886. data/spec/streams/tcpip_socket_stream_spec.rb +146 -146
  887. data/spec/streams/template_stream_protocol_spec.rb +151 -151
  888. data/spec/streams/terminated_stream_protocol_spec.rb +123 -123
  889. data/spec/system/system_spec.rb +645 -645
  890. data/spec/system/target_spec.rb +248 -248
  891. data/spec/tools/cmd_tlm_server/api_spec.rb +1087 -1113
  892. data/spec/tools/cmd_tlm_server/background_task_spec.rb +32 -32
  893. data/spec/tools/cmd_tlm_server/background_tasks_spec.rb +81 -81
  894. data/spec/tools/cmd_tlm_server/cmd_tlm_server_config_spec.rb +411 -411
  895. data/spec/tools/cmd_tlm_server/cmd_tlm_server_spec.rb +415 -415
  896. data/spec/tools/cmd_tlm_server/commanding_spec.rb +123 -123
  897. data/spec/tools/cmd_tlm_server/connections_spec.rb +147 -147
  898. data/spec/tools/cmd_tlm_server/interface_thread_spec.rb +306 -306
  899. data/spec/tools/cmd_tlm_server/interfaces_spec.rb +252 -238
  900. data/spec/tools/cmd_tlm_server/packet_logging_spec.rb +143 -143
  901. data/spec/tools/cmd_tlm_server/router_thread_spec.rb +98 -101
  902. data/spec/tools/cmd_tlm_server/routers_spec.rb +223 -208
  903. data/spec/top_level/top_level_spec.rb +334 -321
  904. data/spec/utilities/crc_spec.rb +45 -45
  905. data/spec/utilities/csv_spec.rb +97 -97
  906. data/spec/utilities/logger_spec.rb +102 -102
  907. data/spec/utilities/message_log_spec.rb +89 -89
  908. data/spec/utilities/quaternion_spec.rb +107 -107
  909. data/spec/utilities/ruby_lex_utils_spec.rb +86 -86
  910. data/tasks/manifest.rake +22 -22
  911. data/tasks/spec.rake +23 -23
  912. metadata +18 -2
@@ -1,49 +1,50 @@
1
- SetWinDelay 500
2
- SetKeyDelay 10
3
-
4
- Sleep 1000
5
- WinActivate Screen
6
- Send {Tab}
7
- Sleep 500
8
- Send {Enter}
9
-
10
- Sleep 2000
11
- Run ruby.exe %A_ScriptDir%/CmdTlmServer
12
- Sleep 2000
13
- Run ruby.exe %A_ScriptDir%/ScriptRunner -w 600 -t 600
14
-
15
- WinWaitActive Script
16
- Send display("INST ADCS"){Enter}
17
- Send wait 2{Enter}
18
- Send clear("INST ADCS"){Enter}
19
- Sleep 500
20
- Click 400 90
21
-
22
- ; Allow the script time to run
23
- Sleep 5000
24
-
25
- WinActivate Script
26
- Send ^q
27
- Sleep 500
28
- Send n
29
-
30
- ; Close down command and telemetry server
31
- WinActivate Command and Telemetry Server
32
- Send ^q
33
- Sleep 500
34
- Send {Enter}
35
-
36
- ; Quit Telemetry Viewer
37
- WinActivate Telemetry
38
- Sleep 500
39
- Send ^q
40
- Sleep 500
41
- Send y
42
-
43
- ; Quit Telemetry Viewer
44
- WinActivate Telemetry
45
- Sleep 500
46
- Send ^q
47
- Sleep 500
48
- Send y
49
-
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 500
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
+