cosmos 3.0.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 (1114) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +48 -0
  3. data/.travis.yml +5 -0
  4. data/Gemfile +5 -0
  5. data/Guardfile +27 -0
  6. data/LICENSE.txt +879 -0
  7. data/Manifest.txt +1112 -0
  8. data/README.md +42 -0
  9. data/Rakefile +214 -0
  10. data/autohotkey/config/data/attitude.bin +0 -0
  11. data/autohotkey/config/data/diamond.STL +58 -0
  12. data/autohotkey/config/data/groundoff.gif +0 -0
  13. data/autohotkey/config/data/groundon.gif +0 -0
  14. data/autohotkey/config/data/position.bin +0 -0
  15. data/autohotkey/config/data/satellite.gif +0 -0
  16. data/autohotkey/config/data/tada.wav +0 -0
  17. data/autohotkey/config/system/system.txt +34 -0
  18. data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -0
  19. data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -0
  20. data/autohotkey/config/targets/COSMOS/cmd_tlm_server.txt +6 -0
  21. data/autohotkey/config/targets/COSMOS/target.txt +5 -0
  22. data/autohotkey/config/targets/INST/cmd_tlm/inst_cmds.txt +121 -0
  23. data/autohotkey/config/targets/INST/cmd_tlm/inst_tlm.txt +247 -0
  24. data/autohotkey/config/targets/INST/cmd_tlm_server.txt +5 -0
  25. data/autohotkey/config/targets/INST/doc/README.txt +1 -0
  26. data/autohotkey/config/targets/INST/lib/example_limits_response.rb +30 -0
  27. data/autohotkey/config/targets/INST/lib/sim_inst.rb +294 -0
  28. data/autohotkey/config/targets/INST/screens/adcs.txt +46 -0
  29. data/autohotkey/config/targets/INST/screens/array.txt +7 -0
  30. data/autohotkey/config/targets/INST/screens/block.txt +8 -0
  31. data/autohotkey/config/targets/INST/screens/commanding.txt +30 -0
  32. data/autohotkey/config/targets/INST/screens/graphs.txt +14 -0
  33. data/autohotkey/config/targets/INST/screens/ground.txt +25 -0
  34. data/autohotkey/config/targets/INST/screens/health_status.txt +33 -0
  35. data/autohotkey/config/targets/INST/screens/hs.txt +49 -0
  36. data/autohotkey/config/targets/INST/screens/image.txt +21 -0
  37. data/autohotkey/config/targets/INST/screens/latest.txt +23 -0
  38. data/autohotkey/config/targets/INST/screens/mech.txt +25 -0
  39. data/autohotkey/config/targets/INST/screens/other.txt +25 -0
  40. data/autohotkey/config/targets/INST/screens/params.txt +25 -0
  41. data/autohotkey/config/targets/INST/screens/tabs.txt +68 -0
  42. data/autohotkey/config/targets/INST/target.txt +27 -0
  43. data/autohotkey/config/targets/META/cmd_tlm/meta_cmd.txt +10 -0
  44. data/autohotkey/config/targets/META/cmd_tlm/meta_tlm.txt +9 -0
  45. data/autohotkey/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -0
  46. data/autohotkey/config/targets/SYSTEM/screens/error.txt +11 -0
  47. data/autohotkey/config/tools/cmd_sender/cmd_sender.txt +1 -0
  48. data/autohotkey/config/tools/cmd_tlm_server/cmd_tlm_server.txt +22 -0
  49. data/autohotkey/config/tools/data_viewer/data_viewer.txt +11 -0
  50. data/autohotkey/config/tools/handbook_creator/default_toc.xsl +59 -0
  51. data/autohotkey/config/tools/handbook_creator/handbook_creator.txt +49 -0
  52. data/autohotkey/config/tools/handbook_creator/templates/command_packets.html.erb +86 -0
  53. data/autohotkey/config/tools/handbook_creator/templates/command_toc.html.erb +38 -0
  54. data/autohotkey/config/tools/handbook_creator/templates/footer.html.erb +9 -0
  55. data/autohotkey/config/tools/handbook_creator/templates/header.html.erb +25 -0
  56. data/autohotkey/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -0
  57. data/autohotkey/config/tools/handbook_creator/templates/nav.html.erb +27 -0
  58. data/autohotkey/config/tools/handbook_creator/templates/overview.html.erb +1 -0
  59. data/autohotkey/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -0
  60. data/autohotkey/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -0
  61. data/autohotkey/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -0
  62. data/autohotkey/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -0
  63. data/autohotkey/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -0
  64. data/autohotkey/config/tools/handbook_creator/templates/title.html.erb +1 -0
  65. data/autohotkey/config/tools/launcher/launcher.txt +38 -0
  66. data/autohotkey/config/tools/limits_monitor/README.txt +1 -0
  67. data/autohotkey/config/tools/opengl_builder/error.txt +1 -0
  68. data/autohotkey/config/tools/script_runner/script_runner.txt +3 -0
  69. data/autohotkey/config/tools/table_manager/ConfigTables_def.txt +8 -0
  70. data/autohotkey/config/tools/table_manager/OneDimensionalTable_def.txt +19 -0
  71. data/autohotkey/config/tools/table_manager/TwoDimensionalTable_def.txt +248 -0
  72. data/autohotkey/config/tools/test_runner/test_runner.txt +8 -0
  73. data/autohotkey/config/tools/test_runner/test_runner2.txt +11 -0
  74. data/autohotkey/config/tools/test_runner/test_runner3.txt +7 -0
  75. data/autohotkey/config/tools/test_runner/test_runner4.txt +1 -0
  76. data/autohotkey/config/tools/tlm_extractor/tlm_extractor.txt +14 -0
  77. data/autohotkey/config/tools/tlm_extractor/tlm_extractor2.txt +9 -0
  78. data/autohotkey/config/tools/tlm_grapher/README.txt +1 -0
  79. data/autohotkey/config/tools/tlm_grapher/bad.txt +50 -0
  80. data/autohotkey/config/tools/tlm_grapher/temp1-4.txt +51 -0
  81. data/autohotkey/config/tools/tlm_grapher/test2.txt +111 -0
  82. data/autohotkey/config/tools/tlm_viewer/tlm_viewer.txt +24 -0
  83. data/autohotkey/config/tools/tlm_viewer/tlm_viewer2.txt +4 -0
  84. data/autohotkey/config/tools/tlm_viewer/tlm_viewer3.txt +3 -0
  85. data/autohotkey/lib/example_background_task.rb +42 -0
  86. data/autohotkey/lib/user_version.rb +3 -0
  87. data/autohotkey/outputs/handbooks/assets/css/bootstrap-theme.css +397 -0
  88. data/autohotkey/outputs/handbooks/assets/css/bootstrap-theme.min.css +7 -0
  89. data/autohotkey/outputs/handbooks/assets/css/bootstrap.css +7118 -0
  90. data/autohotkey/outputs/handbooks/assets/css/bootstrap.min.css +7 -0
  91. data/autohotkey/outputs/handbooks/assets/fonts/glyphicons-halflings-regular.eot +0 -0
  92. data/autohotkey/outputs/handbooks/assets/fonts/glyphicons-halflings-regular.svg +229 -0
  93. data/autohotkey/outputs/handbooks/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
  94. data/autohotkey/outputs/handbooks/assets/fonts/glyphicons-halflings-regular.woff +0 -0
  95. data/autohotkey/outputs/handbooks/assets/js/bootstrap.js +2006 -0
  96. data/autohotkey/outputs/handbooks/assets/js/bootstrap.min.js +7 -0
  97. data/autohotkey/outputs/logs/bigtlm.bin +0 -0
  98. data/autohotkey/outputs/logs/cmd.bin +0 -0
  99. data/autohotkey/outputs/logs/tlm.bin +0 -0
  100. data/autohotkey/outputs/saved_config/README.txt +1 -0
  101. data/autohotkey/outputs/tables/README.txt +1 -0
  102. data/autohotkey/outputs/tmp/README.txt +1 -0
  103. data/autohotkey/procedures/clear_util.rb +7 -0
  104. data/autohotkey/procedures/collect.rb +18 -0
  105. data/autohotkey/procedures/collect_util.rb +14 -0
  106. data/autohotkey/procedures/example_test.rb +67 -0
  107. data/autohotkey/procedures/example_test2.rb +74 -0
  108. data/autohotkey/procedures/script_test.rb +17 -0
  109. data/autohotkey/procedures/syntax_error.rb +18 -0
  110. data/autohotkey/tools/CmdExtractorAHK +16 -0
  111. data/autohotkey/tools/CmdSender +14 -0
  112. data/autohotkey/tools/CmdSenderAHK +18 -0
  113. data/autohotkey/tools/CmdTlmServer +14 -0
  114. data/autohotkey/tools/CmdTlmServerAHK +28 -0
  115. data/autohotkey/tools/CmdTlmServerAHK2 +17 -0
  116. data/autohotkey/tools/DataViewer +14 -0
  117. data/autohotkey/tools/DataViewerAHK +17 -0
  118. data/autohotkey/tools/HandbookCreatorAHK +20 -0
  119. data/autohotkey/tools/LauncherAHK +17 -0
  120. data/autohotkey/tools/LimitsMonitorAHK +20 -0
  121. data/autohotkey/tools/OpenGLBuilderAHK +20 -0
  122. data/autohotkey/tools/PacketViewer +14 -0
  123. data/autohotkey/tools/PacketViewerAHK +18 -0
  124. data/autohotkey/tools/PacketViewerAHK2 +17 -0
  125. data/autohotkey/tools/Replay +14 -0
  126. data/autohotkey/tools/Replay.bat +59 -0
  127. data/autohotkey/tools/ReplayAHK +17 -0
  128. data/autohotkey/tools/ScriptRunner +14 -0
  129. data/autohotkey/tools/ScriptRunnerAHK +20 -0
  130. data/autohotkey/tools/ScriptRunnerAHK2 +17 -0
  131. data/autohotkey/tools/TableManager +14 -0
  132. data/autohotkey/tools/TableManagerAHK +30 -0
  133. data/autohotkey/tools/TestRunner +15 -0
  134. data/autohotkey/tools/TestRunnerAHK +17 -0
  135. data/autohotkey/tools/TestRunnerAHK2 +17 -0
  136. data/autohotkey/tools/TestRunnerAHK3 +17 -0
  137. data/autohotkey/tools/TestRunnerAHK4 +17 -0
  138. data/autohotkey/tools/TlmExtractor +15 -0
  139. data/autohotkey/tools/TlmExtractorAHK +19 -0
  140. data/autohotkey/tools/TlmExtractorAHK2 +16 -0
  141. data/autohotkey/tools/TlmExtractorAHK3 +16 -0
  142. data/autohotkey/tools/TlmGrapher +14 -0
  143. data/autohotkey/tools/TlmGrapherAHK +19 -0
  144. data/autohotkey/tools/TlmGrapherAHK2 +23 -0
  145. data/autohotkey/tools/TlmGrapherAHK3 +17 -0
  146. data/autohotkey/tools/TlmGrapherAHK4 +17 -0
  147. data/autohotkey/tools/TlmViewer +14 -0
  148. data/autohotkey/tools/TlmViewerAHK +28 -0
  149. data/autohotkey/tools/TlmViewerAHK2 +18 -0
  150. data/autohotkey/tools/TlmViewerAHK3 +18 -0
  151. data/autohotkey/tools/TlmViewerAHK4 +18 -0
  152. data/autohotkey/tools/TlmViewerAHK5 +18 -0
  153. data/autohotkey/tools/autohotkey.rb +37 -0
  154. data/autohotkey/tools/cmd_extractor.ahk +27 -0
  155. data/autohotkey/tools/cmd_sender.ahk +162 -0
  156. data/autohotkey/tools/cmd_tlm_server.ahk +89 -0
  157. data/autohotkey/tools/cmd_tlm_server2.ahk +45 -0
  158. data/autohotkey/tools/data_viewer.ahk +135 -0
  159. data/autohotkey/tools/handbook_creator.ahk +23 -0
  160. data/autohotkey/tools/launcher.ahk +41 -0
  161. data/autohotkey/tools/limits_monitor.ahk +70 -0
  162. data/autohotkey/tools/open_gl_builder.ahk +134 -0
  163. data/autohotkey/tools/packet_viewer.ahk +143 -0
  164. data/autohotkey/tools/packet_viewer2.ahk +9 -0
  165. data/autohotkey/tools/replay.ahk +98 -0
  166. data/autohotkey/tools/script_runner.ahk +589 -0
  167. data/autohotkey/tools/script_runner2.ahk +31 -0
  168. data/autohotkey/tools/table_manager.ahk +220 -0
  169. data/autohotkey/tools/test_runner.ahk +259 -0
  170. data/autohotkey/tools/test_runner2.ahk +52 -0
  171. data/autohotkey/tools/test_runner3.ahk +13 -0
  172. data/autohotkey/tools/tlm_extractor.ahk +272 -0
  173. data/autohotkey/tools/tlm_grapher.ahk +642 -0
  174. data/autohotkey/tools/tlm_grapher2.ahk +115 -0
  175. data/autohotkey/tools/tlm_grapher3.ahk +24 -0
  176. data/autohotkey/tools/tlm_viewer.ahk +133 -0
  177. data/autohotkey/tools/tlm_viewer2.ahk +49 -0
  178. data/autohotkey/tools/tlm_viewer4.ahk +4 -0
  179. data/autohotkey/tools/tlm_viewer5.ahk +20 -0
  180. data/autohotkey/userpath.txt +1 -0
  181. data/bin/cosmos +96 -0
  182. data/bin/cstol_converter +1166 -0
  183. data/bin/exchndl20.dll +0 -0
  184. data/bin/exchndl21.dll +0 -0
  185. data/bin/mgwhelp.dll +0 -0
  186. data/bin/rubysloc +85 -0
  187. data/cosmos.gemspec +98 -0
  188. data/data/COSMOS_64x64.bmp +0 -0
  189. data/data/COSMOS_64x64.ico +0 -0
  190. data/data/COSMOS_64x64.png +0 -0
  191. data/data/CheckBoxCheck.gif +0 -0
  192. data/data/CheckBoxEmpty.gif +0 -0
  193. data/data/Earthmap1024x512.gif +0 -0
  194. data/data/about.txt +4 -0
  195. data/data/add_database.png +0 -0
  196. data/data/add_plot.png +0 -0
  197. data/data/add_tab.png +0 -0
  198. data/data/blank.png +0 -0
  199. data/data/bug.png +0 -0
  200. data/data/checkmark.png +0 -0
  201. data/data/close.png +0 -0
  202. data/data/cmd_extractor.png +0 -0
  203. data/data/cmd_sender.png +0 -0
  204. data/data/copy.png +0 -0
  205. data/data/cosmos.xcf +0 -0
  206. data/data/cosmos_word.gif +0 -0
  207. data/data/crc.txt +305 -0
  208. data/data/cts.png +0 -0
  209. data/data/cut.png +0 -0
  210. data/data/data_viewer.png +0 -0
  211. data/data/delete_database.png +0 -0
  212. data/data/delete_plot.png +0 -0
  213. data/data/delete_tab.png +0 -0
  214. data/data/diamond.STL +58 -0
  215. data/data/disconnected.png +0 -0
  216. data/data/edit.png +0 -0
  217. data/data/edit_database.png +0 -0
  218. data/data/edit_plot.png +0 -0
  219. data/data/edit_tab.png +0 -0
  220. data/data/end-26.png +0 -0
  221. data/data/fast_forward-26.png +0 -0
  222. data/data/file.png +0 -0
  223. data/data/handbook_creator.png +0 -0
  224. data/data/help.png +0 -0
  225. data/data/html-32.png +0 -0
  226. data/data/launcher.png +0 -0
  227. data/data/legal.gif +0 -0
  228. data/data/legal.txt +9 -0
  229. data/data/limits_monitor.png +0 -0
  230. data/data/moonmap1k.gif +0 -0
  231. data/data/multi.png +0 -0
  232. data/data/open.png +0 -0
  233. data/data/open_in_browser-32.png +0 -0
  234. data/data/opengl_builder.png +0 -0
  235. data/data/packet_viewer.png +0 -0
  236. data/data/pdf-32.png +0 -0
  237. data/data/play-26.png +0 -0
  238. data/data/redo.png +0 -0
  239. data/data/replay.png +0 -0
  240. data/data/reverse-play-26.png +0 -0
  241. data/data/rewind-26.png +0 -0
  242. data/data/running.png +0 -0
  243. data/data/save.png +0 -0
  244. data/data/save_as.png +0 -0
  245. data/data/screenshot.png +0 -0
  246. data/data/script_runner.png +0 -0
  247. data/data/search-14.png +0 -0
  248. data/data/search.png +0 -0
  249. data/data/send_file.png +0 -0
  250. data/data/skip_to_start-26.png +0 -0
  251. data/data/spinner.gif +0 -0
  252. data/data/splash.gif +0 -0
  253. data/data/stop-26.png +0 -0
  254. data/data/table_manager.png +0 -0
  255. data/data/test_runner.png +0 -0
  256. data/data/tlm_extractor.png +0 -0
  257. data/data/tlm_grapher.png +0 -0
  258. data/data/tlm_viewer.png +0 -0
  259. data/data/undo.png +0 -0
  260. data/demo/Gemfile +5 -0
  261. data/demo/Launcher +15 -0
  262. data/demo/Launcher.bat +59 -0
  263. data/demo/Rakefile +61 -0
  264. data/demo/config/data/attitude.bin +0 -0
  265. data/demo/config/data/crc.txt +206 -0
  266. data/demo/config/data/diamond.STL +58 -0
  267. data/demo/config/data/groundoff.gif +0 -0
  268. data/demo/config/data/groundon.gif +0 -0
  269. data/demo/config/data/hselectoff.gif +0 -0
  270. data/demo/config/data/hselecton.gif +0 -0
  271. data/demo/config/data/hswitchoff.gif +0 -0
  272. data/demo/config/data/hswitchon.gif +0 -0
  273. data/demo/config/data/meta_init.txt +4 -0
  274. data/demo/config/data/position.bin +0 -0
  275. data/demo/config/data/poweroff.gif +0 -0
  276. data/demo/config/data/poweron.gif +0 -0
  277. data/demo/config/data/satellite.gif +0 -0
  278. data/demo/config/data/tada.wav +0 -0
  279. data/demo/config/data/vswitchoff.gif +0 -0
  280. data/demo/config/data/vswitchon.gif +0 -0
  281. data/demo/config/system/system.txt +34 -0
  282. data/demo/config/system/system2.txt +33 -0
  283. data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -0
  284. data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -0
  285. data/demo/config/targets/COSMOS/cmd_tlm_server.txt +6 -0
  286. data/demo/config/targets/COSMOS/screens/limits_change.txt +20 -0
  287. data/demo/config/targets/COSMOS/screens/version.txt +19 -0
  288. data/demo/config/targets/COSMOS/target.txt +11 -0
  289. data/demo/config/targets/EXAMPLE/cmd_tlm/example_cmds.txt +2 -0
  290. data/demo/config/targets/EXAMPLE/cmd_tlm/example_tlm.txt +3 -0
  291. data/demo/config/targets/EXAMPLE/cmd_tlm_server.txt +6 -0
  292. data/demo/config/targets/EXAMPLE/lib/example_interface.rb +22 -0
  293. data/demo/config/targets/EXAMPLE/target.txt +7 -0
  294. data/demo/config/targets/INST/cmd_tlm/inst_cmds.txt +121 -0
  295. data/demo/config/targets/INST/cmd_tlm/inst_tlm.txt +247 -0
  296. data/demo/config/targets/INST/cmd_tlm_server.txt +5 -0
  297. data/demo/config/targets/INST/doc/README.txt +1 -0
  298. data/demo/config/targets/INST/lib/example_limits_response.rb +30 -0
  299. data/demo/config/targets/INST/lib/sim_inst.rb +294 -0
  300. data/demo/config/targets/INST/screens/adcs.txt +46 -0
  301. data/demo/config/targets/INST/screens/array.txt +15 -0
  302. data/demo/config/targets/INST/screens/block.txt +8 -0
  303. data/demo/config/targets/INST/screens/commanding.txt +30 -0
  304. data/demo/config/targets/INST/screens/graphs.txt +14 -0
  305. data/demo/config/targets/INST/screens/ground.txt +25 -0
  306. data/demo/config/targets/INST/screens/hs.txt +44 -0
  307. data/demo/config/targets/INST/screens/latest.txt +23 -0
  308. data/demo/config/targets/INST/screens/other.txt +29 -0
  309. data/demo/config/targets/INST/screens/tabs.txt +70 -0
  310. data/demo/config/targets/INST/target.txt +33 -0
  311. data/demo/config/targets/META/cmd_tlm/meta_cmd.txt +10 -0
  312. data/demo/config/targets/META/cmd_tlm/meta_tlm.txt +13 -0
  313. data/demo/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -0
  314. data/demo/config/targets/SYSTEM/cmd_tlm/override.txt +29 -0
  315. data/demo/config/targets/SYSTEM/screens/status.txt +12 -0
  316. data/demo/config/targets/TEMPLATED/cmd_tlm/templated_cmds.txt +12 -0
  317. data/demo/config/targets/TEMPLATED/cmd_tlm/templated_tlm.txt +3 -0
  318. data/demo/config/targets/TEMPLATED/cmd_tlm_server.txt +6 -0
  319. data/demo/config/targets/TEMPLATED/lib/templated_interface.rb +48 -0
  320. data/demo/config/targets/TEMPLATED/target.txt +6 -0
  321. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server.txt +33 -0
  322. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server2.txt +29 -0
  323. data/demo/config/tools/data_viewer/data_viewer.txt +11 -0
  324. data/demo/config/tools/handbook_creator/default_toc.xsl +59 -0
  325. data/demo/config/tools/handbook_creator/handbook_creator.txt +66 -0
  326. data/demo/config/tools/handbook_creator/templates/command_packets.html.erb +86 -0
  327. data/demo/config/tools/handbook_creator/templates/command_toc.html.erb +38 -0
  328. data/demo/config/tools/handbook_creator/templates/footer.html.erb +9 -0
  329. data/demo/config/tools/handbook_creator/templates/header.html.erb +25 -0
  330. data/demo/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -0
  331. data/demo/config/tools/handbook_creator/templates/nav.html.erb +27 -0
  332. data/demo/config/tools/handbook_creator/templates/overview.html.erb +1 -0
  333. data/demo/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -0
  334. data/demo/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -0
  335. data/demo/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -0
  336. data/demo/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -0
  337. data/demo/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -0
  338. data/demo/config/tools/handbook_creator/templates/title.html.erb +1 -0
  339. data/demo/config/tools/launcher/launcher.txt +45 -0
  340. data/demo/config/tools/launcher/launcher2.txt +45 -0
  341. data/demo/config/tools/limits_monitor/README.txt +1 -0
  342. data/demo/config/tools/opengl_builder/README.txt +1 -0
  343. data/demo/config/tools/script_runner/script_runner.txt +3 -0
  344. data/demo/config/tools/table_manager/ConfigTables_def.txt +8 -0
  345. data/demo/config/tools/table_manager/ExampleTableDefinition.txt +24 -0
  346. data/demo/config/tools/table_manager/MCConfigurationTable_fsw1_def.txt +25 -0
  347. data/demo/config/tools/table_manager/MCConfigurationTable_fsw2_def.txt +25 -0
  348. data/demo/config/tools/table_manager/PPSSelectionTable_def.txt +8 -0
  349. data/demo/config/tools/table_manager/TLMMonitoringTable_def.txt +248 -0
  350. data/demo/config/tools/test_runner/test_runner.txt +17 -0
  351. data/demo/config/tools/tlm_extractor/tlm_extractor.txt +13 -0
  352. data/demo/config/tools/tlm_extractor/tlm_extractor2.txt +2 -0
  353. data/demo/config/tools/tlm_extractor/tlm_extractor3.txt +2 -0
  354. data/demo/config/tools/tlm_extractor/tlm_extractor4.txt +2 -0
  355. data/demo/config/tools/tlm_grapher/README.txt +1 -0
  356. data/demo/config/tools/tlm_viewer/tlm_viewer.txt +41 -0
  357. data/demo/lib/example_background_task.rb +52 -0
  358. data/demo/lib/example_target.rb +108 -0
  359. data/demo/lib/scpi_target.rb +74 -0
  360. data/demo/lib/user_version.rb +3 -0
  361. data/demo/outputs/handbooks/assets/css/bootstrap-theme.css +397 -0
  362. data/demo/outputs/handbooks/assets/css/bootstrap-theme.min.css +7 -0
  363. data/demo/outputs/handbooks/assets/css/bootstrap.css +7118 -0
  364. data/demo/outputs/handbooks/assets/css/bootstrap.min.css +7 -0
  365. data/demo/outputs/handbooks/assets/fonts/glyphicons-halflings-regular.eot +0 -0
  366. data/demo/outputs/handbooks/assets/fonts/glyphicons-halflings-regular.svg +229 -0
  367. data/demo/outputs/handbooks/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
  368. data/demo/outputs/handbooks/assets/fonts/glyphicons-halflings-regular.woff +0 -0
  369. data/demo/outputs/handbooks/assets/img/ball_logo.bmp +0 -0
  370. data/demo/outputs/handbooks/assets/img/ball_logo.gif +0 -0
  371. data/demo/outputs/handbooks/assets/img/ball_logo.jpg +0 -0
  372. data/demo/outputs/handbooks/assets/js/bootstrap.js +2006 -0
  373. data/demo/outputs/handbooks/assets/js/bootstrap.min.js +7 -0
  374. data/demo/outputs/handbooks/assets/js/html5shiv.js +8 -0
  375. data/demo/outputs/handbooks/assets/js/jquery-1.10.2.min.js +6 -0
  376. data/demo/outputs/handbooks/assets/js/respond.min.js +6 -0
  377. data/demo/outputs/logs/README.txt +1 -0
  378. data/demo/outputs/saved_config/README.txt +1 -0
  379. data/demo/outputs/tables/README.txt +1 -0
  380. data/demo/outputs/tmp/README.txt +1 -0
  381. data/demo/procedures/checks.rb +11 -0
  382. data/demo/procedures/clear_util.rb +7 -0
  383. data/demo/procedures/collect.rb +18 -0
  384. data/demo/procedures/collect_util.rb +14 -0
  385. data/demo/procedures/cosmos_api_test.rb +293 -0
  386. data/demo/procedures/disconnect.rb +29 -0
  387. data/demo/procedures/example_test.rb +182 -0
  388. data/demo/procedures/plot_test.rb +8 -0
  389. data/demo/procedures/run_example_test.rb +3 -0
  390. data/demo/procedures/test.rb +51 -0
  391. data/demo/tools/CmdExtractor +15 -0
  392. data/demo/tools/CmdExtractor.bat +59 -0
  393. data/demo/tools/CmdSender +15 -0
  394. data/demo/tools/CmdSender.bat +59 -0
  395. data/demo/tools/CmdTlmServer +15 -0
  396. data/demo/tools/CmdTlmServer.bat +59 -0
  397. data/demo/tools/DataViewer +15 -0
  398. data/demo/tools/DataViewer.bat +59 -0
  399. data/demo/tools/ExampleTarget +15 -0
  400. data/demo/tools/ExampleTarget.bat +59 -0
  401. data/demo/tools/HandbookCreator +15 -0
  402. data/demo/tools/HandbookCreator.bat +61 -0
  403. data/demo/tools/Launcher +15 -0
  404. data/demo/tools/Launcher.bat +59 -0
  405. data/demo/tools/LimitsMonitor +15 -0
  406. data/demo/tools/LimitsMonitor.bat +59 -0
  407. data/demo/tools/OpenGLBuilder +15 -0
  408. data/demo/tools/OpenGLBuilder.bat +59 -0
  409. data/demo/tools/PacketViewer +15 -0
  410. data/demo/tools/PacketViewer.bat +59 -0
  411. data/demo/tools/Replay +15 -0
  412. data/demo/tools/Replay.bat +59 -0
  413. data/demo/tools/ScpiTarget +15 -0
  414. data/demo/tools/ScpiTarget.bat +59 -0
  415. data/demo/tools/ScriptRunner +15 -0
  416. data/demo/tools/ScriptRunner.bat +59 -0
  417. data/demo/tools/TableManager +15 -0
  418. data/demo/tools/TableManager.bat +59 -0
  419. data/demo/tools/TestRunner +15 -0
  420. data/demo/tools/TestRunner.bat +59 -0
  421. data/demo/tools/TlmExtractor +15 -0
  422. data/demo/tools/TlmExtractor.bat +59 -0
  423. data/demo/tools/TlmGrapher +15 -0
  424. data/demo/tools/TlmGrapher.bat +59 -0
  425. data/demo/tools/TlmViewer +15 -0
  426. data/demo/tools/TlmViewer.bat +59 -0
  427. data/demo/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -0
  428. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +15 -0
  429. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +6 -0
  430. data/demo/tools/mac/CmdExtractor.app/Contents/Resources/appIcon.icns +0 -0
  431. data/demo/tools/mac/CmdSender.app/Contents/Info.plist +38 -0
  432. data/demo/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +15 -0
  433. data/demo/tools/mac/CmdSender.app/Contents/MacOS/main.sh +6 -0
  434. data/demo/tools/mac/CmdSender.app/Contents/Resources/appIcon.icns +0 -0
  435. data/demo/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -0
  436. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +15 -0
  437. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +6 -0
  438. data/demo/tools/mac/CmdTlmServer.app/Contents/Resources/appIcon.icns +0 -0
  439. data/demo/tools/mac/DataViewer.app/Contents/Info.plist +38 -0
  440. data/demo/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +15 -0
  441. data/demo/tools/mac/DataViewer.app/Contents/MacOS/main.sh +6 -0
  442. data/demo/tools/mac/DataViewer.app/Contents/Resources/appIcon.icns +0 -0
  443. data/demo/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -0
  444. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +15 -0
  445. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +6 -0
  446. data/demo/tools/mac/HandbookCreator.app/Contents/Resources/appIcon.icns +0 -0
  447. data/demo/tools/mac/Launcher.app/Contents/Info.plist +38 -0
  448. data/demo/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +15 -0
  449. data/demo/tools/mac/Launcher.app/Contents/MacOS/main.sh +6 -0
  450. data/demo/tools/mac/Launcher.app/Contents/Resources/appIcon.icns +0 -0
  451. data/demo/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -0
  452. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +15 -0
  453. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +6 -0
  454. data/demo/tools/mac/LimitsMonitor.app/Contents/Resources/appIcon.icns +0 -0
  455. data/demo/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -0
  456. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +15 -0
  457. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +6 -0
  458. data/demo/tools/mac/OpenGLBuilder.app/Contents/Resources/appIcon.icns +0 -0
  459. data/demo/tools/mac/PacketViewer.app/Contents/Info.plist +38 -0
  460. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +15 -0
  461. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +6 -0
  462. data/demo/tools/mac/PacketViewer.app/Contents/Resources/appIcon.icns +0 -0
  463. data/demo/tools/mac/Replay.app/Contents/Info.plist +38 -0
  464. data/demo/tools/mac/Replay.app/Contents/MacOS/Replay.rb +15 -0
  465. data/demo/tools/mac/Replay.app/Contents/MacOS/main.sh +6 -0
  466. data/demo/tools/mac/Replay.app/Contents/Resources/appIcon.icns +0 -0
  467. data/demo/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -0
  468. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +15 -0
  469. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +6 -0
  470. data/demo/tools/mac/ScriptRunner.app/Contents/Resources/appIcon.icns +0 -0
  471. data/demo/tools/mac/TableManager.app/Contents/Info.plist +38 -0
  472. data/demo/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +15 -0
  473. data/demo/tools/mac/TableManager.app/Contents/MacOS/main.sh +6 -0
  474. data/demo/tools/mac/TableManager.app/Contents/Resources/appIcon.icns +0 -0
  475. data/demo/tools/mac/TestRunner.app/Contents/Info.plist +38 -0
  476. data/demo/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +15 -0
  477. data/demo/tools/mac/TestRunner.app/Contents/MacOS/main.sh +6 -0
  478. data/demo/tools/mac/TestRunner.app/Contents/Resources/appIcon.icns +0 -0
  479. data/demo/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -0
  480. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +15 -0
  481. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +6 -0
  482. data/demo/tools/mac/TlmExtractor.app/Contents/Resources/appIcon.icns +0 -0
  483. data/demo/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -0
  484. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +15 -0
  485. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +6 -0
  486. data/demo/tools/mac/TlmGrapher.app/Contents/Resources/appIcon.icns +0 -0
  487. data/demo/tools/mac/TlmViewer.app/Contents/Info.plist +38 -0
  488. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +15 -0
  489. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +6 -0
  490. data/demo/tools/mac/TlmViewer.app/Contents/Resources/appIcon.icns +0 -0
  491. data/demo/userpath.txt +1 -0
  492. data/ext/cosmos/ext/array/array.c +111 -0
  493. data/ext/cosmos/ext/array/extconf.rb +13 -0
  494. data/ext/cosmos/ext/buffered_file/buffered_file.c +167 -0
  495. data/ext/cosmos/ext/buffered_file/extconf.rb +13 -0
  496. data/ext/cosmos/ext/config_parser/config_parser.c +237 -0
  497. data/ext/cosmos/ext/config_parser/extconf.rb +13 -0
  498. data/ext/cosmos/ext/cosmos_io/cosmos_io.c +117 -0
  499. data/ext/cosmos/ext/cosmos_io/extconf.rb +13 -0
  500. data/ext/cosmos/ext/crc/crc.c +341 -0
  501. data/ext/cosmos/ext/crc/extconf.rb +13 -0
  502. data/ext/cosmos/ext/line_graph/extconf.rb +13 -0
  503. data/ext/cosmos/ext/line_graph/line_graph.c +501 -0
  504. data/ext/cosmos/ext/low_fragmentation_array/extconf.rb +13 -0
  505. data/ext/cosmos/ext/low_fragmentation_array/low_fragmentation_array.c +261 -0
  506. data/ext/cosmos/ext/packet/extconf.rb +13 -0
  507. data/ext/cosmos/ext/packet/packet.c +339 -0
  508. data/ext/cosmos/ext/platform/extconf.rb +13 -0
  509. data/ext/cosmos/ext/platform/platform.c +82 -0
  510. data/ext/cosmos/ext/polynomial_conversion/extconf.rb +13 -0
  511. data/ext/cosmos/ext/polynomial_conversion/polynomial_conversion.c +73 -0
  512. data/ext/cosmos/ext/string/extconf.rb +13 -0
  513. data/ext/cosmos/ext/string/string.c +49 -0
  514. data/ext/cosmos/ext/structure/structure.c +894 -0
  515. data/ext/cosmos/ext/tabbed_plots_config/extconf.rb +13 -0
  516. data/ext/cosmos/ext/tabbed_plots_config/tabbed_plots_config.c +51 -0
  517. data/ext/cosmos/ext/telemetry/extconf.rb +13 -0
  518. data/ext/cosmos/ext/telemetry/telemetry.c +306 -0
  519. data/install/Gemfile +5 -0
  520. data/install/Launcher +14 -0
  521. data/install/Launcher.bat +59 -0
  522. data/install/Rakefile +61 -0
  523. data/install/config/data/README.txt +1 -0
  524. data/install/config/data/crc.txt +133 -0
  525. data/install/config/system/system.txt +29 -0
  526. data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -0
  527. data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -0
  528. data/install/config/targets/COSMOS/cmd_tlm_server.txt +6 -0
  529. data/install/config/targets/COSMOS/screens/limits_change.txt +20 -0
  530. data/install/config/targets/COSMOS/screens/version.txt +19 -0
  531. data/install/config/targets/COSMOS/target.txt +9 -0
  532. data/install/config/targets/SYSTEM/README.txt +1 -0
  533. data/install/config/tools/cmd_tlm_server/cmd_tlm_server.txt +2 -0
  534. data/install/config/tools/data_viewer/data_viewer.txt +4 -0
  535. data/install/config/tools/handbook_creator/default_toc.xsl +59 -0
  536. data/install/config/tools/handbook_creator/handbook_creator.txt +49 -0
  537. data/install/config/tools/handbook_creator/templates/command_packets.html.erb +86 -0
  538. data/install/config/tools/handbook_creator/templates/command_toc.html.erb +38 -0
  539. data/install/config/tools/handbook_creator/templates/footer.html.erb +9 -0
  540. data/install/config/tools/handbook_creator/templates/header.html.erb +25 -0
  541. data/install/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -0
  542. data/install/config/tools/handbook_creator/templates/nav.html.erb +27 -0
  543. data/install/config/tools/handbook_creator/templates/overview.html.erb +1 -0
  544. data/install/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -0
  545. data/install/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -0
  546. data/install/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -0
  547. data/install/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -0
  548. data/install/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -0
  549. data/install/config/tools/handbook_creator/templates/title.html.erb +1 -0
  550. data/install/config/tools/launcher/launcher.txt +39 -0
  551. data/install/config/tools/limits_monitor/README.txt +1 -0
  552. data/install/config/tools/opengl_builder/README.txt +1 -0
  553. data/install/config/tools/script_runner/script_runner.txt +3 -0
  554. data/install/config/tools/table_manager/README.txt +1 -0
  555. data/install/config/tools/test_runner/test_runner.txt +8 -0
  556. data/install/config/tools/tlm_extractor/README.txt +1 -0
  557. data/install/config/tools/tlm_grapher/README.txt +1 -0
  558. data/install/config/tools/tlm_viewer/tlm_viewer.txt +5 -0
  559. data/install/lib/user_version.rb +3 -0
  560. data/install/outputs/handbooks/assets/css/bootstrap-theme.css +397 -0
  561. data/install/outputs/handbooks/assets/css/bootstrap-theme.min.css +7 -0
  562. data/install/outputs/handbooks/assets/css/bootstrap.css +7118 -0
  563. data/install/outputs/handbooks/assets/css/bootstrap.min.css +7 -0
  564. data/install/outputs/handbooks/assets/fonts/glyphicons-halflings-regular.eot +0 -0
  565. data/install/outputs/handbooks/assets/fonts/glyphicons-halflings-regular.svg +229 -0
  566. data/install/outputs/handbooks/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
  567. data/install/outputs/handbooks/assets/fonts/glyphicons-halflings-regular.woff +0 -0
  568. data/install/outputs/handbooks/assets/img/ball_logo.bmp +0 -0
  569. data/install/outputs/handbooks/assets/img/ball_logo.gif +0 -0
  570. data/install/outputs/handbooks/assets/img/ball_logo.jpg +0 -0
  571. data/install/outputs/handbooks/assets/js/bootstrap.js +2006 -0
  572. data/install/outputs/handbooks/assets/js/bootstrap.min.js +7 -0
  573. data/install/outputs/handbooks/assets/js/html5shiv.js +8 -0
  574. data/install/outputs/handbooks/assets/js/jquery-1.10.2.min.js +6 -0
  575. data/install/outputs/handbooks/assets/js/respond.min.js +6 -0
  576. data/install/outputs/logs/README.txt +1 -0
  577. data/install/outputs/saved_config/README.txt +1 -0
  578. data/install/outputs/tables/README.txt +1 -0
  579. data/install/outputs/tmp/README.txt +1 -0
  580. data/install/procedures/README.txt +1 -0
  581. data/install/tools/CmdExtractor +15 -0
  582. data/install/tools/CmdExtractor.bat +59 -0
  583. data/install/tools/CmdSender +15 -0
  584. data/install/tools/CmdSender.bat +59 -0
  585. data/install/tools/CmdTlmServer +15 -0
  586. data/install/tools/CmdTlmServer.bat +59 -0
  587. data/install/tools/DataViewer +15 -0
  588. data/install/tools/DataViewer.bat +59 -0
  589. data/install/tools/HandbookCreator +15 -0
  590. data/install/tools/HandbookCreator.bat +61 -0
  591. data/install/tools/Launcher +15 -0
  592. data/install/tools/Launcher.bat +59 -0
  593. data/install/tools/LimitsMonitor +15 -0
  594. data/install/tools/LimitsMonitor.bat +59 -0
  595. data/install/tools/OpenGLBuilder +15 -0
  596. data/install/tools/OpenGLBuilder.bat +59 -0
  597. data/install/tools/PacketViewer +15 -0
  598. data/install/tools/PacketViewer.bat +59 -0
  599. data/install/tools/Replay +15 -0
  600. data/install/tools/Replay.bat +59 -0
  601. data/install/tools/ScriptRunner +15 -0
  602. data/install/tools/ScriptRunner.bat +59 -0
  603. data/install/tools/TableManager +15 -0
  604. data/install/tools/TableManager.bat +59 -0
  605. data/install/tools/TestRunner +15 -0
  606. data/install/tools/TestRunner.bat +59 -0
  607. data/install/tools/TlmExtractor +15 -0
  608. data/install/tools/TlmExtractor.bat +59 -0
  609. data/install/tools/TlmGrapher +15 -0
  610. data/install/tools/TlmGrapher.bat +59 -0
  611. data/install/tools/TlmViewer +15 -0
  612. data/install/tools/TlmViewer.bat +59 -0
  613. data/install/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -0
  614. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +15 -0
  615. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +6 -0
  616. data/install/tools/mac/CmdExtractor.app/Contents/Resources/appIcon.icns +0 -0
  617. data/install/tools/mac/CmdSender.app/Contents/Info.plist +38 -0
  618. data/install/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +15 -0
  619. data/install/tools/mac/CmdSender.app/Contents/MacOS/main.sh +6 -0
  620. data/install/tools/mac/CmdSender.app/Contents/Resources/appIcon.icns +0 -0
  621. data/install/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -0
  622. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +15 -0
  623. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +6 -0
  624. data/install/tools/mac/CmdTlmServer.app/Contents/Resources/appIcon.icns +0 -0
  625. data/install/tools/mac/DataViewer.app/Contents/Info.plist +38 -0
  626. data/install/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +15 -0
  627. data/install/tools/mac/DataViewer.app/Contents/MacOS/main.sh +6 -0
  628. data/install/tools/mac/DataViewer.app/Contents/Resources/appIcon.icns +0 -0
  629. data/install/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -0
  630. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +15 -0
  631. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +6 -0
  632. data/install/tools/mac/HandbookCreator.app/Contents/Resources/appIcon.icns +0 -0
  633. data/install/tools/mac/Launcher.app/Contents/Info.plist +38 -0
  634. data/install/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +15 -0
  635. data/install/tools/mac/Launcher.app/Contents/MacOS/main.sh +6 -0
  636. data/install/tools/mac/Launcher.app/Contents/Resources/appIcon.icns +0 -0
  637. data/install/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -0
  638. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +15 -0
  639. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +6 -0
  640. data/install/tools/mac/LimitsMonitor.app/Contents/Resources/appIcon.icns +0 -0
  641. data/install/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -0
  642. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +15 -0
  643. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +6 -0
  644. data/install/tools/mac/OpenGLBuilder.app/Contents/Resources/appIcon.icns +0 -0
  645. data/install/tools/mac/PacketViewer.app/Contents/Info.plist +38 -0
  646. data/install/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +15 -0
  647. data/install/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +6 -0
  648. data/install/tools/mac/PacketViewer.app/Contents/Resources/appIcon.icns +0 -0
  649. data/install/tools/mac/Replay.app/Contents/Info.plist +38 -0
  650. data/install/tools/mac/Replay.app/Contents/MacOS/Replay.rb +15 -0
  651. data/install/tools/mac/Replay.app/Contents/MacOS/main.sh +6 -0
  652. data/install/tools/mac/Replay.app/Contents/Resources/appIcon.icns +0 -0
  653. data/install/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -0
  654. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +15 -0
  655. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +6 -0
  656. data/install/tools/mac/ScriptRunner.app/Contents/Resources/appIcon.icns +0 -0
  657. data/install/tools/mac/TableManager.app/Contents/Info.plist +38 -0
  658. data/install/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +15 -0
  659. data/install/tools/mac/TableManager.app/Contents/MacOS/main.sh +6 -0
  660. data/install/tools/mac/TableManager.app/Contents/Resources/appIcon.icns +0 -0
  661. data/install/tools/mac/TestRunner.app/Contents/Info.plist +38 -0
  662. data/install/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +15 -0
  663. data/install/tools/mac/TestRunner.app/Contents/MacOS/main.sh +6 -0
  664. data/install/tools/mac/TestRunner.app/Contents/Resources/appIcon.icns +0 -0
  665. data/install/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -0
  666. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +15 -0
  667. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +6 -0
  668. data/install/tools/mac/TlmExtractor.app/Contents/Resources/appIcon.icns +0 -0
  669. data/install/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -0
  670. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +15 -0
  671. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +6 -0
  672. data/install/tools/mac/TlmGrapher.app/Contents/Resources/appIcon.icns +0 -0
  673. data/install/tools/mac/TlmViewer.app/Contents/Info.plist +38 -0
  674. data/install/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +15 -0
  675. data/install/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +6 -0
  676. data/install/tools/mac/TlmViewer.app/Contents/Resources/appIcon.icns +0 -0
  677. data/install/userpath.txt +1 -0
  678. data/lib/cosmos/ccsds/ccsds_packet.rb +63 -0
  679. data/lib/cosmos/ccsds/ccsds_parser.rb +143 -0
  680. data/lib/cosmos/config/config_parser.rb +324 -0
  681. data/lib/cosmos/conversions/conversion.rb +47 -0
  682. data/lib/cosmos/conversions/generic_conversion.rb +55 -0
  683. data/lib/cosmos/conversions/new_packet_log_conversion.rb +45 -0
  684. data/lib/cosmos/conversions/polynomial_conversion.rb +57 -0
  685. data/lib/cosmos/conversions/processor_conversion.rb +46 -0
  686. data/lib/cosmos/conversions/received_count_conversion.rb +33 -0
  687. data/lib/cosmos/conversions/received_time_formatted_conversion.rb +37 -0
  688. data/lib/cosmos/conversions/received_time_seconds_conversion.rb +37 -0
  689. data/lib/cosmos/conversions/segmented_polynomial_conversion.rb +128 -0
  690. data/lib/cosmos/conversions/unix_time_conversion.rb +50 -0
  691. data/lib/cosmos/conversions/unix_time_formatted_conversion.rb +44 -0
  692. data/lib/cosmos/conversions/unix_time_seconds_conversion.rb +44 -0
  693. data/lib/cosmos/conversions.rb +13 -0
  694. data/lib/cosmos/core_ext/array.rb +354 -0
  695. data/lib/cosmos/core_ext/class.rb +51 -0
  696. data/lib/cosmos/core_ext/cosmos_io.rb +29 -0
  697. data/lib/cosmos/core_ext/exception.rb +52 -0
  698. data/lib/cosmos/core_ext/file.rb +75 -0
  699. data/lib/cosmos/core_ext/hash.rb +28 -0
  700. data/lib/cosmos/core_ext/io.rb +75 -0
  701. data/lib/cosmos/core_ext/kernel.rb +38 -0
  702. data/lib/cosmos/core_ext/math.rb +119 -0
  703. data/lib/cosmos/core_ext/matrix.rb +146 -0
  704. data/lib/cosmos/core_ext/objectspace.rb +29 -0
  705. data/lib/cosmos/core_ext/range.rb +22 -0
  706. data/lib/cosmos/core_ext/socket.rb +32 -0
  707. data/lib/cosmos/core_ext/string.rb +310 -0
  708. data/lib/cosmos/core_ext/stringio.rb +24 -0
  709. data/lib/cosmos/core_ext/time.rb +446 -0
  710. data/lib/cosmos/core_ext.rb +18 -0
  711. data/lib/cosmos/ext/.keep +0 -0
  712. data/lib/cosmos/gui/choosers/combobox_chooser.rb +130 -0
  713. data/lib/cosmos/gui/choosers/file_chooser.rb +68 -0
  714. data/lib/cosmos/gui/choosers/float_chooser.rb +82 -0
  715. data/lib/cosmos/gui/choosers/integer_chooser.rb +80 -0
  716. data/lib/cosmos/gui/choosers/string_chooser.rb +53 -0
  717. data/lib/cosmos/gui/choosers/telemetry_chooser.rb +317 -0
  718. data/lib/cosmos/gui/dialogs/about_dialog.rb +128 -0
  719. data/lib/cosmos/gui/dialogs/calendar_dialog.rb +136 -0
  720. data/lib/cosmos/gui/dialogs/cmd_details_dialog.rb +52 -0
  721. data/lib/cosmos/gui/dialogs/cmd_tlm_raw_dialog.rb +149 -0
  722. data/lib/cosmos/gui/dialogs/details_dialog.rb +174 -0
  723. data/lib/cosmos/gui/dialogs/exception_dialog.rb +97 -0
  724. data/lib/cosmos/gui/dialogs/exception_list_dialog.rb +59 -0
  725. data/lib/cosmos/gui/dialogs/find_replace_dialog.rb +196 -0
  726. data/lib/cosmos/gui/dialogs/legal_dialog.rb +168 -0
  727. data/lib/cosmos/gui/dialogs/packet_log_dialog.rb +118 -0
  728. data/lib/cosmos/gui/dialogs/progress_dialog.rb +262 -0
  729. data/lib/cosmos/gui/dialogs/pry_dialog.rb +161 -0
  730. data/lib/cosmos/gui/dialogs/scroll_text_dialog.rb +37 -0
  731. data/lib/cosmos/gui/dialogs/select_dialog.rb +54 -0
  732. data/lib/cosmos/gui/dialogs/set_tlm_dialog.rb +131 -0
  733. data/lib/cosmos/gui/dialogs/splash.rb +113 -0
  734. data/lib/cosmos/gui/dialogs/tlm_details_dialog.rb +206 -0
  735. data/lib/cosmos/gui/dialogs/tlm_edit_dialog.rb +81 -0
  736. data/lib/cosmos/gui/line_graph/line_graph.rb +456 -0
  737. data/lib/cosmos/gui/line_graph/line_graph_dialog.rb +34 -0
  738. data/lib/cosmos/gui/line_graph/line_graph_drawing.rb +494 -0
  739. data/lib/cosmos/gui/line_graph/line_graph_popups.rb +116 -0
  740. data/lib/cosmos/gui/line_graph/line_graph_scaling.rb +460 -0
  741. data/lib/cosmos/gui/line_graph/line_graph_script.rb +26 -0
  742. data/lib/cosmos/gui/line_graph/lines.rb +290 -0
  743. data/lib/cosmos/gui/line_graph/overview_graph.rb +459 -0
  744. data/lib/cosmos/gui/opengl/earth_model.rb +22 -0
  745. data/lib/cosmos/gui/opengl/gl_bounds.rb +67 -0
  746. data/lib/cosmos/gui/opengl/gl_light.rb +39 -0
  747. data/lib/cosmos/gui/opengl/gl_material.rb +29 -0
  748. data/lib/cosmos/gui/opengl/gl_scene.rb +72 -0
  749. data/lib/cosmos/gui/opengl/gl_shape.rb +146 -0
  750. data/lib/cosmos/gui/opengl/gl_viewer.rb +712 -0
  751. data/lib/cosmos/gui/opengl/gl_viewport.rb +35 -0
  752. data/lib/cosmos/gui/opengl/moon_model.rb +22 -0
  753. data/lib/cosmos/gui/opengl/opengl.rb +8 -0
  754. data/lib/cosmos/gui/opengl/stl_reader.rb +211 -0
  755. data/lib/cosmos/gui/opengl/stl_shape.rb +124 -0
  756. data/lib/cosmos/gui/opengl/texture_mapped_sphere.rb +202 -0
  757. data/lib/cosmos/gui/qt.rb +786 -0
  758. data/lib/cosmos/gui/qt_tool.rb +373 -0
  759. data/lib/cosmos/gui/text/completion.rb +381 -0
  760. data/lib/cosmos/gui/text/completion_line_edit.rb +30 -0
  761. data/lib/cosmos/gui/text/completion_text_edit.rb +179 -0
  762. data/lib/cosmos/gui/text/ruby_editor.rb +395 -0
  763. data/lib/cosmos/gui/utilities/screenshot.rb +25 -0
  764. data/lib/cosmos/gui/utilities/script_module_gui.rb +203 -0
  765. data/lib/cosmos/gui/widgets/full_text_search_line_edit.rb +161 -0
  766. data/lib/cosmos/gui/widgets/packet_log_frame.rb +305 -0
  767. data/lib/cosmos/gui/widgets/realtime_button_bar.rb +98 -0
  768. data/lib/cosmos/interfaces/cmd_tlm_server_interface.rb +149 -0
  769. data/lib/cosmos/interfaces/interface.rb +213 -0
  770. data/lib/cosmos/interfaces/linc_interface.rb +360 -0
  771. data/lib/cosmos/interfaces/serial_interface.rb +76 -0
  772. data/lib/cosmos/interfaces/simulated_target_interface.rb +128 -0
  773. data/lib/cosmos/interfaces/stream_interface.rb +156 -0
  774. data/lib/cosmos/interfaces/tcpip_client_interface.rb +60 -0
  775. data/lib/cosmos/interfaces/tcpip_server_interface.rb +154 -0
  776. data/lib/cosmos/interfaces/udp_interface.rb +173 -0
  777. data/lib/cosmos/interfaces.rb +11 -0
  778. data/lib/cosmos/io/buffered_file.rb +11 -0
  779. data/lib/cosmos/io/cosmos_snmp.rb +50 -0
  780. data/lib/cosmos/io/io_multiplexer.rb +89 -0
  781. data/lib/cosmos/io/json_drb.rb +320 -0
  782. data/lib/cosmos/io/json_drb_object.rb +137 -0
  783. data/lib/cosmos/io/json_rpc.rb +365 -0
  784. data/lib/cosmos/io/posix_serial_driver.rb +145 -0
  785. data/lib/cosmos/io/raw_logger.rb +174 -0
  786. data/lib/cosmos/io/raw_logger_pair.rb +71 -0
  787. data/lib/cosmos/io/serial_driver.rb +85 -0
  788. data/lib/cosmos/io/stderr.rb +36 -0
  789. data/lib/cosmos/io/stdout.rb +36 -0
  790. data/lib/cosmos/io/tcpip_server.rb +532 -0
  791. data/lib/cosmos/io/udp_sockets.rb +152 -0
  792. data/lib/cosmos/io/win32_serial_driver.rb +147 -0
  793. data/lib/cosmos/packet_logs/meta_packet_log_writer.rb +107 -0
  794. data/lib/cosmos/packet_logs/packet_log_reader.rb +439 -0
  795. data/lib/cosmos/packet_logs/packet_log_writer.rb +309 -0
  796. data/lib/cosmos/packet_logs/packet_log_writer_pair.rb +30 -0
  797. data/lib/cosmos/packet_logs.rb +6 -0
  798. data/lib/cosmos/packets/binary_accessor.rb +921 -0
  799. data/lib/cosmos/packets/commands.rb +291 -0
  800. data/lib/cosmos/packets/limits.rb +263 -0
  801. data/lib/cosmos/packets/limits_response.rb +38 -0
  802. data/lib/cosmos/packets/packet.rb +699 -0
  803. data/lib/cosmos/packets/packet_config.rb +1034 -0
  804. data/lib/cosmos/packets/packet_item.rb +317 -0
  805. data/lib/cosmos/packets/packet_item_limits.rb +128 -0
  806. data/lib/cosmos/packets/structure.rb +386 -0
  807. data/lib/cosmos/packets/structure_item.rb +233 -0
  808. data/lib/cosmos/packets/telemetry.rb +317 -0
  809. data/lib/cosmos/processors/new_packet_log_processor.rb +34 -0
  810. data/lib/cosmos/processors/processor.rb +71 -0
  811. data/lib/cosmos/processors/statistics_processor.rb +65 -0
  812. data/lib/cosmos/processors/watermark_processor.rb +44 -0
  813. data/lib/cosmos/processors.rb +6 -0
  814. data/lib/cosmos/script/extract.rb +115 -0
  815. data/lib/cosmos/script/script.rb +1493 -0
  816. data/lib/cosmos/script.rb +9 -0
  817. data/lib/cosmos/streams/burst_stream_protocol.rb +25 -0
  818. data/lib/cosmos/streams/fixed_stream_protocol.rb +111 -0
  819. data/lib/cosmos/streams/length_stream_protocol.rb +140 -0
  820. data/lib/cosmos/streams/preidentified_stream_protocol.rb +118 -0
  821. data/lib/cosmos/streams/serial_stream.rb +143 -0
  822. data/lib/cosmos/streams/stream.rb +57 -0
  823. data/lib/cosmos/streams/stream_protocol.rb +369 -0
  824. data/lib/cosmos/streams/tcpip_client_stream.rb +77 -0
  825. data/lib/cosmos/streams/tcpip_socket_stream.rb +139 -0
  826. data/lib/cosmos/streams/template_stream_protocol.rb +140 -0
  827. data/lib/cosmos/streams/terminated_stream_protocol.rb +81 -0
  828. data/lib/cosmos/system/system.rb +558 -0
  829. data/lib/cosmos/system/target.rb +178 -0
  830. data/lib/cosmos/system.rb +4 -0
  831. data/lib/cosmos/tools/cmd_extractor/cmd_extractor.rb +253 -0
  832. data/lib/cosmos/tools/cmd_sender/cmd_sender.rb +716 -0
  833. data/lib/cosmos/tools/cmd_sender/cmd_sender_item_delegate.rb +77 -0
  834. data/lib/cosmos/tools/cmd_sender/cmd_sender_text_edit.rb +70 -0
  835. data/lib/cosmos/tools/cmd_tlm_server/api.rb +940 -0
  836. data/lib/cosmos/tools/cmd_tlm_server/background_task.rb +46 -0
  837. data/lib/cosmos/tools/cmd_tlm_server/background_tasks.rb +63 -0
  838. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +496 -0
  839. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_config.rb +241 -0
  840. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +1008 -0
  841. data/lib/cosmos/tools/cmd_tlm_server/commanding.rb +112 -0
  842. data/lib/cosmos/tools/cmd_tlm_server/connections.rb +176 -0
  843. data/lib/cosmos/tools/cmd_tlm_server/interface_thread.rb +221 -0
  844. data/lib/cosmos/tools/cmd_tlm_server/interfaces.rb +127 -0
  845. data/lib/cosmos/tools/cmd_tlm_server/packet_logging.rb +132 -0
  846. data/lib/cosmos/tools/cmd_tlm_server/router_thread.rb +66 -0
  847. data/lib/cosmos/tools/cmd_tlm_server/routers.rb +97 -0
  848. data/lib/cosmos/tools/data_viewer/data_viewer.rb +600 -0
  849. data/lib/cosmos/tools/data_viewer/data_viewer_component.rb +167 -0
  850. data/lib/cosmos/tools/data_viewer/dump_component.rb +40 -0
  851. data/lib/cosmos/tools/handbook_creator/handbook_creator.rb +149 -0
  852. data/lib/cosmos/tools/handbook_creator/handbook_creator_config.rb +360 -0
  853. data/lib/cosmos/tools/launcher/launcher.rb +184 -0
  854. data/lib/cosmos/tools/launcher/launcher_config.rb +167 -0
  855. data/lib/cosmos/tools/launcher/launcher_multitool.rb +41 -0
  856. data/lib/cosmos/tools/launcher/launcher_tool.rb +104 -0
  857. data/lib/cosmos/tools/limits_monitor/limits_monitor.rb +768 -0
  858. data/lib/cosmos/tools/opengl_builder/opengl_builder.rb +416 -0
  859. data/lib/cosmos/tools/opengl_builder/scene_config.rb +118 -0
  860. data/lib/cosmos/tools/packet_viewer/packet_viewer.rb +525 -0
  861. data/lib/cosmos/tools/replay/replay.rb +488 -0
  862. data/lib/cosmos/tools/replay/replay_server.rb +91 -0
  863. data/lib/cosmos/tools/script_runner/script_audit.rb +139 -0
  864. data/lib/cosmos/tools/script_runner/script_runner.rb +914 -0
  865. data/lib/cosmos/tools/script_runner/script_runner_config.rb +40 -0
  866. data/lib/cosmos/tools/script_runner/script_runner_frame.rb +1859 -0
  867. data/lib/cosmos/tools/table_manager/table.rb +70 -0
  868. data/lib/cosmos/tools/table_manager/table_config.rb +764 -0
  869. data/lib/cosmos/tools/table_manager/table_item.rb +74 -0
  870. data/lib/cosmos/tools/table_manager/table_manager.rb +1065 -0
  871. data/lib/cosmos/tools/table_manager/table_manager_core.rb +539 -0
  872. data/lib/cosmos/tools/test_runner/results_writer.rb +283 -0
  873. data/lib/cosmos/tools/test_runner/test.rb +480 -0
  874. data/lib/cosmos/tools/test_runner/test_runner.rb +1157 -0
  875. data/lib/cosmos/tools/test_runner/test_runner_chooser.rb +338 -0
  876. data/lib/cosmos/tools/tlm_extractor/text_item_chooser.rb +60 -0
  877. data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +1008 -0
  878. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_config.rb +371 -0
  879. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_processor.rb +60 -0
  880. data/lib/cosmos/tools/tlm_grapher/data_object_adders/housekeeping_data_object_adder.rb +75 -0
  881. data/lib/cosmos/tools/tlm_grapher/data_object_adders/singlexy_data_object_adder.rb +44 -0
  882. data/lib/cosmos/tools/tlm_grapher/data_object_adders/xy_data_object_adder.rb +94 -0
  883. data/lib/cosmos/tools/tlm_grapher/data_object_editors/data_object_editor.rb +61 -0
  884. data/lib/cosmos/tools/tlm_grapher/data_object_editors/housekeeping_data_object_editor.rb +180 -0
  885. data/lib/cosmos/tools/tlm_grapher/data_object_editors/linegraph_data_object_editor.rb +141 -0
  886. data/lib/cosmos/tools/tlm_grapher/data_object_editors/singlexy_data_object_editor.rb +30 -0
  887. data/lib/cosmos/tools/tlm_grapher/data_object_editors/xy_data_object_editor.rb +173 -0
  888. data/lib/cosmos/tools/tlm_grapher/data_objects/data_object.rb +177 -0
  889. data/lib/cosmos/tools/tlm_grapher/data_objects/housekeeping_data_object.rb +409 -0
  890. data/lib/cosmos/tools/tlm_grapher/data_objects/linegraph_data_object.rb +176 -0
  891. data/lib/cosmos/tools/tlm_grapher/data_objects/singlexy_data_object.rb +25 -0
  892. data/lib/cosmos/tools/tlm_grapher/data_objects/xy_data_object.rb +320 -0
  893. data/lib/cosmos/tools/tlm_grapher/plot_editors/linegraph_plot_editor.rb +181 -0
  894. data/lib/cosmos/tools/tlm_grapher/plot_editors/plot_editor.rb +28 -0
  895. data/lib/cosmos/tools/tlm_grapher/plot_editors/singlexy_plot_editor.rb +30 -0
  896. data/lib/cosmos/tools/tlm_grapher/plot_editors/xy_plot_editor.rb +59 -0
  897. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/linegraph_plot_gui_object.rb +172 -0
  898. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/singlexy_plot_gui_object.rb +27 -0
  899. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/xy_plot_gui_object.rb +74 -0
  900. data/lib/cosmos/tools/tlm_grapher/plots/linegraph_plot.rb +201 -0
  901. data/lib/cosmos/tools/tlm_grapher/plots/plot.rb +69 -0
  902. data/lib/cosmos/tools/tlm_grapher/plots/singlexy_plot.rb +20 -0
  903. data/lib/cosmos/tools/tlm_grapher/plots/xy_plot.rb +61 -0
  904. data/lib/cosmos/tools/tlm_grapher/tabbed_plots/overview_tabbed_plots.rb +1278 -0
  905. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_config.rb +430 -0
  906. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_data_object_editor.rb +107 -0
  907. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_logfile_thread.rb +95 -0
  908. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_plot_editor.rb +101 -0
  909. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_realtime_thread.rb +66 -0
  910. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tab.rb +57 -0
  911. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tool.rb +1004 -0
  912. data/lib/cosmos/tools/tlm_grapher/tlm_grapher.rb +87 -0
  913. data/lib/cosmos/tools/tlm_viewer/screen.rb +458 -0
  914. data/lib/cosmos/tools/tlm_viewer/tlm_viewer.rb +544 -0
  915. data/lib/cosmos/tools/tlm_viewer/tlm_viewer_config.rb +287 -0
  916. data/lib/cosmos/tools/tlm_viewer/widgets/aging_widget.rb +110 -0
  917. data/lib/cosmos/tools/tlm_viewer/widgets/array_widget.rb +70 -0
  918. data/lib/cosmos/tools/tlm_viewer/widgets/block_widget.rb +61 -0
  919. data/lib/cosmos/tools/tlm_viewer/widgets/button_widget.rb +39 -0
  920. data/lib/cosmos/tools/tlm_viewer/widgets/canvas_widget.rb +62 -0
  921. data/lib/cosmos/tools/tlm_viewer/widgets/canvasimage_widget.rb +41 -0
  922. data/lib/cosmos/tools/tlm_viewer/widgets/canvasimagevalue_widget.rb +57 -0
  923. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabel_widget.rb +37 -0
  924. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabelvalue_widget.rb +56 -0
  925. data/lib/cosmos/tools/tlm_viewer/widgets/canvasline_widget.rb +55 -0
  926. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslinevalue_widget.rb +66 -0
  927. data/lib/cosmos/tools/tlm_viewer/widgets/canvasvalue_widget.rb +124 -0
  928. data/lib/cosmos/tools/tlm_viewer/widgets/checkbutton_widget.rb +31 -0
  929. data/lib/cosmos/tools/tlm_viewer/widgets/combobox_widget.rb +30 -0
  930. data/lib/cosmos/tools/tlm_viewer/widgets/formatfontvalue_widget.rb +36 -0
  931. data/lib/cosmos/tools/tlm_viewer/widgets/formatvalue_widget.rb +35 -0
  932. data/lib/cosmos/tools/tlm_viewer/widgets/horizontal_widget.rb +27 -0
  933. data/lib/cosmos/tools/tlm_viewer/widgets/horizontalbox_widget.rb +31 -0
  934. data/lib/cosmos/tools/tlm_viewer/widgets/horizontalline_widget.rb +26 -0
  935. data/lib/cosmos/tools/tlm_viewer/widgets/label_widget.rb +29 -0
  936. data/lib/cosmos/tools/tlm_viewer/widgets/labelformatvalue_widget.rb +39 -0
  937. data/lib/cosmos/tools/tlm_viewer/widgets/labelprogressbar_widget.rb +38 -0
  938. data/lib/cosmos/tools/tlm_viewer/widgets/labeltrendlimitsbar_widget.rb +38 -0
  939. data/lib/cosmos/tools/tlm_viewer/widgets/labelvalue_widget.rb +39 -0
  940. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluedesc_widget.rb +42 -0
  941. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluelimitsbar_widget.rb +37 -0
  942. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluerangebar_widget.rb +37 -0
  943. data/lib/cosmos/tools/tlm_viewer/widgets/layout_widget.rb +34 -0
  944. data/lib/cosmos/tools/tlm_viewer/widgets/limitsbar_widget.rb +178 -0
  945. data/lib/cosmos/tools/tlm_viewer/widgets/linegraph_widget.rb +54 -0
  946. data/lib/cosmos/tools/tlm_viewer/widgets/matrixbycolumns_widget.rb +47 -0
  947. data/lib/cosmos/tools/tlm_viewer/widgets/multi_widget.rb +116 -0
  948. data/lib/cosmos/tools/tlm_viewer/widgets/progressbar_widget.rb +34 -0
  949. data/lib/cosmos/tools/tlm_viewer/widgets/radiobutton_widget.rb +30 -0
  950. data/lib/cosmos/tools/tlm_viewer/widgets/rangebar_widget.rb +57 -0
  951. data/lib/cosmos/tools/tlm_viewer/widgets/screenshotbutton_widget.rb +34 -0
  952. data/lib/cosmos/tools/tlm_viewer/widgets/scrollwindow_widget.rb +35 -0
  953. data/lib/cosmos/tools/tlm_viewer/widgets/sectionheader_widget.rb +33 -0
  954. data/lib/cosmos/tools/tlm_viewer/widgets/tabbook_widget.rb +26 -0
  955. data/lib/cosmos/tools/tlm_viewer/widgets/tabitem_widget.rb +28 -0
  956. data/lib/cosmos/tools/tlm_viewer/widgets/textbox_widget.rb +47 -0
  957. data/lib/cosmos/tools/tlm_viewer/widgets/textfield_widget.rb +26 -0
  958. data/lib/cosmos/tools/tlm_viewer/widgets/timegraph_widget.rb +88 -0
  959. data/lib/cosmos/tools/tlm_viewer/widgets/title_widget.rb +27 -0
  960. data/lib/cosmos/tools/tlm_viewer/widgets/trendbar_widget.rb +130 -0
  961. data/lib/cosmos/tools/tlm_viewer/widgets/trendlimitsbar_widget.rb +46 -0
  962. data/lib/cosmos/tools/tlm_viewer/widgets/value_widget.rb +43 -0
  963. data/lib/cosmos/tools/tlm_viewer/widgets/valuelimitsbar_widget.rb +37 -0
  964. data/lib/cosmos/tools/tlm_viewer/widgets/valuerangebar_widget.rb +37 -0
  965. data/lib/cosmos/tools/tlm_viewer/widgets/vertical_widget.rb +35 -0
  966. data/lib/cosmos/tools/tlm_viewer/widgets/verticalbox_widget.rb +37 -0
  967. data/lib/cosmos/tools/tlm_viewer/widgets/widget.rb +257 -0
  968. data/lib/cosmos/tools/tlm_viewer/widgets.rb +53 -0
  969. data/lib/cosmos/top_level.rb +596 -0
  970. data/lib/cosmos/utilities/crc.rb +166 -0
  971. data/lib/cosmos/utilities/csv.rb +83 -0
  972. data/lib/cosmos/utilities/logger.rb +137 -0
  973. data/lib/cosmos/utilities/low_fragmentation_array.rb +11 -0
  974. data/lib/cosmos/utilities/message_log.rb +74 -0
  975. data/lib/cosmos/utilities/quaternion.rb +258 -0
  976. data/lib/cosmos/utilities/ruby_lex_utils.rb +313 -0
  977. data/lib/cosmos/utilities/simulated_target.rb +99 -0
  978. data/lib/cosmos/utilities.rb +10 -0
  979. data/lib/cosmos/version.rb +12 -0
  980. data/lib/cosmos/win32/excel.rb +66 -0
  981. data/lib/cosmos/win32/win32.rb +387 -0
  982. data/lib/cosmos/win32/win32_main.rb +311 -0
  983. data/lib/cosmos.rb +63 -0
  984. data/roodi.yml +24 -0
  985. data/run_gui_tests.bat +32 -0
  986. data/spec/ccsds/ccsds_packet_spec.rb +67 -0
  987. data/spec/ccsds/ccsds_parser_spec.rb +148 -0
  988. data/spec/config/config_parser_spec.rb +322 -0
  989. data/spec/conversions/conversion_spec.rb +31 -0
  990. data/spec/conversions/generic_conversion_spec.rb +45 -0
  991. data/spec/conversions/new_packet_log_conversion_spec.rb +39 -0
  992. data/spec/conversions/polynomial_conversion_spec.rb +40 -0
  993. data/spec/conversions/processor_conversion_spec.rb +45 -0
  994. data/spec/conversions/received_count_conversion_spec.rb +43 -0
  995. data/spec/conversions/received_time_formatted_conversion_spec.rb +49 -0
  996. data/spec/conversions/received_time_seconds_conversion_spec.rb +50 -0
  997. data/spec/conversions/segmented_polynomial_conversion_spec.rb +51 -0
  998. data/spec/conversions/unix_time_formatted_conversion_spec.rb +74 -0
  999. data/spec/conversions/unix_time_seconds_conversion_spec.rb +76 -0
  1000. data/spec/core_ext/array_spec.rb +186 -0
  1001. data/spec/core_ext/class_spec.rb +36 -0
  1002. data/spec/core_ext/cosmos_io_spec.rb +77 -0
  1003. data/spec/core_ext/exception_spec.rb +91 -0
  1004. data/spec/core_ext/file_spec.rb +72 -0
  1005. data/spec/core_ext/hash_spec.rb +24 -0
  1006. data/spec/core_ext/io_spec.rb +46 -0
  1007. data/spec/core_ext/kernel_spec.rb +54 -0
  1008. data/spec/core_ext/math_spec.rb +116 -0
  1009. data/spec/core_ext/matrix_spec.rb +66 -0
  1010. data/spec/core_ext/objectspace_spec.rb +29 -0
  1011. data/spec/core_ext/range_spec.rb +21 -0
  1012. data/spec/core_ext/socket_spec.rb +32 -0
  1013. data/spec/core_ext/string_spec.rb +223 -0
  1014. data/spec/core_ext/stringio_spec.rb +21 -0
  1015. data/spec/core_ext/time_spec.rb +151 -0
  1016. data/spec/gui/line_graph/line_clip_spec.rb +322 -0
  1017. data/spec/install/config/system/system.txt +33 -0
  1018. data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -0
  1019. data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -0
  1020. data/spec/install/config/targets/COSMOS/cmd_tlm_server.txt +6 -0
  1021. data/spec/install/config/targets/COSMOS/screens/limits_change.txt +20 -0
  1022. data/spec/install/config/targets/COSMOS/screens/version.txt +19 -0
  1023. data/spec/install/config/targets/COSMOS/target.txt +5 -0
  1024. data/spec/install/config/targets/INST/cmd_tlm/inst_cmd_linc.txt +30 -0
  1025. data/spec/install/config/targets/INST/cmd_tlm/inst_cmds.txt +111 -0
  1026. data/spec/install/config/targets/INST/cmd_tlm/inst_tlm.txt +236 -0
  1027. data/spec/install/config/targets/INST/cmd_tlm/inst_tlm_linc.txt +25 -0
  1028. data/spec/install/config/targets/INST/cmd_tlm_server.txt +5 -0
  1029. data/spec/install/config/targets/INST/lib/sim_inst.rb +294 -0
  1030. data/spec/install/config/targets/INST/target.txt +10 -0
  1031. data/spec/install/config/targets/META/cmd_tlm/meta_cmd.txt +4 -0
  1032. data/spec/install/config/targets/META/cmd_tlm/meta_tlm.txt +4 -0
  1033. data/spec/install/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -0
  1034. data/spec/install/config/tools/cmd_tlm_server/cmd_tlm_server.txt +1 -0
  1035. data/spec/install/lib/README.txt +1 -0
  1036. data/spec/install/userpath.txt +1 -0
  1037. data/spec/interfaces/cmd_tlm_server_interface_spec.rb +150 -0
  1038. data/spec/interfaces/interface_spec.rb +128 -0
  1039. data/spec/interfaces/linc_interface_spec.rb +199 -0
  1040. data/spec/interfaces/serial_interface_spec.rb +56 -0
  1041. data/spec/interfaces/simulated_target_interface_spec.rb +128 -0
  1042. data/spec/interfaces/stream_interface_spec.rb +157 -0
  1043. data/spec/interfaces/tcpip_client_interface_spec.rb +54 -0
  1044. data/spec/interfaces/tcpip_server_interface_spec.rb +151 -0
  1045. data/spec/interfaces/udp_interface_spec.rb +175 -0
  1046. data/spec/io/buffered_file_spec.rb +113 -0
  1047. data/spec/io/io_multiplexer_spec.rb +94 -0
  1048. data/spec/io/json_drb_object_spec.rb +93 -0
  1049. data/spec/io/json_drb_spec.rb +293 -0
  1050. data/spec/io/json_rpc_spec.rb +264 -0
  1051. data/spec/io/raw_logger_pair_spec.rb +76 -0
  1052. data/spec/io/raw_logger_spec.rb +133 -0
  1053. data/spec/io/serial_driver_spec.rb +61 -0
  1054. data/spec/io/stderr_spec.rb +32 -0
  1055. data/spec/io/stdout_spec.rb +32 -0
  1056. data/spec/io/tcpip_server_spec.rb +322 -0
  1057. data/spec/io/udp_sockets_spec.rb +94 -0
  1058. data/spec/io/win32_serial_driver_spec.rb +88 -0
  1059. data/spec/packet_logs/meta_packet_log_writer_spec.rb +170 -0
  1060. data/spec/packet_logs/packet_log_reader_spec.rb +408 -0
  1061. data/spec/packet_logs/packet_log_writer_pair_spec.rb +30 -0
  1062. data/spec/packet_logs/packet_log_writer_spec.rb +209 -0
  1063. data/spec/packets/binary_accessor_spec.rb +2073 -0
  1064. data/spec/packets/commands_spec.rb +369 -0
  1065. data/spec/packets/limits_response_spec.rb +25 -0
  1066. data/spec/packets/limits_spec.rb +326 -0
  1067. data/spec/packets/packet_config_spec.rb +1620 -0
  1068. data/spec/packets/packet_item_limits_spec.rb +161 -0
  1069. data/spec/packets/packet_item_spec.rb +386 -0
  1070. data/spec/packets/packet_spec.rb +949 -0
  1071. data/spec/packets/structure_item_spec.rb +195 -0
  1072. data/spec/packets/structure_spec.rb +419 -0
  1073. data/spec/packets/telemetry_spec.rb +535 -0
  1074. data/spec/processors/new_packet_log_processor_spec.rb +39 -0
  1075. data/spec/processors/processor_spec.rb +55 -0
  1076. data/spec/processors/statistics_processor_spec.rb +60 -0
  1077. data/spec/processors/watermark_processor_spec.rb +51 -0
  1078. data/spec/script/script_spec.rb +650 -0
  1079. data/spec/spec_helper.rb +138 -0
  1080. data/spec/streams/burst_stream_protocol_spec.rb +32 -0
  1081. data/spec/streams/fixed_stream_protocol_spec.rb +110 -0
  1082. data/spec/streams/length_stream_protocol_spec.rb +297 -0
  1083. data/spec/streams/preidentified_stream_protocol_spec.rb +118 -0
  1084. data/spec/streams/serial_stream_spec.rb +105 -0
  1085. data/spec/streams/stream_protocol_spec.rb +332 -0
  1086. data/spec/streams/stream_spec.rb +29 -0
  1087. data/spec/streams/tcpip_client_stream_spec.rb +54 -0
  1088. data/spec/streams/tcpip_socket_stream_spec.rb +146 -0
  1089. data/spec/streams/template_stream_protocol_spec.rb +151 -0
  1090. data/spec/streams/terminated_stream_protocol_spec.rb +123 -0
  1091. data/spec/system/system_spec.rb +645 -0
  1092. data/spec/system/target_spec.rb +248 -0
  1093. data/spec/tools/cmd_tlm_server/api_spec.rb +1090 -0
  1094. data/spec/tools/cmd_tlm_server/background_task_spec.rb +32 -0
  1095. data/spec/tools/cmd_tlm_server/background_tasks_spec.rb +82 -0
  1096. data/spec/tools/cmd_tlm_server/cmd_tlm_server_config_spec.rb +406 -0
  1097. data/spec/tools/cmd_tlm_server/cmd_tlm_server_spec.rb +418 -0
  1098. data/spec/tools/cmd_tlm_server/commanding_spec.rb +123 -0
  1099. data/spec/tools/cmd_tlm_server/connections_spec.rb +147 -0
  1100. data/spec/tools/cmd_tlm_server/interface_thread_spec.rb +317 -0
  1101. data/spec/tools/cmd_tlm_server/interfaces_spec.rb +228 -0
  1102. data/spec/tools/cmd_tlm_server/packet_logging_spec.rb +143 -0
  1103. data/spec/tools/cmd_tlm_server/router_thread_spec.rb +104 -0
  1104. data/spec/tools/cmd_tlm_server/routers_spec.rb +196 -0
  1105. data/spec/top_level/top_level_spec.rb +320 -0
  1106. data/spec/utilities/crc_spec.rb +45 -0
  1107. data/spec/utilities/csv_spec.rb +97 -0
  1108. data/spec/utilities/logger_spec.rb +102 -0
  1109. data/spec/utilities/message_log_spec.rb +89 -0
  1110. data/spec/utilities/quaternion_spec.rb +107 -0
  1111. data/spec/utilities/ruby_lex_utils_spec.rb +86 -0
  1112. data/tasks/manifest.rake +22 -0
  1113. data/tasks/spec.rake +23 -0
  1114. metadata +1566 -0
@@ -0,0 +1,1620 @@
1
+ # encoding: ascii-8bit
2
+
3
+ # Copyright 2014 Ball Aerospace & Technologies Corp.
4
+ # All Rights Reserved.
5
+ #
6
+ # This program is free software; you can modify and/or redistribute it
7
+ # under the terms of the GNU General Public License
8
+ # as published by the Free Software Foundation; version 3 with
9
+ # attribution addendums as found in the LICENSE.txt
10
+
11
+ require 'spec_helper'
12
+ require 'cosmos'
13
+ require 'cosmos/packets/packet_config'
14
+ require 'tempfile'
15
+
16
+ module Cosmos
17
+
18
+ describe PacketConfig do
19
+
20
+ describe "process_file" do
21
+ before(:each) do
22
+ @pc = PacketConfig.new
23
+ end
24
+
25
+ it "should complain about unknown keywords" do
26
+ tf = Tempfile.new('unittest')
27
+ tf.puts("BLAH")
28
+ tf.close
29
+ expect { @pc.process_file(tf.path, 'SYSTEM') }.to raise_error(ConfigParser::Error, "Unknown keyword 'BLAH'")
30
+ tf.unlink
31
+ end
32
+
33
+ it "should complain about overlapping items" do
34
+ tf = Tempfile.new('unittest')
35
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Description"'
36
+ tf.puts ' ITEM item1 0 8 UINT'
37
+ tf.puts ' ITEM item2 0 8 UINT'
38
+ tf.close
39
+ @pc.process_file(tf.path, "TGT1")
40
+ @pc.warnings[0].should eql "Bit definition overlap at bit offset 0 for Telemetry packet TGT1 PKT1 items ITEM2 and ITEM1"
41
+ tf.unlink
42
+ end
43
+
44
+ it "should not complain with non-overlapping negative offsets" do
45
+ tf = Tempfile.new('unittest')
46
+ tf.puts 'TELEMETRY tgt1 pkt2 LITTLE_ENDIAN "Description"'
47
+ tf.puts ' ITEM item1 0 8 UINT'
48
+ tf.puts ' ITEM item2 8 -16 BLOCK'
49
+ tf.puts ' ITEM item3 -16 16 UINT'
50
+ tf.close
51
+ @pc.process_file(tf.path, "TGT1")
52
+ @pc.warnings[0].should be_nil
53
+ tf.unlink
54
+ end
55
+
56
+ it "should complain with overlapping negative offsets" do
57
+ tf = Tempfile.new('unittest')
58
+ tf.puts 'TELEMETRY tgt1 pkt2 LITTLE_ENDIAN "Description"'
59
+ tf.puts ' ITEM item1 0 8 UINT'
60
+ tf.puts ' ITEM item2 8 -16 BLOCK'
61
+ tf.puts ' ITEM item3 -17 16 UINT'
62
+ tf.close
63
+ @pc.process_file(tf.path, "TGT1")
64
+ @pc.warnings[0].should eql "Bit definition overlap at bit offset -17 for Telemetry packet TGT1 PKT2 items ITEM3 and ITEM2"
65
+ tf.unlink
66
+ end
67
+
68
+ it "should complain about intersecting items" do
69
+ tf = Tempfile.new('unittest')
70
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Description"'
71
+ tf.puts ' ITEM item1 0 32 UINT'
72
+ tf.puts ' ITEM item2 16 32 UINT'
73
+ tf.close
74
+ @pc.process_file(tf.path, "TGT1")
75
+ @pc.warnings[0].should eql "Bit definition overlap at bit offset 16 for Telemetry packet TGT1 PKT1 items ITEM2 and ITEM1"
76
+ tf.unlink
77
+ end
78
+
79
+ it "should complain about array overlapping items" do
80
+ tf = Tempfile.new('unittest')
81
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Description"'
82
+ tf.puts ' ARRAY_ITEM item1 0 8 UINT 32'
83
+ tf.puts ' ARRAY_ITEM item2 0 8 UINT 32'
84
+ tf.close
85
+ @pc.process_file(tf.path, "TGT1")
86
+ @pc.warnings[0].should eql "Bit definition overlap at bit offset 0 for Telemetry packet TGT1 PKT1 items ITEM2 and ITEM1"
87
+ tf.unlink
88
+ end
89
+
90
+ it "should not complain with array non-overlapping negative offsets" do
91
+ tf = Tempfile.new('unittest')
92
+ tf.puts 'TELEMETRY tgt1 pkt2 LITTLE_ENDIAN "Description"'
93
+ tf.puts ' ITEM item1 0 8 UINT'
94
+ tf.puts ' ARRAY_ITEM item2 8 8 INT -16'
95
+ tf.puts ' ITEM item3 -16 16 UINT'
96
+ tf.close
97
+ @pc.process_file(tf.path, "TGT1")
98
+ @pc.warnings[0].should be_nil
99
+ tf.unlink
100
+ end
101
+
102
+ it "should complain with array overlapping negative offsets" do
103
+ tf = Tempfile.new('unittest')
104
+ tf.puts 'TELEMETRY tgt1 pkt2 LITTLE_ENDIAN "Description"'
105
+ tf.puts ' ITEM item1 0 8 UINT'
106
+ tf.puts ' ARRAY_ITEM item2 8 8 INT -16'
107
+ tf.puts ' ITEM item3 -17 16 UINT'
108
+ tf.close
109
+ @pc.process_file(tf.path, "TGT1")
110
+ @pc.warnings[0].should eql "Bit definition overlap at bit offset -17 for Telemetry packet TGT1 PKT2 items ITEM3 and ITEM2"
111
+ tf.unlink
112
+ end
113
+
114
+ it "should complain about array intersecting items" do
115
+ tf = Tempfile.new('unittest')
116
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Description"'
117
+ tf.puts ' ARRAY_ITEM item1 0 8 UINT 32'
118
+ tf.puts ' ARRAY_ITEM item2 16 8 UINT 32'
119
+ tf.close
120
+ @pc.process_file(tf.path, "TGT1")
121
+ @pc.warnings[0].should eql "Bit definition overlap at bit offset 16 for Telemetry packet TGT1 PKT1 items ITEM2 and ITEM1"
122
+ tf.unlink
123
+ end
124
+
125
+ it "should not complain about nonoverlapping little endian bitfields" do
126
+ tf = Tempfile.new('unittest')
127
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Description"'
128
+ tf.puts ' ITEM item1 12 12 UINT'
129
+ tf.puts ' ITEM item2 16 16 UINT'
130
+ tf.close
131
+ @pc.process_file(tf.path, "TGT1")
132
+ @pc.warnings[0].should be_nil
133
+ tf.unlink
134
+ end
135
+
136
+ context "with all telemetry keywords" do
137
+ before(:all) do
138
+ # top level keywords
139
+ @top_keywords = %w(TELEMETRY SELECT_TELEMETRY LIMITS_GROUP LIMITS_GROUP_ITEM)
140
+ # Keywords that require a current packet from TELEMETRY keyword
141
+ @tlm_keywords = %w(SELECT_ITEM ITEM ID_ITEM ARRAY_ITEM APPEND_ITEM APPEND_ID_ITEM APPEND_ARRAY_ITEM MACRO_APPEND_START MACRO_APPEND_END PROCESSOR META)
142
+ # Keywords that require both a current packet and current item
143
+ @item_keywords = %w(STATE READ_CONVERSION WRITE_CONVERSION POLY_READ_CONVERSION POLY_WRITE_CONVERSION SEG_POLY_READ_CONVERSION SEG_POLY_WRITE_CONVERSION GENERIC_READ_CONVERSION_START GENERIC_WRITE_CONVERSION_START LIMITS LIMITS_RESPONSE UNITS FORMAT_STRING DESCRIPTION META)
144
+ end
145
+
146
+ it "should complain if a current packet is not defined" do
147
+ # Check for missing TELEMETRY line
148
+ @tlm_keywords.each do |keyword|
149
+ tf = Tempfile.new('unittest')
150
+ tf.puts(keyword)
151
+ tf.close
152
+ expect { @pc.process_file(tf.path, "SYSTEM") }.to raise_error(ConfigParser::Error, "No current packet for #{keyword}")
153
+ tf.unlink
154
+ end # end for each tlm_keywords
155
+ end
156
+
157
+ it "should complain if a current item is not defined" do
158
+ # Check for missing ITEM definitions
159
+ @item_keywords.each do |keyword|
160
+ next if %w(META).include? keyword
161
+ tf = Tempfile.new('unittest')
162
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
163
+ tf.puts keyword
164
+ tf.close
165
+ expect { @pc.process_file(tf.path, "TGT1") }.to raise_error(ConfigParser::Error, "No current item for #{keyword}")
166
+ tf.unlink
167
+ end
168
+ end
169
+
170
+ it "should complain if there are not enough parameters" do
171
+ @top_keywords.each do |keyword|
172
+ tf = Tempfile.new('unittest')
173
+ tf.puts(keyword)
174
+ tf.close
175
+ expect { @pc.process_file(tf.path, "SYSTEM") }.to raise_error(ConfigParser::Error, /Not enough parameters for #{keyword}/)
176
+ tf.unlink
177
+ end
178
+
179
+ @tlm_keywords.each do |keyword|
180
+ next if %w(MACRO_APPEND_END).include? keyword
181
+ tf = Tempfile.new('unittest')
182
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
183
+ tf.puts keyword
184
+ tf.close
185
+ expect { @pc.process_file(tf.path, "TGT1") }.to raise_error(ConfigParser::Error, /Not enough parameters for #{keyword}/)
186
+ tf.unlink
187
+ end
188
+
189
+ @item_keywords.each do |keyword|
190
+ next if %w(GENERIC_READ_CONVERSION_START GENERIC_WRITE_CONVERSION_START).include? keyword
191
+ tf = Tempfile.new('unittest')
192
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
193
+ tf.puts 'ITEM myitem 0 8 UINT "Test Item"'
194
+ tf.puts keyword
195
+ tf.close
196
+ expect { @pc.process_file(tf.path, "TGT1") }.to raise_error(ConfigParser::Error, /Not enough parameters for #{keyword}/)
197
+ tf.unlink
198
+ end
199
+ end
200
+
201
+ it "should complain if there are too many parameters" do
202
+ @top_keywords.each do |keyword|
203
+ tf = Tempfile.new('unittest')
204
+ case keyword
205
+ when "TELEMETRY"
206
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet" extra'
207
+ when "SELECT_TELEMETRY"
208
+ tf.puts 'SELECT_TELEMETRY tgt1 pkt1 extra'
209
+ when 'LIMITS_GROUP'
210
+ tf.puts "LIMITS_GROUP name extra"
211
+ when 'LIMITS_GROUP_ITEM'
212
+ tf.puts "LIMITS_GROUP_ITEM target packet item extra"
213
+ end
214
+ tf.close
215
+ expect { @pc.process_file(tf.path, "TGT1") }.to raise_error(ConfigParser::Error, /Too many parameters for #{keyword}/)
216
+ tf.unlink
217
+ end
218
+
219
+ @tlm_keywords.each do |keyword|
220
+ next if %w(MACRO_APPEND_END PROCESSOR META).include? keyword
221
+ tf = Tempfile.new('unittest')
222
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
223
+ case keyword
224
+ when "ITEM"
225
+ tf.puts 'ITEM myitem 0 8 UINT "Test Item" BIG_ENDIAN extra'
226
+ when "APPEND_ITEM"
227
+ tf.puts 'APPEND_ITEM myitem 8 UINT "Test Item" BIG_ENDIAN extra'
228
+ when "ID_ITEM"
229
+ tf.puts 'ID_ITEM myitem 0 8 UINT 1 "Test Item id=1" LITTLE_ENDIAN extra'
230
+ when "APPEND_ID_ITEM"
231
+ tf.puts 'APPEND_ID_ITEM myitem 8 UINT 1 "Test Item id=1" BIG_ENDIAN extra'
232
+ when "ARRAY_ITEM"
233
+ tf.puts 'ARRAY_ITEM myitem 0 8 UINT 24 "Test Item array" LITTLE_ENDIAN extra'
234
+ when "APPEND_ARRAY_ITEM"
235
+ tf.puts 'APPEND_ARRAY_ITEM myitem 0 8 UINT 24 "Test Item array" BIG_ENDIAN extra'
236
+ when "SELECT_ITEM"
237
+ tf.puts 'ITEM myitem 0 8 UINT'
238
+ tf.puts 'SELECT_ITEM myitem extra'
239
+ when "MACRO_APPEND_START"
240
+ tf.puts 'MACRO_APPEND_START 0 1 "%s_%d" extra'
241
+ when "ACRO_APPEND_END"
242
+ tf.puts 'MACRO_APPEND_END extra'
243
+ end
244
+ tf.close
245
+ expect { @pc.process_file(tf.path, "TGT1") }.to raise_error(ConfigParser::Error, /Too many parameters for #{keyword}/)
246
+ tf.unlink
247
+ end
248
+
249
+ @item_keywords.each do |keyword|
250
+ # The following can have an "unlimited" number of arguments
251
+ next if %w(POLY_READ_CONVERSION POLY_WRITE_CONVERSION READ_CONVERSION WRITE_CONVERSION SEG_POLY_READ_CONVERSION SEG_POLY_WRITE_CONVERSION LIMITS_RESPONSE META).include? keyword
252
+ tf = Tempfile.new('unittest')
253
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
254
+ tf.puts 'ITEM myitem 0 8 UINT "Test Item"'
255
+ case keyword
256
+ when "STATE"
257
+ tf.puts 'STATE mystate 0 RED extra'
258
+ when "GENERIC_READ_CONVERSION_START", "GENERIC_WRITE_CONVERSION_START"
259
+ tf.puts "#{keyword} FLOAT 64 extra"
260
+ when "LIMITS"
261
+ tf.puts 'LIMITS mylimits 1 ENABLED 0 10 20 30 12 18 20'
262
+ when "UNITS"
263
+ tf.puts 'UNITS degrees deg extra'
264
+ when "FORMAT_STRING", "DESCRIPTION"
265
+ tf.puts "#{keyword} 'string' extra"
266
+ end
267
+ tf.close
268
+ expect { @pc.process_file(tf.path, "TGT1") }.to raise_error(ConfigParser::Error, /Too many parameters for #{keyword}/)
269
+ tf.unlink
270
+ end
271
+ end
272
+ end
273
+
274
+ context "with COMMAND or TELEMETRY" do
275
+ it "should complain about invalid endianness" do
276
+ %w(COMMAND TELEMETRY).each do |keyword|
277
+ tf = Tempfile.new('unittest')
278
+ tf.puts keyword + ' tgt1 pkt1 MIDDLE_ENDIAN "Packet"'
279
+ tf.close
280
+ expect { @pc.process_file(tf.path, "TGT1") }.to raise_error(ConfigParser::Error, "Invalid endianness MIDDLE_ENDIAN. Must be BIG_ENDIAN or LITTLE_ENDIAN.")
281
+ tf.unlink
282
+ end
283
+ end
284
+
285
+ it "should process target, packet, endianness, description" do
286
+ %w(COMMAND TELEMETRY).each do |keyword|
287
+ tf = Tempfile.new('unittest')
288
+ tf.puts keyword + ' tgt1 pkt1 LITTLE_ENDIAN "Packet"'
289
+ tf.close
290
+ @pc.process_file(tf.path, "TGT1")
291
+ pkt = @pc.commands["TGT1"]["PKT1"] if keyword == 'COMMAND'
292
+ pkt = @pc.telemetry["TGT1"]["PKT1"] if keyword == 'TELEMETRY'
293
+ pkt.target_name.should eql "TGT1"
294
+ pkt.packet_name.should eql "PKT1"
295
+ pkt.default_endianness.should eql :LITTLE_ENDIAN
296
+ pkt.description.should eql "Packet"
297
+ tf.unlink
298
+ end
299
+ end
300
+
301
+ it "should substitute the target name" do
302
+ %w(COMMAND TELEMETRY).each do |keyword|
303
+ tf = Tempfile.new('unittest')
304
+ tf.puts keyword + ' tgt1 pkt1 LITTLE_ENDIAN "Packet"'
305
+ tf.close
306
+ @pc.process_file(tf.path, "NEW")
307
+ pkt = @pc.commands["NEW"]["PKT1"] if keyword == 'COMMAND'
308
+ pkt = @pc.telemetry["NEW"]["PKT1"] if keyword == 'TELEMETRY'
309
+ pkt.target_name.should eql "NEW"
310
+ tf.unlink
311
+ end
312
+ end
313
+ end
314
+
315
+ context "with SELECT_COMMAND or SELECT_TELEMETRY" do
316
+ it "should complain if the packet is not found" do
317
+ %w(SELECT_COMMAND SELECT_TELEMETRY).each do |keyword|
318
+ tf = Tempfile.new('unittest')
319
+ tf.puts keyword + ' tgt1 pkt1'
320
+ tf.puts 'SELECT_ITEM ITEM1'
321
+ tf.puts ' DESCRIPTION "New description"'
322
+ tf.close
323
+ expect { @pc.process_file(tf.path, "TGT1") }.to raise_error(ConfigParser::Error, /Packet not found/)
324
+ tf.unlink
325
+ end
326
+ end
327
+
328
+ it "should select a packet for modification" do
329
+ %w(SELECT_COMMAND SELECT_TELEMETRY).each do |keyword|
330
+ tf = Tempfile.new('unittest')
331
+ tf.puts 'COMMAND tgt1 pkt1 LITTLE_ENDIAN "Packet"'
332
+ tf.puts ' APPEND_PARAMETER item1 16 UINT 0 0 0 "Item"'
333
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
334
+ tf.puts ' APPEND_ITEM item1 16 UINT "Item"'
335
+ tf.close
336
+ @pc.process_file(tf.path, "TGT1")
337
+ pkt = @pc.commands["TGT1"]["PKT1"] if keyword =~ /COMMAND/
338
+ pkt = @pc.telemetry["TGT1"]["PKT1"] if keyword =~ /TELEMETRY/
339
+ pkt.get_item("ITEM1").description.should eql "Item"
340
+ tf.unlink
341
+
342
+ tf = Tempfile.new('unittest')
343
+ tf.puts keyword + ' tgt1 pkt1'
344
+ tf.puts 'SELECT_PARAMETER ITEM1' if keyword =~ /COMMAND/
345
+ tf.puts 'SELECT_ITEM ITEM1' if keyword =~ /TELEMETRY/
346
+ tf.puts ' DESCRIPTION "New description"'
347
+ tf.close
348
+ @pc.process_file(tf.path, "TGT1")
349
+ pkt = @pc.commands["TGT1"]["PKT1"] if keyword =~ /COMMAND/
350
+ pkt = @pc.telemetry["TGT1"]["PKT1"] if keyword =~ /TELEMETRY/
351
+ pkt.get_item("ITEM1").description.should eql "New description"
352
+ tf.unlink
353
+ end
354
+ end
355
+
356
+ it "should substitute the target name" do
357
+ %w(SELECT_COMMAND SELECT_TELEMETRY).each do |keyword|
358
+ tf = Tempfile.new('unittest')
359
+ tf.puts 'COMMAND tgt1 pkt1 LITTLE_ENDIAN "Packet"'
360
+ tf.puts ' APPEND_PARAMETER item1 16 UINT 0 0 0 "Item"'
361
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
362
+ tf.puts ' APPEND_ITEM item1 16 UINT "Item"'
363
+ tf.close
364
+ @pc.process_file(tf.path, "NEW")
365
+ pkt = @pc.commands["NEW"]["PKT1"] if keyword =~ /COMMAND/
366
+ pkt = @pc.telemetry["NEW"]["PKT1"] if keyword =~ /TELEMETRY/
367
+ pkt.get_item("ITEM1").description.should eql "Item"
368
+ tf.unlink
369
+
370
+ tf = Tempfile.new('unittest')
371
+ tf.puts keyword + ' tgt1 pkt1'
372
+ tf.puts 'SELECT_PARAMETER ITEM1' if keyword =~ /COMMAND/
373
+ tf.puts 'SELECT_ITEM ITEM1' if keyword =~ /TELEMETRY/
374
+ tf.puts ' DESCRIPTION "New description"'
375
+ tf.close
376
+ @pc.process_file(tf.path, "NEW")
377
+ pkt = @pc.commands["NEW"]["PKT1"] if keyword =~ /COMMAND/
378
+ pkt = @pc.telemetry["NEW"]["PKT1"] if keyword =~ /TELEMETRY/
379
+ pkt.get_item("ITEM1").description.should eql "New description"
380
+ tf.unlink
381
+ end
382
+ end
383
+ end
384
+
385
+ context "with SELECT_PARAMETER" do
386
+ it "should complain if used with SELECT_TELEMETRY" do
387
+ tf = Tempfile.new('unittest')
388
+ tf.puts 'TELEMETRY TGT PKT LITTLE_ENDIAN "Packet"'
389
+ tf.puts ' APPEND_ITEM ITEM 16 UINT "Item"'
390
+ tf.puts 'SELECT_TELEMETRY TGT PKT'
391
+ tf.puts ' SELECT_PARAMETER ITEM'
392
+ tf.close
393
+ expect { @pc.process_file(tf.path, "TGT") }.to raise_error(ConfigParser::Error, "SELECT_PARAMETER only applies to command packets")
394
+ end
395
+
396
+ it "should complain if the parameter is not found" do
397
+ tf = Tempfile.new('unittest')
398
+ tf.puts 'COMMAND TGT PKT LITTLE_ENDIAN "Packet"'
399
+ tf.puts ' APPEND_PARAMETER PARAM 16 UINT 0 0 0 "Param"'
400
+ tf.close
401
+ @pc.process_file(tf.path, "TGT")
402
+ pkt = @pc.commands["TGT"]["PKT"]
403
+ pkt.get_item("PARAM").description.should eql "Param"
404
+ tf.unlink
405
+
406
+ tf = Tempfile.new('unittest')
407
+ tf.puts 'SELECT_COMMAND TGT PKT'
408
+ tf.puts ' SELECT_PARAMETER PARAMX'
409
+ tf.puts ' DESCRIPTION "New description"'
410
+ tf.close
411
+ expect { @pc.process_file(tf.path, "TGT") }.to raise_error(ConfigParser::Error, "PARAMX not found in command packet TGT PKT")
412
+ end
413
+ end
414
+
415
+ context "with SELECT_ITEM" do
416
+ it "should complain if used with SELECT_COMMAND" do
417
+ tf = Tempfile.new('unittest')
418
+ tf.puts 'COMMAND TGT PKT LITTLE_ENDIAN "Packet"'
419
+ tf.puts ' APPEND_PARAMETER PARAM 16 UINT 0 0 0 "Param"'
420
+ tf.puts 'SELECT_COMMAND TGT PKT'
421
+ tf.puts ' SELECT_ITEM PARAM'
422
+ tf.close
423
+ expect { @pc.process_file(tf.path, "TGT") }.to raise_error(ConfigParser::Error, "SELECT_ITEM only applies to telemetry packets")
424
+ end
425
+
426
+ it "should complain if the item is not found" do
427
+ tf = Tempfile.new('unittest')
428
+ tf.puts 'TELEMETRY TGT PKT LITTLE_ENDIAN "Packet"'
429
+ tf.puts ' APPEND_ITEM ITEM 16 UINT "Item"'
430
+ tf.close
431
+ @pc.process_file(tf.path, "TGT")
432
+ pkt = @pc.telemetry["TGT"]["PKT"]
433
+ pkt.get_item("ITEM").description.should eql "Item"
434
+ tf.unlink
435
+
436
+ tf = Tempfile.new('unittest')
437
+ tf.puts 'SELECT_TELEMETRY TGT PKT'
438
+ tf.puts ' SELECT_ITEM ITEMX'
439
+ tf.puts ' DESCRIPTION "New description"'
440
+ tf.close
441
+ expect { @pc.process_file(tf.path, "TGT") }.to raise_error(ConfigParser::Error, "ITEMX not found in telemetry packet TGT PKT")
442
+ end
443
+ end
444
+
445
+ context "with keywords including ITEM" do
446
+ it "should only allow DERIVED items with offset 0 and size 0" do
447
+ tf = Tempfile.new('unittest')
448
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Description"'
449
+ tf.puts ' ITEM ITEM1 8 0 DERIVED'
450
+ tf.close
451
+ expect { @pc.process_file(tf.path, "TGT1") }.to raise_error(ConfigParser::Error, /DERIVED items must have bit_offset of zero/)
452
+ tf.unlink
453
+
454
+ tf = Tempfile.new('unittest')
455
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Description"'
456
+ tf.puts ' ITEM ITEM1 0 8 DERIVED'
457
+ tf.close
458
+ expect { @pc.process_file(tf.path, "TGT1") }.to raise_error(ConfigParser::Error, /DERIVED items must have bit_size of zero/)
459
+ tf.unlink
460
+
461
+ tf = Tempfile.new('unittest')
462
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Description"'
463
+ tf.puts ' ITEM ITEM1 0 0 DERIVED'
464
+ tf.close
465
+ @pc.process_file(tf.path, "TGT1")
466
+ @pc.telemetry["TGT1"]["PKT1"].items.keys.should include('ITEM1')
467
+ tf.unlink
468
+ end
469
+
470
+ it "should accept types INT UINT FLOAT STRING BLOCK" do
471
+ tf = Tempfile.new('unittest')
472
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Description"'
473
+ tf.puts ' ID_ITEM ITEM1 0 32 INT 0'
474
+ tf.puts ' ITEM ITEM2 0 32 UINT'
475
+ tf.puts ' ARRAY_ITEM ITEM3 0 32 FLOAT 64'
476
+ tf.puts ' APPEND_ID_ITEM ITEM4 32 STRING "ABCD"'
477
+ tf.puts ' APPEND_ITEM ITEM5 32 BLOCK'
478
+ tf.puts ' APPEND_ARRAY_ITEM ITEM6 32 BLOCK 64'
479
+ tf.close
480
+ @pc.process_file(tf.path, "TGT1")
481
+ @pc.telemetry["TGT1"]["PKT1"].items.keys.should include('ITEM1','ITEM2','ITEM3','ITEM4','ITEM5','ITEM6')
482
+ id_items = []
483
+ id_items << @pc.telemetry["TGT1"]["PKT1"].items["ITEM1"]
484
+ id_items << @pc.telemetry["TGT1"]["PKT1"].items["ITEM4"]
485
+ @pc.telemetry["TGT1"]["PKT1"].id_items.should eql id_items
486
+ tf.unlink
487
+ end
488
+
489
+ it "should support arbitrary endianness per item" do
490
+ tf = Tempfile.new('unittest')
491
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Description"'
492
+ tf.puts ' ID_ITEM ITEM1 0 32 UINT 0 "" LITTLE_ENDIAN'
493
+ tf.puts ' ITEM ITEM2 0 32 UINT "" LITTLE_ENDIAN'
494
+ tf.puts ' ARRAY_ITEM ITEM3 0 32 UINT 64 "" LITTLE_ENDIAN'
495
+ tf.puts ' APPEND_ID_ITEM ITEM4 32 UINT 1 "" LITTLE_ENDIAN'
496
+ tf.puts ' APPEND_ITEM ITEM5 32 UINT "" LITTLE_ENDIAN'
497
+ tf.puts ' APPEND_ARRAY_ITEM ITEM6 32 UINT 64 "" LITTLE_ENDIAN'
498
+ tf.puts ' ID_ITEM ITEM10 224 32 UINT 0 "" BIG_ENDIAN'
499
+ tf.puts ' ITEM ITEM20 256 32 UINT "" BIG_ENDIAN'
500
+ tf.puts ' ARRAY_ITEM ITEM30 0 32 UINT 64 "" BIG_ENDIAN'
501
+ tf.puts ' APPEND_ID_ITEM ITEM40 32 UINT 1 "" BIG_ENDIAN'
502
+ tf.puts ' APPEND_ITEM ITEM50 32 UINT "" BIG_ENDIAN'
503
+ tf.puts ' APPEND_ARRAY_ITEM ITEM60 32 UINT 64 "" BIG_ENDIAN'
504
+ tf.close
505
+ @pc.process_file(tf.path, "TGT1")
506
+ packet = @pc.telemetry["TGT1"]["PKT1"]
507
+ packet.buffer = "\x00\x00\x00\x01" * 16
508
+ packet.read("ITEM1").should eql 0x01000000
509
+ packet.read("ITEM2").should eql 0x01000000
510
+ packet.read("ITEM3").should eql [0x01000000, 0x01000000]
511
+ packet.read("ITEM4").should eql 0x01000000
512
+ packet.read("ITEM5").should eql 0x01000000
513
+ packet.read("ITEM6").should eql [0x01000000, 0x01000000]
514
+ packet.read("ITEM10").should eql 0x00000001
515
+ packet.read("ITEM20").should eql 0x00000001
516
+ packet.read("ITEM30").should eql [0x00000001, 0x00000001]
517
+ packet.read("ITEM40").should eql 0x00000001
518
+ packet.read("ITEM50").should eql 0x00000001
519
+ packet.read("ITEM60").should eql [0x00000001, 0x00000001]
520
+ tf.unlink
521
+ end
522
+ end
523
+
524
+ context "with keywords including PARAMETER" do
525
+ it "should only allow DERIVED items with offset 0 and size 0" do
526
+ tf = Tempfile.new('unittest')
527
+ tf.puts 'COMMAND tgt1 pkt1 LITTLE_ENDIAN "Description"'
528
+ tf.puts ' PARAMETER ITEM1 8 0 DERIVED 0 0 0'
529
+ tf.close
530
+ expect { @pc.process_file(tf.path, "TGT1") }.to raise_error(ConfigParser::Error, /DERIVED items must have bit_offset of zero/)
531
+ tf.unlink
532
+
533
+ tf = Tempfile.new('unittest')
534
+ tf.puts 'COMMAND tgt1 pkt1 LITTLE_ENDIAN "Description"'
535
+ tf.puts ' PARAMETER ITEM1 0 8 DERIVED 0 0 0'
536
+ tf.close
537
+ expect { @pc.process_file(tf.path, "TGT1") }.to raise_error(ConfigParser::Error, /DERIVED items must have bit_size of zero/)
538
+ tf.unlink
539
+
540
+ tf = Tempfile.new('unittest')
541
+ tf.puts 'COMMAND tgt1 pkt1 LITTLE_ENDIAN "Description"'
542
+ tf.puts ' PARAMETER ITEM1 0 0 DERIVED 0 0 0'
543
+ tf.close
544
+ @pc.process_file(tf.path, "TGT1")
545
+ @pc.commands["TGT1"]["PKT1"].items.keys.should include('ITEM1')
546
+ tf.unlink
547
+ end
548
+
549
+ it "should not allow ID_PARAMETER with DERIVED type" do
550
+ tf = Tempfile.new('unittest')
551
+ tf.puts 'COMMAND tgt1 pkt1 LITTLE_ENDIAN "Description"'
552
+ tf.puts ' ID_PARAMETER ITEM1 0 0 DERIVED 0 0 0'
553
+ tf.close
554
+ expect { @pc.process_file(tf.path, "TGT1") }.to raise_error(ConfigParser::Error, /DERIVED data type not allowed/)
555
+ tf.unlink
556
+ end
557
+
558
+ it "should not allow APPEND_ID_PARAMETER with DERIVED type" do
559
+ tf = Tempfile.new('unittest')
560
+ tf.puts 'COMMAND tgt1 pkt1 LITTLE_ENDIAN "Description"'
561
+ tf.puts ' APPEND_ID_PARAMETER ITEM1 0 DERIVED 0 0 0'
562
+ tf.close
563
+ expect { @pc.process_file(tf.path, "TGT1") }.to raise_error(ConfigParser::Error, /DERIVED data type not allowed/)
564
+ tf.unlink
565
+ end
566
+
567
+ it "should accept types INT UINT FLOAT STRING BLOCK" do
568
+ tf = Tempfile.new('unittest')
569
+ tf.puts 'COMMAND tgt1 pkt1 LITTLE_ENDIAN "Description"'
570
+ tf.puts ' ID_PARAMETER ITEM1 0 32 INT 0 0 0'
571
+ tf.puts ' ID_PARAMETER ITEM2 32 32 STRING "ABCD"'
572
+ tf.puts ' PARAMETER ITEM3 64 32 UINT 0 0 0'
573
+ tf.puts ' ARRAY_PARAMETER ITEM4 96 32 FLOAT 64'
574
+ tf.puts ' APPEND_ID_PARAMETER ITEM5 32 UINT 0 0 0'
575
+ tf.puts ' APPEND_ID_PARAMETER ITEM6 32 STRING "ABCD"'
576
+ tf.puts ' APPEND_PARAMETER ITEM7 32 BLOCK "1234"'
577
+ tf.puts ' APPEND_ARRAY_PARAMETER ITEM8 32 BLOCK 64'
578
+ tf.close
579
+ @pc.process_file(tf.path, "TGT1")
580
+ @pc.commands["TGT1"]["PKT1"].items.keys.should include('ITEM1','ITEM2','ITEM3','ITEM4','ITEM5','ITEM6','ITEM7','ITEM8')
581
+ tf.unlink
582
+ end
583
+
584
+ it "should support arbitrary endianness per item" do
585
+ tf = Tempfile.new('unittest')
586
+ tf.puts 'COMMAND tgt1 pkt1 LITTLE_ENDIAN "Description"'
587
+ tf.puts ' ID_PARAMETER ITEM1 0 32 UINT 0 0 0 "" LITTLE_ENDIAN'
588
+ tf.puts ' PARAMETER ITEM2 0 32 UINT 0 0 0 "" LITTLE_ENDIAN'
589
+ tf.puts ' ARRAY_PARAMETER ITEM3 0 32 UINT 64 "" LITTLE_ENDIAN'
590
+ tf.puts ' APPEND_ID_PARAMETER ITEM4 32 UINT 0 0 0 "" LITTLE_ENDIAN'
591
+ tf.puts ' APPEND_PARAMETER ITEM5 32 UINT 0 0 0 "" LITTLE_ENDIAN'
592
+ tf.puts ' APPEND_ARRAY_PARAMETER ITEM6 32 UINT 64 "" LITTLE_ENDIAN'
593
+ tf.puts ' ID_PARAMETER ITEM10 224 32 UINT 0 0 0 "" BIG_ENDIAN'
594
+ tf.puts ' PARAMETER ITEM20 256 32 UINT 0 0 0 "" BIG_ENDIAN'
595
+ tf.puts ' ARRAY_PARAMETER ITEM30 0 32 UINT 64 "" BIG_ENDIAN'
596
+ tf.puts ' APPEND_ID_PARAMETER ITEM40 32 UINT 0 0 0 "" BIG_ENDIAN'
597
+ tf.puts ' APPEND_PARAMETER ITEM50 32 UINT 0 0 0 "" BIG_ENDIAN'
598
+ tf.puts ' APPEND_ARRAY_PARAMETER ITEM60 32 UINT 64 "" BIG_ENDIAN'
599
+ tf.close
600
+ @pc.process_file(tf.path, "TGT1")
601
+ packet = @pc.commands["TGT1"]["PKT1"]
602
+ packet.buffer = "\x00\x00\x00\x01" * 16
603
+ packet.read("ITEM1").should eql 0x01000000
604
+ packet.read("ITEM2").should eql 0x01000000
605
+ packet.read("ITEM3").should eql [0x01000000, 0x01000000]
606
+ packet.read("ITEM4").should eql 0x01000000
607
+ packet.read("ITEM5").should eql 0x01000000
608
+ packet.read("ITEM6").should eql [0x01000000, 0x01000000]
609
+ packet.read("ITEM10").should eql 0x00000001
610
+ packet.read("ITEM20").should eql 0x00000001
611
+ packet.read("ITEM30").should eql [0x00000001, 0x00000001]
612
+ packet.read("ITEM40").should eql 0x00000001
613
+ packet.read("ITEM50").should eql 0x00000001
614
+ packet.read("ITEM60").should eql [0x00000001, 0x00000001]
615
+ tf.unlink
616
+ end
617
+ end
618
+
619
+ context "with LIMITS_GROUP" do
620
+ it "should create a new limits group" do
621
+ tf = Tempfile.new('unittest')
622
+ tf.puts 'LIMITS_GROUP TVAC'
623
+ tf.puts 'LIMITS_GROUP VIBE'
624
+ tf.close
625
+ @pc.limits_groups.should be_empty
626
+ @pc.process_file(tf.path, "TGT1")
627
+ @pc.limits_groups.should include('TVAC','VIBE')
628
+ tf.unlink
629
+ end
630
+ end
631
+
632
+ context "with LIMITS_ITEM" do
633
+ it "should add a new limits item to the group" do
634
+ tf = Tempfile.new('unittest')
635
+ tf.puts 'LIMITS_GROUP TVAC'
636
+ tf.puts 'LIMITS_GROUP_ITEM TGT1 PKT1 ITEM1'
637
+ tf.close
638
+ @pc.limits_groups.should be_empty
639
+ @pc.process_file(tf.path, "TGT1")
640
+ @pc.limits_groups["TVAC"].should eql [%w(TGT1 PKT1 ITEM1)]
641
+ tf.unlink
642
+
643
+ # Show we can 're-open' the group and add items
644
+ tf = Tempfile.new('unittest')
645
+ tf.puts 'LIMITS_GROUP TVAC'
646
+ tf.puts 'LIMITS_GROUP_ITEM TGT1 PKT1 ITEM2'
647
+ tf.close
648
+ @pc.process_file(tf.path, "TGT1")
649
+ @pc.limits_groups["TVAC"].should eql [%w(TGT1 PKT1 ITEM1), %w(TGT1 PKT1 ITEM2)]
650
+ tf.unlink
651
+ end
652
+ end
653
+
654
+ context "with MACRO_APPEND_START" do
655
+ it "should add items to the packet" do
656
+ tf = Tempfile.new('unittest')
657
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Description"'
658
+ tf.puts 'MACRO_APPEND_START 1 5'
659
+ tf.puts 'APPEND_ITEM BIT 16 UINT "Setting #x"'
660
+ tf.puts ' STATE BAD 0 RED'
661
+ tf.puts ' STATE GOOD 1 GREEN'
662
+ tf.puts 'MACRO_APPEND_END'
663
+ tf.close
664
+ @pc.process_file(tf.path, "TGT1")
665
+ pkt = @pc.telemetry["TGT1"]["PKT1"]
666
+ pkt.items.keys.should include('BIT1','BIT2','BIT3','BIT4','BIT5')
667
+ limits_items = []
668
+ pkt.items.each do |name, item|
669
+ limits_items << item if name =~ /BIT/
670
+ end
671
+ pkt.limits_items.should eql limits_items
672
+ tf.unlink
673
+ end
674
+
675
+ it "should array items to the packet" do
676
+ tf = Tempfile.new('unittest')
677
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Description"'
678
+ tf.puts 'MACRO_APPEND_START 1 5'
679
+ tf.puts 'APPEND_ARRAY_ITEM BIT 16 INT 64 "Int Array Parameter"'
680
+ tf.puts 'MACRO_APPEND_END'
681
+ tf.close
682
+ @pc.process_file(tf.path, "TGT1")
683
+ pkt = @pc.telemetry["TGT1"]["PKT1"]
684
+ pkt.items.keys.should include('BIT1','BIT2','BIT3','BIT4','BIT5')
685
+ pkt.limits_items.should be_empty
686
+ tf.unlink
687
+ end
688
+
689
+ it "should work with printf format strings" do
690
+ tf = Tempfile.new('unittest')
691
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Description"'
692
+ tf.puts 'MACRO_APPEND_START 1 5 "%d%s"'
693
+ tf.puts 'APPEND_ID_ITEM BIT 16 UINT 0 "Setting #x"'
694
+ tf.puts 'MACRO_APPEND_END'
695
+ tf.close
696
+ @pc.process_file(tf.path, "TGT1")
697
+ pkt = @pc.telemetry["TGT1"]["PKT1"]
698
+ pkt.items.keys.should include('1BIT','2BIT','3BIT','4BIT','5BIT')
699
+ pkt.limits_items.should be_empty
700
+ tf.unlink
701
+ end
702
+ end
703
+
704
+ context "with ALLOW_SHORT" do
705
+ it "should mark the packet as allowing short buffers" do
706
+ tf = Tempfile.new('unittest')
707
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Description"'
708
+ tf.puts 'ALLOW_SHORT'
709
+ tf.puts 'TELEMETRY tgt1 pkt2 LITTLE_ENDIAN "Description"'
710
+ tf.close
711
+ @pc.process_file(tf.path, "TGT1")
712
+ @pc.telemetry["TGT1"]["PKT1"].short_buffer_allowed.should be_truthy
713
+ @pc.telemetry["TGT1"]["PKT2"].short_buffer_allowed.should be_falsey
714
+ tf.unlink
715
+ end
716
+ end
717
+
718
+ context "with META" do
719
+ it "should save metadata" do
720
+ tf = Tempfile.new('unittest')
721
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Description"'
722
+ tf.puts 'META TYPE "struct packet"'
723
+ tf.puts 'TELEMETRY tgt1 pkt2 LITTLE_ENDIAN "Description"'
724
+ tf.puts 'META TYPE "struct packet2"'
725
+ tf.close
726
+ @pc.process_file(tf.path, "TGT1")
727
+ @pc.telemetry["TGT1"]["PKT1"].meta['TYPE'].should eql ["struct packet"]
728
+ @pc.telemetry["TGT1"]["PKT2"].meta['TYPE'].should eql ["struct packet2"]
729
+ tf.unlink
730
+ end
731
+ end
732
+
733
+ context "with DISABLE_MESSAGES" do
734
+ it "should mark the packet as messages disabled" do
735
+ tf = Tempfile.new('unittest')
736
+ tf.puts 'COMMAND tgt1 pkt1 LITTLE_ENDIAN "Description"'
737
+ tf.puts 'DISABLE_MESSAGES'
738
+ tf.puts 'COMMAND tgt1 pkt2 LITTLE_ENDIAN "Description"'
739
+ tf.close
740
+ @pc.process_file(tf.path, "TGT1")
741
+ @pc.commands["TGT1"]["PKT1"].messages_disabled.should be_truthy
742
+ @pc.commands["TGT1"]["PKT2"].messages_disabled.should be_falsey
743
+ tf.unlink
744
+ end
745
+ end
746
+
747
+ context "with HIDDEN" do
748
+ it "should mark the packet as hidden" do
749
+ tf = Tempfile.new('unittest')
750
+ tf.puts 'COMMAND tgt1 pkt1 LITTLE_ENDIAN "Description"'
751
+ tf.puts 'HIDDEN'
752
+ tf.puts 'COMMAND tgt1 pkt2 LITTLE_ENDIAN "Description"'
753
+ tf.close
754
+ @pc.process_file(tf.path, "TGT1")
755
+ @pc.commands["TGT1"]["PKT1"].hidden.should be_truthy
756
+ @pc.commands["TGT1"]["PKT1"].disabled.should be_falsey
757
+ @pc.commands["TGT1"]["PKT2"].hidden.should be_falsey
758
+ @pc.commands["TGT1"]["PKT2"].disabled.should be_falsey
759
+ tf.unlink
760
+ end
761
+ end
762
+
763
+ context "with DISABLED" do
764
+ it "should mark the packet as disabled" do
765
+ tf = Tempfile.new('unittest')
766
+ tf.puts 'COMMAND tgt1 pkt1 LITTLE_ENDIAN "Description"'
767
+ tf.puts 'DISABLED'
768
+ tf.puts 'COMMAND tgt1 pkt2 LITTLE_ENDIAN "Description"'
769
+ tf.close
770
+ @pc.process_file(tf.path, "TGT1")
771
+ @pc.commands["TGT1"]["PKT1"].hidden.should be_truthy
772
+ @pc.commands["TGT1"]["PKT1"].disabled.should be_truthy
773
+ @pc.commands["TGT1"]["PKT2"].hidden.should be_falsey
774
+ @pc.commands["TGT1"]["PKT2"].disabled.should be_falsey
775
+ tf.unlink
776
+ end
777
+ end
778
+
779
+ context "with HAZARDOUS" do
780
+ it "should mark the packet as hazardous" do
781
+ tf = Tempfile.new('unittest')
782
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Description"'
783
+ tf.puts 'HAZARDOUS'
784
+ tf.puts 'TELEMETRY tgt1 pkt2 LITTLE_ENDIAN "Description"'
785
+ tf.puts 'COMMAND tgt2 pkt1 LITTLE_ENDIAN "Description"'
786
+ tf.puts 'HAZARDOUS'
787
+ tf.puts 'COMMAND tgt2 pkt2 LITTLE_ENDIAN "Description"'
788
+ tf.close
789
+ @pc.process_file(tf.path, "SYSTEM")
790
+ @pc.telemetry["TGT1"]["PKT1"].hazardous.should be_truthy
791
+ @pc.telemetry["TGT1"]["PKT2"].hazardous.should be_falsey
792
+ @pc.commands["TGT2"]["PKT1"].hazardous.should be_truthy
793
+ @pc.commands["TGT2"]["PKT2"].hazardous.should be_falsey
794
+ tf.unlink
795
+ end
796
+
797
+ it "should take a description" do
798
+ tf = Tempfile.new('unittest')
799
+ tf.puts 'COMMAND tgt1 pkt1 LITTLE_ENDIAN "Description"'
800
+ tf.puts 'HAZARDOUS "Hazardous description"'
801
+ tf.close
802
+ @pc.process_file(tf.path, "TGT1")
803
+ @pc.commands["TGT1"]["PKT1"].hazardous.should be_truthy
804
+ @pc.commands["TGT1"]["PKT1"].hazardous_description.should eql "Hazardous description"
805
+ tf.unlink
806
+ end
807
+ end
808
+
809
+ context "with STATE" do
810
+ it "should support STRING items" do
811
+ tf = Tempfile.new('unittest')
812
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Description"'
813
+ tf.puts ' APPEND_ITEM item1 128 STRING "state item"'
814
+ tf.puts ' STATE FALSE "FALSE STRING"'
815
+ tf.puts ' STATE TRUE "TRUE STRING"'
816
+ tf.close
817
+ @pc.process_file(tf.path, "TGT1")
818
+ @pc.telemetry["TGT1"]["PKT1"].write("ITEM1", "TRUE STRING")
819
+ @pc.telemetry["TGT1"]["PKT1"].read("ITEM1").should eql "TRUE"
820
+ @pc.telemetry["TGT1"]["PKT1"].write("ITEM1", "FALSE STRING")
821
+ @pc.telemetry["TGT1"]["PKT1"].read("ITEM1").should eql "FALSE"
822
+ tf.unlink
823
+ end
824
+
825
+ it "should warn about duplicate states and replace the duplicate" do
826
+ tf = Tempfile.new('unittest')
827
+ tf.puts 'COMMAND tgt1 pkt1 LITTLE_ENDIAN "Description"'
828
+ tf.puts ' APPEND_PARAMETER item1 8 UINT 0 2 0 "state item"'
829
+ tf.puts ' STATE FALSE 0'
830
+ tf.puts ' STATE TRUE 1'
831
+ tf.puts ' STATE FALSE 2'
832
+ tf.close
833
+ @pc.process_file(tf.path, "TGT1")
834
+ @pc.warnings.should include("Duplicate state defined on line 5: STATE FALSE 2")
835
+ @pc.commands["TGT1"]["PKT1"].buffer = "\x00"
836
+ @pc.commands["TGT1"]["PKT1"].read("ITEM1").should eql 0
837
+ @pc.commands["TGT1"]["PKT1"].buffer = "\x02"
838
+ @pc.commands["TGT1"]["PKT1"].read("ITEM1").should eql "FALSE"
839
+ tf.unlink
840
+ end
841
+
842
+ context "with telemetry" do
843
+ it "should only allow GREEN YELLOW or RED" do
844
+ tf = Tempfile.new('unittest')
845
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Description"'
846
+ tf.puts ' APPEND_ITEM item1 8 UINT "state item"'
847
+ tf.puts ' STATE WORST 1 ORANGE'
848
+ tf.close
849
+ expect { @pc.process_file(tf.path, "TGT1") }.to raise_error(ConfigParser::Error, /Invalid state color ORANGE/)
850
+ tf.unlink
851
+ end
852
+
853
+ it "should record the state values and colors" do
854
+ tf = Tempfile.new('unittest')
855
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Description"'
856
+ tf.puts ' APPEND_ITEM item1 8 UINT "state item"'
857
+ tf.puts ' STATE STATE1 1 RED'
858
+ tf.puts ' STATE STATE2 2 YELLOW'
859
+ tf.puts ' STATE STATE3 3 GREEN'
860
+ tf.puts ' STATE STATE4 4'
861
+ tf.close
862
+ @pc.process_file(tf.path, "TGT1")
863
+ index = 1
864
+ colors = [:RED, :YELLOW, :GREEN]
865
+ @pc.telemetry["TGT1"]["PKT1"].items["ITEM1"].states.each do |name,val|
866
+ name.should eql "STATE#{index}"
867
+ val.should eql index
868
+ @pc.telemetry["TGT1"]["PKT1"].items["ITEM1"].state_colors[name].should eql colors[index - 1]
869
+
870
+ index += 1
871
+ end
872
+ @pc.telemetry["TGT1"]["PKT1"].limits_items.should eql [@pc.telemetry["TGT1"]["PKT1"].items["ITEM1"]]
873
+ tf.unlink
874
+ end
875
+ end
876
+
877
+ context "with command" do
878
+ it "should only allow HAZARDOUS as the third param" do
879
+ tf = Tempfile.new('unittest')
880
+ tf.puts 'COMMAND tgt1 pkt1 LITTLE_ENDIAN "Description"'
881
+ tf.puts ' APPEND_PARAMETER item1 8 UINT 0 0 0'
882
+ tf.puts ' STATE WORST 0 RED'
883
+ tf.close
884
+ expect { @pc.process_file(tf.path, "TGT1") }.to raise_error(ConfigParser::Error, /HAZARDOUS expected as third parameter/)
885
+ tf.unlink
886
+ end
887
+
888
+ it "should take HAZARDOUS and an optional description" do
889
+ tf = Tempfile.new('unittest')
890
+ tf.puts 'COMMAND tgt1 pkt1 LITTLE_ENDIAN "Description"'
891
+ tf.puts ' APPEND_PARAMETER item1 8 UINT 1 3 1'
892
+ tf.puts ' STATE GOOD 1'
893
+ tf.puts ' STATE BAD 2 HAZARDOUS'
894
+ tf.puts ' STATE WORST 3 HAZARDOUS "Hazardous description"'
895
+ tf.close
896
+ @pc.process_file(tf.path, "TGT1")
897
+ @pc.commands["TGT1"]["PKT1"].buffer = "\x01"
898
+ @pc.commands["TGT1"]["PKT1"].check_limits
899
+ @pc.commands["TGT1"]["PKT1"].items["ITEM1"].hazardous["GOOD"].should be_nil
900
+ @pc.commands["TGT1"]["PKT1"].items["ITEM1"].hazardous["BAD"].should_not be_nil
901
+ @pc.commands["TGT1"]["PKT1"].items["ITEM1"].hazardous["WORST"].should_not be_nil
902
+ @pc.commands["TGT1"]["PKT1"].items["ITEM1"].hazardous["WORST"].should eql "Hazardous description"
903
+ @pc.commands["TGT1"]["PKT1"].limits_items.should be_empty
904
+ tf.unlink
905
+ end
906
+ end
907
+ end
908
+
909
+ context "with READ_CONVERSION and WRITE_CONVERSION" do
910
+ it "should complain about missing conversion file" do
911
+ filename = File.join(File.dirname(__FILE__), "../test_only.rb")
912
+ File.delete(filename) if File.exist?(filename)
913
+ @pc = PacketConfig.new
914
+
915
+ tf = Tempfile.new('unittest')
916
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
917
+ tf.puts ' ITEM item1 0 16 INT "Integer Item"'
918
+ tf.puts ' READ_CONVERSION test_only.rb'
919
+ tf.close
920
+ expect { @pc.process_file(tf.path, "TGT1") }.to raise_error(ConfigParser::Error, /TestOnly class not found/)
921
+ tf.unlink
922
+
923
+ tf = Tempfile.new('unittest')
924
+ tf.puts 'COMMAND tgt1 pkt1 LITTLE_ENDIAN "Packet"'
925
+ tf.puts ' PARAMETER item1 0 16 INT 0 0 0'
926
+ tf.puts ' WRITE_CONVERSION test_only.rb'
927
+ tf.close
928
+ expect { @pc.process_file(tf.path, "TGT1") }.to raise_error(ConfigParser::Error, /TestOnly class not found/)
929
+ tf.unlink
930
+ end
931
+
932
+ it "should complain about a non Cosmos::Conversion class" do
933
+ filename = File.join(File.dirname(__FILE__), "../conversion1.rb")
934
+ File.open(filename, 'w') do |file|
935
+ file.puts "class Conversion1"
936
+ file.puts " def call(value,packet,buffer)"
937
+ file.puts " end"
938
+ file.puts "end"
939
+ end
940
+ load 'conversion1.rb'
941
+ File.delete(filename) if File.exist?(filename)
942
+
943
+ tf = Tempfile.new('unittest')
944
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
945
+ tf.puts ' ITEM item1 0 16 INT "Integer Item"'
946
+ tf.puts ' READ_CONVERSION conversion1.rb'
947
+ tf.close
948
+ expect { @pc.process_file(tf.path, "TGT1") }.to raise_error(ConfigParser::Error, /read_conversion must be a Cosmos::Conversion but is a Conversion1/)
949
+ tf.unlink
950
+
951
+ tf = Tempfile.new('unittest')
952
+ tf.puts 'COMMAND tgt1 pkt1 LITTLE_ENDIAN "Packet"'
953
+ tf.puts ' PARAMETER item1 0 16 INT 0 0 0'
954
+ tf.puts ' WRITE_CONVERSION conversion1.rb'
955
+ tf.close
956
+ expect { @pc.process_file(tf.path, "TGT1") }.to raise_error(ConfigParser::Error, /write_conversion must be a Cosmos::Conversion but is a Conversion1/)
957
+ tf.unlink
958
+ end
959
+
960
+ it "should parse the conversion" do
961
+ filename = File.join(File.dirname(__FILE__), "../conversion2.rb")
962
+ File.open(filename, 'w') do |file|
963
+ file.puts "require 'cosmos/conversions/conversion'"
964
+ file.puts "class Conversion2 < Cosmos::Conversion"
965
+ file.puts " def call(value,packet,buffer)"
966
+ file.puts " value * 2"
967
+ file.puts " end"
968
+ file.puts "end"
969
+ end
970
+ load 'conversion2.rb'
971
+
972
+ tf = Tempfile.new('unittest')
973
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
974
+ tf.puts ' ITEM item1 0 16 INT "Integer Item"'
975
+ tf.puts ' READ_CONVERSION conversion2.rb'
976
+ tf.close
977
+ @pc.process_file(tf.path, "TGT1")
978
+ @pc.telemetry["TGT1"]["PKT1"].buffer = "\x01"
979
+ @pc.telemetry["TGT1"]["PKT1"].read("ITEM1").should eql 2
980
+ tf.unlink
981
+
982
+ tf = Tempfile.new('unittest')
983
+ tf.puts 'COMMAND tgt1 pkt1 LITTLE_ENDIAN "Packet"'
984
+ tf.puts ' PARAMETER item1 0 16 INT 0 0 0'
985
+ tf.puts ' WRITE_CONVERSION conversion2.rb'
986
+ tf.close
987
+ @pc.process_file(tf.path, "TGT1")
988
+ @pc.commands["TGT1"]["PKT1"].write("ITEM1", 3)
989
+ @pc.commands["TGT1"]["PKT1"].read("ITEM1").should eql 6
990
+ tf.unlink
991
+
992
+ File.delete(filename) if File.exist?(filename)
993
+ end
994
+ end
995
+
996
+ context "with PROCESSOR" do
997
+ it "should complain about missing processor file" do
998
+ filename = File.join(File.dirname(__FILE__), "../test_only.rb")
999
+ File.delete(filename) if File.exist?(filename)
1000
+ @pc = PacketConfig.new
1001
+
1002
+ tf = Tempfile.new('unittest')
1003
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
1004
+ tf.puts ' PROCESSOR TEST test_only.rb'
1005
+ tf.close
1006
+ expect { @pc.process_file(tf.path, "TGT1") }.to raise_error(ConfigParser::Error, /TestOnly class not found/)
1007
+ tf.unlink
1008
+ end
1009
+
1010
+ it "should complain about a non Cosmos::Processor class" do
1011
+ filename = File.join(File.dirname(__FILE__), "../processor1.rb")
1012
+ File.open(filename, 'w') do |file|
1013
+ file.puts "class Processor1"
1014
+ file.puts " def call(packet,buffer)"
1015
+ file.puts " end"
1016
+ file.puts "end"
1017
+ end
1018
+ load 'processor1.rb'
1019
+ File.delete(filename) if File.exist?(filename)
1020
+
1021
+ tf = Tempfile.new('unittest')
1022
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
1023
+ tf.puts ' PROCESSOR P1 processor1.rb'
1024
+ tf.close
1025
+ expect { @pc.process_file(tf.path, "TGT1") }.to raise_error(ConfigParser::Error, /processor must be a Cosmos::Processor but is a Processor1/)
1026
+ tf.unlink
1027
+ end
1028
+
1029
+ it "should parse the processor" do
1030
+ filename = File.join(File.dirname(__FILE__), "../processor2.rb")
1031
+ File.open(filename, 'w') do |file|
1032
+ file.puts "require 'cosmos/processors/processor'"
1033
+ file.puts "class Processor2 < Cosmos::Processor"
1034
+ file.puts " def call(packet,buffer)"
1035
+ file.puts " @results[:TEST] = 5"
1036
+ file.puts " end"
1037
+ file.puts "end"
1038
+ end
1039
+ load 'processor2.rb'
1040
+
1041
+ tf = Tempfile.new('unittest')
1042
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
1043
+ tf.puts ' ITEM item1 0 16 INT "Integer Item"'
1044
+ tf.puts ' READ_CONVERSION processor_conversion.rb P2 TEST'
1045
+ tf.puts ' PROCESSOR P2 processor2.rb'
1046
+ tf.puts ' PROCESSOR P3 processor2.rb RAW'
1047
+ tf.close
1048
+ @pc.process_file(tf.path, "TGT1")
1049
+ @pc.telemetry["TGT1"]["PKT1"].buffer = "\x01\x01"
1050
+ @pc.telemetry["TGT1"]["PKT1"].read("ITEM1").should eql 5
1051
+ tf.unlink
1052
+
1053
+ File.delete(filename) if File.exist?(filename)
1054
+ end
1055
+
1056
+ it "should complain if applied to a command packet" do
1057
+ tf = Tempfile.new('unittest')
1058
+ tf.puts 'COMMAND tgt1 pkt1 LITTLE_ENDIAN "Packet"'
1059
+ tf.puts ' PROCESSOR P1 processor1.rb'
1060
+ tf.close
1061
+ expect { @pc.process_file(tf.path, "TGT1") }.to raise_error(ConfigParser::Error, "PROCESSOR only applies to telemetry packets")
1062
+ tf.unlink
1063
+ end
1064
+ end
1065
+
1066
+ context "with POLY_READ_CONVERSION and POLY_WRITE_CONVERSION" do
1067
+ it "should perform a polynomial conversion" do
1068
+ tf = Tempfile.new('unittest')
1069
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
1070
+ tf.puts ' ITEM item1 0 16 INT "Integer Item"'
1071
+ tf.puts ' POLY_READ_CONVERSION 5 2'
1072
+ tf.close
1073
+ @pc.process_file(tf.path, "TGT1")
1074
+ @pc.telemetry["TGT1"]["PKT1"].buffer = "\x01"
1075
+ @pc.telemetry["TGT1"]["PKT1"].read("ITEM1").should eql 7.0
1076
+ tf.unlink
1077
+
1078
+ tf = Tempfile.new('unittest')
1079
+ tf.puts 'COMMAND tgt1 pkt1 LITTLE_ENDIAN "Packet"'
1080
+ tf.puts ' PARAMETER item1 0 16 INT 0 0 0'
1081
+ tf.puts ' POLY_WRITE_CONVERSION 5 2'
1082
+ tf.close
1083
+ @pc.process_file(tf.path, "TGT1")
1084
+ @pc.commands["TGT1"]["PKT1"].write("ITEM1", 3)
1085
+ @pc.commands["TGT1"]["PKT1"].read("ITEM1").should eql 11
1086
+ tf.unlink
1087
+ end
1088
+ end
1089
+
1090
+ context "with SEG_POLY_READ_CONVERSION and SEG_POLY_WRITE_CONVERSION" do
1091
+ it "should perform a segmented polynomial conversion" do
1092
+ tf = Tempfile.new('unittest')
1093
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
1094
+ tf.puts ' ITEM item1 0 16 INT "Integer Item"'
1095
+ tf.puts ' SEG_POLY_READ_CONVERSION 0 1 2'
1096
+ tf.puts ' SEG_POLY_READ_CONVERSION 5 2 3'
1097
+ tf.close
1098
+ @pc.process_file(tf.path, "TGT1")
1099
+ @pc.telemetry["TGT1"]["PKT1"].buffer = "\x01"
1100
+ @pc.telemetry["TGT1"]["PKT1"].read("ITEM1").should eql 3.0
1101
+ @pc.telemetry["TGT1"]["PKT1"].buffer = "\x05"
1102
+ @pc.telemetry["TGT1"]["PKT1"].read("ITEM1").should eql 17.0
1103
+ tf.unlink
1104
+
1105
+ tf = Tempfile.new('unittest')
1106
+ tf.puts 'COMMAND tgt1 pkt1 LITTLE_ENDIAN "Packet"'
1107
+ tf.puts ' PARAMETER item1 0 16 INT 0 0 0'
1108
+ tf.puts ' SEG_POLY_WRITE_CONVERSION 0 1 2'
1109
+ tf.puts ' SEG_POLY_WRITE_CONVERSION 5 2 3'
1110
+ tf.close
1111
+ @pc.process_file(tf.path, "TGT1")
1112
+ @pc.commands["TGT1"]["PKT1"].write("ITEM1", 1)
1113
+ @pc.commands["TGT1"]["PKT1"].read("ITEM1").should eql 3
1114
+ @pc.commands["TGT1"]["PKT1"].write("ITEM1", 5)
1115
+ @pc.commands["TGT1"]["PKT1"].read("ITEM1").should eql 17
1116
+ tf.unlink
1117
+ end
1118
+ end
1119
+
1120
+ context "with GENERIC_READ_CONVERSION and GENERIC_WRITE_CONVERSION" do
1121
+ it "should process a generic conversion" do
1122
+ tf = Tempfile.new('unittest')
1123
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
1124
+ tf.puts ' APPEND_ITEM item1 16 UINT "Item"'
1125
+ tf.puts ' GENERIC_WRITE_CONVERSION_START'
1126
+ tf.puts ' 2.0 * value'
1127
+ tf.puts ' GENERIC_WRITE_CONVERSION_END'
1128
+ tf.puts ' APPEND_ITEM item2 8 UINT "Item"'
1129
+ tf.puts ' GENERIC_READ_CONVERSION_START'
1130
+ tf.puts ' "Number #{value}"'
1131
+ tf.puts ' GENERIC_READ_CONVERSION_END'
1132
+ tf.close
1133
+ @pc.process_file(tf.path, "TGT1")
1134
+ pkt = @pc.telemetry["TGT1"]["PKT1"]
1135
+ pkt.enable_method_missing
1136
+ pkt.item1 = 2
1137
+ pkt.item1.should eql 4
1138
+ pkt.item2.should eql "Number 0"
1139
+ tf.unlink
1140
+ end
1141
+
1142
+ it "should process a generic conversion with a defined type" do
1143
+ tf = Tempfile.new('unittest')
1144
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
1145
+ tf.puts ' APPEND_ITEM item1 16 UINT "Item"'
1146
+ tf.puts ' GENERIC_WRITE_CONVERSION_START UINT 8'
1147
+ tf.puts ' 2.0 * value'
1148
+ tf.puts ' GENERIC_WRITE_CONVERSION_END'
1149
+ tf.puts ' APPEND_ITEM item2 64 FLOAT "Item"'
1150
+ tf.puts ' GENERIC_READ_CONVERSION_START FLOAT 32'
1151
+ tf.puts ' 2.0 * value'
1152
+ tf.puts ' GENERIC_READ_CONVERSION_END'
1153
+ tf.close
1154
+ @pc.process_file(tf.path, "TGT1")
1155
+ pkt = @pc.telemetry["TGT1"]["PKT1"]
1156
+ pkt.enable_method_missing
1157
+ pkt.item1 = 400
1158
+ pkt.item1.should eql 800
1159
+ pkt.item2 = 400
1160
+ pkt.item2.should eql 800.0
1161
+ tf.unlink
1162
+ end
1163
+ end
1164
+
1165
+ context "with LIMITS" do
1166
+ it "should complain if applied to a command PARAMETER" do
1167
+ tf = Tempfile.new('unittest')
1168
+ tf.puts 'COMMAND tgt1 pkt1 LITTLE_ENDIAN "Packet"'
1169
+ tf.puts ' APPEND_PARAMETER item1 16 UINT 0 0 0 "Item"'
1170
+ tf.puts ' LIMITS DEFAULT 3 ENABLED 1 2 6 7 3 5'
1171
+ tf.close
1172
+ expect { @pc.process_file(tf.path, "TGT1") }.to raise_error(ConfigParser::Error, "LIMITS only applies to telemetry items")
1173
+ tf.unlink
1174
+ end
1175
+
1176
+ it "should complain if the second parameter isn't a number" do
1177
+ tf = Tempfile.new('unittest')
1178
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
1179
+ tf.puts ' APPEND_ITEM item1 16 UINT "Item"'
1180
+ tf.puts ' LIMITS DEFAULT TRUE ENABLED 1 2 6 7 3 5'
1181
+ tf.close
1182
+ expect { @pc.process_file(tf.path, "TGT1") }.to raise_error(ConfigParser::Error, /Ensure persistence is an integer/)
1183
+ tf.unlink
1184
+ end
1185
+
1186
+ it "should complain if the third parameter isn't ENABLED or DISABLED" do
1187
+ tf = Tempfile.new('unittest')
1188
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
1189
+ tf.puts ' APPEND_ITEM item1 16 UINT "Item"'
1190
+ tf.puts ' LIMITS DEFAULT 3 TRUE 1 2 6 7 3 5'
1191
+ tf.close
1192
+ expect { @pc.process_file(tf.path, "TGT1") }.to raise_error(ConfigParser::Error, /Initial state must be ENABLED or DISABLED/)
1193
+ tf.unlink
1194
+ end
1195
+
1196
+ it "should complain if the 4 limits are out of order" do
1197
+ tf = Tempfile.new('unittest')
1198
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
1199
+ tf.puts ' APPEND_ITEM item1 16 UINT "Item"'
1200
+ tf.puts ' LIMITS DEFAULT 3 ENABLED 2 1 3 4'
1201
+ tf.close
1202
+ expect { @pc.process_file(tf.path, "TGT1") }.to raise_error(ConfigParser::Error, "Invalid limits specified. Ensure yellow limits are within red limits.")
1203
+ tf.unlink
1204
+
1205
+ tf = Tempfile.new('unittest')
1206
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
1207
+ tf.puts ' APPEND_ITEM item1 16 UINT "Item"'
1208
+ tf.puts ' LIMITS DEFAULT 3 ENABLED 1 5 3 7'
1209
+ tf.close
1210
+ expect { @pc.process_file(tf.path, "TGT1") }.to raise_error(ConfigParser::Error, "Invalid limits specified. Ensure yellow limits are within red limits.")
1211
+ tf.unlink
1212
+
1213
+ tf = Tempfile.new('unittest')
1214
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
1215
+ tf.puts ' APPEND_ITEM item1 16 UINT "Item"'
1216
+ tf.puts ' LIMITS DEFAULT 3 ENABLED 1 2 5 4'
1217
+ tf.close
1218
+ expect { @pc.process_file(tf.path, "TGT1") }.to raise_error(ConfigParser::Error, "Invalid limits specified. Ensure yellow limits are within red limits.")
1219
+ tf.unlink
1220
+
1221
+ tf = Tempfile.new('unittest')
1222
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
1223
+ tf.puts ' APPEND_ITEM item1 16 UINT "Item"'
1224
+ tf.puts ' LIMITS DEFAULT 3 ENABLED 1 2 3 0'
1225
+ tf.close
1226
+ expect { @pc.process_file(tf.path, "TGT1") }.to raise_error(ConfigParser::Error, "Invalid limits specified. Ensure yellow limits are within red limits.")
1227
+ tf.unlink
1228
+ end
1229
+
1230
+ it "should complain if the 6 limits are out of order" do
1231
+ tf = Tempfile.new('unittest')
1232
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
1233
+ tf.puts ' APPEND_ITEM item1 16 UINT "Item"'
1234
+ tf.puts ' LIMITS DEFAULT 3 ENABLED 1 2 6 7 0 5'
1235
+ tf.close
1236
+ expect { @pc.process_file(tf.path, "TGT1") }.to raise_error(ConfigParser::Error, "Invalid limits specified. Ensure green limits are within yellow limits.")
1237
+ tf.unlink
1238
+
1239
+ tf = Tempfile.new('unittest')
1240
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
1241
+ tf.puts ' APPEND_ITEM item1 16 UINT "Item"'
1242
+ tf.puts ' LIMITS DEFAULT 3 ENABLED 1 3 6 7 2 5'
1243
+ tf.close
1244
+ expect { @pc.process_file(tf.path, "TGT1") }.to raise_error(ConfigParser::Error, "Invalid limits specified. Ensure green limits are within yellow limits.")
1245
+ tf.unlink
1246
+
1247
+ tf = Tempfile.new('unittest')
1248
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
1249
+ tf.puts ' APPEND_ITEM item1 16 UINT "Item"'
1250
+ tf.puts ' LIMITS DEFAULT 3 ENABLED 1 2 6 8 3 7'
1251
+ tf.close
1252
+ expect { @pc.process_file(tf.path, "TGT1") }.to raise_error(ConfigParser::Error, "Invalid limits specified. Ensure green limits are within yellow limits.")
1253
+ tf.unlink
1254
+
1255
+ tf = Tempfile.new('unittest')
1256
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
1257
+ tf.puts ' APPEND_ITEM item1 16 UINT "Item"'
1258
+ tf.puts ' LIMITS DEFAULT 3 ENABLED 1 2 6 8 3 9'
1259
+ tf.close
1260
+ expect { @pc.process_file(tf.path, "TGT1") }.to raise_error(ConfigParser::Error, "Invalid limits specified. Ensure green limits are within yellow limits.")
1261
+ tf.unlink
1262
+
1263
+ tf = Tempfile.new('unittest')
1264
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
1265
+ tf.puts ' APPEND_ITEM item1 16 UINT "Item"'
1266
+ tf.puts ' LIMITS DEFAULT 3 ENABLED 1 2 6 8 4 3'
1267
+ tf.close
1268
+ expect { @pc.process_file(tf.path, "TGT1") }.to raise_error(ConfigParser::Error, "Invalid limits specified. Ensure green limits are within yellow limits.")
1269
+ tf.unlink
1270
+ end
1271
+
1272
+ it "should take 4 limits values" do
1273
+ tf = Tempfile.new('unittest')
1274
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
1275
+ tf.puts ' APPEND_ITEM item1 16 UINT "Item"'
1276
+ tf.puts ' LIMITS DEFAULT 3 ENABLED 1 2 6 7'
1277
+ tf.close
1278
+ @pc.process_file(tf.path, "TGT1")
1279
+ item = @pc.telemetry["TGT1"]["PKT1"].items["ITEM1"]
1280
+ item.limits.values[:DEFAULT].should_not be_nil
1281
+ @pc.telemetry["TGT1"]["PKT1"].buffer = "\x04"
1282
+ @pc.telemetry["TGT1"]["PKT1"].enable_limits("ITEM1")
1283
+ @pc.telemetry["TGT1"]["PKT1"].check_limits
1284
+ item.limits.state.should eql :GREEN
1285
+ @pc.telemetry["TGT1"]["PKT1"].limits_items.should eql [item]
1286
+ tf.unlink
1287
+ end
1288
+
1289
+ it "should take 6 limits values" do
1290
+ tf = Tempfile.new('unittest')
1291
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
1292
+ tf.puts ' APPEND_ITEM item1 16 UINT "Item"'
1293
+ tf.puts ' LIMITS DEFAULT 3 ENABLED 1 2 6 7 3 5'
1294
+ tf.close
1295
+ @pc.process_file(tf.path, "TGT1")
1296
+ item = @pc.telemetry["TGT1"]["PKT1"].items["ITEM1"]
1297
+ item.limits.values[:DEFAULT].should_not be_nil
1298
+ @pc.telemetry["TGT1"]["PKT1"].buffer = "\x04"
1299
+ @pc.telemetry["TGT1"]["PKT1"].enable_limits("ITEM1")
1300
+ @pc.telemetry["TGT1"]["PKT1"].check_limits
1301
+ item.limits.state.should eql :BLUE
1302
+ @pc.telemetry["TGT1"]["PKT1"].limits_items.should eql [item]
1303
+ tf.unlink
1304
+ end
1305
+ end
1306
+
1307
+ context "with LIMITS_RESPONSE" do
1308
+ it "should complain if applied to a command PARAMETER" do
1309
+ tf = Tempfile.new('unittest')
1310
+ tf.puts 'COMMAND tgt1 pkt1 LITTLE_ENDIAN "Packet"'
1311
+ tf.puts ' APPEND_PARAMETER item1 16 UINT 0 0 0 "Item"'
1312
+ tf.puts ' LIMITS_RESPONSE test.rb'
1313
+ tf.close
1314
+ expect { @pc.process_file(tf.path, "TGT1") }.to raise_error(ConfigParser::Error, "LIMITS_RESPONSE only applies to telemetry items")
1315
+ tf.unlink
1316
+ end
1317
+
1318
+ it "should complain about missing response file" do
1319
+ filename = File.join(File.dirname(__FILE__), "../test_only.rb")
1320
+ File.delete(filename) if File.exist?(filename)
1321
+ @pc = PacketConfig.new
1322
+
1323
+ tf = Tempfile.new('unittest')
1324
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
1325
+ tf.puts ' ITEM item1 0 16 INT "Integer Item"'
1326
+ tf.puts ' LIMITS DEFAULT 3 ENABLED 1 2 6 7 3 5'
1327
+ tf.puts ' LIMITS_RESPONSE test_only.rb'
1328
+ tf.close
1329
+ expect { @pc.process_file(tf.path, "TGT1") }.to raise_error(ConfigParser::Error, /TestOnly class not found/)
1330
+ tf.unlink
1331
+ end
1332
+
1333
+ it "should complain about a non Cosmos::LimitsResponse class" do
1334
+ filename = File.join(File.dirname(__FILE__), "../limits_response1.rb")
1335
+ File.open(filename, 'w') do |file|
1336
+ file.puts "class LimitsResponse1"
1337
+ file.puts " def call(target_name, packet_name, item, old_limits_state, new_limits_state)"
1338
+ file.puts " end"
1339
+ file.puts "end"
1340
+ end
1341
+ load 'limits_response1.rb'
1342
+ File.delete(filename) if File.exist?(filename)
1343
+
1344
+ tf = Tempfile.new('unittest')
1345
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
1346
+ tf.puts ' ITEM item1 0 16 INT "Integer Item"'
1347
+ tf.puts ' LIMITS DEFAULT 3 ENABLED 1 2 6 7 3 5'
1348
+ tf.puts ' LIMITS_RESPONSE limits_response1.rb'
1349
+ tf.close
1350
+ expect { @pc.process_file(tf.path, "TGT1") }.to raise_error(ConfigParser::Error, /response must be a Cosmos::LimitsResponse but is a LimitsResponse1/)
1351
+ tf.unlink
1352
+ end
1353
+
1354
+ it "should set the response" do
1355
+ filename = File.join(File.dirname(__FILE__), "../limits_response2.rb")
1356
+ File.open(filename, 'w') do |file|
1357
+ file.puts "require 'cosmos/packets/limits_response'"
1358
+ file.puts "class LimitsResponse2 < Cosmos::LimitsResponse"
1359
+ file.puts " def call(target_name, packet_name, item, old_limits_state, new_limits_state)"
1360
+ file.puts " puts \"\#{target_name} \#{packet_name} \#{item.name} \#{old_limits_state} \#{new_limits_state}\""
1361
+ file.puts " end"
1362
+ file.puts "end"
1363
+ end
1364
+ load 'limits_response2.rb'
1365
+
1366
+ tf = Tempfile.new('unittest')
1367
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
1368
+ tf.puts ' ITEM item1 0 16 INT "Integer Item"'
1369
+ tf.puts ' LIMITS DEFAULT 1 ENABLED 1 2 6 7 3 5'
1370
+ tf.puts ' LIMITS_RESPONSE limits_response2.rb'
1371
+ tf.close
1372
+ @pc.process_file(tf.path, "TGT1")
1373
+ pkt = @pc.telemetry["TGT1"]["PKT1"]
1374
+ pkt.get_item("ITEM1").limits.response.class.should eql LimitsResponse2
1375
+
1376
+ File.delete(filename) if File.exist?(filename)
1377
+ tf.unlink
1378
+ end
1379
+
1380
+ it "should call the response with parameters" do
1381
+ filename = File.join(File.dirname(__FILE__), "../limits_response2.rb")
1382
+ File.open(filename, 'w') do |file|
1383
+ file.puts "require 'cosmos/packets/limits_response'"
1384
+ file.puts "class LimitsResponse2 < Cosmos::LimitsResponse"
1385
+ file.puts " def initialize(val)"
1386
+ file.puts " puts \"initialize: \#{val}\""
1387
+ file.puts " end"
1388
+ file.puts " def call(target_name, packet_name, item, old_limits_state, new_limits_state)"
1389
+ file.puts " puts \"\#{target_name} \#{packet_name} \#{item.name} \#{old_limits_state} \#{new_limits_state}\""
1390
+ file.puts " end"
1391
+ file.puts "end"
1392
+ end
1393
+ load 'limits_response2.rb'
1394
+
1395
+ tf = Tempfile.new('unittest')
1396
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
1397
+ tf.puts ' ITEM item1 0 16 INT "Integer Item"'
1398
+ tf.puts ' LIMITS DEFAULT 1 ENABLED 1 2 6 7 3 5'
1399
+ tf.puts ' LIMITS_RESPONSE limits_response2.rb 2'
1400
+ tf.close
1401
+ capture_io do |stdout|
1402
+ @pc.process_file(tf.path, "TGT1")
1403
+ stdout.string.should eql "initialize: 2\n"
1404
+ end
1405
+
1406
+ File.delete(filename) if File.exist?(filename)
1407
+ tf.unlink
1408
+ end
1409
+ end
1410
+
1411
+ context "with FORMAT_STRING" do
1412
+ it "should complain about invalid format strings" do
1413
+ tf = Tempfile.new('unittest')
1414
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
1415
+ tf.puts ' ITEM item1 0 8 INT'
1416
+ tf.puts ' FORMAT_STRING "%*s"'
1417
+ tf.close
1418
+ expect { @pc.process_file(tf.path, "TGT1") }.to raise_error(ConfigParser::Error, "Invalid FORMAT_STRING specified for type INT: %*s")
1419
+ tf.unlink
1420
+
1421
+ tf = Tempfile.new('unittest')
1422
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
1423
+ tf.puts ' ITEM item1 0 8 STRING'
1424
+ tf.puts ' FORMAT_STRING "%d"'
1425
+ tf.close
1426
+ expect { @pc.process_file(tf.path, "TGT1") }.to raise_error(ConfigParser::Error, "Invalid FORMAT_STRING specified for type STRING: %d")
1427
+ tf.unlink
1428
+ end
1429
+
1430
+ it "should format integers" do
1431
+ tf = Tempfile.new('unittest')
1432
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
1433
+ tf.puts ' ITEM item1 0 8 INT'
1434
+ tf.puts ' FORMAT_STRING "d%d"'
1435
+ tf.puts ' ITEM item2 0 8 UINT'
1436
+ tf.puts ' FORMAT_STRING "u%u"'
1437
+ tf.puts ' ITEM item3 0 8 UINT'
1438
+ tf.puts ' FORMAT_STRING "0x%x"'
1439
+ tf.close
1440
+ @pc.process_file(tf.path, "TGT1")
1441
+ @pc.telemetry["TGT1"]["PKT1"].buffer = "\x0a\x0b\x0c"
1442
+ @pc.telemetry["TGT1"]["PKT1"].read("ITEM1",:FORMATTED).should eql "d10"
1443
+ @pc.telemetry["TGT1"]["PKT1"].read("ITEM2",:FORMATTED).should eql "u10"
1444
+ @pc.telemetry["TGT1"]["PKT1"].read("ITEM3",:FORMATTED).should eql "0xa"
1445
+ tf.unlink
1446
+ end
1447
+
1448
+ it "should format floats" do
1449
+ tf = Tempfile.new('unittest')
1450
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
1451
+ tf.puts ' ITEM item1 0 32 FLOAT'
1452
+ tf.puts ' FORMAT_STRING "%3.3f"'
1453
+ tf.close
1454
+ @pc.process_file(tf.path, "TGT1")
1455
+ @pc.telemetry["TGT1"]["PKT1"].write("ITEM1",12345.12345)
1456
+ @pc.telemetry["TGT1"]["PKT1"].read("ITEM1",:FORMATTED).should eql "12345.123"
1457
+ tf.unlink
1458
+ end
1459
+
1460
+ it "should format strings and blocks" do
1461
+ tf = Tempfile.new('unittest')
1462
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
1463
+ tf.puts ' ITEM item1 0 32 STRING'
1464
+ tf.puts ' FORMAT_STRING "String: %s"'
1465
+ tf.puts ' ITEM item2 0 32 BLOCK'
1466
+ tf.puts ' FORMAT_STRING "Block: %s"'
1467
+ tf.close
1468
+ @pc.process_file(tf.path, "TGT1")
1469
+ @pc.telemetry["TGT1"]["PKT1"].write("ITEM1","HI")
1470
+ @pc.telemetry["TGT1"]["PKT1"].read("ITEM1",:FORMATTED).should eql "String: HI"
1471
+ @pc.telemetry["TGT1"]["PKT1"].write("ITEM2","\x00\x01\x02\x03")
1472
+ @pc.telemetry["TGT1"]["PKT1"].read("ITEM2",:FORMATTED).should eql "Block: \x00\x01\x02\x03"
1473
+ tf.unlink
1474
+ end
1475
+ end
1476
+
1477
+ context "with UNITS" do
1478
+ it "apply units when read :WITH_UNITS" do
1479
+ tf = Tempfile.new('unittest')
1480
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
1481
+ tf.puts ' ITEM item1 0 8 UINT'
1482
+ tf.puts ' UNITS Volts V'
1483
+ tf.close
1484
+ @pc.process_file(tf.path, "TGT1")
1485
+ @pc.telemetry["TGT1"]["PKT1"].read("ITEM1",:WITH_UNITS).should eql "0 V"
1486
+ tf.unlink
1487
+ end
1488
+ end
1489
+
1490
+ context "with META" do
1491
+ it "should save metadata for items" do
1492
+ tf = Tempfile.new('unittest')
1493
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
1494
+ tf.puts ' ITEM item1 0 8 UINT'
1495
+ tf.puts ' META TYPE "unsigned int"'
1496
+ tf.puts ' META OTHER'
1497
+ tf.close
1498
+ @pc.process_file(tf.path, "TGT1")
1499
+ @pc.telemetry["TGT1"]["PKT1"].get_item('item1').meta['TYPE'].should eql ['unsigned int']
1500
+ @pc.telemetry["TGT1"]["PKT1"].get_item('item1').meta['OTHER'].should eql []
1501
+ tf.unlink
1502
+ end
1503
+ end
1504
+
1505
+ context "with OVERFLOW" do
1506
+ it "should set the overflow type for items" do
1507
+ tf = Tempfile.new('unittest')
1508
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
1509
+ tf.puts ' ITEM item1 0 8 UINT'
1510
+ tf.puts ' OVERFLOW TRUNCATE'
1511
+ tf.puts ' ITEM item2 8 8 UINT'
1512
+ tf.puts ' OVERFLOW SATURATE'
1513
+ tf.puts ' ITEM item3 16 8 UINT'
1514
+ tf.puts ' OVERFLOW ERROR'
1515
+ tf.puts ' ITEM item4 24 8 INT'
1516
+ tf.puts ' OVERFLOW ERROR_ALLOW_HEX'
1517
+ tf.close
1518
+ @pc.process_file(tf.path, "TGT1")
1519
+ @pc.telemetry["TGT1"]["PKT1"].get_item('item1').overflow.should eql :TRUNCATE
1520
+ @pc.telemetry["TGT1"]["PKT1"].get_item('item2').overflow.should eql :SATURATE
1521
+ @pc.telemetry["TGT1"]["PKT1"].get_item('item3').overflow.should eql :ERROR
1522
+ @pc.telemetry["TGT1"]["PKT1"].get_item('item4').overflow.should eql :ERROR_ALLOW_HEX
1523
+ tf.unlink
1524
+ end
1525
+ end
1526
+
1527
+ context "with REQUIRED" do
1528
+ it "should only apply to a command parameter" do
1529
+ tf = Tempfile.new('unittest')
1530
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
1531
+ tf.puts ' ITEM item1 0 8 UINT'
1532
+ tf.puts ' REQUIRED'
1533
+ tf.close
1534
+ expect { @pc.process_file(tf.path, "TGT1") }.to raise_error(ConfigParser::Error, "REQUIRED only applies to command parameters")
1535
+ tf.unlink
1536
+
1537
+ tf = Tempfile.new('unittest')
1538
+ tf.puts 'COMMAND tgt1 pkt1 LITTLE_ENDIAN "Packet"'
1539
+ tf.puts ' REQUIRED'
1540
+ tf.close
1541
+ expect { @pc.process_file(tf.path, "TGT1") }.to raise_error(ConfigParser::Error, "No current item for REQUIRED")
1542
+ tf.unlink
1543
+ end
1544
+
1545
+ it "should mark a command parameter as required" do
1546
+ tf = Tempfile.new('unittest')
1547
+ tf.puts 'COMMAND tgt1 pkt1 LITTLE_ENDIAN "Packet"'
1548
+ tf.puts ' PARAMETER item1 0 8 UINT 0 1 1'
1549
+ tf.puts ' REQUIRED'
1550
+ tf.puts ' PARAMETER item2 0 8 UINT 0 1 1'
1551
+ tf.close
1552
+ @pc.process_file(tf.path, "TGT1")
1553
+ @pc.commands["TGT1"]["PKT1"].items["ITEM1"].required.should be_truthy
1554
+ @pc.commands["TGT1"]["PKT1"].items["ITEM2"].required.should be_falsey
1555
+ tf.unlink
1556
+ end
1557
+ end
1558
+
1559
+ context "with MINIMUM_VALUE, MAXIMUM_VALUE, DEFAULT_VALUE" do
1560
+ it "should complain if used on telemetry items" do
1561
+ tf = Tempfile.new('unittest')
1562
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
1563
+ tf.puts ' APPEND_ITEM item1 16 UINT'
1564
+ tf.puts ' MINIMUM_VALUE 1'
1565
+ tf.close
1566
+ expect { @pc.process_file(tf.path, "TGT1") }.to raise_error(ConfigParser::Error, "MINIMUM_VALUE only applies to command parameters")
1567
+ tf.unlink
1568
+
1569
+ tf = Tempfile.new('unittest')
1570
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
1571
+ tf.puts ' APPEND_ITEM item1 16 UINT'
1572
+ tf.puts ' MAXIMUM_VALUE 3'
1573
+ tf.close
1574
+ expect { @pc.process_file(tf.path, "TGT1") }.to raise_error(ConfigParser::Error, "MAXIMUM_VALUE only applies to command parameters")
1575
+ tf.unlink
1576
+
1577
+ tf = Tempfile.new('unittest')
1578
+ tf.puts 'TELEMETRY tgt1 pkt1 LITTLE_ENDIAN "Packet"'
1579
+ tf.puts ' APPEND_ITEM item1 16 UINT'
1580
+ tf.puts ' DEFAULT_VALUE 2'
1581
+ tf.close
1582
+ expect { @pc.process_file(tf.path, "TGT1") }.to raise_error(ConfigParser::Error, "DEFAULT_VALUE only applies to command parameters")
1583
+ tf.unlink
1584
+ end
1585
+
1586
+ it "should allow overriding the defined value" do
1587
+ tf = Tempfile.new('unittest')
1588
+ tf.puts 'COMMAND tgt1 pkt1 LITTLE_ENDIAN "Packet"'
1589
+ tf.puts ' APPEND_PARAMETER item1 16 UINT 0 1 1'
1590
+ tf.puts ' APPEND_PARAMETER item2 16 STRING "HI"'
1591
+ tf.close
1592
+ @pc.process_file(tf.path, "TGT1")
1593
+ @pc.commands["TGT1"]["PKT1"].restore_defaults
1594
+ @pc.commands["TGT1"]["PKT1"].read("ITEM1").should eql 1
1595
+ @pc.commands["TGT1"]["PKT1"].items["ITEM1"].range.should eql (0..1)
1596
+ @pc.commands["TGT1"]["PKT1"].read("ITEM2").should eql "HI"
1597
+ tf.unlink
1598
+
1599
+ # Now override the values from above
1600
+ tf = Tempfile.new('unittest')
1601
+ tf.puts 'SELECT_COMMAND tgt1 pkt1'
1602
+ tf.puts 'SELECT_PARAMETER item1'
1603
+ tf.puts ' MINIMUM_VALUE 1'
1604
+ tf.puts ' MAXIMUM_VALUE 3'
1605
+ tf.puts ' DEFAULT_VALUE 2'
1606
+ tf.puts 'SELECT_PARAMETER item2'
1607
+ tf.puts ' DEFAULT_VALUE "NO"'
1608
+ tf.close
1609
+ @pc.process_file(tf.path, "TGT1")
1610
+ @pc.commands["TGT1"]["PKT1"].restore_defaults
1611
+ @pc.commands["TGT1"]["PKT1"].read("ITEM1").should eql 2
1612
+ @pc.commands["TGT1"]["PKT1"].items["ITEM1"].range.should eql (1..3)
1613
+ @pc.commands["TGT1"]["PKT1"].read("ITEM2").should eql "NO"
1614
+ tf.unlink
1615
+ end
1616
+ end
1617
+
1618
+ end # describe "process_file"
1619
+ end
1620
+ end