cosmos 3.0.1 → 3.1.0

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