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,38 +1,38 @@
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
- # This file implements a class to handle responses to limits state changes.
12
-
13
- require 'cosmos/tools/cmd_tlm_server/api'
14
-
15
- module Cosmos
16
- # This class defines a #call method which is called when a PacketItem
17
- # goes out of limits. This class must be subclassed and the call method
18
- # implemented. Do NOT use this class directly.
19
- class LimitsResponse
20
-
21
- include Api
22
-
23
- # @param packet [Packet] Packet the limits response is assigned to
24
- # @param item [PacketItem] PacketItem the limits response is assigned to
25
- # @param old_limits_state [Symbol] Previous value of the limit. One of nil,
26
- # :GREEN_HIGH, :GREEN_LOW, :YELLOW, :YELLOW_HIGH, :YELLOW_LOW,
27
- # :RED, :RED_HIGH, :RED_LOW. nil if the previous limit state has not yet
28
- # been established.
29
- def call(packet, item, old_limits_state)
30
- raise "call method must be defined by subclass"
31
- end
32
-
33
- def to_s
34
- self.class.to_s.split('::')[-1]
35
- end
36
-
37
- end # class LimitsResponse
38
- 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
+ # This file implements a class to handle responses to limits state changes.
12
+
13
+ require 'cosmos/tools/cmd_tlm_server/api'
14
+
15
+ module Cosmos
16
+ # This class defines a #call method which is called when a PacketItem
17
+ # goes out of limits. This class must be subclassed and the call method
18
+ # implemented. Do NOT use this class directly.
19
+ class LimitsResponse
20
+
21
+ include Api
22
+
23
+ # @param packet [Packet] Packet the limits response is assigned to
24
+ # @param item [PacketItem] PacketItem the limits response is assigned to
25
+ # @param old_limits_state [Symbol] Previous value of the limit. One of nil,
26
+ # :GREEN_HIGH, :GREEN_LOW, :YELLOW, :YELLOW_HIGH, :YELLOW_LOW,
27
+ # :RED, :RED_HIGH, :RED_LOW. nil if the previous limit state has not yet
28
+ # been established.
29
+ def call(packet, item, old_limits_state)
30
+ raise "call method must be defined by subclass"
31
+ end
32
+
33
+ def to_s
34
+ self.class.to_s.split('::')[-1]
35
+ end
36
+
37
+ end # class LimitsResponse
38
+ end
@@ -1,786 +1,786 @@
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 'cosmos/packets/structure'
12
- require 'cosmos/packets/packet_item'
13
- require 'cosmos/ext/packet'
14
-
15
- module Cosmos
16
-
17
- # Adds features common to all COSMOS packets of data to the Structure class.
18
- # This includes the additional attributes listed below. The primary behavior
19
- # Packet adds is the ability to apply formatting to PacketItem values as well
20
- # as managing PacketItem's limit states.
21
- class Packet < Structure
22
-
23
- # @return [String] Name of the target this packet is associated with
24
- attr_reader :target_name
25
-
26
- # @return [String] Name of the packet
27
- attr_reader :packet_name
28
-
29
- # @return [String] Description of the packet
30
- attr_reader :description
31
-
32
- # @return [Time] Time at which the packet was received
33
- attr_reader :received_time
34
-
35
- # @return [Integer] Number of times the packet has been received
36
- attr_reader :received_count
37
-
38
- # @return [Boolean] Flag indicating if the packet is hazardous (typically for commands)
39
- attr_accessor :hazardous
40
-
41
- # @return [String] Description of why the packet is hazardous
42
- attr_reader :hazardous_description
43
-
44
- # Containst the values given by the user for a command (distinguished from defaults)
45
- # These values should be used within command conversions if present because the order
46
- # that values are written into the actual packet can vary
47
- # @return [Hash<Item Name, Value>] Given values when constructing the packet
48
- attr_reader :given_values
49
-
50
- # @return [Boolean] Flag indicating if the packet is stale (hasn't been received recently)
51
- attr_reader :stale
52
-
53
- # @return [Boolean] Whether or not this is a 'raw' packet
54
- attr_accessor :raw
55
-
56
- # @return [Boolean] Whether or not this is a 'hidden' packet
57
- attr_accessor :hidden
58
-
59
- # @return [Boolean] Whether or not this is a 'disabled' packet
60
- attr_accessor :disabled
61
-
62
- # @return [Boolean] Whether or not messages should be printed for this packet
63
- attr_accessor :messages_disabled
64
-
65
- # Valid format types
66
- VALUE_TYPES = [:RAW, :CONVERTED, :FORMATTED, :WITH_UNITS]
67
-
68
- # Creates a new packet by initalizing the attributes.
69
- #
70
- # @param target_name [String] Name of the target this packet is associated with
71
- # @param packet_name [String] Name of the packet
72
- # @param default_endianness [Symbol] One of {BinaryAccessor::ENDIANNESS}
73
- # @param description [String] Description of the packet
74
- # @param buffer [String] String buffer to hold the packet data
75
- # @param item_class [Class] Class used to instantiate items (Must be a
76
- # subclass of PacketItem)
77
- # def initialize(target_name, packet_name, default_endianness = :BIG_ENDIAN, description = nil, buffer = '', item_class = PacketItem)
78
-
79
- # (see Structure#buffer=)
80
- def buffer=(buffer)
81
- synchronize() do
82
- begin
83
- internal_buffer_equals(buffer)
84
- rescue RuntimeError
85
- Logger.instance.error "#{@target_name} #{@packet_name} received with actual packet length of #{buffer.length} but defined length of #{@defined_length}"
86
- end
87
- @read_conversion_cache.clear if @read_conversion_cache
88
- process()
89
- end
90
- end
91
-
92
- # Sets the target name this packet is associated with. Unidentified packets
93
- # will have target name set to nil.
94
- #
95
- # @param target_name [String] Name of the target this packet is associated with
96
- # def target_name=(target_name)
97
-
98
- # Sets the packet name. Unidentified packets will have packet name set to
99
- # nil.
100
- #
101
- # @param packet_name [String] Name of the packet
102
- # def packet_name=(packet_name)
103
-
104
- # Sets the description of the packet
105
- #
106
- # @param description [String] Description of the packet
107
- # def description=(description)
108
-
109
- # Sets the received time of the packet
110
- #
111
- # @param received_time [Time] Time this packet was received
112
- # def received_time=(received_time)
113
-
114
- # Sets the received time of the packet (without cloning)
115
- #
116
- # @param received_time [Time] Time this packet was received
117
- def set_received_time_fast(received_time)
118
- @received_time = received_time
119
- @received_time.freeze if @received_time
120
- end
121
-
122
- # Sets the received count of the packet
123
- #
124
- # @param received_count [Integer] Number of times this packet has been
125
- # received
126
- # def received_count=(received_count)
127
-
128
- # Sets the hazardous description of the packet
129
- #
130
- # @param hazardous_description [String] Hazardous description of the packet
131
- def hazardous_description=(hazardous_description)
132
- if hazardous_description
133
- raise ArgumentError, "hazardous_description must be a String but is a #{hazardous_description.class}" unless String === hazardous_description
134
- @hazardous_description = hazardous_description.clone.freeze
135
- else
136
- @hazardous_description = nil
137
- end
138
- end
139
-
140
- # Saves a hash of the values given by a user when constructing a command
141
- #
142
- # @param given_values [Hash<Item Name, Value>] Hash of given command parameters
143
- def given_values=(given_values)
144
- if given_values
145
- raise ArgumentError, "given_values must be a Hash but is a #{given_values.class}" unless Hash === given_values
146
- @given_values = given_values.clone
147
- else
148
- @given_values = nil
149
- end
150
- end
151
-
152
- # Sets the callback object called when a limits state changes
153
- #
154
- # @param limits_change_callback [#call] Object must respond to the call
155
- # method and take the following arguments: packet (Packet), item (PacketItem),
156
- # old_limits_state (Symbol), item_value (Object), log_change (Boolean). The
157
- # current item state can be found by querying the item object:
158
- # item.limits.state.
159
- def limits_change_callback=(limits_change_callback)
160
- if limits_change_callback
161
- raise ArgumentError, "limits_change_callback must respond to call" unless limits_change_callback.respond_to?(:call)
162
- @limits_change_callback = limits_change_callback
163
- else
164
- @limits_change_callback = nil
165
- end
166
- end
167
-
168
- # Review bit offset to look for overlapping definitions. This will allow
169
- # gaps in the packet, but not allow the same bits to be used for multiple
170
- # variables.
171
- #
172
- # @return [Array<String>] Warning messages for big definition overlaps
173
- def check_bit_offsets
174
- expected_next_offset = nil
175
- previous_item = nil
176
- warnings = []
177
- @sorted_items.each do |item|
178
- if expected_next_offset and item.bit_offset < expected_next_offset
179
- msg = "Bit definition overlap at bit offset #{item.bit_offset} for packet #{@target_name} #{@packet_name} items #{item.name} and #{previous_item.name}"
180
- Logger.instance.warn(msg)
181
- warnings << msg
182
- end
183
- if item.array_size
184
- if item.array_size > 0
185
- expected_next_offset = item.bit_offset + item.array_size
186
- else
187
- expected_next_offset = item.array_size
188
- end
189
- else
190
- expected_next_offset = nil
191
- if item.bit_offset > 0
192
- # Handle little-endian bit fields
193
- byte_aligned = ((item.bit_offset % 8) == 0)
194
- if item.endianness == :LITTLE_ENDIAN and (item.data_type == :INT or item.data_type == :UINT) and !(byte_aligned and (item.bit_size == 8 or item.bit_size == 16 or item.bit_size == 32 or item.bit_size == 64))
195
- # Bit offset always refers to the most significant bit of a bitfield
196
- bits_remaining_in_last_byte = 8 - (item.bit_offset % 8)
197
- if item.bit_size > bits_remaining_in_last_byte
198
- expected_next_offset = item.bit_offset + bits_remaining_in_last_byte
199
- end
200
- end
201
- end
202
- unless expected_next_offset
203
- if item.bit_size > 0
204
- expected_next_offset = item.bit_offset + item.bit_size
205
- else
206
- expected_next_offset = item.bit_size
207
- end
208
- end
209
- end
210
- previous_item = item
211
- end
212
- warnings
213
- end
214
-
215
- # Id items are used by the identify? method to determine if a raw buffer of
216
- # data represents this packet.
217
- # @return [Array<PacketItem>] Packet item identifiers
218
- def id_items
219
- @id_items ||= []
220
- end
221
-
222
- # @return [Array<PacketItem>] All items with defined limits
223
- def limits_items
224
- @limits_items ||= []
225
- end
226
-
227
- # @return [Hash] Hash of processors associated with this packet
228
- def processors
229
- @processors ||= {}
230
- end
231
-
232
- # Returns packet specific metadata
233
- # @return [Hash<Meta Name, Meta Values>]
234
- def meta
235
- @meta ||= {}
236
- end
237
-
238
- # Indicates if the packet has been identified
239
- # @return [TrueClass or FalseClass]
240
- def identified?
241
- !@target_name.nil? && !@packet_name.nil?
242
- end
243
-
244
- # Define an item in the packet. This creates a new instance of the
245
- # item_class as given in the constructor and adds it to the items hash. It
246
- # also resizes the buffer to accomodate the new item.
247
- #
248
- # @param name [String] Name of the item. Used by the items hash to retrieve
249
- # the item.
250
- # @param bit_offset [Integer] Bit offset of the item in the raw buffer
251
- # @param bit_size [Integer] Bit size of the item in the raw buffer
252
- # @param data_type [Symbol] Type of data contained by the item. This is
253
- # dependant on the item_class but by default see StructureItem.
254
- # @param array_size [Integer] Set to a non nil value if the item is to
255
- # represented as an array.
256
- # @param endianness [Symbol] Endianness of this item. By default the
257
- # endianness as set in the constructure is used.
258
- # @param overflow [Symbol] How to handle value overflows. This is
259
- # dependant on the item_class but by default see StructureItem.
260
- # @param format_string [String] String to pass to Kernel#sprintf
261
- # @param read_conversion [Conversion] Conversion to apply when reading the
262
- # item from the packet buffer
263
- # @param write_conversion [Conversion] Conversion to apply before writing
264
- # the item to the packet buffer
265
- # @param id_value [Object] Set to something other than nil to indicate that
266
- # this item should be used to identify a buffer as this packet. The
267
- # id_value should make sense according to the data_type.
268
- # @return [PacketItem] The new packet item
269
- def define_item(name, bit_offset, bit_size, data_type, array_size = nil, endianness = @default_endianness, overflow = :ERROR, format_string = nil, read_conversion = nil, write_conversion = nil, id_value = nil)
270
- item = super(name, bit_offset, bit_size, data_type, array_size, endianness, overflow)
271
- packet_define_item(item, format_string, read_conversion, write_conversion, id_value)
272
- end
273
-
274
- # Add an item to the packet by adding it to the items hash. It also
275
- # resizes the buffer to accomodate the new item.
276
- #
277
- # @param item [PacketItem] Item to add to the packet
278
- # @return [PacketItem] The same packet item
279
- def define(item)
280
- item = super(item)
281
- update_id_items(item)
282
- update_limits_items_cache(item)
283
- item
284
- end
285
-
286
- # Define an item at the end of the packet. This creates a new instance of the
287
- # item_class as given in the constructor and adds it to the items hash. It
288
- # also resizes the buffer to accomodate the new item.
289
- #
290
- # @param name (see #define_item)
291
- # @param bit_size (see #define_item)
292
- # @param data_type (see #define_item)
293
- # @param array_size (see #define_item)
294
- # @param endianness (see #define_item)
295
- # @param overflow (see #define_item)
296
- # @param format_string (see #define_item)
297
- # @param read_conversion (see #define_item)
298
- # @param write_conversion (see #define_item)
299
- # @param id_value (see #define_item)
300
- # @return (see #define_item)
301
- def append_item(name, bit_size, data_type, array_size = nil, endianness = @default_endianness, overflow = :ERROR, format_string = nil, read_conversion = nil, write_conversion = nil, id_value = nil)
302
- item = super(name, bit_size, data_type, array_size, endianness, overflow)
303
- packet_define_item(item, format_string, read_conversion, write_conversion, id_value)
304
- end
305
-
306
- # (see Structure#get_item)
307
- def get_item(name)
308
- super(name)
309
- rescue ArgumentError
310
- raise "Packet item '#{@target_name} #{@packet_name} #{name.upcase}' does not exist"
311
- end
312
-
313
- # Read an item in the packet
314
- #
315
- # @param item [PacketItem] Instance of PacketItem or one of its subclasses
316
- # @param value_type [Symbol] How to convert the item before returning it.
317
- # Must be one of {VALUE_TYPES}
318
- # @param buffer (see Structure#read_item)
319
- # @return The value. :FORMATTED and :WITH_UNITS values are always returned
320
- # as Strings. :RAW values will match their data_type. :CONVERTED values
321
- # can be any type.
322
- def read_item(item, value_type = :CONVERTED, buffer = @buffer)
323
- value = super(item, :RAW, buffer)
324
- case value_type
325
- when :RAW
326
- # Done above
327
- when :CONVERTED, :FORMATTED, :WITH_UNITS
328
- if item.read_conversion
329
- using_cached_value = false
330
-
331
- check_cache = buffer.equal?(@buffer)
332
- if check_cache and @read_conversion_cache
333
- synchronize_allow_reads() do
334
- if @read_conversion_cache[item]
335
- value = @read_conversion_cache[item]
336
- using_cached_value = true
337
- end
338
- end
339
- end
340
-
341
- unless using_cached_value
342
- if item.array_size
343
- value.map! do |val, index|
344
- item.read_conversion.call(val, self, buffer)
345
- end
346
- else
347
- value = item.read_conversion.call(value, self, buffer)
348
- end
349
- if check_cache
350
- synchronize_allow_reads() do
351
- @read_conversion_cache ||= {}
352
- @read_conversion_cache[item] = value
353
- end
354
- end
355
- end
356
- end
357
-
358
- # Convert from value to state if possible
359
- if item.states
360
- if Array === value
361
- value = value.map do |val, index|
362
- if item.states.key(val)
363
- item.states.key(val)
364
- else
365
- apply_format_string_and_units(item, val, value_type)
366
- end
367
- end
368
- else
369
- state_value = item.states.key(value)
370
- if state_value
371
- value = state_value
372
- else
373
- value = apply_format_string_and_units(item, value, value_type)
374
- end
375
- end
376
- else
377
- if Array === value
378
- value = value.map do |val, index|
379
- apply_format_string_and_units(item, val, value_type)
380
- end
381
- else
382
- value = apply_format_string_and_units(item, value, value_type)
383
- end
384
- end
385
- else
386
- raise ArgumentError, "Unknown value type on read: #{value_type}"
387
- end
388
- return value
389
- end
390
-
391
- # Write an item in the packet
392
- #
393
- # @param item [PacketItem] Instance of PacketItem or one of its subclasses
394
- # @param value (see Structure#write_item)
395
- # @param value_type (see #read_item)
396
- # @param buffer (see Structure#write_item)
397
- def write_item(item, value, value_type = :CONVERTED, buffer = @buffer)
398
- if @read_conversion_cache
399
- synchronize() do
400
- @read_conversion_cache.clear
401
- end
402
- end
403
- case value_type
404
- when :RAW
405
- super(item, value, value_type, buffer)
406
- when :CONVERTED
407
- if item.states
408
- # Convert from state to value if possible
409
- state_value = item.states[value.to_s.upcase]
410
- value = state_value if state_value
411
- end
412
- if item.write_conversion
413
- value = item.write_conversion.call(value, self, buffer)
414
- else
415
- raise "Cannot write DERIVED item without a write conversion" if item.data_type == :DERIVED
416
- end
417
- begin
418
- super(item, value, :RAW, buffer) unless item.data_type == :DERIVED
419
- rescue ArgumentError => err
420
- if item.states and String === value and err.message =~ /invalid value for/
421
- raise "Unknown state #{value} for #{item.name}"
422
- else
423
- raise err
424
- end
425
- end
426
- when :FORMATTED, :WITH_UNITS
427
- raise ArgumentError, "Invalid value type on write: #{value_type}"
428
- else
429
- raise ArgumentError, "Unknown value type on write: #{value_type}"
430
- end
431
- end
432
-
433
- # Read an item in the packet by name
434
- #
435
- # @param name [String] Name of the item to read
436
- # @param value_type (see #read_item)
437
- # @param buffer (see #read_item)
438
- # @return (see #read_item)
439
- def read(name, value_type = :CONVERTED, buffer = @buffer)
440
- return super(name, value_type, buffer)
441
- end
442
-
443
- # Write an item in the packet by name
444
- #
445
- # @param name [String] Name of the item to write
446
- # @param value (see #write_item)
447
- # @param value_type (see #write_item)
448
- # @param buffer (see #write_item)
449
- def write(name, value, value_type = :CONVERTED, buffer = @buffer)
450
- super(name, value, value_type, buffer)
451
- end
452
-
453
- # Read all items in the packet into an array of arrays
454
- # [[item name, item value], ...]
455
- #
456
- # @param value_type (see #read_item)
457
- # @param buffer (see Structure#read_all)
458
- # @param top (See Structure#read_all)
459
- # @return (see Structure#read_all)
460
- def read_all(value_type = :CONVERTED, buffer = @buffer, top = true)
461
- return super(value_type, buffer, top)
462
- end
463
-
464
- # Read all items in the packet into an array of arrays
465
- # [[item name, item value], [item limits state], ...]
466
- #
467
- # @param value_type (see #read_all)
468
- # @param buffer (see #read_all)
469
- # @return [Array<String, Object, Symbol|nil>] Returns an Array consisting
470
- # of [item name, item value, item limits state] where the item limits
471
- # state can be one of {Cosmos::Limits::LIMITS_STATES}
472
- def read_all_with_limits_states(value_type = :CONVERTED, buffer = @buffer)
473
- result = nil
474
- synchronize_allow_reads(true) do
475
- result = read_all(value_type, buffer, false).map! do |array|
476
- array << @items[array[0]].limits.state
477
- end
478
- end
479
- return result
480
- end
481
-
482
- # Create a string that shows the name and value of each item in the packet
483
- #
484
- # @param value_type (see #read_item)
485
- # @param indent (see Structure#formatted)
486
- # @param buffer (see Structure#formatted)
487
- # @return (see Structure#formatted)
488
- def formatted(value_type = :CONVERTED, indent = 0, buffer = @buffer)
489
- return super(value_type, indent, buffer)
490
- end
491
-
492
- # Tries to identify if a buffer represents the currently defined packet. It
493
- # does this by iterating over all the packet items that were created with
494
- # an ID value and checking whether that ID value is present at the correct
495
- # location in the buffer.
496
- #
497
- # Incorrectly sized buffers will still positively identify if there is
498
- # enough data to match the ID values. This is to allow incorrectly sized
499
- # packets to still be processed as well as possible given the incorrectly
500
- # sized data.
501
- #
502
- # @param buffer [String] Raw buffer of binary data
503
- # @return [Boolean] Whether or not the buffer of data is this packet
504
- # def identify?(buffer)
505
-
506
- # Restore all items in the packet to their default value
507
- #
508
- # @param buffer [String] Raw buffer of binary data
509
- def restore_defaults(buffer = @buffer)
510
- @sorted_items.each do |item|
511
- write_item(item, item.default, :CONVERTED, buffer)
512
- end
513
- end
514
-
515
- # Enable limits on an item by name
516
- #
517
- # @param name [String] Name of the item to enable limits
518
- def enable_limits(name)
519
- get_item(name).limits.enabled = true
520
- end
521
-
522
- # Disable limits on an item by name
523
- #
524
- # @param name [String] Name of the item to disable limits
525
- def disable_limits(name)
526
- item = get_item(name)
527
- item.limits.enabled = false
528
- unless item.limits.state == :STALE
529
- old_limits_state = item.limits.state
530
- item.limits.state = nil
531
- @limits_change_callback.call(self, item, old_limits_state, nil, false) if @limits_change_callback
532
- end
533
- end
534
-
535
- # Add an item to the limits items cache if necessary.
536
- # You MUST call this after adding limits to an item
537
- #This is an optimization so we don't have to iterate through all the items when
538
- # checking for limits.
539
- def update_limits_items_cache(item)
540
- if item.limits.values || item.state_colors
541
- @limits_items ||= []
542
- @limits_items_hash ||= {}
543
- unless @limits_items_hash[item]
544
- @limits_items << item
545
- @limits_items_hash[item] = true
546
- end
547
- end
548
- end
549
-
550
- # Return an array of arrays indicating all items in the packet that are out of limits
551
- # [[target name, packet name, item name, item limits state], ...]
552
- #
553
- # @return [Array<Array<String, String, String, Symbol>>]
554
- def out_of_limits
555
- items = []
556
- return items unless @limits_items
557
- @limits_items.each do |item|
558
- if (item.limits.enabled && item.limits.state &&
559
- PacketItemLimits::OUT_OF_LIMITS_STATES.include?(item.limits.state))
560
- items << [@target_name, @packet_name, item.name, item.limits.state]
561
- end
562
- end
563
- return items
564
- end
565
-
566
- # Set the limits state for all items to the given state
567
- #
568
- # @param state [Symbol] Must be one of PacketItemLimits::LIMITS_STATES
569
- def set_all_limits_states(state)
570
- @sorted_items.each {|item| item.limits.state = state}
571
- end
572
-
573
- # Check all the items in the packet against their defined limits. Update
574
- # their internal limits state and persistence and call the
575
- # limits_change_callback as necessary.
576
- #
577
- # @param limits_set [Symbol] Which limits set to check the item values
578
- # against.
579
- # @param ignore_persistence [Boolean] Whether to ignore persistence when
580
- # checking for out of limits
581
- def check_limits(limits_set = :DEFAULT, ignore_persistence = false)
582
- # If check_limits is being called, then a new packet has arrived and
583
- # this packet is no longer stale
584
- if @stale
585
- @stale = false
586
- set_all_limits_states(nil)
587
- end
588
-
589
- return unless @limits_items
590
- @limits_items.each do |item|
591
- # Verify limits monitoring is enabled for this item
592
- if item.limits.enabled
593
- value = read_item(item)
594
-
595
- # Handle state monitoring and value monitoring differently
596
- if item.states
597
- handle_limits_states(item, value)
598
- elsif item.limits.values
599
- handle_limits_values(item, value, limits_set, ignore_persistence)
600
- end
601
- end
602
- end
603
- end
604
-
605
- # Sets the overall packet stale state to true and sets each packet item
606
- # limits state to :STALE.
607
- def set_stale
608
- @stale = true
609
- set_all_limits_states(:STALE)
610
- end
611
-
612
- # Reset temporary packet data
613
- # This includes packet received time, received count, and processor state
614
- def reset
615
- @received_time = nil
616
- @received_count = 0
617
- if @read_conversion_cache
618
- synchronize() do
619
- @read_conversion_cache.clear
620
- end
621
- end
622
- return unless @processors
623
- @processors.each do |processor_name, processor|
624
- processor.reset
625
- end
626
- end
627
-
628
- # Make a light weight clone of this packet. This only creates a new buffer
629
- # of data and clones the processors. The defined packet items are the same.
630
- #
631
- # @return [Packet] A copy of the current packet with a new underlying
632
- # buffer of data and processors
633
- def clone
634
- packet = super()
635
- if packet.instance_variable_get("@processors".freeze)
636
- packet.instance_variable_set("@processors".freeze, packet.processors.clone)
637
- packet.processors.each do |processor_name, processor|
638
- packet.processors[processor_name] = processor.clone
639
- end
640
- end
641
- packet
642
- end
643
- alias dup clone
644
-
645
- protected
646
-
647
- # Performs packet specific processing on the packet. Intended to only be run once for each packet received
648
- def process(buffer = @buffer)
649
- return unless @processors
650
- @processors.each do |processor_name, processor|
651
- processor.call(self, buffer)
652
- end
653
- end
654
-
655
- def handle_limits_states(item, value)
656
- # Retrieve limits state for the given value
657
- limits_state = item.state_colors[value]
658
-
659
- if item.limits.state != limits_state # PacketItemLimits state has changed
660
- # Save old limits state
661
- old_limits_state = item.limits.state
662
- # Update to new limits state
663
- item.limits.state = limits_state
664
-
665
- if old_limits_state == nil # Changing from nil
666
- if limits_state != :GREEN && limits_state != :BLUE # Warnings are needed
667
- @limits_change_callback.call(self, item, old_limits_state, value, true) if @limits_change_callback
668
- end
669
- else # Changing from a state other than nil so always call the callback
670
- if @limits_change_callback
671
- if item.limits.state.nil?
672
- @limits_change_callback.call(self, item, old_limits_state, value, false)
673
- else
674
- @limits_change_callback.call(self, item, old_limits_state, value, true)
675
- end
676
- end
677
- end
678
- end
679
- end
680
-
681
- def handle_limits_values(item, value, limits_set, ignore_persistence)
682
- # Retrieve limits settings for the specified limits_set
683
- limits = item.limits.values[limits_set]
684
-
685
- # Use the default limits set if limits aren't specified for the
686
- # particular limits set
687
- limits = item.limits.values[:DEFAULT] unless limits
688
-
689
- # Extract limits from array
690
- red_low = limits[0]
691
- yellow_low = limits[1]
692
- yellow_high = limits[2]
693
- red_high = limits[3]
694
- green_low = limits[4]
695
- green_high = limits[5]
696
- limits_state = nil
697
-
698
- # Determine the limits_state based on the limits values and the current
699
- # value of the item
700
- if (value > yellow_low)
701
- if (value < yellow_high)
702
- if green_low
703
- if value < green_high
704
- if value > green_low
705
- limits_state = :BLUE
706
- else
707
- limits_state = :GREEN_LOW
708
- end
709
- else
710
- limits_state = :GREEN_HIGH
711
- end
712
- else
713
- limits_state = :GREEN
714
- end
715
- elsif (value < red_high)
716
- limits_state = :YELLOW_HIGH
717
- else
718
- limits_state = :RED_HIGH
719
- end
720
- else # value <= yellow_low
721
- if (value > red_low)
722
- limits_state = :YELLOW_LOW
723
- else
724
- limits_state = :RED_LOW
725
- end
726
- end
727
-
728
- if item.limits.state != limits_state # limits state has changed
729
- # Save old limits state for use in the callback
730
- old_limits_state = item.limits.state
731
-
732
- item.limits.persistence_count += 1
733
-
734
- # Check for item to achieve its persistence which means we
735
- # have to update the state and call the callback
736
- # Note when going back to green (or blue) persistence is ignored
737
- if (item.limits.persistence_count >= item.limits.persistence_setting) || ignore_persistence
738
- item.limits.state = limits_state
739
-
740
- # Additional actions for limits change
741
- @limits_change_callback.call(self, item, old_limits_state, value, true) if @limits_change_callback
742
-
743
- # Clear persistence since we've entered a new state
744
- item.limits.persistence_count = 0
745
- end
746
- else # limits state has not changed so clear persistence
747
- item.limits.persistence_count = 0
748
- end
749
- end
750
-
751
- def apply_format_string_and_units(item, value, value_type)
752
- if value_type == :FORMATTED or value_type == :WITH_UNITS
753
- if item.format_string && value
754
- value = sprintf(item.format_string, value)
755
- else
756
- value = value.to_s
757
- end
758
- end
759
- value << ' ' << item.units if value_type == :WITH_UNITS and item.units
760
- value
761
- end
762
-
763
- def packet_define_item(item, format_string, read_conversion, write_conversion, id_value)
764
- item.format_string = format_string
765
- item.read_conversion = read_conversion
766
- item.write_conversion = write_conversion
767
-
768
- # Change id_value to the correct type
769
- if id_value
770
- item.id_value = id_value
771
- update_id_items(item)
772
- end
773
- item
774
- end
775
-
776
- def update_id_items(item)
777
- if item.id_value
778
- @id_items ||= []
779
- @id_items << item
780
- end
781
- item
782
- end
783
-
784
- end # class Packet
785
-
786
- end # module Cosmos
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 'cosmos/packets/structure'
12
+ require 'cosmos/packets/packet_item'
13
+ require 'cosmos/ext/packet'
14
+
15
+ module Cosmos
16
+
17
+ # Adds features common to all COSMOS packets of data to the Structure class.
18
+ # This includes the additional attributes listed below. The primary behavior
19
+ # Packet adds is the ability to apply formatting to PacketItem values as well
20
+ # as managing PacketItem's limit states.
21
+ class Packet < Structure
22
+
23
+ # @return [String] Name of the target this packet is associated with
24
+ attr_reader :target_name
25
+
26
+ # @return [String] Name of the packet
27
+ attr_reader :packet_name
28
+
29
+ # @return [String] Description of the packet
30
+ attr_reader :description
31
+
32
+ # @return [Time] Time at which the packet was received
33
+ attr_reader :received_time
34
+
35
+ # @return [Integer] Number of times the packet has been received
36
+ attr_reader :received_count
37
+
38
+ # @return [Boolean] Flag indicating if the packet is hazardous (typically for commands)
39
+ attr_accessor :hazardous
40
+
41
+ # @return [String] Description of why the packet is hazardous
42
+ attr_reader :hazardous_description
43
+
44
+ # Containst the values given by the user for a command (distinguished from defaults)
45
+ # These values should be used within command conversions if present because the order
46
+ # that values are written into the actual packet can vary
47
+ # @return [Hash<Item Name, Value>] Given values when constructing the packet
48
+ attr_reader :given_values
49
+
50
+ # @return [Boolean] Flag indicating if the packet is stale (hasn't been received recently)
51
+ attr_reader :stale
52
+
53
+ # @return [Boolean] Whether or not this is a 'raw' packet
54
+ attr_accessor :raw
55
+
56
+ # @return [Boolean] Whether or not this is a 'hidden' packet
57
+ attr_accessor :hidden
58
+
59
+ # @return [Boolean] Whether or not this is a 'disabled' packet
60
+ attr_accessor :disabled
61
+
62
+ # @return [Boolean] Whether or not messages should be printed for this packet
63
+ attr_accessor :messages_disabled
64
+
65
+ # Valid format types
66
+ VALUE_TYPES = [:RAW, :CONVERTED, :FORMATTED, :WITH_UNITS]
67
+
68
+ # Creates a new packet by initalizing the attributes.
69
+ #
70
+ # @param target_name [String] Name of the target this packet is associated with
71
+ # @param packet_name [String] Name of the packet
72
+ # @param default_endianness [Symbol] One of {BinaryAccessor::ENDIANNESS}
73
+ # @param description [String] Description of the packet
74
+ # @param buffer [String] String buffer to hold the packet data
75
+ # @param item_class [Class] Class used to instantiate items (Must be a
76
+ # subclass of PacketItem)
77
+ # def initialize(target_name, packet_name, default_endianness = :BIG_ENDIAN, description = nil, buffer = '', item_class = PacketItem)
78
+
79
+ # (see Structure#buffer=)
80
+ def buffer=(buffer)
81
+ synchronize() do
82
+ begin
83
+ internal_buffer_equals(buffer)
84
+ rescue RuntimeError
85
+ Logger.instance.error "#{@target_name} #{@packet_name} received with actual packet length of #{buffer.length} but defined length of #{@defined_length}"
86
+ end
87
+ @read_conversion_cache.clear if @read_conversion_cache
88
+ process()
89
+ end
90
+ end
91
+
92
+ # Sets the target name this packet is associated with. Unidentified packets
93
+ # will have target name set to nil.
94
+ #
95
+ # @param target_name [String] Name of the target this packet is associated with
96
+ # def target_name=(target_name)
97
+
98
+ # Sets the packet name. Unidentified packets will have packet name set to
99
+ # nil.
100
+ #
101
+ # @param packet_name [String] Name of the packet
102
+ # def packet_name=(packet_name)
103
+
104
+ # Sets the description of the packet
105
+ #
106
+ # @param description [String] Description of the packet
107
+ # def description=(description)
108
+
109
+ # Sets the received time of the packet
110
+ #
111
+ # @param received_time [Time] Time this packet was received
112
+ # def received_time=(received_time)
113
+
114
+ # Sets the received time of the packet (without cloning)
115
+ #
116
+ # @param received_time [Time] Time this packet was received
117
+ def set_received_time_fast(received_time)
118
+ @received_time = received_time
119
+ @received_time.freeze if @received_time
120
+ end
121
+
122
+ # Sets the received count of the packet
123
+ #
124
+ # @param received_count [Integer] Number of times this packet has been
125
+ # received
126
+ # def received_count=(received_count)
127
+
128
+ # Sets the hazardous description of the packet
129
+ #
130
+ # @param hazardous_description [String] Hazardous description of the packet
131
+ def hazardous_description=(hazardous_description)
132
+ if hazardous_description
133
+ raise ArgumentError, "hazardous_description must be a String but is a #{hazardous_description.class}" unless String === hazardous_description
134
+ @hazardous_description = hazardous_description.clone.freeze
135
+ else
136
+ @hazardous_description = nil
137
+ end
138
+ end
139
+
140
+ # Saves a hash of the values given by a user when constructing a command
141
+ #
142
+ # @param given_values [Hash<Item Name, Value>] Hash of given command parameters
143
+ def given_values=(given_values)
144
+ if given_values
145
+ raise ArgumentError, "given_values must be a Hash but is a #{given_values.class}" unless Hash === given_values
146
+ @given_values = given_values.clone
147
+ else
148
+ @given_values = nil
149
+ end
150
+ end
151
+
152
+ # Sets the callback object called when a limits state changes
153
+ #
154
+ # @param limits_change_callback [#call] Object must respond to the call
155
+ # method and take the following arguments: packet (Packet), item (PacketItem),
156
+ # old_limits_state (Symbol), item_value (Object), log_change (Boolean). The
157
+ # current item state can be found by querying the item object:
158
+ # item.limits.state.
159
+ def limits_change_callback=(limits_change_callback)
160
+ if limits_change_callback
161
+ raise ArgumentError, "limits_change_callback must respond to call" unless limits_change_callback.respond_to?(:call)
162
+ @limits_change_callback = limits_change_callback
163
+ else
164
+ @limits_change_callback = nil
165
+ end
166
+ end
167
+
168
+ # Review bit offset to look for overlapping definitions. This will allow
169
+ # gaps in the packet, but not allow the same bits to be used for multiple
170
+ # variables.
171
+ #
172
+ # @return [Array<String>] Warning messages for big definition overlaps
173
+ def check_bit_offsets
174
+ expected_next_offset = nil
175
+ previous_item = nil
176
+ warnings = []
177
+ @sorted_items.each do |item|
178
+ if expected_next_offset and item.bit_offset < expected_next_offset
179
+ msg = "Bit definition overlap at bit offset #{item.bit_offset} for packet #{@target_name} #{@packet_name} items #{item.name} and #{previous_item.name}"
180
+ Logger.instance.warn(msg)
181
+ warnings << msg
182
+ end
183
+ if item.array_size
184
+ if item.array_size > 0
185
+ expected_next_offset = item.bit_offset + item.array_size
186
+ else
187
+ expected_next_offset = item.array_size
188
+ end
189
+ else
190
+ expected_next_offset = nil
191
+ if item.bit_offset > 0
192
+ # Handle little-endian bit fields
193
+ byte_aligned = ((item.bit_offset % 8) == 0)
194
+ if item.endianness == :LITTLE_ENDIAN and (item.data_type == :INT or item.data_type == :UINT) and !(byte_aligned and (item.bit_size == 8 or item.bit_size == 16 or item.bit_size == 32 or item.bit_size == 64))
195
+ # Bit offset always refers to the most significant bit of a bitfield
196
+ bits_remaining_in_last_byte = 8 - (item.bit_offset % 8)
197
+ if item.bit_size > bits_remaining_in_last_byte
198
+ expected_next_offset = item.bit_offset + bits_remaining_in_last_byte
199
+ end
200
+ end
201
+ end
202
+ unless expected_next_offset
203
+ if item.bit_size > 0
204
+ expected_next_offset = item.bit_offset + item.bit_size
205
+ else
206
+ expected_next_offset = item.bit_size
207
+ end
208
+ end
209
+ end
210
+ previous_item = item
211
+ end
212
+ warnings
213
+ end
214
+
215
+ # Id items are used by the identify? method to determine if a raw buffer of
216
+ # data represents this packet.
217
+ # @return [Array<PacketItem>] Packet item identifiers
218
+ def id_items
219
+ @id_items ||= []
220
+ end
221
+
222
+ # @return [Array<PacketItem>] All items with defined limits
223
+ def limits_items
224
+ @limits_items ||= []
225
+ end
226
+
227
+ # @return [Hash] Hash of processors associated with this packet
228
+ def processors
229
+ @processors ||= {}
230
+ end
231
+
232
+ # Returns packet specific metadata
233
+ # @return [Hash<Meta Name, Meta Values>]
234
+ def meta
235
+ @meta ||= {}
236
+ end
237
+
238
+ # Indicates if the packet has been identified
239
+ # @return [TrueClass or FalseClass]
240
+ def identified?
241
+ !@target_name.nil? && !@packet_name.nil?
242
+ end
243
+
244
+ # Define an item in the packet. This creates a new instance of the
245
+ # item_class as given in the constructor and adds it to the items hash. It
246
+ # also resizes the buffer to accomodate the new item.
247
+ #
248
+ # @param name [String] Name of the item. Used by the items hash to retrieve
249
+ # the item.
250
+ # @param bit_offset [Integer] Bit offset of the item in the raw buffer
251
+ # @param bit_size [Integer] Bit size of the item in the raw buffer
252
+ # @param data_type [Symbol] Type of data contained by the item. This is
253
+ # dependant on the item_class but by default see StructureItem.
254
+ # @param array_size [Integer] Set to a non nil value if the item is to
255
+ # represented as an array.
256
+ # @param endianness [Symbol] Endianness of this item. By default the
257
+ # endianness as set in the constructure is used.
258
+ # @param overflow [Symbol] How to handle value overflows. This is
259
+ # dependant on the item_class but by default see StructureItem.
260
+ # @param format_string [String] String to pass to Kernel#sprintf
261
+ # @param read_conversion [Conversion] Conversion to apply when reading the
262
+ # item from the packet buffer
263
+ # @param write_conversion [Conversion] Conversion to apply before writing
264
+ # the item to the packet buffer
265
+ # @param id_value [Object] Set to something other than nil to indicate that
266
+ # this item should be used to identify a buffer as this packet. The
267
+ # id_value should make sense according to the data_type.
268
+ # @return [PacketItem] The new packet item
269
+ def define_item(name, bit_offset, bit_size, data_type, array_size = nil, endianness = @default_endianness, overflow = :ERROR, format_string = nil, read_conversion = nil, write_conversion = nil, id_value = nil)
270
+ item = super(name, bit_offset, bit_size, data_type, array_size, endianness, overflow)
271
+ packet_define_item(item, format_string, read_conversion, write_conversion, id_value)
272
+ end
273
+
274
+ # Add an item to the packet by adding it to the items hash. It also
275
+ # resizes the buffer to accomodate the new item.
276
+ #
277
+ # @param item [PacketItem] Item to add to the packet
278
+ # @return [PacketItem] The same packet item
279
+ def define(item)
280
+ item = super(item)
281
+ update_id_items(item)
282
+ update_limits_items_cache(item)
283
+ item
284
+ end
285
+
286
+ # Define an item at the end of the packet. This creates a new instance of the
287
+ # item_class as given in the constructor and adds it to the items hash. It
288
+ # also resizes the buffer to accomodate the new item.
289
+ #
290
+ # @param name (see #define_item)
291
+ # @param bit_size (see #define_item)
292
+ # @param data_type (see #define_item)
293
+ # @param array_size (see #define_item)
294
+ # @param endianness (see #define_item)
295
+ # @param overflow (see #define_item)
296
+ # @param format_string (see #define_item)
297
+ # @param read_conversion (see #define_item)
298
+ # @param write_conversion (see #define_item)
299
+ # @param id_value (see #define_item)
300
+ # @return (see #define_item)
301
+ def append_item(name, bit_size, data_type, array_size = nil, endianness = @default_endianness, overflow = :ERROR, format_string = nil, read_conversion = nil, write_conversion = nil, id_value = nil)
302
+ item = super(name, bit_size, data_type, array_size, endianness, overflow)
303
+ packet_define_item(item, format_string, read_conversion, write_conversion, id_value)
304
+ end
305
+
306
+ # (see Structure#get_item)
307
+ def get_item(name)
308
+ super(name)
309
+ rescue ArgumentError
310
+ raise "Packet item '#{@target_name} #{@packet_name} #{name.upcase}' does not exist"
311
+ end
312
+
313
+ # Read an item in the packet
314
+ #
315
+ # @param item [PacketItem] Instance of PacketItem or one of its subclasses
316
+ # @param value_type [Symbol] How to convert the item before returning it.
317
+ # Must be one of {VALUE_TYPES}
318
+ # @param buffer (see Structure#read_item)
319
+ # @return The value. :FORMATTED and :WITH_UNITS values are always returned
320
+ # as Strings. :RAW values will match their data_type. :CONVERTED values
321
+ # can be any type.
322
+ def read_item(item, value_type = :CONVERTED, buffer = @buffer)
323
+ value = super(item, :RAW, buffer)
324
+ case value_type
325
+ when :RAW
326
+ # Done above
327
+ when :CONVERTED, :FORMATTED, :WITH_UNITS
328
+ if item.read_conversion
329
+ using_cached_value = false
330
+
331
+ check_cache = buffer.equal?(@buffer)
332
+ if check_cache and @read_conversion_cache
333
+ synchronize_allow_reads() do
334
+ if @read_conversion_cache[item]
335
+ value = @read_conversion_cache[item]
336
+ using_cached_value = true
337
+ end
338
+ end
339
+ end
340
+
341
+ unless using_cached_value
342
+ if item.array_size
343
+ value.map! do |val, index|
344
+ item.read_conversion.call(val, self, buffer)
345
+ end
346
+ else
347
+ value = item.read_conversion.call(value, self, buffer)
348
+ end
349
+ if check_cache
350
+ synchronize_allow_reads() do
351
+ @read_conversion_cache ||= {}
352
+ @read_conversion_cache[item] = value
353
+ end
354
+ end
355
+ end
356
+ end
357
+
358
+ # Convert from value to state if possible
359
+ if item.states
360
+ if Array === value
361
+ value = value.map do |val, index|
362
+ if item.states.key(val)
363
+ item.states.key(val)
364
+ else
365
+ apply_format_string_and_units(item, val, value_type)
366
+ end
367
+ end
368
+ else
369
+ state_value = item.states.key(value)
370
+ if state_value
371
+ value = state_value
372
+ else
373
+ value = apply_format_string_and_units(item, value, value_type)
374
+ end
375
+ end
376
+ else
377
+ if Array === value
378
+ value = value.map do |val, index|
379
+ apply_format_string_and_units(item, val, value_type)
380
+ end
381
+ else
382
+ value = apply_format_string_and_units(item, value, value_type)
383
+ end
384
+ end
385
+ else
386
+ raise ArgumentError, "Unknown value type on read: #{value_type}"
387
+ end
388
+ return value
389
+ end
390
+
391
+ # Write an item in the packet
392
+ #
393
+ # @param item [PacketItem] Instance of PacketItem or one of its subclasses
394
+ # @param value (see Structure#write_item)
395
+ # @param value_type (see #read_item)
396
+ # @param buffer (see Structure#write_item)
397
+ def write_item(item, value, value_type = :CONVERTED, buffer = @buffer)
398
+ if @read_conversion_cache
399
+ synchronize() do
400
+ @read_conversion_cache.clear
401
+ end
402
+ end
403
+ case value_type
404
+ when :RAW
405
+ super(item, value, value_type, buffer)
406
+ when :CONVERTED
407
+ if item.states
408
+ # Convert from state to value if possible
409
+ state_value = item.states[value.to_s.upcase]
410
+ value = state_value if state_value
411
+ end
412
+ if item.write_conversion
413
+ value = item.write_conversion.call(value, self, buffer)
414
+ else
415
+ raise "Cannot write DERIVED item without a write conversion" if item.data_type == :DERIVED
416
+ end
417
+ begin
418
+ super(item, value, :RAW, buffer) unless item.data_type == :DERIVED
419
+ rescue ArgumentError => err
420
+ if item.states and String === value and err.message =~ /invalid value for/
421
+ raise "Unknown state #{value} for #{item.name}"
422
+ else
423
+ raise err
424
+ end
425
+ end
426
+ when :FORMATTED, :WITH_UNITS
427
+ raise ArgumentError, "Invalid value type on write: #{value_type}"
428
+ else
429
+ raise ArgumentError, "Unknown value type on write: #{value_type}"
430
+ end
431
+ end
432
+
433
+ # Read an item in the packet by name
434
+ #
435
+ # @param name [String] Name of the item to read
436
+ # @param value_type (see #read_item)
437
+ # @param buffer (see #read_item)
438
+ # @return (see #read_item)
439
+ def read(name, value_type = :CONVERTED, buffer = @buffer)
440
+ return super(name, value_type, buffer)
441
+ end
442
+
443
+ # Write an item in the packet by name
444
+ #
445
+ # @param name [String] Name of the item to write
446
+ # @param value (see #write_item)
447
+ # @param value_type (see #write_item)
448
+ # @param buffer (see #write_item)
449
+ def write(name, value, value_type = :CONVERTED, buffer = @buffer)
450
+ super(name, value, value_type, buffer)
451
+ end
452
+
453
+ # Read all items in the packet into an array of arrays
454
+ # [[item name, item value], ...]
455
+ #
456
+ # @param value_type (see #read_item)
457
+ # @param buffer (see Structure#read_all)
458
+ # @param top (See Structure#read_all)
459
+ # @return (see Structure#read_all)
460
+ def read_all(value_type = :CONVERTED, buffer = @buffer, top = true)
461
+ return super(value_type, buffer, top)
462
+ end
463
+
464
+ # Read all items in the packet into an array of arrays
465
+ # [[item name, item value], [item limits state], ...]
466
+ #
467
+ # @param value_type (see #read_all)
468
+ # @param buffer (see #read_all)
469
+ # @return [Array<String, Object, Symbol|nil>] Returns an Array consisting
470
+ # of [item name, item value, item limits state] where the item limits
471
+ # state can be one of {Cosmos::Limits::LIMITS_STATES}
472
+ def read_all_with_limits_states(value_type = :CONVERTED, buffer = @buffer)
473
+ result = nil
474
+ synchronize_allow_reads(true) do
475
+ result = read_all(value_type, buffer, false).map! do |array|
476
+ array << @items[array[0]].limits.state
477
+ end
478
+ end
479
+ return result
480
+ end
481
+
482
+ # Create a string that shows the name and value of each item in the packet
483
+ #
484
+ # @param value_type (see #read_item)
485
+ # @param indent (see Structure#formatted)
486
+ # @param buffer (see Structure#formatted)
487
+ # @return (see Structure#formatted)
488
+ def formatted(value_type = :CONVERTED, indent = 0, buffer = @buffer)
489
+ return super(value_type, indent, buffer)
490
+ end
491
+
492
+ # Tries to identify if a buffer represents the currently defined packet. It
493
+ # does this by iterating over all the packet items that were created with
494
+ # an ID value and checking whether that ID value is present at the correct
495
+ # location in the buffer.
496
+ #
497
+ # Incorrectly sized buffers will still positively identify if there is
498
+ # enough data to match the ID values. This is to allow incorrectly sized
499
+ # packets to still be processed as well as possible given the incorrectly
500
+ # sized data.
501
+ #
502
+ # @param buffer [String] Raw buffer of binary data
503
+ # @return [Boolean] Whether or not the buffer of data is this packet
504
+ # def identify?(buffer)
505
+
506
+ # Restore all items in the packet to their default value
507
+ #
508
+ # @param buffer [String] Raw buffer of binary data
509
+ def restore_defaults(buffer = @buffer)
510
+ @sorted_items.each do |item|
511
+ write_item(item, item.default, :CONVERTED, buffer)
512
+ end
513
+ end
514
+
515
+ # Enable limits on an item by name
516
+ #
517
+ # @param name [String] Name of the item to enable limits
518
+ def enable_limits(name)
519
+ get_item(name).limits.enabled = true
520
+ end
521
+
522
+ # Disable limits on an item by name
523
+ #
524
+ # @param name [String] Name of the item to disable limits
525
+ def disable_limits(name)
526
+ item = get_item(name)
527
+ item.limits.enabled = false
528
+ unless item.limits.state == :STALE
529
+ old_limits_state = item.limits.state
530
+ item.limits.state = nil
531
+ @limits_change_callback.call(self, item, old_limits_state, nil, false) if @limits_change_callback
532
+ end
533
+ end
534
+
535
+ # Add an item to the limits items cache if necessary.
536
+ # You MUST call this after adding limits to an item
537
+ #This is an optimization so we don't have to iterate through all the items when
538
+ # checking for limits.
539
+ def update_limits_items_cache(item)
540
+ if item.limits.values || item.state_colors
541
+ @limits_items ||= []
542
+ @limits_items_hash ||= {}
543
+ unless @limits_items_hash[item]
544
+ @limits_items << item
545
+ @limits_items_hash[item] = true
546
+ end
547
+ end
548
+ end
549
+
550
+ # Return an array of arrays indicating all items in the packet that are out of limits
551
+ # [[target name, packet name, item name, item limits state], ...]
552
+ #
553
+ # @return [Array<Array<String, String, String, Symbol>>]
554
+ def out_of_limits
555
+ items = []
556
+ return items unless @limits_items
557
+ @limits_items.each do |item|
558
+ if (item.limits.enabled && item.limits.state &&
559
+ PacketItemLimits::OUT_OF_LIMITS_STATES.include?(item.limits.state))
560
+ items << [@target_name, @packet_name, item.name, item.limits.state]
561
+ end
562
+ end
563
+ return items
564
+ end
565
+
566
+ # Set the limits state for all items to the given state
567
+ #
568
+ # @param state [Symbol] Must be one of PacketItemLimits::LIMITS_STATES
569
+ def set_all_limits_states(state)
570
+ @sorted_items.each {|item| item.limits.state = state}
571
+ end
572
+
573
+ # Check all the items in the packet against their defined limits. Update
574
+ # their internal limits state and persistence and call the
575
+ # limits_change_callback as necessary.
576
+ #
577
+ # @param limits_set [Symbol] Which limits set to check the item values
578
+ # against.
579
+ # @param ignore_persistence [Boolean] Whether to ignore persistence when
580
+ # checking for out of limits
581
+ def check_limits(limits_set = :DEFAULT, ignore_persistence = false)
582
+ # If check_limits is being called, then a new packet has arrived and
583
+ # this packet is no longer stale
584
+ if @stale
585
+ @stale = false
586
+ set_all_limits_states(nil)
587
+ end
588
+
589
+ return unless @limits_items
590
+ @limits_items.each do |item|
591
+ # Verify limits monitoring is enabled for this item
592
+ if item.limits.enabled
593
+ value = read_item(item)
594
+
595
+ # Handle state monitoring and value monitoring differently
596
+ if item.states
597
+ handle_limits_states(item, value)
598
+ elsif item.limits.values
599
+ handle_limits_values(item, value, limits_set, ignore_persistence)
600
+ end
601
+ end
602
+ end
603
+ end
604
+
605
+ # Sets the overall packet stale state to true and sets each packet item
606
+ # limits state to :STALE.
607
+ def set_stale
608
+ @stale = true
609
+ set_all_limits_states(:STALE)
610
+ end
611
+
612
+ # Reset temporary packet data
613
+ # This includes packet received time, received count, and processor state
614
+ def reset
615
+ @received_time = nil
616
+ @received_count = 0
617
+ if @read_conversion_cache
618
+ synchronize() do
619
+ @read_conversion_cache.clear
620
+ end
621
+ end
622
+ return unless @processors
623
+ @processors.each do |processor_name, processor|
624
+ processor.reset
625
+ end
626
+ end
627
+
628
+ # Make a light weight clone of this packet. This only creates a new buffer
629
+ # of data and clones the processors. The defined packet items are the same.
630
+ #
631
+ # @return [Packet] A copy of the current packet with a new underlying
632
+ # buffer of data and processors
633
+ def clone
634
+ packet = super()
635
+ if packet.instance_variable_get("@processors".freeze)
636
+ packet.instance_variable_set("@processors".freeze, packet.processors.clone)
637
+ packet.processors.each do |processor_name, processor|
638
+ packet.processors[processor_name] = processor.clone
639
+ end
640
+ end
641
+ packet
642
+ end
643
+ alias dup clone
644
+
645
+ protected
646
+
647
+ # Performs packet specific processing on the packet. Intended to only be run once for each packet received
648
+ def process(buffer = @buffer)
649
+ return unless @processors
650
+ @processors.each do |processor_name, processor|
651
+ processor.call(self, buffer)
652
+ end
653
+ end
654
+
655
+ def handle_limits_states(item, value)
656
+ # Retrieve limits state for the given value
657
+ limits_state = item.state_colors[value]
658
+
659
+ if item.limits.state != limits_state # PacketItemLimits state has changed
660
+ # Save old limits state
661
+ old_limits_state = item.limits.state
662
+ # Update to new limits state
663
+ item.limits.state = limits_state
664
+
665
+ if old_limits_state == nil # Changing from nil
666
+ if limits_state != :GREEN && limits_state != :BLUE # Warnings are needed
667
+ @limits_change_callback.call(self, item, old_limits_state, value, true) if @limits_change_callback
668
+ end
669
+ else # Changing from a state other than nil so always call the callback
670
+ if @limits_change_callback
671
+ if item.limits.state.nil?
672
+ @limits_change_callback.call(self, item, old_limits_state, value, false)
673
+ else
674
+ @limits_change_callback.call(self, item, old_limits_state, value, true)
675
+ end
676
+ end
677
+ end
678
+ end
679
+ end
680
+
681
+ def handle_limits_values(item, value, limits_set, ignore_persistence)
682
+ # Retrieve limits settings for the specified limits_set
683
+ limits = item.limits.values[limits_set]
684
+
685
+ # Use the default limits set if limits aren't specified for the
686
+ # particular limits set
687
+ limits = item.limits.values[:DEFAULT] unless limits
688
+
689
+ # Extract limits from array
690
+ red_low = limits[0]
691
+ yellow_low = limits[1]
692
+ yellow_high = limits[2]
693
+ red_high = limits[3]
694
+ green_low = limits[4]
695
+ green_high = limits[5]
696
+ limits_state = nil
697
+
698
+ # Determine the limits_state based on the limits values and the current
699
+ # value of the item
700
+ if (value > yellow_low)
701
+ if (value < yellow_high)
702
+ if green_low
703
+ if value < green_high
704
+ if value > green_low
705
+ limits_state = :BLUE
706
+ else
707
+ limits_state = :GREEN_LOW
708
+ end
709
+ else
710
+ limits_state = :GREEN_HIGH
711
+ end
712
+ else
713
+ limits_state = :GREEN
714
+ end
715
+ elsif (value < red_high)
716
+ limits_state = :YELLOW_HIGH
717
+ else
718
+ limits_state = :RED_HIGH
719
+ end
720
+ else # value <= yellow_low
721
+ if (value > red_low)
722
+ limits_state = :YELLOW_LOW
723
+ else
724
+ limits_state = :RED_LOW
725
+ end
726
+ end
727
+
728
+ if item.limits.state != limits_state # limits state has changed
729
+ # Save old limits state for use in the callback
730
+ old_limits_state = item.limits.state
731
+
732
+ item.limits.persistence_count += 1
733
+
734
+ # Check for item to achieve its persistence which means we
735
+ # have to update the state and call the callback
736
+ # Note when going back to green (or blue) persistence is ignored
737
+ if (item.limits.persistence_count >= item.limits.persistence_setting) || ignore_persistence
738
+ item.limits.state = limits_state
739
+
740
+ # Additional actions for limits change
741
+ @limits_change_callback.call(self, item, old_limits_state, value, true) if @limits_change_callback
742
+
743
+ # Clear persistence since we've entered a new state
744
+ item.limits.persistence_count = 0
745
+ end
746
+ else # limits state has not changed so clear persistence
747
+ item.limits.persistence_count = 0
748
+ end
749
+ end
750
+
751
+ def apply_format_string_and_units(item, value, value_type)
752
+ if value_type == :FORMATTED or value_type == :WITH_UNITS
753
+ if item.format_string && value
754
+ value = sprintf(item.format_string, value)
755
+ else
756
+ value = value.to_s
757
+ end
758
+ end
759
+ value << ' ' << item.units if value_type == :WITH_UNITS and item.units
760
+ value
761
+ end
762
+
763
+ def packet_define_item(item, format_string, read_conversion, write_conversion, id_value)
764
+ item.format_string = format_string
765
+ item.read_conversion = read_conversion
766
+ item.write_conversion = write_conversion
767
+
768
+ # Change id_value to the correct type
769
+ if id_value
770
+ item.id_value = id_value
771
+ update_id_items(item)
772
+ end
773
+ item
774
+ end
775
+
776
+ def update_id_items(item)
777
+ if item.id_value
778
+ @id_items ||= []
779
+ @id_items << item
780
+ end
781
+ item
782
+ end
783
+
784
+ end # class Packet
785
+
786
+ end # module Cosmos