cosmos 3.0.1 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (912) hide show
  1. checksums.yaml +4 -4
  2. data/.coveralls.yml +1 -0
  3. data/.gitignore +48 -48
  4. data/.travis.yml +7 -7
  5. data/CONTRIBUTING.txt +50 -50
  6. data/Gemfile +6 -6
  7. data/Guardfile +27 -27
  8. data/LICENSE.txt +879 -879
  9. data/Manifest.txt +1116 -1114
  10. data/README.md +109 -107
  11. data/Rakefile +214 -214
  12. data/autohotkey/config/data/diamond.STL +57 -57
  13. data/autohotkey/config/system/system.txt +34 -34
  14. data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  15. data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  16. data/autohotkey/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  17. data/autohotkey/config/targets/COSMOS/target.txt +5 -5
  18. data/autohotkey/config/targets/INST/cmd_tlm/inst_cmds.txt +121 -121
  19. data/autohotkey/config/targets/INST/cmd_tlm/inst_tlm.txt +247 -247
  20. data/autohotkey/config/targets/INST/cmd_tlm_server.txt +5 -5
  21. data/autohotkey/config/targets/INST/lib/example_limits_response.rb +30 -30
  22. data/autohotkey/config/targets/INST/lib/sim_inst.rb +305 -294
  23. data/autohotkey/config/targets/INST/screens/adcs.txt +46 -46
  24. data/autohotkey/config/targets/INST/screens/array.txt +7 -7
  25. data/autohotkey/config/targets/INST/screens/block.txt +8 -8
  26. data/autohotkey/config/targets/INST/screens/commanding.txt +30 -30
  27. data/autohotkey/config/targets/INST/screens/graphs.txt +14 -14
  28. data/autohotkey/config/targets/INST/screens/ground.txt +25 -25
  29. data/autohotkey/config/targets/INST/screens/health_status.txt +33 -33
  30. data/autohotkey/config/targets/INST/screens/hs.txt +49 -49
  31. data/autohotkey/config/targets/INST/screens/image.txt +21 -21
  32. data/autohotkey/config/targets/INST/screens/latest.txt +23 -23
  33. data/autohotkey/config/targets/INST/screens/mech.txt +25 -25
  34. data/autohotkey/config/targets/INST/screens/other.txt +25 -25
  35. data/autohotkey/config/targets/INST/screens/params.txt +25 -25
  36. data/autohotkey/config/targets/INST/screens/tabs.txt +68 -68
  37. data/autohotkey/config/targets/INST/target.txt +26 -26
  38. data/autohotkey/config/targets/META/cmd_tlm/meta_cmd.txt +10 -10
  39. data/autohotkey/config/targets/META/cmd_tlm/meta_tlm.txt +9 -9
  40. data/autohotkey/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
  41. data/autohotkey/config/targets/SYSTEM/screens/error.txt +11 -11
  42. data/autohotkey/config/tools/cmd_tlm_server/cmd_tlm_server.txt +22 -22
  43. data/autohotkey/config/tools/data_viewer/data_viewer.txt +11 -11
  44. data/autohotkey/config/tools/handbook_creator/handbook_creator.txt +49 -49
  45. data/autohotkey/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
  46. data/autohotkey/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  47. data/autohotkey/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  48. data/autohotkey/config/tools/handbook_creator/templates/header.html.erb +25 -25
  49. data/autohotkey/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  50. data/autohotkey/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  51. data/autohotkey/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  52. data/autohotkey/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  53. data/autohotkey/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  54. data/autohotkey/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  55. data/autohotkey/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
  56. data/autohotkey/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  57. data/autohotkey/config/tools/handbook_creator/templates/title.html.erb +1 -1
  58. data/autohotkey/config/tools/launcher/launcher.txt +38 -38
  59. data/autohotkey/config/tools/script_runner/script_runner.txt +3 -3
  60. data/autohotkey/config/tools/table_manager/ConfigTables_def.txt +8 -8
  61. data/autohotkey/config/tools/table_manager/OneDimensionalTable_def.txt +19 -19
  62. data/autohotkey/config/tools/table_manager/TwoDimensionalTable_def.txt +248 -248
  63. data/autohotkey/config/tools/test_runner/test_runner.txt +8 -8
  64. data/autohotkey/config/tools/test_runner/test_runner2.txt +11 -11
  65. data/autohotkey/config/tools/test_runner/test_runner3.txt +6 -6
  66. data/autohotkey/config/tools/test_runner/test_runner4.txt +1 -1
  67. data/autohotkey/config/tools/tlm_extractor/tlm_extractor.txt +13 -13
  68. data/autohotkey/config/tools/tlm_extractor/tlm_extractor2.txt +9 -9
  69. data/autohotkey/config/tools/tlm_grapher/bad.txt +50 -50
  70. data/autohotkey/config/tools/tlm_grapher/temp1-4.txt +51 -51
  71. data/autohotkey/config/tools/tlm_grapher/test2.txt +111 -111
  72. data/autohotkey/config/tools/tlm_viewer/tlm_viewer.txt +24 -24
  73. data/autohotkey/config/tools/tlm_viewer/tlm_viewer2.txt +4 -4
  74. data/autohotkey/config/tools/tlm_viewer/tlm_viewer3.txt +3 -3
  75. data/autohotkey/lib/example_background_task.rb +42 -42
  76. data/autohotkey/lib/user_version.rb +3 -3
  77. data/autohotkey/procedures/clear_util.rb +7 -7
  78. data/autohotkey/procedures/collect.rb +18 -18
  79. data/autohotkey/procedures/collect_util.rb +14 -14
  80. data/autohotkey/procedures/example_test.rb +67 -67
  81. data/autohotkey/procedures/example_test2.rb +74 -74
  82. data/autohotkey/procedures/script_test.rb +17 -17
  83. data/autohotkey/procedures/syntax_error.rb +18 -18
  84. data/autohotkey/tools/CmdExtractorAHK +16 -16
  85. data/autohotkey/tools/CmdSender +14 -14
  86. data/autohotkey/tools/CmdSenderAHK +18 -18
  87. data/autohotkey/tools/CmdTlmServer +14 -14
  88. data/autohotkey/tools/CmdTlmServerAHK +28 -28
  89. data/autohotkey/tools/CmdTlmServerAHK2 +17 -17
  90. data/autohotkey/tools/DataViewer +14 -14
  91. data/autohotkey/tools/DataViewerAHK +17 -17
  92. data/autohotkey/tools/HandbookCreatorAHK +20 -20
  93. data/autohotkey/tools/LauncherAHK +17 -17
  94. data/autohotkey/tools/LimitsMonitorAHK +20 -20
  95. data/autohotkey/tools/OpenGLBuilderAHK +20 -20
  96. data/autohotkey/tools/PacketViewer +14 -14
  97. data/autohotkey/tools/PacketViewerAHK +18 -18
  98. data/autohotkey/tools/PacketViewerAHK2 +17 -17
  99. data/autohotkey/tools/Replay +14 -14
  100. data/autohotkey/tools/Replay.bat +59 -59
  101. data/autohotkey/tools/ReplayAHK +17 -17
  102. data/autohotkey/tools/ScriptRunner +14 -14
  103. data/autohotkey/tools/ScriptRunnerAHK +20 -20
  104. data/autohotkey/tools/ScriptRunnerAHK2 +17 -17
  105. data/autohotkey/tools/TableManager +14 -14
  106. data/autohotkey/tools/TableManagerAHK +30 -30
  107. data/autohotkey/tools/TestRunner +15 -15
  108. data/autohotkey/tools/TestRunnerAHK +17 -17
  109. data/autohotkey/tools/TestRunnerAHK2 +17 -17
  110. data/autohotkey/tools/TestRunnerAHK3 +17 -17
  111. data/autohotkey/tools/TestRunnerAHK4 +17 -17
  112. data/autohotkey/tools/TlmExtractor +15 -15
  113. data/autohotkey/tools/TlmExtractorAHK +19 -19
  114. data/autohotkey/tools/TlmExtractorAHK2 +16 -16
  115. data/autohotkey/tools/TlmExtractorAHK3 +16 -16
  116. data/autohotkey/tools/TlmGrapher +14 -14
  117. data/autohotkey/tools/TlmGrapherAHK +19 -19
  118. data/autohotkey/tools/TlmGrapherAHK2 +23 -23
  119. data/autohotkey/tools/TlmGrapherAHK3 +17 -17
  120. data/autohotkey/tools/TlmGrapherAHK4 +17 -17
  121. data/autohotkey/tools/TlmViewer +14 -14
  122. data/autohotkey/tools/TlmViewerAHK +28 -28
  123. data/autohotkey/tools/TlmViewerAHK2 +18 -18
  124. data/autohotkey/tools/TlmViewerAHK3 +18 -18
  125. data/autohotkey/tools/TlmViewerAHK4 +18 -18
  126. data/autohotkey/tools/TlmViewerAHK5 +18 -18
  127. data/autohotkey/tools/autohotkey.rb +37 -37
  128. data/autohotkey/tools/cmd_extractor.ahk +27 -27
  129. data/autohotkey/tools/cmd_sender.ahk +182 -162
  130. data/autohotkey/tools/cmd_tlm_server.ahk +89 -89
  131. data/autohotkey/tools/cmd_tlm_server2.ahk +45 -45
  132. data/autohotkey/tools/data_viewer.ahk +135 -135
  133. data/autohotkey/tools/handbook_creator.ahk +23 -23
  134. data/autohotkey/tools/launcher.ahk +41 -41
  135. data/autohotkey/tools/limits_monitor.ahk +70 -70
  136. data/autohotkey/tools/open_gl_builder.ahk +134 -134
  137. data/autohotkey/tools/packet_viewer.ahk +143 -143
  138. data/autohotkey/tools/packet_viewer2.ahk +9 -9
  139. data/autohotkey/tools/replay.ahk +98 -98
  140. data/autohotkey/tools/script_runner.ahk +589 -589
  141. data/autohotkey/tools/script_runner2.ahk +34 -31
  142. data/autohotkey/tools/table_manager.ahk +220 -220
  143. data/autohotkey/tools/test_runner.ahk +262 -259
  144. data/autohotkey/tools/test_runner2.ahk +52 -52
  145. data/autohotkey/tools/test_runner3.ahk +13 -13
  146. data/autohotkey/tools/tlm_extractor.ahk +272 -272
  147. data/autohotkey/tools/tlm_grapher.ahk +642 -642
  148. data/autohotkey/tools/tlm_grapher2.ahk +115 -115
  149. data/autohotkey/tools/tlm_grapher3.ahk +24 -24
  150. data/autohotkey/tools/tlm_viewer.ahk +133 -133
  151. data/autohotkey/tools/tlm_viewer2.ahk +50 -49
  152. data/autohotkey/tools/tlm_viewer4.ahk +4 -4
  153. data/autohotkey/tools/tlm_viewer5.ahk +20 -20
  154. data/bin/cosmos +96 -96
  155. data/bin/cstol_converter +1166 -1166
  156. data/bin/rubysloc +85 -85
  157. data/cosmos.gemspec +98 -97
  158. data/data/about.txt +4 -4
  159. data/data/crc.txt +306 -305
  160. data/data/diamond.STL +57 -57
  161. data/data/legal.txt +9 -9
  162. data/demo/Gemfile +6 -6
  163. data/demo/Launcher +15 -15
  164. data/demo/Launcher.bat +59 -59
  165. data/demo/Rakefile +61 -61
  166. data/demo/config/data/crc.txt +222 -206
  167. data/demo/config/data/diamond.STL +57 -57
  168. data/demo/config/data/meta_init.txt +4 -4
  169. data/demo/config/system/system.txt +34 -34
  170. data/demo/config/system/system2.txt +33 -33
  171. data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  172. data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  173. data/demo/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  174. data/demo/config/targets/COSMOS/screens/limits_change.txt +20 -20
  175. data/demo/config/targets/COSMOS/screens/version.txt +19 -19
  176. data/demo/config/targets/COSMOS/target.txt +11 -11
  177. data/demo/config/targets/EXAMPLE/cmd_tlm/example_cmds.txt +2 -2
  178. data/demo/config/targets/EXAMPLE/cmd_tlm/example_tlm.txt +3 -3
  179. data/demo/config/targets/EXAMPLE/cmd_tlm_server.txt +6 -6
  180. data/demo/config/targets/EXAMPLE/lib/example_interface.rb +22 -22
  181. data/demo/config/targets/EXAMPLE/target.txt +6 -6
  182. data/demo/config/targets/INST/cmd_tlm/inst_cmds.txt +121 -121
  183. data/demo/config/targets/INST/cmd_tlm/inst_tlm.txt +247 -247
  184. data/demo/config/targets/INST/cmd_tlm_server.txt +5 -5
  185. data/demo/config/targets/INST/lib/example_limits_response.rb +30 -30
  186. data/demo/config/targets/INST/lib/sim_inst.rb +305 -294
  187. data/demo/config/targets/INST/screens/adcs.txt +46 -46
  188. data/demo/config/targets/INST/screens/array.txt +15 -15
  189. data/demo/config/targets/INST/screens/block.txt +8 -8
  190. data/demo/config/targets/INST/screens/commanding.txt +30 -30
  191. data/demo/config/targets/INST/screens/graphs.txt +14 -14
  192. data/demo/config/targets/INST/screens/ground.txt +25 -25
  193. data/demo/config/targets/INST/screens/hs.txt +44 -44
  194. data/demo/config/targets/INST/screens/latest.txt +23 -23
  195. data/demo/config/targets/INST/screens/other.txt +29 -29
  196. data/demo/config/targets/INST/screens/tabs.txt +70 -70
  197. data/demo/config/targets/INST/target.txt +33 -33
  198. data/demo/config/targets/META/cmd_tlm/meta_cmd.txt +10 -10
  199. data/demo/config/targets/META/cmd_tlm/meta_tlm.txt +13 -13
  200. data/demo/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
  201. data/demo/config/targets/SYSTEM/cmd_tlm/override.txt +29 -29
  202. data/demo/config/targets/SYSTEM/screens/status.txt +12 -12
  203. data/demo/config/targets/TEMPLATED/cmd_tlm/templated_cmds.txt +13 -12
  204. data/demo/config/targets/TEMPLATED/cmd_tlm/templated_tlm.txt +3 -3
  205. data/demo/config/targets/TEMPLATED/cmd_tlm_server.txt +6 -6
  206. data/demo/config/targets/TEMPLATED/lib/templated_interface.rb +54 -48
  207. data/demo/config/targets/TEMPLATED/target.txt +6 -6
  208. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server.txt +33 -33
  209. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server2.txt +29 -29
  210. data/demo/config/tools/data_viewer/data_viewer.txt +11 -11
  211. data/demo/config/tools/handbook_creator/handbook_creator.txt +66 -66
  212. data/demo/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
  213. data/demo/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  214. data/demo/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  215. data/demo/config/tools/handbook_creator/templates/header.html.erb +25 -25
  216. data/demo/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  217. data/demo/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  218. data/demo/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  219. data/demo/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  220. data/demo/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  221. data/demo/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  222. data/demo/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
  223. data/demo/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  224. data/demo/config/tools/handbook_creator/templates/title.html.erb +1 -1
  225. data/demo/config/tools/launcher/launcher.txt +45 -45
  226. data/demo/config/tools/launcher/launcher2.txt +45 -45
  227. data/demo/config/tools/script_runner/script_runner.txt +3 -3
  228. data/demo/config/tools/table_manager/ConfigTables_def.txt +8 -8
  229. data/demo/config/tools/table_manager/ExampleTableDefinition.txt +24 -24
  230. data/demo/config/tools/table_manager/MCConfigurationTable_fsw1_def.txt +25 -25
  231. data/demo/config/tools/table_manager/MCConfigurationTable_fsw2_def.txt +25 -25
  232. data/demo/config/tools/table_manager/PPSSelectionTable_def.txt +8 -8
  233. data/demo/config/tools/table_manager/TLMMonitoringTable_def.txt +248 -248
  234. data/demo/config/tools/test_runner/test_runner.txt +17 -17
  235. data/demo/config/tools/tlm_extractor/tlm_extractor.txt +13 -13
  236. data/demo/config/tools/tlm_extractor/tlm_extractor2.txt +2 -2
  237. data/demo/config/tools/tlm_extractor/tlm_extractor3.txt +2 -2
  238. data/demo/config/tools/tlm_extractor/tlm_extractor4.txt +2 -2
  239. data/demo/config/tools/tlm_viewer/tlm_viewer.txt +41 -41
  240. data/demo/lib/example_background_task.rb +57 -52
  241. data/demo/lib/example_target.rb +113 -108
  242. data/demo/lib/scpi_target.rb +74 -74
  243. data/demo/lib/user_version.rb +3 -3
  244. data/demo/procedures/checks.rb +11 -11
  245. data/demo/procedures/clear_util.rb +7 -7
  246. data/demo/procedures/collect.rb +18 -18
  247. data/demo/procedures/collect_util.rb +14 -14
  248. data/demo/procedures/cosmos_api_test.rb +293 -293
  249. data/demo/procedures/disconnect.rb +29 -29
  250. data/demo/procedures/example_test.rb +182 -182
  251. data/demo/procedures/plot_test.rb +8 -8
  252. data/demo/procedures/run_example_test.rb +3 -3
  253. data/demo/procedures/test.rb +51 -51
  254. data/demo/tools/CmdExtractor +15 -15
  255. data/demo/tools/CmdExtractor.bat +59 -59
  256. data/demo/tools/CmdSender +15 -15
  257. data/demo/tools/CmdSender.bat +59 -59
  258. data/demo/tools/CmdTlmServer +15 -15
  259. data/demo/tools/CmdTlmServer.bat +59 -59
  260. data/demo/tools/DataViewer +15 -15
  261. data/demo/tools/DataViewer.bat +59 -59
  262. data/demo/tools/ExampleTarget +15 -15
  263. data/demo/tools/ExampleTarget.bat +59 -59
  264. data/demo/tools/HandbookCreator +15 -15
  265. data/demo/tools/HandbookCreator.bat +61 -61
  266. data/demo/tools/Launcher +15 -15
  267. data/demo/tools/Launcher.bat +59 -59
  268. data/demo/tools/LimitsMonitor +15 -15
  269. data/demo/tools/LimitsMonitor.bat +59 -59
  270. data/demo/tools/OpenGLBuilder +15 -15
  271. data/demo/tools/OpenGLBuilder.bat +59 -59
  272. data/demo/tools/PacketViewer +15 -15
  273. data/demo/tools/PacketViewer.bat +59 -59
  274. data/demo/tools/Replay +15 -15
  275. data/demo/tools/Replay.bat +59 -59
  276. data/demo/tools/ScpiTarget +15 -15
  277. data/demo/tools/ScpiTarget.bat +59 -59
  278. data/demo/tools/ScriptRunner +15 -15
  279. data/demo/tools/ScriptRunner.bat +59 -59
  280. data/demo/tools/TableManager +15 -15
  281. data/demo/tools/TableManager.bat +59 -59
  282. data/demo/tools/TestRunner +15 -15
  283. data/demo/tools/TestRunner.bat +59 -59
  284. data/demo/tools/TlmExtractor +15 -15
  285. data/demo/tools/TlmExtractor.bat +59 -59
  286. data/demo/tools/TlmGrapher +15 -15
  287. data/demo/tools/TlmGrapher.bat +59 -59
  288. data/demo/tools/TlmViewer +15 -15
  289. data/demo/tools/TlmViewer.bat +59 -59
  290. data/demo/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
  291. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +15 -15
  292. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +6 -6
  293. data/demo/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
  294. data/demo/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +15 -15
  295. data/demo/tools/mac/CmdSender.app/Contents/MacOS/main.sh +6 -6
  296. data/demo/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
  297. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +15 -15
  298. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +6 -6
  299. data/demo/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
  300. data/demo/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +15 -15
  301. data/demo/tools/mac/DataViewer.app/Contents/MacOS/main.sh +6 -6
  302. data/demo/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
  303. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +15 -15
  304. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +6 -6
  305. data/demo/tools/mac/Launcher.app/Contents/Info.plist +38 -38
  306. data/demo/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +15 -15
  307. data/demo/tools/mac/Launcher.app/Contents/MacOS/main.sh +6 -6
  308. data/demo/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
  309. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +15 -15
  310. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +6 -6
  311. data/demo/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
  312. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +15 -15
  313. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +6 -6
  314. data/demo/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
  315. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +15 -15
  316. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +6 -6
  317. data/demo/tools/mac/Replay.app/Contents/Info.plist +38 -38
  318. data/demo/tools/mac/Replay.app/Contents/MacOS/Replay.rb +15 -15
  319. data/demo/tools/mac/Replay.app/Contents/MacOS/main.sh +6 -6
  320. data/demo/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
  321. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +15 -15
  322. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +6 -6
  323. data/demo/tools/mac/TableManager.app/Contents/Info.plist +38 -38
  324. data/demo/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +15 -15
  325. data/demo/tools/mac/TableManager.app/Contents/MacOS/main.sh +6 -6
  326. data/demo/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
  327. data/demo/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +15 -15
  328. data/demo/tools/mac/TestRunner.app/Contents/MacOS/main.sh +6 -6
  329. data/demo/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
  330. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +15 -15
  331. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +6 -6
  332. data/demo/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
  333. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +15 -15
  334. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +6 -6
  335. data/demo/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
  336. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +15 -15
  337. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +6 -6
  338. data/ext/cosmos/ext/array/array.c +111 -111
  339. data/ext/cosmos/ext/array/extconf.rb +13 -13
  340. data/ext/cosmos/ext/buffered_file/buffered_file.c +167 -167
  341. data/ext/cosmos/ext/buffered_file/extconf.rb +13 -13
  342. data/ext/cosmos/ext/config_parser/config_parser.c +237 -237
  343. data/ext/cosmos/ext/config_parser/extconf.rb +13 -13
  344. data/ext/cosmos/ext/cosmos_io/cosmos_io.c +117 -117
  345. data/ext/cosmos/ext/cosmos_io/extconf.rb +13 -13
  346. data/ext/cosmos/ext/crc/crc.c +341 -341
  347. data/ext/cosmos/ext/crc/extconf.rb +12 -12
  348. data/ext/cosmos/ext/line_graph/extconf.rb +13 -13
  349. data/ext/cosmos/ext/line_graph/line_graph.c +501 -501
  350. data/ext/cosmos/ext/low_fragmentation_array/extconf.rb +12 -12
  351. data/ext/cosmos/ext/low_fragmentation_array/low_fragmentation_array.c +261 -261
  352. data/ext/cosmos/ext/packet/extconf.rb +13 -13
  353. data/ext/cosmos/ext/packet/packet.c +339 -339
  354. data/ext/cosmos/ext/platform/extconf.rb +13 -13
  355. data/ext/cosmos/ext/platform/platform.c +81 -81
  356. data/ext/cosmos/ext/polynomial_conversion/extconf.rb +13 -13
  357. data/ext/cosmos/ext/polynomial_conversion/polynomial_conversion.c +73 -73
  358. data/ext/cosmos/ext/string/extconf.rb +13 -13
  359. data/ext/cosmos/ext/string/string.c +49 -49
  360. data/ext/cosmos/ext/structure/structure.c +894 -894
  361. data/ext/cosmos/ext/tabbed_plots_config/extconf.rb +13 -13
  362. data/ext/cosmos/ext/tabbed_plots_config/tabbed_plots_config.c +51 -51
  363. data/ext/cosmos/ext/telemetry/extconf.rb +13 -13
  364. data/ext/cosmos/ext/telemetry/telemetry.c +306 -306
  365. data/ext/mkrf_conf.rb +40 -40
  366. data/install/Gemfile +6 -6
  367. data/install/Launcher +14 -14
  368. data/install/Launcher.bat +59 -59
  369. data/install/Rakefile +61 -61
  370. data/install/config/data/crc.txt +134 -133
  371. data/install/config/system/system.txt +29 -29
  372. data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  373. data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  374. data/install/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  375. data/install/config/targets/COSMOS/screens/limits_change.txt +20 -20
  376. data/install/config/targets/COSMOS/screens/version.txt +19 -19
  377. data/install/config/targets/COSMOS/target.txt +8 -8
  378. data/install/config/tools/cmd_tlm_server/cmd_tlm_server.txt +2 -2
  379. data/install/config/tools/data_viewer/data_viewer.txt +3 -3
  380. data/install/config/tools/handbook_creator/handbook_creator.txt +49 -49
  381. data/install/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
  382. data/install/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  383. data/install/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  384. data/install/config/tools/handbook_creator/templates/header.html.erb +25 -25
  385. data/install/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  386. data/install/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  387. data/install/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  388. data/install/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  389. data/install/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  390. data/install/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  391. data/install/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
  392. data/install/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  393. data/install/config/tools/handbook_creator/templates/title.html.erb +1 -1
  394. data/install/config/tools/launcher/launcher.txt +39 -39
  395. data/install/config/tools/script_runner/script_runner.txt +3 -3
  396. data/install/config/tools/test_runner/test_runner.txt +8 -8
  397. data/install/config/tools/tlm_viewer/tlm_viewer.txt +5 -5
  398. data/install/lib/user_version.rb +3 -3
  399. data/install/tools/CmdExtractor +15 -15
  400. data/install/tools/CmdExtractor.bat +59 -59
  401. data/install/tools/CmdSender +15 -15
  402. data/install/tools/CmdSender.bat +59 -59
  403. data/install/tools/CmdTlmServer +15 -15
  404. data/install/tools/CmdTlmServer.bat +59 -59
  405. data/install/tools/DataViewer +15 -15
  406. data/install/tools/DataViewer.bat +59 -59
  407. data/install/tools/HandbookCreator +15 -15
  408. data/install/tools/HandbookCreator.bat +61 -61
  409. data/install/tools/Launcher +15 -15
  410. data/install/tools/Launcher.bat +59 -59
  411. data/install/tools/LimitsMonitor +15 -15
  412. data/install/tools/LimitsMonitor.bat +59 -59
  413. data/install/tools/OpenGLBuilder +15 -15
  414. data/install/tools/OpenGLBuilder.bat +59 -59
  415. data/install/tools/PacketViewer +15 -15
  416. data/install/tools/PacketViewer.bat +59 -59
  417. data/install/tools/Replay +15 -15
  418. data/install/tools/Replay.bat +59 -59
  419. data/install/tools/ScriptRunner +15 -15
  420. data/install/tools/ScriptRunner.bat +59 -59
  421. data/install/tools/TableManager +15 -15
  422. data/install/tools/TableManager.bat +59 -59
  423. data/install/tools/TestRunner +15 -15
  424. data/install/tools/TestRunner.bat +59 -59
  425. data/install/tools/TlmExtractor +15 -15
  426. data/install/tools/TlmExtractor.bat +59 -59
  427. data/install/tools/TlmGrapher +15 -15
  428. data/install/tools/TlmGrapher.bat +59 -59
  429. data/install/tools/TlmViewer +15 -15
  430. data/install/tools/TlmViewer.bat +59 -59
  431. data/install/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
  432. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +15 -15
  433. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +6 -6
  434. data/install/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
  435. data/install/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +15 -15
  436. data/install/tools/mac/CmdSender.app/Contents/MacOS/main.sh +6 -6
  437. data/install/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
  438. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +15 -15
  439. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +6 -6
  440. data/install/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
  441. data/install/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +15 -15
  442. data/install/tools/mac/DataViewer.app/Contents/MacOS/main.sh +6 -6
  443. data/install/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
  444. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +15 -15
  445. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +6 -6
  446. data/install/tools/mac/Launcher.app/Contents/Info.plist +38 -38
  447. data/install/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +15 -15
  448. data/install/tools/mac/Launcher.app/Contents/MacOS/main.sh +6 -6
  449. data/install/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
  450. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +15 -15
  451. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +6 -6
  452. data/install/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
  453. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +15 -15
  454. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +6 -6
  455. data/install/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
  456. data/install/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +15 -15
  457. data/install/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +6 -6
  458. data/install/tools/mac/Replay.app/Contents/Info.plist +38 -38
  459. data/install/tools/mac/Replay.app/Contents/MacOS/Replay.rb +15 -15
  460. data/install/tools/mac/Replay.app/Contents/MacOS/main.sh +6 -6
  461. data/install/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
  462. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +15 -15
  463. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +6 -6
  464. data/install/tools/mac/TableManager.app/Contents/Info.plist +38 -38
  465. data/install/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +15 -15
  466. data/install/tools/mac/TableManager.app/Contents/MacOS/main.sh +6 -6
  467. data/install/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
  468. data/install/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +15 -15
  469. data/install/tools/mac/TestRunner.app/Contents/MacOS/main.sh +6 -6
  470. data/install/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
  471. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +15 -15
  472. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +6 -6
  473. data/install/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
  474. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +15 -15
  475. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +6 -6
  476. data/install/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
  477. data/install/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +15 -15
  478. data/install/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +6 -6
  479. data/lib/cosmos.rb +63 -63
  480. data/lib/cosmos/ccsds/ccsds_packet.rb +63 -63
  481. data/lib/cosmos/ccsds/ccsds_parser.rb +143 -143
  482. data/lib/cosmos/config/config_parser.rb +324 -324
  483. data/lib/cosmos/conversions.rb +13 -13
  484. data/lib/cosmos/conversions/conversion.rb +47 -47
  485. data/lib/cosmos/conversions/generic_conversion.rb +55 -55
  486. data/lib/cosmos/conversions/new_packet_log_conversion.rb +45 -45
  487. data/lib/cosmos/conversions/polynomial_conversion.rb +57 -57
  488. data/lib/cosmos/conversions/processor_conversion.rb +46 -46
  489. data/lib/cosmos/conversions/received_count_conversion.rb +33 -33
  490. data/lib/cosmos/conversions/received_time_formatted_conversion.rb +37 -37
  491. data/lib/cosmos/conversions/received_time_seconds_conversion.rb +37 -37
  492. data/lib/cosmos/conversions/segmented_polynomial_conversion.rb +128 -128
  493. data/lib/cosmos/conversions/unix_time_conversion.rb +50 -50
  494. data/lib/cosmos/conversions/unix_time_formatted_conversion.rb +44 -44
  495. data/lib/cosmos/conversions/unix_time_seconds_conversion.rb +44 -44
  496. data/lib/cosmos/core_ext.rb +18 -18
  497. data/lib/cosmos/core_ext/array.rb +354 -354
  498. data/lib/cosmos/core_ext/class.rb +51 -51
  499. data/lib/cosmos/core_ext/cosmos_io.rb +29 -29
  500. data/lib/cosmos/core_ext/exception.rb +52 -52
  501. data/lib/cosmos/core_ext/file.rb +75 -75
  502. data/lib/cosmos/core_ext/hash.rb +28 -28
  503. data/lib/cosmos/core_ext/io.rb +75 -75
  504. data/lib/cosmos/core_ext/kernel.rb +38 -38
  505. data/lib/cosmos/core_ext/math.rb +119 -119
  506. data/lib/cosmos/core_ext/matrix.rb +146 -146
  507. data/lib/cosmos/core_ext/objectspace.rb +29 -29
  508. data/lib/cosmos/core_ext/range.rb +22 -22
  509. data/lib/cosmos/core_ext/socket.rb +32 -32
  510. data/lib/cosmos/core_ext/string.rb +310 -310
  511. data/lib/cosmos/core_ext/stringio.rb +24 -24
  512. data/lib/cosmos/core_ext/time.rb +446 -446
  513. data/lib/cosmos/gui/choosers/combobox_chooser.rb +130 -130
  514. data/lib/cosmos/gui/choosers/file_chooser.rb +68 -68
  515. data/lib/cosmos/gui/choosers/float_chooser.rb +82 -82
  516. data/lib/cosmos/gui/choosers/integer_chooser.rb +80 -80
  517. data/lib/cosmos/gui/choosers/string_chooser.rb +53 -53
  518. data/lib/cosmos/gui/choosers/telemetry_chooser.rb +317 -317
  519. data/lib/cosmos/gui/dialogs/about_dialog.rb +128 -128
  520. data/lib/cosmos/gui/dialogs/calendar_dialog.rb +136 -136
  521. data/lib/cosmos/gui/dialogs/cmd_details_dialog.rb +52 -52
  522. data/lib/cosmos/gui/dialogs/cmd_tlm_raw_dialog.rb +149 -149
  523. data/lib/cosmos/gui/dialogs/details_dialog.rb +174 -174
  524. data/lib/cosmos/gui/dialogs/exception_dialog.rb +97 -97
  525. data/lib/cosmos/gui/dialogs/exception_list_dialog.rb +59 -59
  526. data/lib/cosmos/gui/dialogs/find_replace_dialog.rb +196 -196
  527. data/lib/cosmos/gui/dialogs/legal_dialog.rb +169 -168
  528. data/lib/cosmos/gui/dialogs/packet_log_dialog.rb +118 -118
  529. data/lib/cosmos/gui/dialogs/progress_dialog.rb +270 -262
  530. data/lib/cosmos/gui/dialogs/pry_dialog.rb +165 -161
  531. data/lib/cosmos/gui/dialogs/scroll_text_dialog.rb +37 -37
  532. data/lib/cosmos/gui/dialogs/select_dialog.rb +54 -54
  533. data/lib/cosmos/gui/dialogs/set_tlm_dialog.rb +131 -131
  534. data/lib/cosmos/gui/dialogs/splash.rb +113 -113
  535. data/lib/cosmos/gui/dialogs/tlm_details_dialog.rb +206 -206
  536. data/lib/cosmos/gui/dialogs/tlm_edit_dialog.rb +81 -81
  537. data/lib/cosmos/gui/line_graph/line_graph.rb +456 -456
  538. data/lib/cosmos/gui/line_graph/line_graph_dialog.rb +34 -34
  539. data/lib/cosmos/gui/line_graph/line_graph_drawing.rb +494 -494
  540. data/lib/cosmos/gui/line_graph/line_graph_popups.rb +116 -116
  541. data/lib/cosmos/gui/line_graph/line_graph_scaling.rb +460 -460
  542. data/lib/cosmos/gui/line_graph/line_graph_script.rb +26 -26
  543. data/lib/cosmos/gui/line_graph/lines.rb +290 -290
  544. data/lib/cosmos/gui/line_graph/overview_graph.rb +459 -459
  545. data/lib/cosmos/gui/opengl/earth_model.rb +22 -22
  546. data/lib/cosmos/gui/opengl/gl_bounds.rb +67 -67
  547. data/lib/cosmos/gui/opengl/gl_light.rb +39 -39
  548. data/lib/cosmos/gui/opengl/gl_material.rb +29 -29
  549. data/lib/cosmos/gui/opengl/gl_scene.rb +72 -72
  550. data/lib/cosmos/gui/opengl/gl_shape.rb +146 -146
  551. data/lib/cosmos/gui/opengl/gl_viewer.rb +724 -712
  552. data/lib/cosmos/gui/opengl/gl_viewport.rb +35 -35
  553. data/lib/cosmos/gui/opengl/moon_model.rb +22 -22
  554. data/lib/cosmos/gui/opengl/opengl.rb +8 -8
  555. data/lib/cosmos/gui/opengl/stl_reader.rb +211 -211
  556. data/lib/cosmos/gui/opengl/stl_shape.rb +124 -124
  557. data/lib/cosmos/gui/opengl/texture_mapped_sphere.rb +202 -202
  558. data/lib/cosmos/gui/qt.rb +813 -786
  559. data/lib/cosmos/gui/qt_tool.rb +378 -373
  560. data/lib/cosmos/gui/text/completion.rb +381 -381
  561. data/lib/cosmos/gui/text/completion_line_edit.rb +30 -30
  562. data/lib/cosmos/gui/text/completion_text_edit.rb +179 -179
  563. data/lib/cosmos/gui/text/ruby_editor.rb +395 -395
  564. data/lib/cosmos/gui/utilities/screenshot.rb +25 -25
  565. data/lib/cosmos/gui/utilities/script_module_gui.rb +203 -203
  566. data/lib/cosmos/gui/widgets/full_text_search_line_edit.rb +161 -161
  567. data/lib/cosmos/gui/widgets/packet_log_frame.rb +305 -305
  568. data/lib/cosmos/gui/widgets/realtime_button_bar.rb +98 -98
  569. data/lib/cosmos/interfaces.rb +11 -11
  570. data/lib/cosmos/interfaces/cmd_tlm_server_interface.rb +153 -149
  571. data/lib/cosmos/interfaces/interface.rb +213 -213
  572. data/lib/cosmos/interfaces/linc_interface.rb +360 -360
  573. data/lib/cosmos/interfaces/serial_interface.rb +76 -76
  574. data/lib/cosmos/interfaces/simulated_target_interface.rb +129 -128
  575. data/lib/cosmos/interfaces/stream_interface.rb +156 -156
  576. data/lib/cosmos/interfaces/tcpip_client_interface.rb +60 -60
  577. data/lib/cosmos/interfaces/tcpip_server_interface.rb +154 -154
  578. data/lib/cosmos/interfaces/udp_interface.rb +173 -173
  579. data/lib/cosmos/io/buffered_file.rb +11 -11
  580. data/lib/cosmos/io/cosmos_snmp.rb +50 -50
  581. data/lib/cosmos/io/io_multiplexer.rb +89 -89
  582. data/lib/cosmos/io/json_drb.rb +344 -320
  583. data/lib/cosmos/io/json_drb_object.rb +137 -137
  584. data/lib/cosmos/io/json_rpc.rb +365 -365
  585. data/lib/cosmos/io/posix_serial_driver.rb +145 -145
  586. data/lib/cosmos/io/raw_logger.rb +174 -174
  587. data/lib/cosmos/io/raw_logger_pair.rb +71 -71
  588. data/lib/cosmos/io/serial_driver.rb +85 -85
  589. data/lib/cosmos/io/stderr.rb +36 -36
  590. data/lib/cosmos/io/stdout.rb +36 -36
  591. data/lib/cosmos/io/tcpip_server.rb +583 -532
  592. data/lib/cosmos/io/udp_sockets.rb +152 -152
  593. data/lib/cosmos/io/win32_serial_driver.rb +147 -147
  594. data/lib/cosmos/packet_logs.rb +6 -6
  595. data/lib/cosmos/packet_logs/meta_packet_log_writer.rb +107 -107
  596. data/lib/cosmos/packet_logs/packet_log_reader.rb +441 -439
  597. data/lib/cosmos/packet_logs/packet_log_writer.rb +321 -309
  598. data/lib/cosmos/packet_logs/packet_log_writer_pair.rb +30 -30
  599. data/lib/cosmos/packets/binary_accessor.rb +921 -921
  600. data/lib/cosmos/packets/commands.rb +291 -291
  601. data/lib/cosmos/packets/limits.rb +263 -263
  602. data/lib/cosmos/packets/limits_response.rb +38 -38
  603. data/lib/cosmos/packets/packet.rb +714 -699
  604. data/lib/cosmos/packets/packet_config.rb +1034 -1034
  605. data/lib/cosmos/packets/packet_item.rb +317 -317
  606. data/lib/cosmos/packets/packet_item_limits.rb +128 -128
  607. data/lib/cosmos/packets/structure.rb +421 -386
  608. data/lib/cosmos/packets/structure_item.rb +233 -233
  609. data/lib/cosmos/packets/telemetry.rb +317 -317
  610. data/lib/cosmos/processors.rb +6 -6
  611. data/lib/cosmos/processors/new_packet_log_processor.rb +34 -34
  612. data/lib/cosmos/processors/processor.rb +71 -71
  613. data/lib/cosmos/processors/statistics_processor.rb +65 -65
  614. data/lib/cosmos/processors/watermark_processor.rb +44 -44
  615. data/lib/cosmos/script.rb +9 -9
  616. data/lib/cosmos/script/extract.rb +115 -115
  617. data/lib/cosmos/script/script.rb +1513 -1493
  618. data/lib/cosmos/streams/burst_stream_protocol.rb +25 -25
  619. data/lib/cosmos/streams/fixed_stream_protocol.rb +111 -111
  620. data/lib/cosmos/streams/length_stream_protocol.rb +140 -140
  621. data/lib/cosmos/streams/preidentified_stream_protocol.rb +118 -118
  622. data/lib/cosmos/streams/serial_stream.rb +152 -143
  623. data/lib/cosmos/streams/stream.rb +57 -57
  624. data/lib/cosmos/streams/stream_protocol.rb +369 -369
  625. data/lib/cosmos/streams/tcpip_client_stream.rb +77 -77
  626. data/lib/cosmos/streams/tcpip_socket_stream.rb +139 -139
  627. data/lib/cosmos/streams/template_stream_protocol.rb +140 -140
  628. data/lib/cosmos/streams/terminated_stream_protocol.rb +81 -81
  629. data/lib/cosmos/system.rb +4 -4
  630. data/lib/cosmos/system/system.rb +558 -558
  631. data/lib/cosmos/system/target.rb +178 -178
  632. data/lib/cosmos/tools/cmd_extractor/cmd_extractor.rb +254 -253
  633. data/lib/cosmos/tools/cmd_sender/cmd_sender.rb +716 -716
  634. data/lib/cosmos/tools/cmd_sender/cmd_sender_item_delegate.rb +77 -77
  635. data/lib/cosmos/tools/cmd_sender/cmd_sender_text_edit.rb +70 -70
  636. data/lib/cosmos/tools/cmd_tlm_server/api.rb +936 -940
  637. data/lib/cosmos/tools/cmd_tlm_server/background_task.rb +46 -46
  638. data/lib/cosmos/tools/cmd_tlm_server/background_tasks.rb +67 -63
  639. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +511 -497
  640. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_config.rb +241 -241
  641. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +1033 -1008
  642. data/lib/cosmos/tools/cmd_tlm_server/commanding.rb +112 -112
  643. data/lib/cosmos/tools/cmd_tlm_server/connections.rb +176 -176
  644. data/lib/cosmos/tools/cmd_tlm_server/interface_thread.rb +241 -221
  645. data/lib/cosmos/tools/cmd_tlm_server/interfaces.rb +127 -127
  646. data/lib/cosmos/tools/cmd_tlm_server/packet_logging.rb +132 -132
  647. data/lib/cosmos/tools/cmd_tlm_server/router_thread.rb +66 -66
  648. data/lib/cosmos/tools/cmd_tlm_server/routers.rb +97 -97
  649. data/lib/cosmos/tools/data_viewer/data_viewer.rb +628 -600
  650. data/lib/cosmos/tools/data_viewer/data_viewer_component.rb +167 -167
  651. data/lib/cosmos/tools/data_viewer/dump_component.rb +40 -40
  652. data/lib/cosmos/tools/handbook_creator/handbook_creator.rb +149 -149
  653. data/lib/cosmos/tools/handbook_creator/handbook_creator_config.rb +360 -360
  654. data/lib/cosmos/tools/launcher/launcher.rb +184 -184
  655. data/lib/cosmos/tools/launcher/launcher_config.rb +175 -167
  656. data/lib/cosmos/tools/launcher/launcher_multitool.rb +40 -41
  657. data/lib/cosmos/tools/launcher/launcher_tool.rb +104 -104
  658. data/lib/cosmos/tools/limits_monitor/limits_monitor.rb +796 -768
  659. data/lib/cosmos/tools/opengl_builder/opengl_builder.rb +416 -416
  660. data/lib/cosmos/tools/opengl_builder/scene_config.rb +118 -118
  661. data/lib/cosmos/tools/packet_viewer/packet_viewer.rb +525 -525
  662. data/lib/cosmos/tools/replay/replay.rb +495 -488
  663. data/lib/cosmos/tools/replay/replay_server.rb +91 -91
  664. data/lib/cosmos/tools/script_runner/script_audit.rb +147 -139
  665. data/lib/cosmos/tools/script_runner/script_runner.rb +914 -914
  666. data/lib/cosmos/tools/script_runner/script_runner_config.rb +40 -40
  667. data/lib/cosmos/tools/script_runner/script_runner_frame.rb +1892 -1859
  668. data/lib/cosmos/tools/table_manager/table.rb +70 -70
  669. data/lib/cosmos/tools/table_manager/table_config.rb +764 -764
  670. data/lib/cosmos/tools/table_manager/table_item.rb +74 -74
  671. data/lib/cosmos/tools/table_manager/table_manager.rb +1065 -1065
  672. data/lib/cosmos/tools/table_manager/table_manager_core.rb +539 -539
  673. data/lib/cosmos/tools/test_runner/results_writer.rb +283 -283
  674. data/lib/cosmos/tools/test_runner/test.rb +480 -480
  675. data/lib/cosmos/tools/test_runner/test_runner.rb +1157 -1157
  676. data/lib/cosmos/tools/test_runner/test_runner_chooser.rb +338 -338
  677. data/lib/cosmos/tools/tlm_extractor/text_item_chooser.rb +60 -60
  678. data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +1008 -1008
  679. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_config.rb +371 -371
  680. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_processor.rb +60 -60
  681. data/lib/cosmos/tools/tlm_grapher/data_object_adders/housekeeping_data_object_adder.rb +75 -75
  682. data/lib/cosmos/tools/tlm_grapher/data_object_adders/singlexy_data_object_adder.rb +44 -44
  683. data/lib/cosmos/tools/tlm_grapher/data_object_adders/xy_data_object_adder.rb +94 -94
  684. data/lib/cosmos/tools/tlm_grapher/data_object_editors/data_object_editor.rb +61 -61
  685. data/lib/cosmos/tools/tlm_grapher/data_object_editors/housekeeping_data_object_editor.rb +180 -180
  686. data/lib/cosmos/tools/tlm_grapher/data_object_editors/linegraph_data_object_editor.rb +141 -141
  687. data/lib/cosmos/tools/tlm_grapher/data_object_editors/singlexy_data_object_editor.rb +30 -30
  688. data/lib/cosmos/tools/tlm_grapher/data_object_editors/xy_data_object_editor.rb +173 -173
  689. data/lib/cosmos/tools/tlm_grapher/data_objects/data_object.rb +177 -177
  690. data/lib/cosmos/tools/tlm_grapher/data_objects/housekeeping_data_object.rb +412 -409
  691. data/lib/cosmos/tools/tlm_grapher/data_objects/linegraph_data_object.rb +176 -176
  692. data/lib/cosmos/tools/tlm_grapher/data_objects/singlexy_data_object.rb +25 -25
  693. data/lib/cosmos/tools/tlm_grapher/data_objects/xy_data_object.rb +323 -320
  694. data/lib/cosmos/tools/tlm_grapher/plot_editors/linegraph_plot_editor.rb +181 -181
  695. data/lib/cosmos/tools/tlm_grapher/plot_editors/plot_editor.rb +28 -28
  696. data/lib/cosmos/tools/tlm_grapher/plot_editors/singlexy_plot_editor.rb +30 -30
  697. data/lib/cosmos/tools/tlm_grapher/plot_editors/xy_plot_editor.rb +59 -59
  698. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/linegraph_plot_gui_object.rb +172 -172
  699. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/singlexy_plot_gui_object.rb +27 -27
  700. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/xy_plot_gui_object.rb +74 -74
  701. data/lib/cosmos/tools/tlm_grapher/plots/linegraph_plot.rb +201 -201
  702. data/lib/cosmos/tools/tlm_grapher/plots/plot.rb +69 -69
  703. data/lib/cosmos/tools/tlm_grapher/plots/singlexy_plot.rb +20 -20
  704. data/lib/cosmos/tools/tlm_grapher/plots/xy_plot.rb +61 -61
  705. data/lib/cosmos/tools/tlm_grapher/tabbed_plots/overview_tabbed_plots.rb +1278 -1278
  706. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_config.rb +430 -430
  707. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_data_object_editor.rb +107 -107
  708. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_logfile_thread.rb +111 -95
  709. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_plot_editor.rb +101 -101
  710. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_realtime_thread.rb +72 -66
  711. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tab.rb +57 -57
  712. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tool.rb +1004 -1004
  713. data/lib/cosmos/tools/tlm_grapher/tlm_grapher.rb +87 -87
  714. data/lib/cosmos/tools/tlm_viewer/screen.rb +486 -458
  715. data/lib/cosmos/tools/tlm_viewer/tlm_viewer.rb +563 -544
  716. data/lib/cosmos/tools/tlm_viewer/tlm_viewer_config.rb +287 -287
  717. data/lib/cosmos/tools/tlm_viewer/widgets.rb +53 -53
  718. data/lib/cosmos/tools/tlm_viewer/widgets/aging_widget.rb +110 -110
  719. data/lib/cosmos/tools/tlm_viewer/widgets/array_widget.rb +70 -70
  720. data/lib/cosmos/tools/tlm_viewer/widgets/block_widget.rb +61 -61
  721. data/lib/cosmos/tools/tlm_viewer/widgets/button_widget.rb +39 -39
  722. data/lib/cosmos/tools/tlm_viewer/widgets/canvas_widget.rb +62 -62
  723. data/lib/cosmos/tools/tlm_viewer/widgets/canvasimage_widget.rb +41 -41
  724. data/lib/cosmos/tools/tlm_viewer/widgets/canvasimagevalue_widget.rb +57 -57
  725. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabel_widget.rb +37 -37
  726. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabelvalue_widget.rb +56 -56
  727. data/lib/cosmos/tools/tlm_viewer/widgets/canvasline_widget.rb +55 -55
  728. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslinevalue_widget.rb +66 -66
  729. data/lib/cosmos/tools/tlm_viewer/widgets/canvasvalue_widget.rb +124 -124
  730. data/lib/cosmos/tools/tlm_viewer/widgets/checkbutton_widget.rb +31 -31
  731. data/lib/cosmos/tools/tlm_viewer/widgets/combobox_widget.rb +30 -30
  732. data/lib/cosmos/tools/tlm_viewer/widgets/formatfontvalue_widget.rb +36 -36
  733. data/lib/cosmos/tools/tlm_viewer/widgets/formatvalue_widget.rb +35 -35
  734. data/lib/cosmos/tools/tlm_viewer/widgets/horizontal_widget.rb +27 -27
  735. data/lib/cosmos/tools/tlm_viewer/widgets/horizontalbox_widget.rb +31 -31
  736. data/lib/cosmos/tools/tlm_viewer/widgets/horizontalline_widget.rb +26 -26
  737. data/lib/cosmos/tools/tlm_viewer/widgets/label_widget.rb +29 -29
  738. data/lib/cosmos/tools/tlm_viewer/widgets/labelformatvalue_widget.rb +39 -39
  739. data/lib/cosmos/tools/tlm_viewer/widgets/labelprogressbar_widget.rb +38 -38
  740. data/lib/cosmos/tools/tlm_viewer/widgets/labeltrendlimitsbar_widget.rb +38 -38
  741. data/lib/cosmos/tools/tlm_viewer/widgets/labelvalue_widget.rb +39 -39
  742. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluedesc_widget.rb +42 -42
  743. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluelimitsbar_widget.rb +37 -37
  744. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluerangebar_widget.rb +37 -37
  745. data/lib/cosmos/tools/tlm_viewer/widgets/layout_widget.rb +34 -34
  746. data/lib/cosmos/tools/tlm_viewer/widgets/limitsbar_widget.rb +178 -178
  747. data/lib/cosmos/tools/tlm_viewer/widgets/linegraph_widget.rb +54 -54
  748. data/lib/cosmos/tools/tlm_viewer/widgets/matrixbycolumns_widget.rb +47 -47
  749. data/lib/cosmos/tools/tlm_viewer/widgets/multi_widget.rb +116 -116
  750. data/lib/cosmos/tools/tlm_viewer/widgets/progressbar_widget.rb +34 -34
  751. data/lib/cosmos/tools/tlm_viewer/widgets/radiobutton_widget.rb +30 -30
  752. data/lib/cosmos/tools/tlm_viewer/widgets/rangebar_widget.rb +57 -57
  753. data/lib/cosmos/tools/tlm_viewer/widgets/screenshotbutton_widget.rb +34 -34
  754. data/lib/cosmos/tools/tlm_viewer/widgets/scrollwindow_widget.rb +35 -35
  755. data/lib/cosmos/tools/tlm_viewer/widgets/sectionheader_widget.rb +33 -33
  756. data/lib/cosmos/tools/tlm_viewer/widgets/tabbook_widget.rb +26 -26
  757. data/lib/cosmos/tools/tlm_viewer/widgets/tabitem_widget.rb +28 -28
  758. data/lib/cosmos/tools/tlm_viewer/widgets/textbox_widget.rb +47 -47
  759. data/lib/cosmos/tools/tlm_viewer/widgets/textfield_widget.rb +26 -26
  760. data/lib/cosmos/tools/tlm_viewer/widgets/timegraph_widget.rb +88 -88
  761. data/lib/cosmos/tools/tlm_viewer/widgets/title_widget.rb +27 -27
  762. data/lib/cosmos/tools/tlm_viewer/widgets/trendbar_widget.rb +130 -130
  763. data/lib/cosmos/tools/tlm_viewer/widgets/trendlimitsbar_widget.rb +46 -46
  764. data/lib/cosmos/tools/tlm_viewer/widgets/value_widget.rb +43 -43
  765. data/lib/cosmos/tools/tlm_viewer/widgets/valuelimitsbar_widget.rb +37 -37
  766. data/lib/cosmos/tools/tlm_viewer/widgets/valuerangebar_widget.rb +37 -37
  767. data/lib/cosmos/tools/tlm_viewer/widgets/vertical_widget.rb +35 -35
  768. data/lib/cosmos/tools/tlm_viewer/widgets/verticalbox_widget.rb +37 -37
  769. data/lib/cosmos/tools/tlm_viewer/widgets/widget.rb +257 -257
  770. data/lib/cosmos/top_level.rb +647 -596
  771. data/lib/cosmos/utilities.rb +11 -10
  772. data/lib/cosmos/utilities/crc.rb +166 -166
  773. data/lib/cosmos/utilities/csv.rb +83 -83
  774. data/lib/cosmos/utilities/logger.rb +137 -137
  775. data/lib/cosmos/utilities/low_fragmentation_array.rb +11 -11
  776. data/lib/cosmos/utilities/message_log.rb +74 -74
  777. data/lib/cosmos/utilities/quaternion.rb +258 -258
  778. data/lib/cosmos/utilities/ruby_lex_utils.rb +313 -313
  779. data/lib/cosmos/utilities/simulated_target.rb +99 -99
  780. data/lib/cosmos/utilities/sleeper.rb +44 -0
  781. data/lib/cosmos/version.rb +12 -12
  782. data/lib/cosmos/win32/excel.rb +66 -66
  783. data/lib/cosmos/win32/win32.rb +387 -387
  784. data/lib/cosmos/win32/win32_main.rb +311 -311
  785. data/roodi.yml +24 -24
  786. data/run_gui_tests.bat +32 -32
  787. data/spec/ccsds/ccsds_packet_spec.rb +67 -67
  788. data/spec/ccsds/ccsds_parser_spec.rb +148 -148
  789. data/spec/config/config_parser_spec.rb +322 -322
  790. data/spec/conversions/conversion_spec.rb +31 -31
  791. data/spec/conversions/generic_conversion_spec.rb +45 -45
  792. data/spec/conversions/new_packet_log_conversion_spec.rb +39 -39
  793. data/spec/conversions/polynomial_conversion_spec.rb +40 -40
  794. data/spec/conversions/processor_conversion_spec.rb +45 -45
  795. data/spec/conversions/received_count_conversion_spec.rb +43 -43
  796. data/spec/conversions/received_time_formatted_conversion_spec.rb +49 -49
  797. data/spec/conversions/received_time_seconds_conversion_spec.rb +50 -50
  798. data/spec/conversions/segmented_polynomial_conversion_spec.rb +51 -51
  799. data/spec/conversions/unix_time_formatted_conversion_spec.rb +74 -74
  800. data/spec/conversions/unix_time_seconds_conversion_spec.rb +76 -76
  801. data/spec/core_ext/array_spec.rb +186 -186
  802. data/spec/core_ext/class_spec.rb +36 -36
  803. data/spec/core_ext/cosmos_io_spec.rb +77 -77
  804. data/spec/core_ext/exception_spec.rb +91 -91
  805. data/spec/core_ext/file_spec.rb +72 -72
  806. data/spec/core_ext/hash_spec.rb +24 -24
  807. data/spec/core_ext/io_spec.rb +46 -46
  808. data/spec/core_ext/kernel_spec.rb +54 -54
  809. data/spec/core_ext/math_spec.rb +116 -116
  810. data/spec/core_ext/matrix_spec.rb +66 -66
  811. data/spec/core_ext/objectspace_spec.rb +29 -29
  812. data/spec/core_ext/range_spec.rb +21 -21
  813. data/spec/core_ext/socket_spec.rb +32 -32
  814. data/spec/core_ext/string_spec.rb +223 -223
  815. data/spec/core_ext/stringio_spec.rb +21 -21
  816. data/spec/core_ext/time_spec.rb +151 -151
  817. data/spec/gui/line_graph/line_clip_spec.rb +322 -322
  818. data/spec/install/config/system/system.txt +33 -33
  819. data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  820. data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  821. data/spec/install/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  822. data/spec/install/config/targets/COSMOS/screens/limits_change.txt +20 -20
  823. data/spec/install/config/targets/COSMOS/screens/version.txt +19 -19
  824. data/spec/install/config/targets/COSMOS/target.txt +5 -5
  825. data/spec/install/config/targets/INST/cmd_tlm/inst_cmd_linc.txt +30 -30
  826. data/spec/install/config/targets/INST/cmd_tlm/inst_cmds.txt +111 -111
  827. data/spec/install/config/targets/INST/cmd_tlm/inst_tlm.txt +236 -236
  828. data/spec/install/config/targets/INST/cmd_tlm/inst_tlm_linc.txt +25 -25
  829. data/spec/install/config/targets/INST/cmd_tlm_server.txt +5 -5
  830. data/spec/install/config/targets/INST/lib/sim_inst.rb +305 -294
  831. data/spec/install/config/targets/INST/target.txt +10 -10
  832. data/spec/install/config/targets/META/cmd_tlm/meta_cmd.txt +4 -4
  833. data/spec/install/config/targets/META/cmd_tlm/meta_tlm.txt +4 -4
  834. data/spec/install/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
  835. data/spec/interfaces/cmd_tlm_server_interface_spec.rb +150 -150
  836. data/spec/interfaces/interface_spec.rb +130 -131
  837. data/spec/interfaces/linc_interface_spec.rb +199 -199
  838. data/spec/interfaces/serial_interface_spec.rb +56 -56
  839. data/spec/interfaces/simulated_target_interface_spec.rb +128 -128
  840. data/spec/interfaces/stream_interface_spec.rb +157 -157
  841. data/spec/interfaces/tcpip_client_interface_spec.rb +54 -54
  842. data/spec/interfaces/tcpip_server_interface_spec.rb +151 -151
  843. data/spec/interfaces/udp_interface_spec.rb +175 -177
  844. data/spec/io/buffered_file_spec.rb +113 -113
  845. data/spec/io/io_multiplexer_spec.rb +94 -94
  846. data/spec/io/json_drb_object_spec.rb +99 -99
  847. data/spec/io/json_drb_spec.rb +311 -311
  848. data/spec/io/json_rpc_spec.rb +264 -264
  849. data/spec/io/raw_logger_pair_spec.rb +76 -76
  850. data/spec/io/raw_logger_spec.rb +133 -133
  851. data/spec/io/serial_driver_spec.rb +61 -61
  852. data/spec/io/stderr_spec.rb +32 -32
  853. data/spec/io/stdout_spec.rb +32 -32
  854. data/spec/io/tcpip_server_spec.rb +338 -338
  855. data/spec/io/udp_sockets_spec.rb +94 -94
  856. data/spec/io/win32_serial_driver_spec.rb +88 -88
  857. data/spec/packet_logs/meta_packet_log_writer_spec.rb +170 -170
  858. data/spec/packet_logs/packet_log_reader_spec.rb +408 -408
  859. data/spec/packet_logs/packet_log_writer_pair_spec.rb +30 -30
  860. data/spec/packet_logs/packet_log_writer_spec.rb +223 -223
  861. data/spec/packets/binary_accessor_spec.rb +2073 -2073
  862. data/spec/packets/commands_spec.rb +369 -369
  863. data/spec/packets/limits_response_spec.rb +25 -25
  864. data/spec/packets/limits_spec.rb +326 -326
  865. data/spec/packets/packet_config_spec.rb +1620 -1620
  866. data/spec/packets/packet_item_limits_spec.rb +161 -161
  867. data/spec/packets/packet_item_spec.rb +386 -386
  868. data/spec/packets/packet_spec.rb +1057 -949
  869. data/spec/packets/structure_item_spec.rb +195 -195
  870. data/spec/packets/structure_spec.rb +419 -419
  871. data/spec/packets/telemetry_spec.rb +535 -535
  872. data/spec/processors/new_packet_log_processor_spec.rb +39 -39
  873. data/spec/processors/processor_spec.rb +55 -55
  874. data/spec/processors/statistics_processor_spec.rb +60 -60
  875. data/spec/processors/watermark_processor_spec.rb +51 -51
  876. data/spec/script/script_spec.rb +654 -654
  877. data/spec/spec_helper.rb +154 -148
  878. data/spec/streams/burst_stream_protocol_spec.rb +32 -32
  879. data/spec/streams/fixed_stream_protocol_spec.rb +110 -110
  880. data/spec/streams/length_stream_protocol_spec.rb +297 -297
  881. data/spec/streams/preidentified_stream_protocol_spec.rb +118 -118
  882. data/spec/streams/serial_stream_spec.rb +105 -105
  883. data/spec/streams/stream_protocol_spec.rb +332 -332
  884. data/spec/streams/stream_spec.rb +29 -29
  885. data/spec/streams/tcpip_client_stream_spec.rb +54 -54
  886. data/spec/streams/tcpip_socket_stream_spec.rb +146 -146
  887. data/spec/streams/template_stream_protocol_spec.rb +151 -151
  888. data/spec/streams/terminated_stream_protocol_spec.rb +123 -123
  889. data/spec/system/system_spec.rb +645 -645
  890. data/spec/system/target_spec.rb +248 -248
  891. data/spec/tools/cmd_tlm_server/api_spec.rb +1087 -1113
  892. data/spec/tools/cmd_tlm_server/background_task_spec.rb +32 -32
  893. data/spec/tools/cmd_tlm_server/background_tasks_spec.rb +81 -81
  894. data/spec/tools/cmd_tlm_server/cmd_tlm_server_config_spec.rb +411 -411
  895. data/spec/tools/cmd_tlm_server/cmd_tlm_server_spec.rb +415 -415
  896. data/spec/tools/cmd_tlm_server/commanding_spec.rb +123 -123
  897. data/spec/tools/cmd_tlm_server/connections_spec.rb +147 -147
  898. data/spec/tools/cmd_tlm_server/interface_thread_spec.rb +306 -306
  899. data/spec/tools/cmd_tlm_server/interfaces_spec.rb +252 -238
  900. data/spec/tools/cmd_tlm_server/packet_logging_spec.rb +143 -143
  901. data/spec/tools/cmd_tlm_server/router_thread_spec.rb +98 -101
  902. data/spec/tools/cmd_tlm_server/routers_spec.rb +223 -208
  903. data/spec/top_level/top_level_spec.rb +334 -321
  904. data/spec/utilities/crc_spec.rb +45 -45
  905. data/spec/utilities/csv_spec.rb +97 -97
  906. data/spec/utilities/logger_spec.rb +102 -102
  907. data/spec/utilities/message_log_spec.rb +89 -89
  908. data/spec/utilities/quaternion_spec.rb +107 -107
  909. data/spec/utilities/ruby_lex_utils_spec.rb +86 -86
  910. data/tasks/manifest.rake +22 -22
  911. data/tasks/spec.rake +23 -23
  912. metadata +18 -2
@@ -1,949 +1,1057 @@
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'
14
- require 'cosmos/conversions/generic_conversion'
15
-
16
- module Cosmos
17
-
18
- describe Packet do
19
-
20
- describe "buffer=" do
21
- it "should set the buffer" do
22
- p = Packet.new("tgt", "pkt")
23
- p.buffer = "\x00\x01\x02\x03"
24
- p.buffer.should eql "\x00\x01\x02\x03"
25
- end
26
-
27
- it "should complain if the given buffer is too big" do
28
- capture_io do |stdout|
29
- p = Packet.new("tgt", "pkt")
30
- p.append_item("test1", 16, :UINT)
31
-
32
- p.buffer = "\x00\x00\x00"
33
- stdout.string.should match(/TGT PKT received with actual packet length of 3 but defined length of 2/)
34
- end
35
- end
36
-
37
- it "should run processors if present" do
38
- p = Packet.new("tgt", "pkt")
39
- p.processors['processor'] = double("call", :call => true)
40
- p.buffer = "\x00\x01\x02\x03"
41
- end
42
- end
43
-
44
- describe "target_name=" do
45
- it "should set the target_name to an uppercase String" do
46
- p = Packet.new("tgt", "pkt")
47
- p.target_name.should eql "TGT"
48
- end
49
-
50
- it "should set target_name to nil" do
51
- p = Packet.new(nil,"pkt")
52
- p.target_name.should be_nil
53
- end
54
-
55
- it "should complain about non String target_names" do
56
- expect { Packet.new(5, "pkt") }.to raise_error(ArgumentError, "target_name must be a String but is a Fixnum")
57
- end
58
- end
59
-
60
- describe "packet_name=" do
61
- it "should set the packet_name to an uppercase String" do
62
- p = Packet.new("tgt", "pkt")
63
- p.packet_name.should eql "PKT"
64
- end
65
-
66
- it "should set packet_name to nil" do
67
- p = Packet.new("tgt",nil)
68
- p.packet_name.should be_nil
69
- end
70
-
71
- it "should complain about non String packet_names" do
72
- expect { Packet.new("tgt", 5) }.to raise_error(ArgumentError, "packet_name must be a String but is a Fixnum")
73
- end
74
- end
75
-
76
- describe "description=" do
77
- it "should set the description to a String" do
78
- p = Packet.new("tgt", "pkt", :BIG_ENDIAN, "This is a description")
79
- p.description.should eql "This is a description"
80
- end
81
-
82
- it "should set description to nil" do
83
- p = Packet.new("tgt","pkt")
84
- p.description = nil
85
- p.description.should be_nil
86
- end
87
-
88
- it "should complain about non String descriptions" do
89
- p = Packet.new("tgt","pkt")
90
- expect { p.description = 5 }.to raise_error(ArgumentError, "description must be a String but is a Fixnum")
91
- end
92
- end
93
-
94
- describe "received_time=" do
95
- it "should set the received_time to a Time" do
96
- p = Packet.new("tgt", "pkt")
97
- t = Time.now
98
- p.received_time = t
99
- p.received_time.should eql t
100
- end
101
-
102
- it "should set received_time to nil" do
103
- p = Packet.new("tgt","pkt")
104
- p.received_time = nil
105
- p.received_time.should be_nil
106
- end
107
-
108
- it "should complain about non Time received_times" do
109
- p = Packet.new("tgt","pkt")
110
- expect {p.received_time = "1pm" }.to raise_error(ArgumentError, "received_time must be a Time but is a String")
111
- end
112
- end
113
-
114
- describe "received_count=" do
115
- it "should set the received_count to a Fixnum" do
116
- p = Packet.new("tgt", "pkt")
117
- p.received_count = 10
118
- p.received_count.should eql 10
119
- end
120
-
121
- it "should complain about nil received_count" do
122
- p = Packet.new("tgt","pkt")
123
- expect {p.received_count = nil }.to raise_error(ArgumentError, "received_count must be a Fixnum but is a NilClass")
124
- end
125
-
126
- it "should complain about non Fixnum received_counts" do
127
- p = Packet.new("tgt","pkt")
128
- expect {p.received_count = "5" }.to raise_error(ArgumentError, "received_count must be a Fixnum but is a String")
129
- end
130
- end
131
-
132
- describe "hazardous_description=" do
133
- it "should set the hazardous_description to a String" do
134
- p = Packet.new("tgt", "pkt")
135
- p.hazardous_description = "This is a description"
136
- p.hazardous_description.should eql "This is a description"
137
- end
138
-
139
- it "should set hazardous_description to nil" do
140
- p = Packet.new("tgt","pkt")
141
- p.hazardous_description = nil
142
- p.hazardous_description.should be_nil
143
- end
144
-
145
- it "should complain about non String hazardous_descriptions" do
146
- p = Packet.new("tgt","pkt")
147
- expect {p.hazardous_description = 5 }.to raise_error(ArgumentError, "hazardous_description must be a String but is a Fixnum")
148
- end
149
- end
150
-
151
- describe "given_values=" do
152
- it "should set the given_values to a Hash" do
153
- p = Packet.new("tgt", "pkt")
154
- gv = {}
155
- p.given_values = gv
156
- p.given_values.should eql gv
157
- end
158
-
159
- it "should set given_values to nil" do
160
- p = Packet.new("tgt","pkt")
161
- p.given_values = nil
162
- p.given_values.should be_nil
163
- end
164
-
165
- it "should complain about non Hash given_valuess" do
166
- p = Packet.new("tgt","pkt")
167
- expect {p.given_values = [] }.to raise_error(ArgumentError, "given_values must be a Hash but is a Array")
168
- end
169
- end
170
-
171
- describe "meta" do
172
- it "should allow adding items to the meta hash" do
173
- p = Packet.new("tgt","pkt")
174
- p.meta['TYPE'] = 'float32'
175
- p.meta['TYPE'].should eql 'float32'
176
- end
177
- end
178
-
179
- describe "limits_change_callback=" do
180
- it "should set the limits_change_callback to something that responds to call" do
181
- p = Packet.new("tgt", "pkt")
182
- callback = Object.new
183
- allow(callback).to receive(:call)
184
- expect { p.limits_change_callback = callback }.to_not raise_error
185
- end
186
-
187
- it "should set limits_change_callback to nil" do
188
- p = Packet.new("tgt","pkt")
189
- expect { p.limits_change_callback = nil }.to_not raise_error
190
- end
191
-
192
- it "should complain about non #call limits_change_callbacks" do
193
- p = Packet.new("tgt","pkt")
194
- expect {p.limits_change_callback = "" }.to raise_error(ArgumentError, "limits_change_callback must respond to call")
195
- end
196
- end
197
-
198
- describe "define_item" do
199
- it "should take a format_string, read_conversion, write_conversion, and id_value" do
200
- p = Packet.new("tgt","pkt")
201
- rc = GenericConversion.new("value / 2")
202
- wc = GenericConversion.new("value * 2")
203
- p.define_item("item",0,32,:FLOAT,nil,:BIG_ENDIAN,:ERROR,"%5.1f",rc,wc,5)
204
- i = p.get_item("ITEM")
205
- i.format_string.should eql "%5.1f"
206
- i.read_conversion.to_s.should eql rc.to_s
207
- i.write_conversion.to_s.should eql wc.to_s
208
- i.id_value.should eql 5.0
209
- end
210
-
211
- it "should initialize format_string, read_conversion, write_conversion, and id_value to nil" do
212
- p = Packet.new("tgt","pkt")
213
- p.define_item("item",0,32,:FLOAT)
214
- i = p.get_item("ITEM")
215
- i.format_string.should be_nil
216
- i.read_conversion.should be_nil
217
- i.write_conversion.should be_nil
218
- i.id_value.should be_nil
219
- end
220
- end
221
-
222
- describe "append_item" do
223
- it "should take a format_string, read_conversion, write_conversion, and id_value" do
224
- p = Packet.new("tgt","pkt")
225
- rc = GenericConversion.new("value / 2")
226
- wc = GenericConversion.new("value * 2")
227
- p.append_item("item",32,:FLOAT,nil,:BIG_ENDIAN,:ERROR,"%5.1f",rc,wc,5)
228
- i = p.get_item("ITEM")
229
- i.format_string.should eql "%5.1f"
230
- i.read_conversion.to_s.should eql rc.to_s
231
- i.write_conversion.to_s.should eql wc.to_s
232
- i.id_value.should eql 5.0
233
- end
234
-
235
- it "should initialize format_string, read_conversion, write_conversion, and id_value to nil" do
236
- p = Packet.new("tgt","pkt")
237
- p.append_item("item",32,:FLOAT)
238
- i = p.get_item("ITEM")
239
- i.format_string.should be_nil
240
- i.read_conversion.should be_nil
241
- i.write_conversion.should be_nil
242
- i.id_value.should be_nil
243
- end
244
- end
245
-
246
- describe "get_item" do
247
- it "should complain if an item doesn't exist" do
248
- p = Packet.new("tgt","pkt")
249
- expect { p.get_item("test") }.to raise_error(RuntimeError, "Packet item 'TGT PKT TEST' does not exist")
250
- end
251
- end
252
-
253
- describe "read and read_item" do
254
- before (:each) do
255
- @p = Packet.new("tgt","pkt")
256
- end
257
-
258
- it "should complain about unknown value_type" do
259
- @p.append_item("item",32,:UINT)
260
- i = @p.get_item("ITEM")
261
- expect { @p.read("ITEM", :MINE, "\x01\x02\x03\x04") }.to raise_error(ArgumentError, "Unknown value type on read: MINE")
262
- expect { @p.read_item(i, :MINE, "\x01\x02\x03\x04") }.to raise_error(ArgumentError, "Unknown value type on read: MINE")
263
- end
264
-
265
- it "should read the RAW value" do
266
- @p.append_item("item",32,:UINT)
267
- i = @p.get_item("ITEM")
268
- @p.read("ITEM", :RAW, "\x01\x02\x03\x04").should eql 0x01020304
269
- @p.read_item(i, :RAW, "\x01\x02\x03\x04").should eql 0x01020304
270
- end
271
-
272
- it "should read the CONVERTED value" do
273
- @p.append_item("item",8,:UINT)
274
- i = @p.get_item("ITEM")
275
- @p.read("ITEM", :CONVERTED, "\x02").should eql 2
276
- @p.read_item(i, :CONVERTED, "\x02").should eql 2
277
- i.read_conversion = GenericConversion.new("value / 2")
278
- @p.read("ITEM", :CONVERTED, "\x02").should eql 1
279
- @p.read_item(i, :CONVERTED, "\x02").should eql 1
280
- end
281
-
282
- it "should read the CONVERTED value with states" do
283
- @p.append_item("item",8,:UINT)
284
- i = @p.get_item("ITEM")
285
- i.states = {"TRUE"=>1, "FALSE"=>2}
286
- @p.read("ITEM", :CONVERTED, "\x00").should eql 0
287
- @p.read_item(i, :CONVERTED, "\x00").should eql 0
288
- @p.read("ITEM", :CONVERTED, "\x01").should eql "TRUE"
289
- @p.read_item(i, :CONVERTED, "\x01").should eql "TRUE"
290
- i.read_conversion = GenericConversion.new("value / 2")
291
- @p.read("ITEM", :CONVERTED, "\x04").should eql "FALSE"
292
- @p.read_item(i, :CONVERTED, "\x04").should eql "FALSE"
293
- end
294
-
295
- it "should read the FORMATTED value" do
296
- @p.append_item("item",8,:UINT)
297
- i = @p.get_item("ITEM")
298
- @p.read("ITEM", :FORMATTED, "\x02").should eql "2"
299
- @p.read_item(i, :FORMATTED, "\x02").should eql "2"
300
- i.format_string = "0x%x"
301
- @p.read("ITEM", :FORMATTED, "\x02").should eql "0x2"
302
- @p.read_item(i, :FORMATTED, "\x02").should eql "0x2"
303
- i.states = {"TRUE"=>1, "FALSE"=>2}
304
- @p.read("ITEM", :FORMATTED, "\x01").should eql "TRUE"
305
- @p.read_item(i, :FORMATTED, "\x01").should eql "TRUE"
306
- @p.read("ITEM", :FORMATTED, "\x02").should eql "FALSE"
307
- @p.read_item(i, :FORMATTED, "\x02").should eql "FALSE"
308
- @p.read("ITEM", :FORMATTED, "\x04").should eql "0x4"
309
- @p.read_item(i, :FORMATTED, "\x04").should eql "0x4"
310
- i.read_conversion = GenericConversion.new("value / 2")
311
- @p.read("ITEM", :FORMATTED, "\x04").should eql "FALSE"
312
- @p.read_item(i, :FORMATTED, "\x04").should eql "FALSE"
313
- end
314
-
315
- it "should read the WITH_UNITS value" do
316
- @p.append_item("item",8,:UINT)
317
- i = @p.get_item("ITEM")
318
- i.units = "V"
319
- @p.read("ITEM", :WITH_UNITS, "\x02").should eql "2 V"
320
- @p.read_item(i, :WITH_UNITS, "\x02").should eql "2 V"
321
- i.format_string = "0x%x"
322
- @p.read("ITEM", :WITH_UNITS, "\x02").should eql "0x2 V"
323
- @p.read_item(i, :WITH_UNITS, "\x02").should eql "0x2 V"
324
- i.states = {"TRUE"=>1, "FALSE"=>2}
325
- @p.read("ITEM", :WITH_UNITS, "\x01").should eql "TRUE"
326
- @p.read_item(i, :WITH_UNITS, "\x01").should eql "TRUE"
327
- @p.read("ITEM", :WITH_UNITS, "\x02").should eql "FALSE"
328
- @p.read_item(i, :WITH_UNITS, "\x02").should eql "FALSE"
329
- @p.read("ITEM", :WITH_UNITS, "\x04").should eql "0x4 V"
330
- @p.read_item(i, :WITH_UNITS, "\x04").should eql "0x4 V"
331
- i.read_conversion = GenericConversion.new("value / 2")
332
- @p.read("ITEM", :WITH_UNITS, "\x04").should eql "FALSE"
333
- @p.read_item(i, :WITH_UNITS, "\x04").should eql "FALSE"
334
- end
335
-
336
- it "should read the WITH_UNITS array value" do
337
- @p.append_item("item",8,:UINT, 16)
338
- i = @p.get_item("ITEM")
339
- i.units = "V"
340
- @p.read("ITEM", :WITH_UNITS, "\x01\x02").should eql ["1 V", "2 V"]
341
- @p.read_item(i, :WITH_UNITS, "\x01\x02").should eql ["1 V", "2 V"]
342
- i.format_string = "0x%x"
343
- @p.read("ITEM", :WITH_UNITS, "\x01\x02").should eql ["0x1 V", "0x2 V"]
344
- @p.read_item(i, :WITH_UNITS, "\x01\x02").should eql ["0x1 V", "0x2 V"]
345
- i.states = {"TRUE"=>1, "FALSE"=>2}
346
- @p.read("ITEM", :WITH_UNITS, "\x01\x02").should eql ["TRUE", "FALSE"]
347
- @p.read_item(i, :WITH_UNITS, "\x01\x02").should eql ["TRUE", "FALSE"]
348
- @p.read("ITEM", :WITH_UNITS, "\x00\x01").should eql ["0x0 V", "TRUE"]
349
- @p.read_item(i, :WITH_UNITS, "\x00\x01").should eql ["0x0 V", "TRUE"]
350
- @p.read("ITEM", :WITH_UNITS, "\x02\x03").should eql ["FALSE", "0x3 V"]
351
- @p.read_item(i, :WITH_UNITS, "\x02\x03").should eql ["FALSE", "0x3 V"]
352
- @p.read("ITEM", :WITH_UNITS, "\x04").should eql ["0x4 V"]
353
- @p.read_item(i, :WITH_UNITS, "\x04").should eql ["0x4 V"]
354
- @p.read("ITEM", :WITH_UNITS, "\x04").should eql ["0x4 V"]
355
- @p.read_item(i, :WITH_UNITS, "\x04").should eql ["0x4 V"]
356
- i.read_conversion = GenericConversion.new("value / 2")
357
- @p.read("ITEM", :WITH_UNITS, "\x02\x04").should eql ["TRUE","FALSE"]
358
- @p.read_item(i, :WITH_UNITS, "\x02\x04").should eql ["TRUE","FALSE"]
359
- @p.read("ITEM", :WITH_UNITS, "\x08").should eql ["0x4 V"]
360
- @p.read_item(i, :WITH_UNITS, "\x08").should eql ["0x4 V"]
361
- end
362
- end
363
-
364
- describe "write and write_item" do
365
- before (:each) do
366
- @p = Packet.new("tgt","pkt")
367
- @buffer = "\x00\x00\x00\x00"
368
- end
369
-
370
- it "should complain about unknown value_type" do
371
- @p.append_item("item",32,:UINT)
372
- i = @p.get_item("ITEM")
373
- expect { @p.write("ITEM", 0, :MINE) }.to raise_error(ArgumentError, "Unknown value type on write: MINE")
374
- expect { @p.write_item(i, 0, :MINE) }.to raise_error(ArgumentError, "Unknown value type on write: MINE")
375
- end
376
-
377
- it "should write the RAW value" do
378
- @p.append_item("item",32,:UINT)
379
- i = @p.get_item("ITEM")
380
- @p.write("ITEM", 0x01020304, :RAW, @buffer)
381
- @buffer.should eql "\x01\x02\x03\x04"
382
- @p.write_item(i, 0x05060708, :RAW, @buffer)
383
- @buffer.should eql "\x05\x06\x07\x08"
384
- end
385
-
386
- it "should write the CONVERTED value" do
387
- @p.append_item("item",8,:UINT)
388
- i = @p.get_item("ITEM")
389
- @p.write("ITEM", 1, :CONVERTED, @buffer)
390
- @buffer.should eql "\x01\x00\x00\x00"
391
- @p.write_item(i, 2, :CONVERTED, @buffer)
392
- @buffer.should eql "\x02\x00\x00\x00"
393
- i.write_conversion = GenericConversion.new("value / 2")
394
- @p.write("ITEM", 1, :CONVERTED, @buffer)
395
- @buffer.should eql "\x00\x00\x00\x00"
396
- @p.write_item(i, 2, :CONVERTED, @buffer)
397
- @buffer.should eql "\x01\x00\x00\x00"
398
- end
399
-
400
- it "should write the CONVERTED value with states" do
401
- @p.append_item("item",8,:UINT)
402
- i = @p.get_item("ITEM")
403
- i.states = {"TRUE"=>1, "FALSE"=>2}
404
- @p.write("ITEM", 3, :CONVERTED, @buffer)
405
- @buffer.should eql "\x03\x00\x00\x00"
406
- @p.write_item(i, 4, :CONVERTED, @buffer)
407
- @buffer.should eql "\x04\x00\x00\x00"
408
- @p.write("ITEM", "TRUE", :CONVERTED, @buffer)
409
- @buffer.should eql "\x01\x00\x00\x00"
410
- @p.write_item(i, "FALSE", :CONVERTED, @buffer)
411
- @buffer.should eql "\x02\x00\x00\x00"
412
- i.write_conversion = GenericConversion.new("value / 2")
413
- @p.write("ITEM", 4, :CONVERTED, @buffer)
414
- @buffer.should eql "\x02\x00\x00\x00"
415
- @p.write("ITEM", "TRUE", :CONVERTED, @buffer)
416
- @buffer.should eql "\x00\x00\x00\x00"
417
- @p.write_item(i, "FALSE", :CONVERTED, @buffer)
418
- @buffer.should eql "\x01\x00\x00\x00"
419
- end
420
-
421
- it "should complain about the FORMATTED value_type" do
422
- @p.append_item("item",8,:UINT)
423
- i = @p.get_item("ITEM")
424
- expect { @p.write("ITEM", 3, :FORMATTED, @buffer) }.to raise_error(ArgumentError, "Invalid value type on write: FORMATTED")
425
- expect { @p.write_item(i, 3, :FORMATTED, @buffer) }.to raise_error(ArgumentError, "Invalid value type on write: FORMATTED")
426
- end
427
-
428
- it "should complain about the WITH_UNITS value_type" do
429
- @p.append_item("item",8,:UINT)
430
- i = @p.get_item("ITEM")
431
- expect { @p.write("ITEM", 3, :WITH_UNITS, @buffer) }.to raise_error(ArgumentError, "Invalid value type on write: WITH_UNITS")
432
- expect { @p.write_item(i, 3, :WITH_UNITS, @buffer) }.to raise_error(ArgumentError, "Invalid value type on write: WITH_UNITS")
433
- end
434
- end
435
-
436
- describe "read_all" do
437
- it "should default to read all CONVERTED items" do
438
- p = Packet.new("tgt","pkt")
439
- p.append_item("test1", 8, :UINT, 16)
440
- p.append_item("test2", 16, :UINT)
441
- i = p.get_item("TEST2")
442
- i.states = {"TRUE"=>0x0304}
443
- p.append_item("test3", 32, :UINT)
444
- i = p.get_item("TEST3")
445
- i.read_conversion = GenericConversion.new("value / 2")
446
-
447
- buffer = "\x01\x02\x03\x04\x04\x06\x08\x0A"
448
- p.buffer = buffer
449
- vals = p.read_all
450
- vals[0][0].should eql "TEST1"
451
- vals[1][0].should eql "TEST2"
452
- vals[2][0].should eql "TEST3"
453
- vals[0][1].should eql [1,2]
454
- vals[1][1].should eql "TRUE"
455
- vals[2][1].should eql 0x02030405
456
- end
457
- end
458
-
459
- describe "read_all_with_limits_states" do
460
- it "should return an array of items with their limit states" do
461
- p = Packet.new("tgt","pkt")
462
- p.append_item("test1", 8, :UINT)
463
- i = p.get_item("TEST1")
464
- i.states = {"TRUE"=>1,"FALSE"=>0}
465
- i.state_colors = {"TRUE"=>:GREEN,"FALSE"=>:RED}
466
- p.write("TEST1",0)
467
- p.enable_limits("TEST1")
468
- p.append_item("test2", 16, :UINT)
469
- i = p.get_item("TEST2")
470
- i.limits.values = {:DEFAULT=>[1,2,4,5]}
471
- p.write("TEST2",3)
472
- p.enable_limits("TEST2")
473
- p.update_limits_items_cache
474
- p.check_limits
475
-
476
- vals = p.read_all_with_limits_states
477
- vals[0][0].should eql "TEST1"
478
- vals[1][0].should eql "TEST2"
479
- vals[0][1].should eql "FALSE"
480
- vals[1][1].should eql 3
481
- vals[0][2].should eql :RED
482
- vals[1][2].should eql :GREEN
483
- end
484
- end
485
-
486
- describe "formatted" do
487
- it "should print out all the items and CONVERTED values" do
488
- p = Packet.new("tgt","pkt")
489
- p.append_item("test1", 8, :UINT, 16)
490
- p.write("test1", [1,2])
491
- p.append_item("test2", 16, :UINT)
492
- i = p.get_item("TEST2")
493
- i.states = {"TRUE"=>0x0304}
494
- p.write("test2", 0x0304)
495
- p.append_item("test3", 32, :UINT)
496
- i = p.get_item("TEST3")
497
- i.read_conversion = GenericConversion.new("value / 2")
498
- p.write("test3", 0x0406080A)
499
- p.formatted.should include("TEST1: [1, 2]")
500
- p.formatted.should include("TEST2: TRUE")
501
- p.formatted.should include("TEST3: #{0x02030405}")
502
- end
503
- end
504
-
505
- describe "identify?" do
506
- it "should identify a buffer based on id_items" do
507
- p = Packet.new("tgt","pkt")
508
- p.append_item("item1",8,:UINT)
509
- p.append_item("item2",16,:UINT,nil,:BIG_ENDIAN,:ERROR,nil,nil,nil,5)
510
- p.append_item("item3",32,:UINT)
511
- p.identify?("\x00\x00\x05\x01\x02\x03\x04").should be_truthy
512
- p.identify?("\x00\x00\x04\x01\x02\x03\x04").should be_falsey
513
- p.identify?("\x00").should be_falsey
514
- end
515
-
516
- it "should identify if the buffer is too short" do
517
- p = Packet.new("tgt","pkt")
518
- p.append_item("item1",8,:UINT)
519
- p.append_item("item2",16,:UINT,nil,:BIG_ENDIAN,:ERROR,nil,nil,nil,5)
520
- p.append_item("item3",32,:UINT)
521
- p.identify?("\x00\x00\x05\x01\x02\x03").should be_truthy
522
- end
523
-
524
- it "should identify if the buffer is too long" do
525
- p = Packet.new("tgt","pkt")
526
- p.append_item("item1",8,:UINT)
527
- p.append_item("item2",16,:UINT,nil,:BIG_ENDIAN,:ERROR,nil,nil,nil,5)
528
- p.append_item("item3",32,:UINT)
529
- p.identify?("\x00\x00\x05\x01\x02\x03\x04\x05").should be_truthy
530
- end
531
- end
532
-
533
- describe "identified?" do
534
- it "should return true if the target name and packet name are set" do
535
- Packet.new('TGT',nil).identified?.should be_falsey
536
- Packet.new(nil,'PKT').identified?.should be_falsey
537
- Packet.new('TGT','PKT').identified?.should be_truthy
538
- end
539
- end
540
-
541
- describe "restore_defaults" do
542
- it "should write all the items back to their default values" do
543
- p = Packet.new("tgt","pkt")
544
- p.append_item("test1", 8, :UINT, 16)
545
- i = p.get_item("TEST1")
546
- i.default = [3,4]
547
- p.write("test1", [1,2])
548
- p.append_item("test2", 16, :UINT)
549
- i = p.get_item("TEST2")
550
- i.default = 0x0102
551
- i.states = {"TRUE"=>0x0304}
552
- p.write("test2", 0x0304)
553
- p.append_item("test3", 32, :UINT)
554
- i = p.get_item("TEST3")
555
- i.default = 0x02030405
556
- i.write_conversion = GenericConversion.new("value * 2")
557
- p.write("test3", 0x01020304)
558
- p.buffer.should eql "\x01\x02\x03\x04\x02\x04\x06\x08"
559
- p.restore_defaults
560
- p.buffer.should eql "\x03\x04\x01\x02\x04\x06\x08\x0A"
561
- end
562
- end
563
-
564
- describe "enable_limits" do
565
- it "should enable limits on each packet item" do
566
- p = Packet.new("tgt","pkt")
567
- p.append_item("test1", 8, :UINT, 16)
568
- p.append_item("test2", 16, :UINT)
569
- p.get_item("TEST1").limits.enabled.should be_falsey
570
- p.get_item("TEST2").limits.enabled.should be_falsey
571
- p.enable_limits("TEST1")
572
- p.get_item("TEST1").limits.enabled.should be_truthy
573
- p.get_item("TEST2").limits.enabled.should be_falsey
574
- p.enable_limits("TEST2")
575
- p.get_item("TEST1").limits.enabled.should be_truthy
576
- p.get_item("TEST2").limits.enabled.should be_truthy
577
- end
578
- end
579
-
580
- describe "disable_limits" do
581
- it "should disable limits on each packet item" do
582
- p = Packet.new("tgt","pkt")
583
- p.append_item("test1", 8, :UINT)
584
- p.append_item("test2", 16, :UINT)
585
- p.enable_limits("TEST1")
586
- p.enable_limits("TEST2")
587
- p.get_item("TEST1").limits.enabled.should be_truthy
588
- p.get_item("TEST2").limits.enabled.should be_truthy
589
- p.disable_limits("TEST1")
590
- p.get_item("TEST1").limits.enabled.should be_falsey
591
- p.get_item("TEST2").limits.enabled.should be_truthy
592
- p.disable_limits("TEST2")
593
- p.get_item("TEST1").limits.enabled.should be_falsey
594
- p.get_item("TEST2").limits.enabled.should be_falsey
595
- end
596
-
597
- it "should call the limits_change_callback for all non STALE items" do
598
- p = Packet.new("tgt","pkt")
599
- p.append_item("test1", 8, :UINT)
600
- p.get_item("TEST1").limits.values = {:DEFAULT=>[1,2,4,5]}
601
- p.append_item("test2", 16, :UINT)
602
- p.get_item("TEST2").limits.values = {:DEFAULT=>[1,2,4,5]}
603
- p.write("TEST1",3)
604
- p.write("TEST2",3)
605
- p.enable_limits("TEST1")
606
- p.enable_limits("TEST2")
607
- p.update_limits_items_cache
608
-
609
- callback = double("callback", :call => true)
610
- p.limits_change_callback = callback
611
- expect(callback).to receive(:call).with(p, p.get_item("TEST1"),:GREEN,nil,false)
612
- expect(callback).to receive(:call).with(p, p.get_item("TEST2"),:GREEN,nil,false)
613
- p.check_limits
614
- p.disable_limits("TEST1")
615
- p.disable_limits("TEST2")
616
- p.get_item("TEST1").limits.enabled.should be_falsey
617
- p.get_item("TEST2").limits.enabled.should be_falsey
618
- end
619
- end
620
-
621
- describe "limits_items" do
622
- it "should return all items with limits" do
623
- p = Packet.new("tgt","pkt")
624
- p.append_item("test1", 8, :UINT)
625
- p.enable_limits("TEST1")
626
- p.append_item("test2", 16, :UINT)
627
- p.enable_limits("TEST2")
628
- p.limits_items.should eql []
629
-
630
- test1 = p.get_item("TEST1")
631
- test1.limits.values = {:DEFAULT=>[1,2,4,5]}
632
- p.update_limits_items_cache
633
- p.limits_items.should eql [test1]
634
- test2 = p.get_item("TEST2")
635
- test2.limits.values = {:DEFAULT=>[1,2,4,5]}
636
- p.update_limits_items_cache
637
- p.limits_items.should eql [test1, test2]
638
- end
639
- end
640
-
641
- describe "out_of_limits" do
642
- it "should return an array indicating all items out of limits" do
643
- p = Packet.new("tgt","pkt")
644
- p.append_item("test1", 8, :UINT)
645
- p.get_item("TEST1").limits.values = {:DEFAULT=>[1,2,4,5]}
646
- p.enable_limits("TEST1")
647
- p.write("TEST1",3)
648
- p.append_item("test2", 16, :UINT)
649
- p.get_item("TEST2").limits.values = {:DEFAULT=>[1,2,4,5]}
650
- p.write("TEST2",3)
651
- p.enable_limits("TEST2")
652
- p.update_limits_items_cache
653
- p.check_limits
654
- p.out_of_limits.should eql []
655
-
656
- p.write("TEST1",6)
657
- p.check_limits
658
- p.out_of_limits.should eql [["TGT","PKT","TEST1",:RED_HIGH]]
659
- p.write("TEST2",2)
660
- p.check_limits
661
- p.out_of_limits.should eql [["TGT","PKT","TEST1",:RED_HIGH],["TGT","PKT","TEST2",:YELLOW_LOW]]
662
- end
663
- end
664
-
665
- describe "set_all_limits_states" do
666
- it "should set all limits states to the given state" do
667
- p = Packet.new("tgt","pkt")
668
- p.append_item("test1", 8, :UINT)
669
- p.get_item("TEST1").limits.values = {:DEFAULT=>[1,2,4,5]}
670
- p.enable_limits("TEST1")
671
- p.append_item("test2", 16, :UINT)
672
- p.get_item("TEST2").limits.values = {:DEFAULT=>[1,2,4,5]}
673
- p.enable_limits("TEST2")
674
- p.update_limits_items_cache
675
- p.out_of_limits.should eql []
676
-
677
- PacketItemLimits::OUT_OF_LIMITS_STATES.each do |state|
678
- p.set_all_limits_states(state)
679
- p.out_of_limits.should eql [["TGT","PKT","TEST1",state],["TGT","PKT","TEST2",state]]
680
- end
681
- end
682
- end
683
-
684
- describe "check_limits" do
685
- before(:each) do
686
- @p = Packet.new("tgt","pkt")
687
- @p.append_item("test1", 8, :UINT)
688
- @p.append_item("test2", 16, :UINT)
689
- @p.append_item("test3", 32, :FLOAT)
690
- end
691
-
692
- it "should set clear the stale flag" do
693
- @p.stale.should be_truthy
694
- @p.check_limits
695
- @p.stale.should be_falsey
696
- end
697
-
698
- it "should not call the limits_change_callback if limits are disabled" do
699
- @p.get_item("TEST1").limits.enabled.should be_falsey
700
- @p.get_item("TEST2").limits.enabled.should be_falsey
701
- callback = double("callback")
702
- allow(callback).to receive(:call)
703
- @p.limits_change_callback = callback
704
- @p.check_limits
705
- expect(callback).to_not receive(:call)
706
- end
707
-
708
- context "with states" do
709
- it "should call the limits_change_callback" do
710
- test1 = @p.get_item("TEST1")
711
- test1.limits.enabled.should be_falsey
712
- test1.states = {"TRUE"=>1,"FALSE"=>0}
713
- test1.state_colors = {"TRUE"=>:GREEN,"FALSE"=>:RED}
714
- @p.write("TEST1", 0)
715
- @p.enable_limits("TEST1")
716
- test2 = @p.get_item("TEST2")
717
- test2.limits.enabled.should be_falsey
718
- test2.states = {"TRUE"=>1,"FALSE"=>0}
719
- test2.state_colors = {"TRUE"=>:RED,"FALSE"=>:GREEN}
720
- @p.write("TEST2", 0)
721
- @p.enable_limits("TEST2")
722
- @p.update_limits_items_cache
723
-
724
- # Mock the callback so we can see if it is called properly
725
- callback = double("callback", :call => true)
726
- @p.limits_change_callback = callback
727
-
728
- # Check the limits for the first time, TEST1 should be :RED and TEST2
729
- # should be :GREEN
730
- expect(callback).to receive(:call).once.with(@p, test1,nil,"FALSE",true)
731
- @p.check_limits
732
-
733
- # Change the TEST2 state to :RED, we were previously :GREEN
734
- @p.write("TEST2", 1)
735
- expect(callback).to receive(:call).once.with(@p, test2,:GREEN,"TRUE",true)
736
- @p.check_limits
737
-
738
- # Change the TEST2 value to something that doesn't map to a state
739
- @p.write("TEST2", 2)
740
- expect(callback).to receive(:call).once.with(@p, test2,:RED,2,false)
741
- @p.check_limits
742
- end
743
- end
744
-
745
- context "with values" do
746
- before(:each) do
747
- @test1 = @p.get_item("TEST1")
748
- @test1.limits.enabled.should be_falsey
749
- @test1.limits.values = {:DEFAULT=>[1,2,4,5]} # red yellow
750
- @p.enable_limits("TEST1")
751
-
752
- @test2 = @p.get_item("TEST2")
753
- @test2.limits.enabled.should be_falsey
754
- @test2.limits.values = {:DEFAULT=>[1,2,6,7,3,5]} # red yellow and blue
755
- @p.enable_limits("TEST2")
756
-
757
- @test3 = @p.get_item("TEST3")
758
- @test3.limits.enabled.should be_falsey
759
- @test3.limits.values = {:DEFAULT=>[1,1.5,2.5,3]} # red yellow
760
- @p.enable_limits("TEST3")
761
- @p.update_limits_items_cache
762
-
763
- # Mock the callback so we can see if it is called properly
764
- @callback = double("callback", :call => true)
765
- @p.limits_change_callback = @callback
766
- end
767
-
768
- it "should detect initial low states" do
769
- @p.write("TEST1", 0)
770
- @p.write("TEST2", 3)
771
- @p.write("TEST3", 1.25)
772
- @p.check_limits
773
- @p.get_item("TEST1").limits.state.should eql :RED_LOW
774
- @p.get_item("TEST2").limits.state.should eql :GREEN_LOW
775
- @p.get_item("TEST3").limits.state.should eql :YELLOW_LOW
776
- end
777
-
778
- it "should detect initial high states" do
779
- @p.write("TEST1", 6)
780
- @p.write("TEST2", 5)
781
- @p.write("TEST3", 2.75)
782
- @p.check_limits
783
- @p.get_item("TEST1").limits.state.should eql :RED_HIGH
784
- @p.get_item("TEST2").limits.state.should eql :GREEN_HIGH
785
- @p.get_item("TEST3").limits.state.should eql :YELLOW_HIGH
786
- end
787
-
788
- it "should detect initial middle states" do
789
- @p.write("TEST1", 3)
790
- @p.write("TEST2", 4)
791
- @p.write("TEST3", 2.0)
792
- @p.check_limits
793
- @p.get_item("TEST1").limits.state.should eql :GREEN
794
- @p.get_item("TEST2").limits.state.should eql :BLUE
795
- @p.get_item("TEST3").limits.state.should eql :GREEN
796
- end
797
-
798
- it "should clear persistence when initial state is nil" do
799
- @p.get_item("TEST1").limits.persistence_count = 2
800
- @p.get_item("TEST2").limits.persistence_count = 3
801
- @p.get_item("TEST3").limits.persistence_count = 4
802
- @p.check_limits
803
- @p.get_item("TEST1").limits.persistence_count.should eql 0
804
- @p.get_item("TEST2").limits.persistence_count.should eql 0
805
- @p.get_item("TEST3").limits.persistence_count.should eql 0
806
- end
807
-
808
- context "when calling the limits_change_callback" do
809
- it "should initially call only for out of limits" do
810
- @p.write("TEST1", 0)
811
- @p.write("TEST2", 4)
812
- @p.write("TEST3", 1.25)
813
-
814
- # Check the limits for the first time, TEST1 should be :RED_LOW, TEST2
815
- # should be :BLUE, TEST3 should be YELLOW_LOW
816
- expect(@callback).to receive(:call).with(@p, @test1,nil,0,true)
817
- expect(@callback).to receive(:call).with(@p, @test3,nil,1.25,true)
818
- @p.check_limits
819
- end
820
-
821
- it "should call when limits change states" do
822
- @p.write("TEST1", 0)
823
- @p.write("TEST2", 4)
824
- @p.write("TEST3", 1.25)
825
- @p.check_limits
826
-
827
- # Make TEST2 be GREEN_LOW, we were previously :BLUE
828
- @p.write("TEST2", 3)
829
- expect(@callback).to receive(:call).once.with(@p, @test2,:BLUE,3,true)
830
- @p.check_limits
831
- end
832
-
833
- it "should call only when persistence is achieved" do
834
- @p.get_item("TEST1").limits.persistence_setting = 2
835
- @p.get_item("TEST2").limits.persistence_setting = 3
836
- @p.get_item("TEST3").limits.persistence_setting = 4
837
-
838
- @p.write("TEST1", 3)
839
- @p.write("TEST2", 4)
840
- @p.write("TEST3", 2.0)
841
- @p.check_limits
842
-
843
- @p.write("TEST1", 0)
844
- @p.write("TEST2", 3)
845
- @p.write("TEST3", 1.25)
846
- @p.check_limits
847
-
848
- @p.write("TEST1", 0)
849
- @p.write("TEST2", 3)
850
- @p.write("TEST3", 1.25)
851
- expect(@callback).to receive(:call).with(@p, @test1,:GREEN,0,true)
852
- @p.check_limits
853
-
854
- @p.write("TEST1", 0)
855
- @p.write("TEST2", 3)
856
- @p.write("TEST3", 1.25)
857
- expect(@callback).to receive(:call).with(@p, @test2,:BLUE,3,true)
858
- @p.check_limits
859
-
860
- @p.write("TEST1", 0)
861
- @p.write("TEST2", 3)
862
- @p.write("TEST3", 1.25)
863
- expect(@callback).to receive(:call).with(@p, @test3,:GREEN,1.25,true)
864
- @p.check_limits
865
- end
866
-
867
- it "should not call when state changes before persistence is achieved" do
868
- @p.get_item("TEST1").limits.persistence_setting = 3
869
- @p.get_item("TEST2").limits.persistence_setting = 3
870
- @p.get_item("TEST3").limits.persistence_setting = 3
871
-
872
- @p.write("TEST1", 3)
873
- @p.write("TEST2", 4)
874
- @p.write("TEST3", 2.0)
875
- @p.check_limits
876
-
877
- # Write bad values twice
878
- @p.write("TEST1", 0)
879
- @p.write("TEST2", 3)
880
- @p.write("TEST3", 1.25)
881
- @p.check_limits
882
-
883
- @p.write("TEST1", 0)
884
- @p.write("TEST2", 3)
885
- @p.write("TEST3", 1.25)
886
- @p.check_limits
887
-
888
- # Set the values back to good
889
- @p.write("TEST1", 3)
890
- @p.write("TEST2", 4)
891
- @p.write("TEST3", 2.0)
892
- @p.check_limits
893
- expect(@callback).to_not receive(:call)
894
- end
895
- end
896
- end
897
- end
898
-
899
- describe "stale" do
900
- it "should set all limits states to stale" do
901
- p = Packet.new("tgt","pkt")
902
- p.append_item("test1", 8, :UINT)
903
- p.get_item("TEST1").limits.values = {:DEFAULT=>[1,2,4,5]}
904
- p.enable_limits("TEST1")
905
- p.append_item("test2", 16, :UINT)
906
- p.get_item("TEST2").limits.values = {:DEFAULT=>[1,2,4,5]}
907
- p.enable_limits("TEST2")
908
- p.update_limits_items_cache
909
- p.out_of_limits.should eql []
910
-
911
- p.stale.should be_truthy
912
- p.get_item("TEST1").limits.state.should eql :STALE
913
- p.get_item("TEST2").limits.state.should eql :STALE
914
- # Update the limits
915
- p.check_limits
916
- p.stale.should be_falsey
917
- p.get_item("TEST1").limits.state.should_not eql :STALE
918
- p.get_item("TEST2").limits.state.should_not eql :STALE
919
- # set them all back to stale
920
- p.set_stale
921
- p.get_item("TEST1").limits.state.should eql :STALE
922
- p.get_item("TEST2").limits.state.should eql :STALE
923
- end
924
- end
925
-
926
- describe "clone" do
927
- it "should duplicate the packet" do
928
- p = Packet.new("tgt","pkt")
929
- p2 = p.clone
930
- p2.target_name.should eql "TGT"
931
- p2.packet_name.should eql "PKT"
932
- end
933
- end
934
-
935
- describe "reset" do
936
- it "should reset the packet" do
937
- p = Packet.new("tgt","pkt")
938
- p.processors['processor'] = double("reset", :reset => true)
939
- p.received_time = Time.now
940
- p.received_count = 50
941
- p.reset
942
- p.received_time.should eql nil
943
- p.received_count.should eql 0
944
- end
945
- end
946
-
947
- end # describe Packet
948
-
949
- end
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'
14
+ require 'cosmos/conversions/generic_conversion'
15
+
16
+ module Cosmos
17
+
18
+ describe Packet do
19
+
20
+ describe "buffer=" do
21
+ it "should set the buffer" do
22
+ p = Packet.new("tgt", "pkt")
23
+ p.buffer = "\x00\x01\x02\x03"
24
+ p.buffer.should eql "\x00\x01\x02\x03"
25
+ end
26
+
27
+ it "should complain if the given buffer is too big" do
28
+ capture_io do |stdout|
29
+ p = Packet.new("tgt", "pkt")
30
+ p.append_item("test1", 16, :UINT)
31
+
32
+ p.buffer = "\x00\x00\x00"
33
+ stdout.string.should match(/TGT PKT received with actual packet length of 3 but defined length of 2/)
34
+ end
35
+ end
36
+
37
+ it "should run processors if present" do
38
+ p = Packet.new("tgt", "pkt")
39
+ p.processors['processor'] = double("call", :call => true)
40
+ p.buffer = "\x00\x01\x02\x03"
41
+ end
42
+ end
43
+
44
+ describe "target_name=" do
45
+ it "should set the target_name to an uppercase String" do
46
+ p = Packet.new("tgt", "pkt")
47
+ p.target_name.should eql "TGT"
48
+ end
49
+
50
+ it "should set target_name to nil" do
51
+ p = Packet.new(nil,"pkt")
52
+ p.target_name.should be_nil
53
+ end
54
+
55
+ it "should complain about non String target_names" do
56
+ expect { Packet.new(5, "pkt") }.to raise_error(ArgumentError, "target_name must be a String but is a Fixnum")
57
+ end
58
+ end
59
+
60
+ describe "packet_name=" do
61
+ it "should set the packet_name to an uppercase String" do
62
+ p = Packet.new("tgt", "pkt")
63
+ p.packet_name.should eql "PKT"
64
+ end
65
+
66
+ it "should set packet_name to nil" do
67
+ p = Packet.new("tgt",nil)
68
+ p.packet_name.should be_nil
69
+ end
70
+
71
+ it "should complain about non String packet_names" do
72
+ expect { Packet.new("tgt", 5) }.to raise_error(ArgumentError, "packet_name must be a String but is a Fixnum")
73
+ end
74
+ end
75
+
76
+ describe "description=" do
77
+ it "should set the description to a String" do
78
+ p = Packet.new("tgt", "pkt", :BIG_ENDIAN, "This is a description")
79
+ p.description.should eql "This is a description"
80
+ end
81
+
82
+ it "should set description to nil" do
83
+ p = Packet.new("tgt","pkt")
84
+ p.description = nil
85
+ p.description.should be_nil
86
+ end
87
+
88
+ it "should complain about non String descriptions" do
89
+ p = Packet.new("tgt","pkt")
90
+ expect { p.description = 5 }.to raise_error(ArgumentError, "description must be a String but is a Fixnum")
91
+ end
92
+ end
93
+
94
+ describe "received_time=" do
95
+ it "should set the received_time to a Time" do
96
+ p = Packet.new("tgt", "pkt")
97
+ t = Time.now
98
+ p.received_time = t
99
+ p.received_time.should eql t
100
+ end
101
+
102
+ it "should set received_time to nil" do
103
+ p = Packet.new("tgt","pkt")
104
+ p.received_time = nil
105
+ p.received_time.should be_nil
106
+ end
107
+
108
+ it "should complain about non Time received_times" do
109
+ p = Packet.new("tgt","pkt")
110
+ expect {p.received_time = "1pm" }.to raise_error(ArgumentError, "received_time must be a Time but is a String")
111
+ end
112
+ end
113
+
114
+ describe "received_count=" do
115
+ it "should set the received_count to a Fixnum" do
116
+ p = Packet.new("tgt", "pkt")
117
+ p.received_count = 10
118
+ p.received_count.should eql 10
119
+ end
120
+
121
+ it "should complain about nil received_count" do
122
+ p = Packet.new("tgt","pkt")
123
+ expect {p.received_count = nil }.to raise_error(ArgumentError, "received_count must be a Fixnum but is a NilClass")
124
+ end
125
+
126
+ it "should complain about non Fixnum received_counts" do
127
+ p = Packet.new("tgt","pkt")
128
+ expect {p.received_count = "5" }.to raise_error(ArgumentError, "received_count must be a Fixnum but is a String")
129
+ end
130
+ end
131
+
132
+ describe "hazardous_description=" do
133
+ it "should set the hazardous_description to a String" do
134
+ p = Packet.new("tgt", "pkt")
135
+ p.hazardous_description = "This is a description"
136
+ p.hazardous_description.should eql "This is a description"
137
+ end
138
+
139
+ it "should set hazardous_description to nil" do
140
+ p = Packet.new("tgt","pkt")
141
+ p.hazardous_description = nil
142
+ p.hazardous_description.should be_nil
143
+ end
144
+
145
+ it "should complain about non String hazardous_descriptions" do
146
+ p = Packet.new("tgt","pkt")
147
+ expect {p.hazardous_description = 5 }.to raise_error(ArgumentError, "hazardous_description must be a String but is a Fixnum")
148
+ end
149
+ end
150
+
151
+ describe "given_values=" do
152
+ it "should set the given_values to a Hash" do
153
+ p = Packet.new("tgt", "pkt")
154
+ gv = {}
155
+ p.given_values = gv
156
+ p.given_values.should eql gv
157
+ end
158
+
159
+ it "should set given_values to nil" do
160
+ p = Packet.new("tgt","pkt")
161
+ p.given_values = nil
162
+ p.given_values.should be_nil
163
+ end
164
+
165
+ it "should complain about non Hash given_valuess" do
166
+ p = Packet.new("tgt","pkt")
167
+ expect {p.given_values = [] }.to raise_error(ArgumentError, "given_values must be a Hash but is a Array")
168
+ end
169
+ end
170
+
171
+ describe "meta" do
172
+ it "should allow adding items to the meta hash" do
173
+ p = Packet.new("tgt","pkt")
174
+ p.meta['TYPE'] = 'float32'
175
+ p.meta['TYPE'].should eql 'float32'
176
+ end
177
+ end
178
+
179
+ describe "limits_change_callback=" do
180
+ it "should set the limits_change_callback to something that responds to call" do
181
+ p = Packet.new("tgt", "pkt")
182
+ callback = Object.new
183
+ allow(callback).to receive(:call)
184
+ expect { p.limits_change_callback = callback }.to_not raise_error
185
+ end
186
+
187
+ it "should set limits_change_callback to nil" do
188
+ p = Packet.new("tgt","pkt")
189
+ expect { p.limits_change_callback = nil }.to_not raise_error
190
+ end
191
+
192
+ it "should complain about non #call limits_change_callbacks" do
193
+ p = Packet.new("tgt","pkt")
194
+ expect {p.limits_change_callback = "" }.to raise_error(ArgumentError, "limits_change_callback must respond to call")
195
+ end
196
+ end
197
+
198
+ describe "define_item" do
199
+ it "should take a format_string, read_conversion, write_conversion, and id_value" do
200
+ p = Packet.new("tgt","pkt")
201
+ rc = GenericConversion.new("value / 2")
202
+ wc = GenericConversion.new("value * 2")
203
+ p.define_item("item",0,32,:FLOAT,nil,:BIG_ENDIAN,:ERROR,"%5.1f",rc,wc,5)
204
+ i = p.get_item("ITEM")
205
+ i.format_string.should eql "%5.1f"
206
+ i.read_conversion.to_s.should eql rc.to_s
207
+ i.write_conversion.to_s.should eql wc.to_s
208
+ i.id_value.should eql 5.0
209
+ end
210
+
211
+ it "should initialize format_string, read_conversion, write_conversion, and id_value to nil" do
212
+ p = Packet.new("tgt","pkt")
213
+ p.define_item("item",0,32,:FLOAT)
214
+ i = p.get_item("ITEM")
215
+ i.format_string.should be_nil
216
+ i.read_conversion.should be_nil
217
+ i.write_conversion.should be_nil
218
+ i.id_value.should be_nil
219
+ end
220
+ end
221
+
222
+ describe "append_item" do
223
+ it "should take a format_string, read_conversion, write_conversion, and id_value" do
224
+ p = Packet.new("tgt","pkt")
225
+ rc = GenericConversion.new("value / 2")
226
+ wc = GenericConversion.new("value * 2")
227
+ p.append_item("item",32,:FLOAT,nil,:BIG_ENDIAN,:ERROR,"%5.1f",rc,wc,5)
228
+ i = p.get_item("ITEM")
229
+ i.format_string.should eql "%5.1f"
230
+ i.read_conversion.to_s.should eql rc.to_s
231
+ i.write_conversion.to_s.should eql wc.to_s
232
+ i.id_value.should eql 5.0
233
+ end
234
+
235
+ it "should initialize format_string, read_conversion, write_conversion, and id_value to nil" do
236
+ p = Packet.new("tgt","pkt")
237
+ p.append_item("item",32,:FLOAT)
238
+ i = p.get_item("ITEM")
239
+ i.format_string.should be_nil
240
+ i.read_conversion.should be_nil
241
+ i.write_conversion.should be_nil
242
+ i.id_value.should be_nil
243
+ end
244
+ end
245
+
246
+ describe "get_item" do
247
+ it "should complain if an item doesn't exist" do
248
+ p = Packet.new("tgt","pkt")
249
+ expect { p.get_item("test") }.to raise_error(RuntimeError, "Packet item 'TGT PKT TEST' does not exist")
250
+ end
251
+ end
252
+
253
+ describe "read and read_item" do
254
+ before (:each) do
255
+ @p = Packet.new("tgt","pkt")
256
+ end
257
+
258
+ it "should complain about unknown value_type" do
259
+ @p.append_item("item",32,:UINT)
260
+ i = @p.get_item("ITEM")
261
+ expect { @p.read("ITEM", :MINE, "\x01\x02\x03\x04") }.to raise_error(ArgumentError, "Unknown value type on read: MINE")
262
+ expect { @p.read_item(i, :MINE, "\x01\x02\x03\x04") }.to raise_error(ArgumentError, "Unknown value type on read: MINE")
263
+ end
264
+
265
+ it "should read the RAW value" do
266
+ @p.append_item("item",32,:UINT)
267
+ i = @p.get_item("ITEM")
268
+ @p.read("ITEM", :RAW, "\x01\x02\x03\x04").should eql 0x01020304
269
+ @p.read_item(i, :RAW, "\x01\x02\x03\x04").should eql 0x01020304
270
+ end
271
+
272
+ it "should read the CONVERTED value" do
273
+ @p.append_item("item",8,:UINT)
274
+ i = @p.get_item("ITEM")
275
+ @p.read("ITEM", :CONVERTED, "\x02").should eql 2
276
+ @p.read_item(i, :CONVERTED, "\x02").should eql 2
277
+ i.read_conversion = GenericConversion.new("value / 2")
278
+ @p.read("ITEM", :CONVERTED, "\x02").should eql 1
279
+ @p.read_item(i, :CONVERTED, "\x02").should eql 1
280
+ end
281
+
282
+ it "should read the CONVERTED value with states" do
283
+ @p.append_item("item",8,:UINT)
284
+ i = @p.get_item("ITEM")
285
+ i.states = {"TRUE"=>1, "FALSE"=>2}
286
+ @p.read("ITEM", :CONVERTED, "\x00").should eql 0
287
+ @p.read_item(i, :CONVERTED, "\x00").should eql 0
288
+ @p.read("ITEM", :CONVERTED, "\x01").should eql "TRUE"
289
+ @p.read_item(i, :CONVERTED, "\x01").should eql "TRUE"
290
+ i.read_conversion = GenericConversion.new("value / 2")
291
+ @p.read("ITEM", :CONVERTED, "\x04").should eql "FALSE"
292
+ @p.read_item(i, :CONVERTED, "\x04").should eql "FALSE"
293
+ end
294
+
295
+ it "should read the FORMATTED value" do
296
+ @p.append_item("item",8,:UINT)
297
+ i = @p.get_item("ITEM")
298
+ @p.read("ITEM", :FORMATTED, "\x02").should eql "2"
299
+ @p.read_item(i, :FORMATTED, "\x02").should eql "2"
300
+ i.format_string = "0x%x"
301
+ @p.read("ITEM", :FORMATTED, "\x02").should eql "0x2"
302
+ @p.read_item(i, :FORMATTED, "\x02").should eql "0x2"
303
+ i.states = {"TRUE"=>1, "FALSE"=>2}
304
+ @p.read("ITEM", :FORMATTED, "\x01").should eql "TRUE"
305
+ @p.read_item(i, :FORMATTED, "\x01").should eql "TRUE"
306
+ @p.read("ITEM", :FORMATTED, "\x02").should eql "FALSE"
307
+ @p.read_item(i, :FORMATTED, "\x02").should eql "FALSE"
308
+ @p.read("ITEM", :FORMATTED, "\x04").should eql "0x4"
309
+ @p.read_item(i, :FORMATTED, "\x04").should eql "0x4"
310
+ i.read_conversion = GenericConversion.new("value / 2")
311
+ @p.read("ITEM", :FORMATTED, "\x04").should eql "FALSE"
312
+ @p.read_item(i, :FORMATTED, "\x04").should eql "FALSE"
313
+ end
314
+
315
+ it "should read the WITH_UNITS value" do
316
+ @p.append_item("item",8,:UINT)
317
+ i = @p.get_item("ITEM")
318
+ i.units = "V"
319
+ @p.read("ITEM", :WITH_UNITS, "\x02").should eql "2 V"
320
+ @p.read_item(i, :WITH_UNITS, "\x02").should eql "2 V"
321
+ i.format_string = "0x%x"
322
+ @p.read("ITEM", :WITH_UNITS, "\x02").should eql "0x2 V"
323
+ @p.read_item(i, :WITH_UNITS, "\x02").should eql "0x2 V"
324
+ i.states = {"TRUE"=>1, "FALSE"=>2}
325
+ @p.read("ITEM", :WITH_UNITS, "\x01").should eql "TRUE"
326
+ @p.read_item(i, :WITH_UNITS, "\x01").should eql "TRUE"
327
+ @p.read("ITEM", :WITH_UNITS, "\x02").should eql "FALSE"
328
+ @p.read_item(i, :WITH_UNITS, "\x02").should eql "FALSE"
329
+ @p.read("ITEM", :WITH_UNITS, "\x04").should eql "0x4 V"
330
+ @p.read_item(i, :WITH_UNITS, "\x04").should eql "0x4 V"
331
+ i.read_conversion = GenericConversion.new("value / 2")
332
+ @p.read("ITEM", :WITH_UNITS, "\x04").should eql "FALSE"
333
+ @p.read_item(i, :WITH_UNITS, "\x04").should eql "FALSE"
334
+ end
335
+
336
+ it "should read the WITH_UNITS array value" do
337
+ @p.append_item("item",8,:UINT, 16)
338
+ i = @p.get_item("ITEM")
339
+ i.units = "V"
340
+ @p.read("ITEM", :WITH_UNITS, "\x01\x02").should eql ["1 V", "2 V"]
341
+ @p.read_item(i, :WITH_UNITS, "\x01\x02").should eql ["1 V", "2 V"]
342
+ i.format_string = "0x%x"
343
+ @p.read("ITEM", :WITH_UNITS, "\x01\x02").should eql ["0x1 V", "0x2 V"]
344
+ @p.read_item(i, :WITH_UNITS, "\x01\x02").should eql ["0x1 V", "0x2 V"]
345
+ i.states = {"TRUE"=>1, "FALSE"=>2}
346
+ @p.read("ITEM", :WITH_UNITS, "\x01\x02").should eql ["TRUE", "FALSE"]
347
+ @p.read_item(i, :WITH_UNITS, "\x01\x02").should eql ["TRUE", "FALSE"]
348
+ @p.read("ITEM", :WITH_UNITS, "\x00\x01").should eql ["0x0 V", "TRUE"]
349
+ @p.read_item(i, :WITH_UNITS, "\x00\x01").should eql ["0x0 V", "TRUE"]
350
+ @p.read("ITEM", :WITH_UNITS, "\x02\x03").should eql ["FALSE", "0x3 V"]
351
+ @p.read_item(i, :WITH_UNITS, "\x02\x03").should eql ["FALSE", "0x3 V"]
352
+ @p.read("ITEM", :WITH_UNITS, "\x04").should eql ["0x4 V"]
353
+ @p.read_item(i, :WITH_UNITS, "\x04").should eql ["0x4 V"]
354
+ @p.read("ITEM", :WITH_UNITS, "\x04").should eql ["0x4 V"]
355
+ @p.read_item(i, :WITH_UNITS, "\x04").should eql ["0x4 V"]
356
+ i.read_conversion = GenericConversion.new("value / 2")
357
+ @p.read("ITEM", :WITH_UNITS, "\x02\x04").should eql ["TRUE","FALSE"]
358
+ @p.read_item(i, :WITH_UNITS, "\x02\x04").should eql ["TRUE","FALSE"]
359
+ @p.read("ITEM", :WITH_UNITS, "\x08").should eql ["0x4 V"]
360
+ @p.read_item(i, :WITH_UNITS, "\x08").should eql ["0x4 V"]
361
+ end
362
+ end
363
+
364
+ describe "write and write_item" do
365
+ before (:each) do
366
+ @p = Packet.new("tgt","pkt")
367
+ @buffer = "\x00\x00\x00\x00"
368
+ end
369
+
370
+ it "should complain about unknown value_type" do
371
+ @p.append_item("item",32,:UINT)
372
+ i = @p.get_item("ITEM")
373
+ expect { @p.write("ITEM", 0, :MINE) }.to raise_error(ArgumentError, "Unknown value type on write: MINE")
374
+ expect { @p.write_item(i, 0, :MINE) }.to raise_error(ArgumentError, "Unknown value type on write: MINE")
375
+ end
376
+
377
+ it "should write the RAW value" do
378
+ @p.append_item("item",32,:UINT)
379
+ i = @p.get_item("ITEM")
380
+ @p.write("ITEM", 0x01020304, :RAW, @buffer)
381
+ @buffer.should eql "\x01\x02\x03\x04"
382
+ @p.write_item(i, 0x05060708, :RAW, @buffer)
383
+ @buffer.should eql "\x05\x06\x07\x08"
384
+ end
385
+
386
+ it "should write the CONVERTED value" do
387
+ @p.append_item("item",8,:UINT)
388
+ i = @p.get_item("ITEM")
389
+ @p.write("ITEM", 1, :CONVERTED, @buffer)
390
+ @buffer.should eql "\x01\x00\x00\x00"
391
+ @p.write_item(i, 2, :CONVERTED, @buffer)
392
+ @buffer.should eql "\x02\x00\x00\x00"
393
+ i.write_conversion = GenericConversion.new("value / 2")
394
+ @p.write("ITEM", 1, :CONVERTED, @buffer)
395
+ @buffer.should eql "\x00\x00\x00\x00"
396
+ @p.write_item(i, 2, :CONVERTED, @buffer)
397
+ @buffer.should eql "\x01\x00\x00\x00"
398
+ end
399
+
400
+ it "should write the CONVERTED value with states" do
401
+ @p.append_item("item",8,:UINT)
402
+ i = @p.get_item("ITEM")
403
+ i.states = {"TRUE"=>1, "FALSE"=>2}
404
+ @p.write("ITEM", 3, :CONVERTED, @buffer)
405
+ @buffer.should eql "\x03\x00\x00\x00"
406
+ @p.write_item(i, 4, :CONVERTED, @buffer)
407
+ @buffer.should eql "\x04\x00\x00\x00"
408
+ @p.write("ITEM", "TRUE", :CONVERTED, @buffer)
409
+ @buffer.should eql "\x01\x00\x00\x00"
410
+ @p.write_item(i, "FALSE", :CONVERTED, @buffer)
411
+ @buffer.should eql "\x02\x00\x00\x00"
412
+ i.write_conversion = GenericConversion.new("value / 2")
413
+ @p.write("ITEM", 4, :CONVERTED, @buffer)
414
+ @buffer.should eql "\x02\x00\x00\x00"
415
+ @p.write("ITEM", "TRUE", :CONVERTED, @buffer)
416
+ @buffer.should eql "\x00\x00\x00\x00"
417
+ @p.write_item(i, "FALSE", :CONVERTED, @buffer)
418
+ @buffer.should eql "\x01\x00\x00\x00"
419
+ end
420
+
421
+ it "should complain about the FORMATTED value_type" do
422
+ @p.append_item("item",8,:UINT)
423
+ i = @p.get_item("ITEM")
424
+ expect { @p.write("ITEM", 3, :FORMATTED, @buffer) }.to raise_error(ArgumentError, "Invalid value type on write: FORMATTED")
425
+ expect { @p.write_item(i, 3, :FORMATTED, @buffer) }.to raise_error(ArgumentError, "Invalid value type on write: FORMATTED")
426
+ end
427
+
428
+ it "should complain about the WITH_UNITS value_type" do
429
+ @p.append_item("item",8,:UINT)
430
+ i = @p.get_item("ITEM")
431
+ expect { @p.write("ITEM", 3, :WITH_UNITS, @buffer) }.to raise_error(ArgumentError, "Invalid value type on write: WITH_UNITS")
432
+ expect { @p.write_item(i, 3, :WITH_UNITS, @buffer) }.to raise_error(ArgumentError, "Invalid value type on write: WITH_UNITS")
433
+ end
434
+ end
435
+
436
+ describe "read_all" do
437
+ it "should default to read all CONVERTED items" do
438
+ p = Packet.new("tgt","pkt")
439
+ p.append_item("test1", 8, :UINT, 16)
440
+ p.append_item("test2", 16, :UINT)
441
+ i = p.get_item("TEST2")
442
+ i.states = {"TRUE"=>0x0304}
443
+ p.append_item("test3", 32, :UINT)
444
+ i = p.get_item("TEST3")
445
+ i.read_conversion = GenericConversion.new("value / 2")
446
+
447
+ buffer = "\x01\x02\x03\x04\x04\x06\x08\x0A"
448
+ p.buffer = buffer
449
+ vals = p.read_all
450
+ vals[0][0].should eql "TEST1"
451
+ vals[1][0].should eql "TEST2"
452
+ vals[2][0].should eql "TEST3"
453
+ vals[0][1].should eql [1,2]
454
+ vals[1][1].should eql "TRUE"
455
+ vals[2][1].should eql 0x02030405
456
+ end
457
+ end
458
+
459
+ describe "read_all_with_limits_states" do
460
+ it "should return an array of items with their limit states" do
461
+ p = Packet.new("tgt","pkt")
462
+ p.append_item("test1", 8, :UINT)
463
+ i = p.get_item("TEST1")
464
+ i.states = {"TRUE"=>1,"FALSE"=>0}
465
+ i.state_colors = {"TRUE"=>:GREEN,"FALSE"=>:RED}
466
+ p.write("TEST1",0)
467
+ p.enable_limits("TEST1")
468
+ p.append_item("test2", 16, :UINT)
469
+ i = p.get_item("TEST2")
470
+ i.limits.values = {:DEFAULT=>[1,2,4,5]}
471
+ p.write("TEST2",3)
472
+ p.enable_limits("TEST2")
473
+ p.update_limits_items_cache
474
+ p.check_limits
475
+
476
+ vals = p.read_all_with_limits_states
477
+ vals[0][0].should eql "TEST1"
478
+ vals[1][0].should eql "TEST2"
479
+ vals[0][1].should eql "FALSE"
480
+ vals[1][1].should eql 3
481
+ vals[0][2].should eql :RED
482
+ vals[1][2].should eql :GREEN
483
+ end
484
+ end
485
+
486
+ describe "formatted" do
487
+ it "should print out all the items and CONVERTED values" do
488
+ p = Packet.new("tgt","pkt")
489
+ p.append_item("test1", 8, :UINT, 16)
490
+ p.write("test1", [1,2])
491
+ p.append_item("test2", 16, :UINT)
492
+ i = p.get_item("TEST2")
493
+ i.states = {"TRUE"=>0x0304}
494
+ p.write("test2", 0x0304)
495
+ p.append_item("test3", 32, :UINT)
496
+ i = p.get_item("TEST3")
497
+ i.read_conversion = GenericConversion.new("value / 2")
498
+ p.write("test3", 0x0406080A)
499
+ p.formatted.should include("TEST1: [1, 2]")
500
+ p.formatted.should include("TEST2: TRUE")
501
+ p.formatted.should include("TEST3: #{0x02030405}")
502
+ end
503
+ end
504
+
505
+ describe "identify?" do
506
+ it "should identify a buffer based on id_items" do
507
+ p = Packet.new("tgt","pkt")
508
+ p.append_item("item1",8,:UINT)
509
+ p.append_item("item2",16,:UINT,nil,:BIG_ENDIAN,:ERROR,nil,nil,nil,5)
510
+ p.append_item("item3",32,:UINT)
511
+ p.identify?("\x00\x00\x05\x01\x02\x03\x04").should be_truthy
512
+ p.identify?("\x00\x00\x04\x01\x02\x03\x04").should be_falsey
513
+ p.identify?("\x00").should be_falsey
514
+ end
515
+
516
+ it "should identify if the buffer is too short" do
517
+ p = Packet.new("tgt","pkt")
518
+ p.append_item("item1",8,:UINT)
519
+ p.append_item("item2",16,:UINT,nil,:BIG_ENDIAN,:ERROR,nil,nil,nil,5)
520
+ p.append_item("item3",32,:UINT)
521
+ p.identify?("\x00\x00\x05\x01\x02\x03").should be_truthy
522
+ end
523
+
524
+ it "should identify if the buffer is too long" do
525
+ p = Packet.new("tgt","pkt")
526
+ p.append_item("item1",8,:UINT)
527
+ p.append_item("item2",16,:UINT,nil,:BIG_ENDIAN,:ERROR,nil,nil,nil,5)
528
+ p.append_item("item3",32,:UINT)
529
+ p.identify?("\x00\x00\x05\x01\x02\x03\x04\x05").should be_truthy
530
+ end
531
+ end
532
+
533
+ describe "identified?" do
534
+ it "should return true if the target name and packet name are set" do
535
+ Packet.new('TGT',nil).identified?.should be_falsey
536
+ Packet.new(nil,'PKT').identified?.should be_falsey
537
+ Packet.new('TGT','PKT').identified?.should be_truthy
538
+ end
539
+ end
540
+
541
+ describe "restore_defaults" do
542
+ it "should write all the items back to their default values" do
543
+ p = Packet.new("tgt","pkt")
544
+ p.append_item("test1", 8, :UINT, 16)
545
+ i = p.get_item("TEST1")
546
+ i.default = [3,4]
547
+ p.write("test1", [1,2])
548
+ p.append_item("test2", 16, :UINT)
549
+ i = p.get_item("TEST2")
550
+ i.default = 0x0102
551
+ i.states = {"TRUE"=>0x0304}
552
+ p.write("test2", 0x0304)
553
+ p.append_item("test3", 32, :UINT)
554
+ i = p.get_item("TEST3")
555
+ i.default = 0x02030405
556
+ i.write_conversion = GenericConversion.new("value * 2")
557
+ p.write("test3", 0x01020304)
558
+ p.buffer.should eql "\x01\x02\x03\x04\x02\x04\x06\x08"
559
+ p.restore_defaults
560
+ p.buffer.should eql "\x03\x04\x01\x02\x04\x06\x08\x0A"
561
+ end
562
+ end
563
+
564
+ describe "enable_limits" do
565
+ it "should enable limits on each packet item" do
566
+ p = Packet.new("tgt","pkt")
567
+ p.append_item("test1", 8, :UINT, 16)
568
+ p.append_item("test2", 16, :UINT)
569
+ p.get_item("TEST1").limits.enabled.should be_falsey
570
+ p.get_item("TEST2").limits.enabled.should be_falsey
571
+ p.enable_limits("TEST1")
572
+ p.get_item("TEST1").limits.enabled.should be_truthy
573
+ p.get_item("TEST2").limits.enabled.should be_falsey
574
+ p.enable_limits("TEST2")
575
+ p.get_item("TEST1").limits.enabled.should be_truthy
576
+ p.get_item("TEST2").limits.enabled.should be_truthy
577
+ end
578
+ end
579
+
580
+ describe "disable_limits" do
581
+ it "should disable limits on each packet item" do
582
+ p = Packet.new("tgt","pkt")
583
+ p.append_item("test1", 8, :UINT)
584
+ p.append_item("test2", 16, :UINT)
585
+ p.enable_limits("TEST1")
586
+ p.enable_limits("TEST2")
587
+ p.get_item("TEST1").limits.enabled.should be_truthy
588
+ p.get_item("TEST2").limits.enabled.should be_truthy
589
+ p.disable_limits("TEST1")
590
+ p.get_item("TEST1").limits.enabled.should be_falsey
591
+ p.get_item("TEST2").limits.enabled.should be_truthy
592
+ p.disable_limits("TEST2")
593
+ p.get_item("TEST1").limits.enabled.should be_falsey
594
+ p.get_item("TEST2").limits.enabled.should be_falsey
595
+ end
596
+
597
+ it "should call the limits_change_callback for all non STALE items" do
598
+ p = Packet.new("tgt","pkt")
599
+ p.append_item("test1", 8, :UINT)
600
+ p.get_item("TEST1").limits.values = {:DEFAULT=>[1,2,4,5]}
601
+ p.append_item("test2", 16, :UINT)
602
+ p.get_item("TEST2").limits.values = {:DEFAULT=>[1,2,4,5]}
603
+ p.write("TEST1",3)
604
+ p.write("TEST2",3)
605
+ p.enable_limits("TEST1")
606
+ p.enable_limits("TEST2")
607
+ p.update_limits_items_cache
608
+
609
+ callback = double("callback", :call => true)
610
+ p.limits_change_callback = callback
611
+ expect(callback).to receive(:call).with(p, p.get_item("TEST1"),:GREEN,nil,false)
612
+ expect(callback).to receive(:call).with(p, p.get_item("TEST2"),:GREEN,nil,false)
613
+ p.check_limits
614
+ p.disable_limits("TEST1")
615
+ p.disable_limits("TEST2")
616
+ p.get_item("TEST1").limits.enabled.should be_falsey
617
+ p.get_item("TEST2").limits.enabled.should be_falsey
618
+ end
619
+ end
620
+
621
+ describe "limits_items" do
622
+ it "should return all items with limits" do
623
+ p = Packet.new("tgt","pkt")
624
+ p.append_item("test1", 8, :UINT)
625
+ p.enable_limits("TEST1")
626
+ p.append_item("test2", 16, :UINT)
627
+ p.enable_limits("TEST2")
628
+ p.limits_items.should eql []
629
+
630
+ test1 = p.get_item("TEST1")
631
+ test1.limits.values = {:DEFAULT=>[1,2,4,5]}
632
+ p.update_limits_items_cache
633
+ p.limits_items.should eql [test1]
634
+ test2 = p.get_item("TEST2")
635
+ test2.limits.values = {:DEFAULT=>[1,2,4,5]}
636
+ p.update_limits_items_cache
637
+ p.limits_items.should eql [test1, test2]
638
+ end
639
+ end
640
+
641
+ describe "out_of_limits" do
642
+ it "should return an array indicating all items out of limits" do
643
+ p = Packet.new("tgt","pkt")
644
+ p.append_item("test1", 8, :UINT)
645
+ p.get_item("TEST1").limits.values = {:DEFAULT=>[1,2,4,5]}
646
+ p.enable_limits("TEST1")
647
+ p.write("TEST1",3)
648
+ p.append_item("test2", 16, :UINT)
649
+ p.get_item("TEST2").limits.values = {:DEFAULT=>[1,2,4,5]}
650
+ p.write("TEST2",3)
651
+ p.enable_limits("TEST2")
652
+ p.update_limits_items_cache
653
+ p.check_limits
654
+ p.out_of_limits.should eql []
655
+
656
+ p.write("TEST1",6)
657
+ p.check_limits
658
+ p.out_of_limits.should eql [["TGT","PKT","TEST1",:RED_HIGH]]
659
+ p.write("TEST2",2)
660
+ p.check_limits
661
+ p.out_of_limits.should eql [["TGT","PKT","TEST1",:RED_HIGH],["TGT","PKT","TEST2",:YELLOW_LOW]]
662
+ end
663
+ end
664
+
665
+ describe "set_all_limits_states" do
666
+ it "should set all limits states to the given state" do
667
+ p = Packet.new("tgt","pkt")
668
+ p.append_item("test1", 8, :UINT)
669
+ p.get_item("TEST1").limits.values = {:DEFAULT=>[1,2,4,5]}
670
+ p.enable_limits("TEST1")
671
+ p.append_item("test2", 16, :UINT)
672
+ p.get_item("TEST2").limits.values = {:DEFAULT=>[1,2,4,5]}
673
+ p.enable_limits("TEST2")
674
+ p.update_limits_items_cache
675
+ p.out_of_limits.should eql []
676
+
677
+ PacketItemLimits::OUT_OF_LIMITS_STATES.each do |state|
678
+ p.set_all_limits_states(state)
679
+ p.out_of_limits.should eql [["TGT","PKT","TEST1",state],["TGT","PKT","TEST2",state]]
680
+ end
681
+ end
682
+ end
683
+
684
+ describe "check_limits" do
685
+ before(:each) do
686
+ @p = Packet.new("tgt","pkt")
687
+ @p.append_item("test1", 8, :UINT)
688
+ @p.append_item("test2", 16, :UINT)
689
+ @p.append_item("test3", 32, :FLOAT)
690
+ end
691
+
692
+ it "should set clear the stale flag" do
693
+ @p.stale.should be_truthy
694
+ @p.check_limits
695
+ @p.stale.should be_falsey
696
+ end
697
+
698
+ it "should not call the limits_change_callback if limits are disabled" do
699
+ @p.get_item("TEST1").limits.enabled.should be_falsey
700
+ @p.get_item("TEST2").limits.enabled.should be_falsey
701
+ callback = double("callback")
702
+ allow(callback).to receive(:call)
703
+ @p.limits_change_callback = callback
704
+ @p.check_limits
705
+ expect(callback).to_not receive(:call)
706
+ end
707
+
708
+ context "with states" do
709
+ it "should call the limits_change_callback" do
710
+ test1 = @p.get_item("TEST1")
711
+ test1.limits.enabled.should be_falsey
712
+ test1.states = {"TRUE"=>1,"FALSE"=>0}
713
+ test1.state_colors = {"TRUE"=>:GREEN,"FALSE"=>:RED}
714
+ @p.write("TEST1", 0)
715
+ @p.enable_limits("TEST1")
716
+ test2 = @p.get_item("TEST2")
717
+ test2.limits.enabled.should be_falsey
718
+ test2.states = {"TRUE"=>1,"FALSE"=>0}
719
+ test2.state_colors = {"TRUE"=>:RED,"FALSE"=>:GREEN}
720
+ @p.write("TEST2", 0)
721
+ @p.enable_limits("TEST2")
722
+ @p.update_limits_items_cache
723
+
724
+ # Mock the callback so we can see if it is called properly
725
+ callback = double("callback", :call => true)
726
+ @p.limits_change_callback = callback
727
+
728
+ # Check the limits for the first time, TEST1 should be :RED and TEST2
729
+ # should be :GREEN
730
+ expect(callback).to receive(:call).once.with(@p, test1,nil,"FALSE",true)
731
+ @p.check_limits
732
+
733
+ # Change the TEST2 state to :RED, we were previously :GREEN
734
+ @p.write("TEST2", 1)
735
+ expect(callback).to receive(:call).once.with(@p, test2,:GREEN,"TRUE",true)
736
+ @p.check_limits
737
+
738
+ # Change the TEST2 value to something that doesn't map to a state
739
+ @p.write("TEST2", 2)
740
+ expect(callback).to receive(:call).once.with(@p, test2,:RED,2,false)
741
+ @p.check_limits
742
+ end
743
+ end
744
+
745
+ context "with values" do
746
+ before(:each) do
747
+ @test1 = @p.get_item("TEST1")
748
+ @test1.limits.enabled.should be_falsey
749
+ @test1.limits.values = {:DEFAULT=>[1,2,4,5]} # red yellow
750
+ @p.enable_limits("TEST1")
751
+
752
+ @test2 = @p.get_item("TEST2")
753
+ @test2.limits.enabled.should be_falsey
754
+ @test2.limits.values = {:DEFAULT=>[1,2,6,7,3,5]} # red yellow and blue
755
+ @p.enable_limits("TEST2")
756
+
757
+ @test3 = @p.get_item("TEST3")
758
+ @test3.limits.enabled.should be_falsey
759
+ @test3.limits.values = {:DEFAULT=>[1,1.5,2.5,3]} # red yellow
760
+ @p.enable_limits("TEST3")
761
+ @p.update_limits_items_cache
762
+
763
+ # Mock the callback so we can see if it is called properly
764
+ @callback = double("callback", :call => true)
765
+ @p.limits_change_callback = @callback
766
+ end
767
+
768
+ it "should detect initial low states" do
769
+ @p.write("TEST1", 0)
770
+ @p.write("TEST2", 3)
771
+ @p.write("TEST3", 1.25)
772
+ @p.check_limits
773
+ @p.get_item("TEST1").limits.state.should eql :RED_LOW
774
+ @p.get_item("TEST2").limits.state.should eql :GREEN_LOW
775
+ @p.get_item("TEST3").limits.state.should eql :YELLOW_LOW
776
+ end
777
+
778
+ it "should detect initial high states" do
779
+ @p.write("TEST1", 6)
780
+ @p.write("TEST2", 5)
781
+ @p.write("TEST3", 2.75)
782
+ @p.check_limits
783
+ @p.get_item("TEST1").limits.state.should eql :RED_HIGH
784
+ @p.get_item("TEST2").limits.state.should eql :GREEN_HIGH
785
+ @p.get_item("TEST3").limits.state.should eql :YELLOW_HIGH
786
+ end
787
+
788
+ it "should detect initial middle states" do
789
+ @p.write("TEST1", 3)
790
+ @p.write("TEST2", 4)
791
+ @p.write("TEST3", 2.0)
792
+ @p.check_limits
793
+ @p.get_item("TEST1").limits.state.should eql :GREEN
794
+ @p.get_item("TEST2").limits.state.should eql :BLUE
795
+ @p.get_item("TEST3").limits.state.should eql :GREEN
796
+ end
797
+
798
+ it "should clear persistence when initial state is nil" do
799
+ @p.get_item("TEST1").limits.persistence_count = 2
800
+ @p.get_item("TEST2").limits.persistence_count = 3
801
+ @p.get_item("TEST3").limits.persistence_count = 4
802
+ @p.check_limits
803
+ @p.get_item("TEST1").limits.persistence_count.should eql 0
804
+ @p.get_item("TEST2").limits.persistence_count.should eql 0
805
+ @p.get_item("TEST3").limits.persistence_count.should eql 0
806
+ end
807
+
808
+ context "when calling the limits_change_callback" do
809
+ it "should initially call only for out of limits" do
810
+ @p.write("TEST1", 0)
811
+ @p.write("TEST2", 4)
812
+ @p.write("TEST3", 1.25)
813
+
814
+ # Check the limits for the first time, TEST1 should be :RED_LOW, TEST2
815
+ # should be :BLUE, TEST3 should be YELLOW_LOW
816
+ expect(@callback).to receive(:call).with(@p, @test1,nil,0,true)
817
+ expect(@callback).to receive(:call).with(@p, @test3,nil,1.25,true)
818
+ @p.check_limits
819
+ end
820
+
821
+ it "should call when limits change states" do
822
+ @p.write("TEST1", 0)
823
+ @p.write("TEST2", 4)
824
+ @p.write("TEST3", 1.25)
825
+ @p.check_limits
826
+
827
+ # Make TEST2 be GREEN_LOW, we were previously :BLUE
828
+ @p.write("TEST2", 3)
829
+ expect(@callback).to receive(:call).once.with(@p, @test2,:BLUE,3,true)
830
+ @p.check_limits
831
+ end
832
+
833
+ it "should call only when persistence is achieved" do
834
+ # First establish the green state when coming from nil
835
+ @p.get_item("TEST1").limits.persistence_setting = 1
836
+ @p.get_item("TEST2").limits.persistence_setting = 1
837
+ @p.get_item("TEST3").limits.persistence_setting = 1
838
+ @p.write("TEST1", 3)
839
+ @p.write("TEST2", 4)
840
+ @p.write("TEST3", 2.0)
841
+ expect(@callback).to receive(:call).with(@p, @test1,nil,3,true)
842
+ expect(@callback).to receive(:call).with(@p, @test2,nil,4,true)
843
+ expect(@callback).to receive(:call).with(@p, @test3,nil,2.0,true)
844
+ @p.check_limits
845
+ @test1.limits.state.should eql :GREEN
846
+ @test2.limits.state.should eql :BLUE
847
+ @test3.limits.state.should eql :GREEN
848
+
849
+ # Now test the persistence setting by going out of limits
850
+ @p.get_item("TEST1").limits.persistence_setting = 2
851
+ @p.get_item("TEST2").limits.persistence_setting = 3
852
+ @p.get_item("TEST3").limits.persistence_setting = 4
853
+
854
+ @p.write("TEST1", 0)
855
+ @p.write("TEST2", 8)
856
+ @p.write("TEST3", 1.25)
857
+ @p.check_limits
858
+ @test1.limits.state.should eql :GREEN
859
+ @test2.limits.state.should eql :BLUE
860
+ @test3.limits.state.should eql :GREEN
861
+
862
+ @p.write("TEST1", 0)
863
+ @p.write("TEST2", 8)
864
+ @p.write("TEST3", 1.25)
865
+ expect(@callback).to receive(:call).with(@p, @test1,:GREEN,0,true)
866
+ @p.check_limits
867
+ @test1.limits.state.should eql :RED_LOW
868
+ @test2.limits.state.should eql :BLUE
869
+ @test3.limits.state.should eql :GREEN
870
+
871
+ @p.write("TEST1", 0)
872
+ @p.write("TEST2", 8)
873
+ @p.write("TEST3", 1.25)
874
+ expect(@callback).to receive(:call).with(@p, @test2,:BLUE,8,true)
875
+ @p.check_limits
876
+ @test1.limits.state.should eql :RED_LOW
877
+ @test2.limits.state.should eql :RED_HIGH
878
+ @test3.limits.state.should eql :GREEN
879
+
880
+ @p.write("TEST1", 0)
881
+ @p.write("TEST2", 8)
882
+ @p.write("TEST3", 1.25)
883
+ expect(@callback).to receive(:call).with(@p, @test3,:GREEN,1.25,true)
884
+ @p.check_limits
885
+ @test1.limits.state.should eql :RED_LOW
886
+ @test2.limits.state.should eql :RED_HIGH
887
+ @test3.limits.state.should eql :YELLOW_LOW
888
+
889
+ # Now go back to good on everything and verify persistence still applies
890
+ @p.write("TEST1", 3)
891
+ @p.write("TEST2", 4)
892
+ @p.write("TEST3", 2.0)
893
+ @p.check_limits
894
+ @test1.limits.state.should eql :RED_LOW
895
+ @test2.limits.state.should eql :RED_HIGH
896
+ @test3.limits.state.should eql :YELLOW_LOW
897
+
898
+ @p.write("TEST1", 3)
899
+ @p.write("TEST2", 4)
900
+ @p.write("TEST3", 2.0)
901
+ expect(@callback).to receive(:call).with(@p, @test1,:RED_LOW,3,true)
902
+ @p.check_limits
903
+ @test1.limits.state.should eql :GREEN
904
+ @test2.limits.state.should eql :RED_HIGH
905
+ @test3.limits.state.should eql :YELLOW_LOW
906
+
907
+ @p.write("TEST1", 3)
908
+ @p.write("TEST2", 4)
909
+ @p.write("TEST3", 2.0)
910
+ expect(@callback).to receive(:call).with(@p, @test2,:RED_HIGH,4,true)
911
+ @p.check_limits
912
+ @test1.limits.state.should eql :GREEN
913
+ @test2.limits.state.should eql :BLUE
914
+ @test3.limits.state.should eql :YELLOW_LOW
915
+
916
+ @p.write("TEST1", 3)
917
+ @p.write("TEST2", 4)
918
+ @p.write("TEST3", 2.0)
919
+ expect(@callback).to receive(:call).with(@p, @test3,:YELLOW_LOW,2.0,true)
920
+ @p.check_limits
921
+ @test1.limits.state.should eql :GREEN
922
+ @test2.limits.state.should eql :BLUE
923
+ @test3.limits.state.should eql :GREEN
924
+ end
925
+
926
+ it "should not call when state changes before persistence is achieved" do
927
+ # First establish the green state when coming from nil
928
+ @p.get_item("TEST1").limits.persistence_setting = 1
929
+ @p.get_item("TEST2").limits.persistence_setting = 1
930
+ @p.get_item("TEST3").limits.persistence_setting = 1
931
+ @p.write("TEST1", 3)
932
+ @p.write("TEST2", 4)
933
+ @p.write("TEST3", 2.0)
934
+ expect(@callback).to receive(:call).with(@p, @test1,nil,3,true)
935
+ expect(@callback).to receive(:call).with(@p, @test2,nil,4,true)
936
+ expect(@callback).to receive(:call).with(@p, @test3,nil,2.0,true)
937
+ @p.check_limits
938
+ @test1.limits.state.should eql :GREEN
939
+ @test2.limits.state.should eql :BLUE
940
+ @test3.limits.state.should eql :GREEN
941
+
942
+ # Set all persistence the same
943
+ @p.get_item("TEST1").limits.persistence_setting = 3
944
+ @p.get_item("TEST2").limits.persistence_setting = 3
945
+ @p.get_item("TEST3").limits.persistence_setting = 3
946
+
947
+ # Write bad values twice
948
+ @p.write("TEST1", 0)
949
+ @p.write("TEST2", 8)
950
+ @p.write("TEST3", 1.25)
951
+ expect(@callback).to_not receive(:call)
952
+ @p.check_limits
953
+ @test1.limits.state.should eql :GREEN
954
+ @test2.limits.state.should eql :BLUE
955
+ @test3.limits.state.should eql :GREEN
956
+
957
+ @p.write("TEST1", 0)
958
+ @p.write("TEST2", 8)
959
+ @p.write("TEST3", 1.25)
960
+ expect(@callback).to_not receive(:call)
961
+ @p.check_limits
962
+ @test1.limits.state.should eql :GREEN
963
+ @test2.limits.state.should eql :BLUE
964
+ @test3.limits.state.should eql :GREEN
965
+
966
+ # Set the values back to good
967
+ @p.write("TEST1", 3)
968
+ @p.write("TEST2", 4)
969
+ @p.write("TEST3", 2.0)
970
+ @p.check_limits
971
+ @test1.limits.state.should eql :GREEN
972
+ @test2.limits.state.should eql :BLUE
973
+ @test3.limits.state.should eql :GREEN
974
+
975
+ # Write bad values twice
976
+ @p.write("TEST1", 0)
977
+ @p.write("TEST2", 8)
978
+ @p.write("TEST3", 1.25)
979
+ expect(@callback).to_not receive(:call)
980
+ @p.check_limits
981
+ @test1.limits.state.should eql :GREEN
982
+ @test2.limits.state.should eql :BLUE
983
+ @test3.limits.state.should eql :GREEN
984
+
985
+ @p.write("TEST1", 0)
986
+ @p.write("TEST2", 8)
987
+ @p.write("TEST3", 1.25)
988
+ expect(@callback).to_not receive(:call)
989
+ @p.check_limits
990
+ @test1.limits.state.should eql :GREEN
991
+ @test2.limits.state.should eql :BLUE
992
+ @test3.limits.state.should eql :GREEN
993
+
994
+ # Set the values back to good
995
+ @p.write("TEST1", 3)
996
+ @p.write("TEST2", 4)
997
+ @p.write("TEST3", 2.0)
998
+ @p.check_limits
999
+ @test1.limits.state.should eql :GREEN
1000
+ @test2.limits.state.should eql :BLUE
1001
+ @test3.limits.state.should eql :GREEN
1002
+ end
1003
+ end
1004
+ end
1005
+ end
1006
+
1007
+ describe "stale" do
1008
+ it "should set all limits states to stale" do
1009
+ p = Packet.new("tgt","pkt")
1010
+ p.append_item("test1", 8, :UINT)
1011
+ p.get_item("TEST1").limits.values = {:DEFAULT=>[1,2,4,5]}
1012
+ p.enable_limits("TEST1")
1013
+ p.append_item("test2", 16, :UINT)
1014
+ p.get_item("TEST2").limits.values = {:DEFAULT=>[1,2,4,5]}
1015
+ p.enable_limits("TEST2")
1016
+ p.update_limits_items_cache
1017
+ p.out_of_limits.should eql []
1018
+
1019
+ p.stale.should be_truthy
1020
+ p.get_item("TEST1").limits.state.should eql :STALE
1021
+ p.get_item("TEST2").limits.state.should eql :STALE
1022
+ # Update the limits
1023
+ p.check_limits
1024
+ p.stale.should be_falsey
1025
+ p.get_item("TEST1").limits.state.should_not eql :STALE
1026
+ p.get_item("TEST2").limits.state.should_not eql :STALE
1027
+ # set them all back to stale
1028
+ p.set_stale
1029
+ p.get_item("TEST1").limits.state.should eql :STALE
1030
+ p.get_item("TEST2").limits.state.should eql :STALE
1031
+ end
1032
+ end
1033
+
1034
+ describe "clone" do
1035
+ it "should duplicate the packet" do
1036
+ p = Packet.new("tgt","pkt")
1037
+ p2 = p.clone
1038
+ p2.target_name.should eql "TGT"
1039
+ p2.packet_name.should eql "PKT"
1040
+ end
1041
+ end
1042
+
1043
+ describe "reset" do
1044
+ it "should reset the packet" do
1045
+ p = Packet.new("tgt","pkt")
1046
+ p.processors['processor'] = double("reset", :reset => true)
1047
+ p.received_time = Time.now
1048
+ p.received_count = 50
1049
+ p.reset
1050
+ p.received_time.should eql nil
1051
+ p.received_count.should eql 0
1052
+ end
1053
+ end
1054
+
1055
+ end # describe Packet
1056
+
1057
+ end