cosmos 3.5.1 → 3.5.2

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