cosmos 3.9.2 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (438) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +23 -0
  3. data/.travis.yml +1 -0
  4. data/.yardopts +3 -0
  5. data/Gemfile +1 -1
  6. data/Manifest.txt +137 -52
  7. data/Rakefile +50 -44
  8. data/autohotkey/config/system/system.txt +0 -5
  9. data/autohotkey/config/targets/INST/cmd_tlm/inst_cmds.txt +6 -1
  10. data/autohotkey/config/targets/INST/screens/extra.txt +19 -0
  11. data/autohotkey/config/targets/INST/sequences/run_sequence.txt +1 -0
  12. data/autohotkey/config/targets/META/screens/data.txt +12 -0
  13. data/autohotkey/config/targets/SYSTEM/cmd_tlm/meta_cmd_tlm.txt +16 -0
  14. data/autohotkey/config/targets/{COSMOS/cmd_tlm/cosmos_server_cmds.txt → SYSTEM/cmd_tlm/system_cmds.txt} +8 -8
  15. data/autohotkey/config/targets/SYSTEM/cmd_tlm/system_tlm.txt +7 -0
  16. data/autohotkey/config/targets/SYSTEM/screens/limits_change.txt +14 -0
  17. data/autohotkey/config/targets/SYSTEM/screens/meta.txt +14 -0
  18. data/autohotkey/config/targets/SYSTEM/target.txt +12 -0
  19. data/autohotkey/config/tools/cmd_tlm_server/cmd_tlm_server.txt +2 -2
  20. data/autohotkey/config/tools/test_runner/test_runner2.txt +1 -1
  21. data/autohotkey/tools/CmdSequence +14 -0
  22. data/autohotkey/tools/CmdSequenceAHK +23 -0
  23. data/autohotkey/tools/CmdSequenceAHK2 +16 -0
  24. data/autohotkey/tools/cmd_extractor.ahk +2 -2
  25. data/autohotkey/tools/cmd_sender.ahk +4 -6
  26. data/autohotkey/tools/cmd_sequence.ahk +215 -0
  27. data/autohotkey/tools/cmd_sequence2.ahk +23 -0
  28. data/autohotkey/tools/data_viewer.ahk +2 -3
  29. data/autohotkey/tools/limits_monitor.ahk +9 -11
  30. data/autohotkey/tools/open_gl_builder.ahk +1 -2
  31. data/autohotkey/tools/packet_viewer.ahk +51 -35
  32. data/autohotkey/tools/replay.ahk +1 -2
  33. data/autohotkey/tools/script_runner.ahk +1 -2
  34. data/autohotkey/tools/script_runner2.ahk +1 -2
  35. data/autohotkey/tools/test_runner2.ahk +1 -5
  36. data/autohotkey/tools/test_runner3.ahk +1 -3
  37. data/autohotkey/tools/tlm_grapher.ahk +1 -3
  38. data/autohotkey/tools/tlm_grapher3.ahk +1 -2
  39. data/autohotkey/tools/tlm_viewer.ahk +8 -3
  40. data/autohotkey/tools/tlm_viewer2.ahk +2 -3
  41. data/autohotkey/tools/tlm_viewer5.ahk +1 -2
  42. data/cosmos.gemspec +26 -20
  43. data/data/cmd_sequence.png +0 -0
  44. data/data/config/_array_params.yaml +23 -0
  45. data/data/config/_id_items.yaml +24 -0
  46. data/data/config/_id_params.yaml +58 -0
  47. data/data/config/_interfaces.yaml +206 -0
  48. data/data/config/_items.yaml +20 -0
  49. data/data/config/_params.yaml +58 -0
  50. data/data/config/cmd_tlm_server.yaml +110 -0
  51. data/data/config/command.yaml +38 -0
  52. data/data/config/command_modifiers.yaml +127 -0
  53. data/data/config/command_telemetry.yaml +3 -0
  54. data/data/config/data_viewer.yaml +43 -0
  55. data/data/config/handbook_creator.yaml +23 -0
  56. data/data/config/housekeeping_params.yaml +71 -0
  57. data/data/config/interface_modifiers.yaml +44 -0
  58. data/data/config/item_modifiers.yaml +172 -0
  59. data/data/config/launcher.yaml +117 -0
  60. data/data/config/limits_monitor.yaml +53 -0
  61. data/data/config/linegraph_params.yaml +30 -0
  62. data/data/config/linegraph_plot.yaml +106 -0
  63. data/data/config/page_modifiers.yaml +128 -0
  64. data/data/config/param_item_modifiers.yaml +41 -0
  65. data/data/config/parameter_modifiers.yaml +144 -0
  66. data/data/config/protocols.yaml +257 -0
  67. data/data/config/screen.yaml +151 -0
  68. data/data/config/script_runner.yaml +15 -0
  69. data/data/config/system.yaml +153 -0
  70. data/data/config/table_manager.yaml +76 -0
  71. data/data/config/table_parameter_modifiers.yaml +9 -0
  72. data/data/config/target.yaml +71 -0
  73. data/data/config/telemetry.yaml +73 -0
  74. data/data/config/telemetry_modifiers.yaml +129 -0
  75. data/data/config/test_runner.yaml +118 -0
  76. data/data/config/tlm_extractor.yaml +109 -0
  77. data/data/config/tlm_grapher.yaml +78 -0
  78. data/data/config/tlm_viewer.yaml +107 -0
  79. data/data/config/unknown.yaml +3 -0
  80. data/data/config/widgets.yaml +1339 -0
  81. data/data/config/xy_params.yaml +50 -0
  82. data/data/config/xy_plot.yaml +12 -0
  83. data/data/config_editor.png +0 -0
  84. data/data/crc.txt +172 -161
  85. data/data/delete.png +0 -0
  86. data/demo/config/data/crc.txt +56 -36
  87. data/demo/config/data/meta_init.txt +1 -4
  88. data/demo/config/system/system.txt +15 -3
  89. data/demo/config/system/system2.txt +13 -3
  90. data/demo/config/targets/EXAMPLE/lib/example_interface.rb +2 -6
  91. data/demo/config/targets/EXAMPLE/target.txt +3 -1
  92. data/demo/config/targets/INST/cmd_tlm/inst_cmds.txt +1 -0
  93. data/demo/config/targets/INST/lib/inst_dump_component.rb +34 -0
  94. data/demo/config/targets/INST/screens/adcs.txt +39 -15
  95. data/demo/config/targets/INST/screens/commanding.txt +26 -19
  96. data/demo/config/targets/INST/screens/spacing_box.txt +44 -0
  97. data/demo/config/targets/INST/screens/spacing_grid.txt +78 -0
  98. data/demo/config/targets/INST/screens/tabs.txt +0 -2
  99. data/demo/config/targets/INST/sequences/sequence.tsv +3 -0
  100. data/demo/config/targets/INST/tables/EventAction.csv +9 -0
  101. data/demo/config/targets/INST/tables/EventAction.dat +0 -0
  102. data/demo/config/targets/INST/tables/McConfigTable.csv +20 -0
  103. data/demo/config/targets/INST/tables/McConfigTable.dat +0 -0
  104. data/demo/config/targets/INST/target.txt +4 -0
  105. data/demo/config/targets/INST/tools/data_viewer/data_viewer.txt +2 -0
  106. data/demo/config/targets/INST/tools/data_viewer/data_viewer2.txt +2 -0
  107. data/demo/config/targets/INST/tools/table_manager/EventAction_def.txt +6 -0
  108. data/demo/config/targets/INST/tools/table_manager/McConfigTable_def.txt +38 -0
  109. data/demo/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -3
  110. data/demo/config/targets/SYSTEM/cmd_tlm/meta_cmd_tlm.txt +16 -0
  111. data/demo/config/targets/{COSMOS/cmd_tlm/cosmos_server_cmds.txt → SYSTEM/cmd_tlm/system_cmds.txt} +8 -8
  112. data/demo/config/targets/SYSTEM/cmd_tlm/system_tlm.txt +7 -0
  113. data/demo/config/targets/{COSMOS → SYSTEM}/cmd_tlm_server.txt +2 -2
  114. data/demo/config/targets/SYSTEM/lib/limits_groups.rb +39 -0
  115. data/demo/config/targets/SYSTEM/screens/status.txt +1 -1
  116. data/demo/config/targets/SYSTEM/target.txt +12 -0
  117. data/demo/config/targets/TEMPLATED/cmd_tlm_server.txt +1 -1
  118. data/demo/config/targets/TEMPLATED/lib/templated_interface.rb +8 -5
  119. data/demo/config/targets/TEMPLATED/target.txt +2 -0
  120. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server.txt +15 -6
  121. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server2.txt +13 -5
  122. data/demo/config/tools/data_viewer/data_viewer.txt +9 -0
  123. data/demo/config/tools/launcher/launcher.txt +9 -6
  124. data/demo/config/tools/launcher/launcher2.txt +16 -13
  125. data/demo/config/tools/launcher/launcher_mini.txt +45 -0
  126. data/demo/config/tools/table_manager/MCConfigurationTable_fsw1_def.txt +12 -11
  127. data/demo/config/tools/table_manager/MCConfigurationTable_fsw2_def.txt +12 -11
  128. data/demo/config/tools/test_runner/test_runner.txt +1 -1
  129. data/demo/config/tools/tlm_viewer/tlm_viewer.txt +5 -5
  130. data/demo/lib/example_background_task.rb +9 -5
  131. data/demo/lib/example_target.rb +5 -15
  132. data/demo/lib/scpi_target.rb +4 -10
  133. data/demo/procedures/cosmos_api_test.rb +17 -0
  134. data/demo/tools/CmdSequence +16 -0
  135. data/demo/tools/CmdSequence.bat +9 -0
  136. data/demo/tools/ConfigEditor +16 -0
  137. data/demo/tools/ConfigEditor.bat +9 -0
  138. data/demo/tools/mac/CmdSequence.app/Contents/Info.plist +38 -0
  139. data/demo/tools/mac/CmdSequence.app/Contents/MacOS/CmdSequence.rb +16 -0
  140. data/demo/tools/mac/CmdSequence.app/Contents/MacOS/main.sh +10 -0
  141. data/demo/tools/mac/CmdSequence.app/Contents/MacOS/tool_launch.rb +38 -0
  142. data/demo/tools/mac/CmdSequence.app/Contents/Resources/appIcon.icns +0 -0
  143. data/ext/cosmos/ext/packet/packet.c +5 -5
  144. data/install/config/data/crc.txt +12 -8
  145. data/install/config/system/system.txt +13 -3
  146. data/install/config/targets/SYSTEM/cmd_tlm/meta_cmd_tlm.txt +14 -0
  147. data/install/config/targets/SYSTEM/target.txt +12 -0
  148. data/install/tools/CmdSequence +16 -0
  149. data/install/tools/CmdSequence.bat +9 -0
  150. data/install/tools/ConfigEditor +16 -0
  151. data/install/tools/ConfigEditor.bat +9 -0
  152. data/install/tools/mac/CmdSequence.app/Contents/Info.plist +38 -0
  153. data/install/tools/mac/CmdSequence.app/Contents/MacOS/CmdSequence.rb +16 -0
  154. data/install/tools/mac/CmdSequence.app/Contents/MacOS/main.sh +10 -0
  155. data/install/tools/mac/CmdSequence.app/Contents/MacOS/tool_launch.rb +38 -0
  156. data/install/tools/mac/CmdSequence.app/Contents/Resources/appIcon.icns +0 -0
  157. data/lib/cosmos.rb +1 -1
  158. data/lib/cosmos/config/config_parser.rb +147 -59
  159. data/lib/cosmos/config/meta_config_parser.rb +57 -0
  160. data/lib/cosmos/conversions/polynomial_conversion.rb +20 -4
  161. data/lib/cosmos/conversions/unix_time_conversion.rb +4 -4
  162. data/lib/cosmos/core_ext/array.rb +45 -5
  163. data/lib/cosmos/core_ext/cosmos_io.rb +31 -15
  164. data/lib/cosmos/core_ext/file.rb +2 -2
  165. data/lib/cosmos/core_ext/kernel.rb +1 -6
  166. data/lib/cosmos/core_ext/objectspace.rb +0 -2
  167. data/lib/cosmos/core_ext/string.rb +27 -4
  168. data/lib/cosmos/core_ext/time.rb +39 -10
  169. data/lib/cosmos/gui/choosers/combobox_chooser.rb +37 -26
  170. data/lib/cosmos/gui/choosers/file_chooser.rb +23 -6
  171. data/lib/cosmos/gui/choosers/float_chooser.rb +13 -11
  172. data/lib/cosmos/gui/choosers/integer_chooser.rb +13 -11
  173. data/lib/cosmos/gui/choosers/string_chooser.rb +18 -36
  174. data/lib/cosmos/gui/choosers/telemetry_chooser.rb +64 -64
  175. data/lib/cosmos/gui/choosers/value_chooser.rb +15 -15
  176. data/lib/cosmos/gui/dialogs/about_dialog.rb +18 -13
  177. data/lib/cosmos/gui/dialogs/calendar_dialog.rb +11 -3
  178. data/lib/cosmos/gui/dialogs/cmd_tlm_raw_dialog.rb +1 -1
  179. data/lib/cosmos/gui/dialogs/details_dialog.rb +1 -1
  180. data/lib/cosmos/gui/dialogs/exception_dialog.rb +7 -7
  181. data/lib/cosmos/gui/dialogs/find_replace_dialog.rb +20 -15
  182. data/lib/cosmos/gui/dialogs/interface_raw_dialog.rb +143 -0
  183. data/lib/cosmos/gui/dialogs/legal_dialog.rb +6 -5
  184. data/lib/cosmos/gui/dialogs/packet_log_dialog.rb +5 -2
  185. data/lib/cosmos/gui/dialogs/progress_dialog.rb +1 -1
  186. data/lib/cosmos/gui/dialogs/pry_dialog.rb +4 -4
  187. data/lib/cosmos/gui/dialogs/scroll_text_dialog.rb +3 -0
  188. data/lib/cosmos/gui/dialogs/set_tlm_dialog.rb +7 -6
  189. data/lib/cosmos/gui/dialogs/splash.rb +1 -1
  190. data/lib/cosmos/gui/dialogs/tlm_details_dialog.rb +1 -1
  191. data/lib/cosmos/gui/dialogs/tlm_graph_dialog.rb +114 -0
  192. data/lib/cosmos/gui/line_graph/line_graph.rb +9 -10
  193. data/lib/cosmos/gui/line_graph/line_graph_dialog.rb +7 -5
  194. data/lib/cosmos/gui/line_graph/line_graph_drawing.rb +3 -7
  195. data/lib/cosmos/gui/line_graph/line_graph_popups.rb +3 -8
  196. data/lib/cosmos/gui/line_graph/line_graph_scaling.rb +2 -7
  197. data/lib/cosmos/gui/line_graph/overview_graph.rb +6 -1
  198. data/lib/cosmos/gui/opengl/earth_model.rb +6 -3
  199. data/lib/cosmos/gui/opengl/gl_bounds.rb +11 -23
  200. data/lib/cosmos/gui/opengl/gl_light.rb +3 -4
  201. data/lib/cosmos/gui/opengl/gl_material.rb +3 -4
  202. data/lib/cosmos/gui/opengl/gl_scene.rb +10 -4
  203. data/lib/cosmos/gui/opengl/gl_shape.rb +6 -2
  204. data/lib/cosmos/gui/opengl/gl_viewer.rb +5 -5
  205. data/lib/cosmos/gui/opengl/gl_viewport.rb +11 -12
  206. data/lib/cosmos/gui/opengl/moon_model.rb +6 -3
  207. data/lib/cosmos/gui/opengl/stl_reader.rb +8 -9
  208. data/lib/cosmos/gui/opengl/stl_shape.rb +4 -5
  209. data/lib/cosmos/gui/opengl/texture_mapped_sphere.rb +7 -7
  210. data/lib/cosmos/gui/qt.rb +1 -1
  211. data/lib/cosmos/gui/qt_tool.rb +21 -10
  212. data/lib/cosmos/gui/text/completion.rb +23 -2
  213. data/lib/cosmos/gui/text/completion_text_edit.rb +38 -23
  214. data/lib/cosmos/gui/utilities/analyze_log.rb +1 -1
  215. data/lib/cosmos/gui/utilities/screenshot.rb +2 -2
  216. data/lib/cosmos/gui/widgets/full_text_search_line_edit.rb +11 -1
  217. data/lib/cosmos/gui/widgets/packet_log_frame.rb +19 -6
  218. data/lib/cosmos/interfaces.rb +10 -0
  219. data/lib/cosmos/interfaces/cmd_tlm_server_interface.rb +28 -47
  220. data/lib/cosmos/interfaces/interface.rb +240 -22
  221. data/lib/cosmos/interfaces/linc_interface.rb +3 -5
  222. data/lib/cosmos/interfaces/protocols/burst_protocol.rb +173 -0
  223. data/lib/cosmos/interfaces/protocols/crc_protocol.rb +141 -0
  224. data/lib/cosmos/{streams/fixed_stream_protocol.rb → interfaces/protocols/fixed_protocol.rb} +40 -37
  225. data/lib/cosmos/{streams/length_stream_protocol.rb → interfaces/protocols/length_protocol.rb} +55 -48
  226. data/lib/cosmos/interfaces/protocols/override_protocol.rb +52 -0
  227. data/lib/cosmos/interfaces/protocols/preidentified_protocol.rb +141 -0
  228. data/lib/cosmos/interfaces/protocols/protocol.rb +60 -0
  229. data/lib/cosmos/interfaces/protocols/template_protocol.rb +209 -0
  230. data/lib/cosmos/interfaces/protocols/terminated_protocol.rb +81 -0
  231. data/lib/cosmos/interfaces/serial_interface.rb +28 -23
  232. data/lib/cosmos/interfaces/simulated_target_interface.rb +27 -16
  233. data/lib/cosmos/interfaces/stream_interface.rb +36 -108
  234. data/lib/cosmos/interfaces/tcpip_client_interface.rb +21 -21
  235. data/lib/cosmos/interfaces/tcpip_server_interface.rb +555 -94
  236. data/lib/cosmos/interfaces/udp_interface.rb +51 -83
  237. data/lib/cosmos/io/buffered_file.rb +92 -2
  238. data/lib/cosmos/io/json_drb.rb +2 -2
  239. data/lib/cosmos/io/posix_serial_driver.rb +3 -1
  240. data/lib/cosmos/io/raw_logger.rb +3 -3
  241. data/lib/cosmos/io/serial_driver.rb +14 -5
  242. data/lib/cosmos/io/win32_serial_driver.rb +16 -4
  243. data/lib/cosmos/packet_logs.rb +0 -1
  244. data/lib/cosmos/packet_logs/packet_log_reader.rb +11 -1
  245. data/lib/cosmos/packet_logs/packet_log_writer.rb +31 -13
  246. data/lib/cosmos/packets/binary_accessor.rb +599 -32
  247. data/lib/cosmos/packets/commands.rb +48 -24
  248. data/lib/cosmos/packets/packet.rb +140 -54
  249. data/lib/cosmos/packets/packet_config.rb +0 -2
  250. data/lib/cosmos/packets/parsers/packet_item_parser.rb +10 -2
  251. data/lib/cosmos/packets/structure.rb +81 -33
  252. data/lib/cosmos/packets/structure_item.rb +45 -5
  253. data/lib/cosmos/packets/telemetry.rb +149 -55
  254. data/lib/cosmos/script/api_shared.rb +1000 -0
  255. data/lib/cosmos/script/commands.rb +2 -2
  256. data/lib/cosmos/script/extract.rb +19 -4
  257. data/lib/cosmos/script/limits.rb +2 -0
  258. data/lib/cosmos/script/script.rb +1 -1
  259. data/lib/cosmos/script/scripting.rb +4 -784
  260. data/lib/cosmos/script/telemetry.rb +44 -23
  261. data/lib/cosmos/script/tools.rb +15 -69
  262. data/lib/cosmos/streams/serial_stream.rb +12 -19
  263. data/lib/cosmos/streams/stream.rb +2 -11
  264. data/lib/cosmos/streams/tcpip_socket_stream.rb +3 -13
  265. data/lib/cosmos/system/system.rb +187 -31
  266. data/lib/cosmos/system/target.rb +11 -2
  267. data/lib/cosmos/tools/cmd_extractor/cmd_extractor.rb +12 -11
  268. data/lib/cosmos/tools/cmd_sender/{cmd_sender_item_delegate.rb → cmd_param_table_item_delegate.rb} +11 -10
  269. data/lib/cosmos/tools/cmd_sender/cmd_sender.rb +209 -164
  270. data/lib/cosmos/tools/cmd_sequence/cmd_sequence.rb +652 -0
  271. data/lib/cosmos/tools/cmd_sequence/sequence_item.rb +510 -0
  272. data/lib/cosmos/tools/cmd_sequence/sequence_list.rb +194 -0
  273. data/lib/cosmos/tools/cmd_tlm_server/api.rb +179 -5
  274. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +31 -14
  275. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_config.rb +23 -16
  276. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +92 -20
  277. data/lib/cosmos/tools/cmd_tlm_server/commanding.rb +1 -1
  278. data/lib/cosmos/tools/cmd_tlm_server/gui/interfaces_tab.rb +17 -4
  279. data/lib/cosmos/tools/cmd_tlm_server/gui/targets_tab.rb +0 -5
  280. data/lib/cosmos/tools/cmd_tlm_server/interface_thread.rb +1 -2
  281. data/lib/cosmos/tools/cmd_tlm_server/interfaces.rb +4 -4
  282. data/lib/cosmos/tools/cmd_tlm_server/limits_groups_background_task.rb +121 -0
  283. data/lib/cosmos/tools/cmd_tlm_server/routers.rb +8 -4
  284. data/lib/cosmos/tools/config_editor/config_editor.rb +720 -0
  285. data/lib/cosmos/tools/config_editor/config_editor_frame.rb +675 -0
  286. data/lib/cosmos/tools/data_viewer/data_viewer.rb +44 -27
  287. data/lib/cosmos/tools/data_viewer/data_viewer_component.rb +8 -22
  288. data/lib/cosmos/tools/launcher/launcher.rb +29 -12
  289. data/lib/cosmos/tools/launcher/launcher_config.rb +1 -1
  290. data/lib/cosmos/tools/limits_monitor/limits_monitor.rb +153 -42
  291. data/lib/cosmos/tools/packet_viewer/packet_viewer.rb +44 -6
  292. data/lib/cosmos/tools/replay/replay.rb +36 -20
  293. data/lib/cosmos/tools/replay/replay_server.rb +1 -1
  294. data/lib/cosmos/tools/script_runner/script_runner_config.rb +1 -1
  295. data/lib/cosmos/tools/script_runner/script_runner_frame.rb +31 -21
  296. data/lib/cosmos/tools/table_manager/table_config.rb +9 -3
  297. data/lib/cosmos/tools/table_manager/table_manager.rb +27 -7
  298. data/lib/cosmos/tools/test_runner/results_writer.rb +6 -6
  299. data/lib/cosmos/tools/test_runner/test_runner.rb +4 -6
  300. data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +4 -5
  301. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_config.rb +1 -1
  302. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_processor.rb +1 -1
  303. data/lib/cosmos/tools/tlm_grapher/data_object_adders/housekeeping_data_object_adder.rb +23 -6
  304. data/lib/cosmos/tools/tlm_grapher/data_object_editors/housekeeping_data_object_editor.rb +44 -3
  305. data/lib/cosmos/tools/tlm_grapher/data_objects/housekeeping_data_object.rb +20 -7
  306. data/lib/cosmos/tools/tlm_grapher/tabbed_plots/overview_tabbed_plots.rb +1 -1
  307. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_config.rb +11 -4
  308. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_plot_editor.rb +2 -2
  309. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_realtime_thread.rb +1 -1
  310. data/lib/cosmos/tools/tlm_grapher/tlm_grapher.rb +16 -0
  311. data/lib/cosmos/tools/tlm_viewer/screen.rb +36 -32
  312. data/lib/cosmos/tools/tlm_viewer/tlm_viewer.rb +59 -50
  313. data/lib/cosmos/tools/tlm_viewer/tlm_viewer_config.rb +2 -2
  314. data/lib/cosmos/tools/tlm_viewer/widgets.rb +1 -0
  315. data/lib/cosmos/tools/tlm_viewer/widgets/canvasvalue_widget.rb +1 -0
  316. data/lib/cosmos/tools/tlm_viewer/widgets/labelvalue_widget.rb +22 -4
  317. data/lib/cosmos/tools/tlm_viewer/widgets/matrixbycolumns_widget.rb +9 -0
  318. data/lib/cosmos/tools/tlm_viewer/widgets/spacer_widget.rb +55 -0
  319. data/lib/cosmos/tools/tlm_viewer/widgets/vertical_widget.rb +3 -2
  320. data/lib/cosmos/tools/tlm_viewer/widgets/verticalbox_widget.rb +3 -2
  321. data/lib/cosmos/tools/tlm_viewer/widgets/widget.rb +12 -12
  322. data/lib/cosmos/top_level.rb +34 -24
  323. data/lib/cosmos/utilities/crc.rb +108 -6
  324. data/lib/cosmos/utilities/csv.rb +68 -14
  325. data/lib/cosmos/utilities/logger.rb +2 -2
  326. data/lib/cosmos/utilities/low_fragmentation_array.rb +9 -1
  327. data/lib/cosmos/version.rb +6 -6
  328. data/lib/cosmos/win32/win32_main.rb +50 -46
  329. data/run_gui_tests.bat +3 -1
  330. data/spec/conversions/unix_time_formatted_conversion_spec.rb +2 -2
  331. data/spec/conversions/unix_time_seconds_conversion_spec.rb +2 -2
  332. data/spec/core_ext/file_spec.rb +1 -1
  333. data/spec/core_ext/objectspace_spec.rb +12 -9
  334. data/spec/core_ext/string_spec.rb +6 -0
  335. data/spec/core_ext/time_spec.rb +10 -0
  336. data/spec/gui/line_graph/line_clip_spec.rb +226 -224
  337. data/spec/gui/qt_spec.rb +81 -79
  338. data/spec/install/config/system/system.txt +0 -6
  339. data/spec/install/config/targets/INST/cmd_tlm/inst_cmd_linc.txt +5 -5
  340. data/spec/install/config/targets/INST/cmd_tlm/inst_tlm_linc.txt +8 -8
  341. data/spec/install/config/targets/SYSTEM/cmd_tlm/meta_cmd_tlm.txt +16 -0
  342. data/{install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt → spec/install/config/targets/SYSTEM/cmd_tlm/system_cmds.txt} +8 -8
  343. data/spec/install/config/targets/SYSTEM/cmd_tlm/system_tlm.txt +7 -0
  344. data/spec/install/config/targets/{COSMOS → SYSTEM}/cmd_tlm_server.txt +2 -2
  345. data/spec/install/config/targets/SYSTEM/screens/status.txt +12 -0
  346. data/spec/install/config/targets/SYSTEM/target.txt +12 -0
  347. data/spec/interfaces/cmd_tlm_server_interface_spec.rb +9 -13
  348. data/spec/interfaces/interface_spec.rb +402 -18
  349. data/spec/interfaces/linc_interface_spec.rb +37 -39
  350. data/spec/interfaces/protocols/burst_protocol_spec.rb +300 -0
  351. data/spec/interfaces/protocols/crc_protocol_spec.rb +709 -0
  352. data/spec/interfaces/protocols/fixed_protocol_spec.rb +119 -0
  353. data/spec/interfaces/protocols/length_protocol_spec.rb +499 -0
  354. data/spec/interfaces/protocols/override_protocol_spec.rb +158 -0
  355. data/spec/interfaces/protocols/preidentified_protocol_spec.rb +149 -0
  356. data/spec/interfaces/protocols/template_protocol_spec.rb +218 -0
  357. data/spec/interfaces/protocols/terminated_protocol_spec.rb +174 -0
  358. data/spec/interfaces/serial_interface_spec.rb +35 -34
  359. data/spec/interfaces/simulated_target_interface_spec.rb +13 -13
  360. data/spec/interfaces/tcpip_client_interface_spec.rb +21 -16
  361. data/spec/interfaces/tcpip_server_interface_spec.rb +66 -69
  362. data/spec/interfaces/udp_interface_spec.rb +120 -55
  363. data/spec/io/serial_driver_spec.rb +41 -39
  364. data/spec/io/udp_sockets_spec.rb +13 -8
  365. data/spec/io/win32_serial_driver_spec.rb +62 -59
  366. data/spec/packet_logs/packet_log_reader_spec.rb +68 -47
  367. data/spec/packet_logs/packet_log_writer_spec.rb +7 -5
  368. data/spec/packets/commands_spec.rb +5 -5
  369. data/spec/packets/packet_spec.rb +2 -14
  370. data/spec/script/extract_spec.rb +21 -7
  371. data/spec/script/scripting_spec.rb +261 -6
  372. data/spec/script/telemetry_spec.rb +17 -9
  373. data/spec/spec_helper.rb +26 -10
  374. data/spec/streams/serial_stream_spec.rb +87 -82
  375. data/spec/streams/tcpip_client_stream_spec.rb +12 -4
  376. data/spec/streams/tcpip_socket_stream_spec.rb +5 -0
  377. data/spec/system/system_spec.rb +66 -50
  378. data/spec/system/target_spec.rb +33 -11
  379. data/spec/tools/cmd_tlm_server/api_spec.rb +5 -5
  380. data/spec/tools/cmd_tlm_server/background_tasks_spec.rb +75 -15
  381. data/spec/tools/cmd_tlm_server/cmd_tlm_server_config_spec.rb +125 -5
  382. data/spec/tools/cmd_tlm_server/cmd_tlm_server_spec.rb +244 -232
  383. data/spec/tools/cmd_tlm_server/commanding_spec.rb +18 -18
  384. data/spec/tools/cmd_tlm_server/interface_thread_spec.rb +124 -29
  385. data/spec/tools/cmd_tlm_server/interfaces_spec.rb +2 -2
  386. data/spec/tools/cmd_tlm_server/limits_groups_background_task_spec.rb +145 -0
  387. data/spec/tools/cmd_tlm_server/router_thread_spec.rb +50 -10
  388. data/spec/tools/table_manager/tablemanager_core_spec.rb +0 -1
  389. data/spec/top_level/top_level_spec.rb +39 -11
  390. data/spec/utilities/csv_spec.rb +62 -20
  391. data/tasks/gemfile_stats.rake +6 -3
  392. data/test/performance/config/system/system_packets.txt +0 -1
  393. data/test/performance/config/system/system_threads.txt +0 -1
  394. metadata +177 -92
  395. data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +0 -15
  396. data/autohotkey/config/targets/COSMOS/cmd_tlm_server.txt +0 -6
  397. data/autohotkey/config/targets/COSMOS/target.txt +0 -5
  398. data/autohotkey/userpath.txt +0 -1
  399. data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +0 -15
  400. data/demo/config/targets/COSMOS/screens/limits_change.txt +0 -20
  401. data/demo/config/targets/COSMOS/screens/version.txt +0 -19
  402. data/demo/config/targets/COSMOS/target.txt +0 -11
  403. data/demo/config/targets/META/cmd_tlm/meta_cmd.txt +0 -10
  404. data/demo/config/targets/META/cmd_tlm/meta_tlm.txt +0 -13
  405. data/demo/userpath.txt +0 -1
  406. data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +0 -15
  407. data/install/config/targets/COSMOS/cmd_tlm_server.txt +0 -6
  408. data/install/config/targets/COSMOS/screens/limits_change.txt +0 -20
  409. data/install/config/targets/COSMOS/screens/version.txt +0 -19
  410. data/install/config/targets/COSMOS/target.txt +0 -9
  411. data/install/config/targets/SYSTEM/README.txt +0 -1
  412. data/install/userpath.txt +0 -1
  413. data/lib/cosmos/io/tcpip_server.rb +0 -571
  414. data/lib/cosmos/packet_logs/meta_packet_log_writer.rb +0 -107
  415. data/lib/cosmos/streams/burst_stream_protocol.rb +0 -25
  416. data/lib/cosmos/streams/preidentified_stream_protocol.rb +0 -118
  417. data/lib/cosmos/streams/stream_protocol.rb +0 -373
  418. data/lib/cosmos/streams/template_stream_protocol.rb +0 -140
  419. data/lib/cosmos/streams/terminated_stream_protocol.rb +0 -85
  420. data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +0 -41
  421. data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +0 -15
  422. data/spec/install/config/targets/COSMOS/screens/limits_change.txt +0 -20
  423. data/spec/install/config/targets/COSMOS/screens/version.txt +0 -19
  424. data/spec/install/config/targets/COSMOS/target.txt +0 -5
  425. data/spec/install/config/targets/META/cmd_tlm/meta_cmd.txt +0 -4
  426. data/spec/install/config/targets/META/cmd_tlm/meta_tlm.txt +0 -4
  427. data/spec/install/userpath.txt +0 -1
  428. data/spec/interfaces/stream_interface_spec.rb +0 -157
  429. data/spec/io/tcpip_server_spec.rb +0 -338
  430. data/spec/packet_logs/meta_packet_log_writer_spec.rb +0 -170
  431. data/spec/streams/burst_stream_protocol_spec.rb +0 -32
  432. data/spec/streams/fixed_stream_protocol_spec.rb +0 -113
  433. data/spec/streams/length_stream_protocol_spec.rb +0 -300
  434. data/spec/streams/preidentified_stream_protocol_spec.rb +0 -121
  435. data/spec/streams/stream_protocol_spec.rb +0 -346
  436. data/spec/streams/template_stream_protocol_spec.rb +0 -156
  437. data/spec/streams/terminated_stream_protocol_spec.rb +0 -127
  438. data/test/performance/userpath.txt +0 -1
@@ -0,0 +1,55 @@
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'
12
+ require 'cosmos/tools/tlm_viewer/widgets/widget'
13
+
14
+ module Cosmos
15
+
16
+ # SpacerWidget class
17
+ #
18
+ class SpacerWidget < Qt::Widget
19
+ include Widget
20
+
21
+ def initialize(parent_layout, width, height, hpolicy="MINIMUM", vpolicy="MINIMUM")
22
+ super()
23
+ if parent_layout
24
+ spacer_item = Qt::SpacerItem.new(width.to_i,
25
+ height.to_i,
26
+ size_policy(hpolicy),
27
+ size_policy(vpolicy))
28
+ parent_layout.addItem(spacer_item)
29
+ end
30
+ end
31
+
32
+ def size_policy(str)
33
+ case str.upcase
34
+ when 'FIXED'
35
+ return Qt::SizePolicy::Fixed
36
+ when 'MINIMUM'
37
+ return Qt::SizePolicy::Minimum
38
+ when 'MAXIMUM'
39
+ return Qt::SizePolicy::Maximum
40
+ when 'PREFERRED'
41
+ return Qt::SizePolicy::Preferred
42
+ when 'EXPANDING'
43
+ return Qt::SizePolicy::Expanding
44
+ when 'MINIMUMEXPANDING'
45
+ return Qt::SizePolicy::MinimumExpanding
46
+ when 'IGNORED'
47
+ return Qt::SizePolicy::Ignored
48
+ else
49
+ return Qt::SizePolicy::Minimum
50
+ end
51
+ end
52
+
53
+ end
54
+
55
+ end # module Cosmos
@@ -20,15 +20,16 @@ module Cosmos
20
20
  include Widget
21
21
  include LayoutWidget
22
22
 
23
- def initialize(parent_layout = nil, vSpacing = 3)
23
+ def initialize(parent_layout = nil, vSpacing = 3, vPack = true)
24
24
  super()
25
25
  setSpacing(vSpacing.to_i)
26
26
  parent_layout.addLayout(self) if parent_layout
27
+ @v_pack = ConfigParser::handle_true_false(vPack)
27
28
  end
28
29
 
29
30
  def process_settings
30
31
  super()
31
- addStretch(1)
32
+ addStretch(1) if @v_pack
32
33
  end
33
34
  end
34
35
 
@@ -20,17 +20,18 @@ module Cosmos
20
20
  include Widget
21
21
  include LayoutWidget
22
22
 
23
- def initialize(parent_layout = nil, title = "", vSpacing = 3)
23
+ def initialize(parent_layout = nil, title = "", vSpacing = 3, vPack = true)
24
24
  super()
25
25
  box = Qt::GroupBox.new(title.to_s)
26
26
  setSpacing(vSpacing.to_i)
27
27
  box.setLayout(self)
28
28
  parent_layout.addWidget(box) if parent_layout
29
+ @v_pack = ConfigParser::handle_true_false(vPack)
29
30
  end
30
31
 
31
32
  def process_settings
32
33
  super()
33
- addStretch(1)
34
+ addStretch(1) if @v_pack
34
35
  end
35
36
  end
36
37
 
@@ -11,6 +11,7 @@
11
11
  require 'cosmos'
12
12
  require 'cosmos/gui/dialogs/tlm_details_dialog'
13
13
  require 'cosmos/gui/dialogs/tlm_edit_dialog'
14
+ require 'cosmos/gui/dialogs/tlm_graph_dialog'
14
15
 
15
16
  module Cosmos
16
17
 
@@ -153,6 +154,12 @@ module Cosmos
153
154
  @settings.each do |setting_name, setting_values|
154
155
  begin
155
156
  case setting_name
157
+ when 'TEXTALIGN'
158
+ sheet << "qproperty-alignment:Align#{setting_values[0].capitalize}"
159
+ when 'PADDING'
160
+ sheet << "padding:#{setting_values[0]}"
161
+ when 'MARGIN'
162
+ sheet << "margin:#{setting_values[0]}"
156
163
  when 'BACKCOLOR'
157
164
  case setting_values.size
158
165
  when 1 # color name
@@ -215,8 +222,9 @@ module Cosmos
215
222
  packets = System.telemetry.latest_packets(@target_name, @item_name)
216
223
  offset = 0
217
224
  packets.each do |packet|
218
- @dialogs << TlmDetailsDialog.new(nil, @target_name, packet.packet_name, @item_name)
219
- @dialogs[-1].move(dialog.x + offset, dialog.y + offset)
225
+ dialog = TlmDetailsDialog.new(nil, @target_name, packet.packet_name, @item_name)
226
+ dialog.move(dialog.x + offset, dialog.y + offset)
227
+ @dialogs << dialog
220
228
  offset += 30
221
229
  end
222
230
  else
@@ -236,13 +244,7 @@ module Cosmos
236
244
 
237
245
  graph = Qt::Action.new("Graph #{@target_name} #{@packet_name} #{@item_name}", menu)
238
246
  graph.connect(SIGNAL('triggered()')) do
239
- if Kernel.is_windows?
240
- Cosmos.run_process("rubyw tools/TlmGrapher -i \"#{@target_name} #{@packet_name} #{@item_name}\" --system #{File.basename(System.initial_filename)}")
241
- elsif Kernel.is_mac? and File.exist?("tools/mac/TlmGrapher.app")
242
- Cosmos.run_process("open tools/mac/TlmGrapher.app --args -i \"#{@target_name} #{@packet_name} #{@item_name}\" --system #{File.basename(System.initial_filename)}")
243
- else
244
- Cosmos.run_process("ruby tools/TlmGrapher -i \"#{@target_name} #{@packet_name} #{@item_name}\" --system #{File.basename(System.initial_filename)}")
245
- end
247
+ TlmGraphDialog.new(self, target_name, packet_name, item_name)
246
248
  end
247
249
  menu.addAction(graph)
248
250
 
@@ -251,7 +253,5 @@ module Cosmos
251
253
  point.dispose
252
254
  menu.dispose
253
255
  end
254
-
255
256
  end
256
-
257
- end # module Cosmos
257
+ end
@@ -70,15 +70,17 @@ module Cosmos
70
70
  $VERBOSE = saved_verbose
71
71
  end
72
72
 
73
- # Searches for the file userpath.txt to define the USERPATH constant
73
+ # Searches for the /config/system and /config/targets directories to define
74
+ # the USERPATH constant
74
75
  #
75
- # @param start_dir [String] Path to start the search for userpath.txt. The
76
- # search will continue by moving up directories until the root directory is
77
- # reached.
76
+ # @param start_dir [String] Path to start the search for the /config/system
77
+ # and /config/targets directories. The search will continue by moving up
78
+ # directories until the root directory is reached.
78
79
  def self.define_user_path(start_dir = Dir.pwd)
79
80
  current_dir = File.expand_path(start_dir)
80
81
  while true
81
- if File.exist?(File.join(current_dir, 'userpath.txt'))
82
+ if File.exist?(File.join(current_dir, 'config', 'system')) and
83
+ File.exist?(File.join(current_dir, 'config', 'targets'))
82
84
  disable_warnings do
83
85
  Cosmos.const_set(:USERPATH, current_dir)
84
86
  end
@@ -113,7 +115,7 @@ module Cosmos
113
115
  Cosmos.const_set(:USERPATH, ENV['COSMOS_USERPATH'])
114
116
  end
115
117
  else
116
- # Give up and assume we are in the tools directory and there is no userpath.txt file
118
+ # Give up and assume we are in the tools directory
117
119
  disable_warnings do
118
120
  Cosmos.const_set(:USERPATH, File.expand_path(File.join(File.dirname($0), '..')))
119
121
  end
@@ -572,7 +574,7 @@ module Cosmos
572
574
  retry_count = 0
573
575
  begin
574
576
  yield
575
- rescue Exception => error
577
+ rescue => error
576
578
  Logger.error "#{name} thread unexpectedly died. Retries: #{retry_count} of #{retry_attempts}"
577
579
  Logger.error error.formatted
578
580
  retry_count += 1
@@ -589,30 +591,38 @@ module Cosmos
589
591
  # convention of having a single class per file where the class name is camel
590
592
  # cased and filename is lowercase with underscores.
591
593
  #
592
- # @param class_filename [String] The name of the file which contains the
594
+ # @param class_name_or_class_filename [String] The name of the class or the file which contains the
593
595
  # Ruby class to require
594
- def self.require_class(class_filename)
595
- class_name = class_filename.filename_to_class_name
596
- return class_name.to_class if class_name.to_class and defined? class_name.to_class
597
- self.require_file(class_filename)
598
- klass = class_name.to_class
599
- if klass
600
- return klass
596
+ # @param log_error [Boolean] Whether to log an error if we can not require
597
+ # the class
598
+ def self.require_class(class_name_or_class_filename, log_error = true)
599
+ if class_name_or_class_filename.downcase[-3..-1] == '.rb' or (class_name_or_class_filename[0] == class_name_or_class_filename[0].downcase)
600
+ class_filename = class_name_or_class_filename
601
+ class_name = class_filename.filename_to_class_name
601
602
  else
602
- raise "Ruby class #{class_name} not found"
603
+ class_name = class_name_or_class_filename
604
+ class_filename = class_name.class_name_to_filename
603
605
  end
606
+ return class_name.to_class if class_name.to_class and defined? class_name.to_class
607
+ self.require_file(class_filename, log_error)
608
+ klass = class_name.to_class
609
+ raise "Ruby class #{class_name} not found" unless klass
610
+ klass
604
611
  end
605
612
 
606
613
  # Requires a file with a standard error message if it fails
607
614
  #
608
615
  # @param filename [String] The name of the file to require
609
- def self.require_file(filename)
616
+ # @param log_error [Boolean] Whether to log an error if we can not require
617
+ # the class
618
+ def self.require_file(filename, log_error = true)
610
619
  begin
611
620
  require filename
612
621
  rescue Exception => err
613
- msg = "Unable to require #{filename} due to #{err.message}. Ensure #{filename} is in the COSMOS lib directory."
614
- Logger.error msg
615
- raise msg
622
+ msg = "Unable to require #{filename} due to #{err.message}. "\
623
+ "Ensure #{filename} is in the COSMOS lib directory."
624
+ Logger.error msg if log_error
625
+ raise $!, msg, $!.backtrace
616
626
  end
617
627
  end
618
628
 
@@ -705,8 +715,8 @@ module Cosmos
705
715
  if owner and owner.respond_to? :graceful_kill
706
716
  if Thread.current != thread
707
717
  owner.graceful_kill
708
- end_time = Time.now + graceful_timeout
709
- while thread.alive? && ((end_time - Time.now) > 0)
718
+ end_time = Time.now.sys + graceful_timeout
719
+ while thread.alive? && ((end_time - Time.now.sys) > 0)
710
720
  sleep(timeout_interval)
711
721
  end
712
722
  else
@@ -719,8 +729,8 @@ module Cosmos
719
729
  # Graceful failed
720
730
  Logger.warn "Failed to gracefully kill thread:\n Caller Backtrace:\n #{caller().join("\n ")}\n \n Thread Backtrace:\n #{thread.backtrace.join("\n ")}\n\n"
721
731
  thread.kill
722
- end_time = Time.now + hard_timeout
723
- while thread.alive? && ((end_time - Time.now) > 0)
732
+ end_time = Time.now.sys + hard_timeout
733
+ while thread.alive? && ((end_time - Time.now.sys) > 0)
724
734
  sleep(timeout_interval)
725
735
  end
726
736
  end
@@ -8,13 +8,32 @@
8
8
  # as published by the Free Software Foundation; version 3 with
9
9
  # attribution addendums as found in the LICENSE.txt
10
10
 
11
- require 'cosmos/ext/crc'
11
+ require 'cosmos/ext/crc' if RUBY_ENGINE == 'ruby' and !ENV['COSMOS_NO_EXT']
12
12
 
13
13
  module Cosmos
14
14
 
15
15
  # Abstract base class which {Crc16}, {Crc32} and {Crc64} use. Do NOT use this
16
16
  # class directly but instead use one of the subclasses.
17
17
  class Crc
18
+ BIT_REVERSE_TABLE = [
19
+ 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,
20
+ 0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8, 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8,
21
+ 0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4, 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,
22
+ 0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC, 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC,
23
+ 0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2, 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,
24
+ 0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA, 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,
25
+ 0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6, 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6,
26
+ 0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE, 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE,
27
+ 0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1, 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1,
28
+ 0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9, 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,
29
+ 0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5, 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5,
30
+ 0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED, 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,
31
+ 0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3, 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3,
32
+ 0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB, 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB,
33
+ 0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7, 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
34
+ 0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF
35
+ ]
36
+
18
37
  # @return [Integer] The polynomial used when calcuating the CRC
19
38
  attr_reader :poly
20
39
  # @return [Integer] Seed value used to start the calulation
@@ -38,20 +57,33 @@ module Cosmos
38
57
  @seed = seed
39
58
  @xor = xor
40
59
  @reflect = reflect
41
- @table = ''
60
+ if RUBY_ENGINE == 'ruby' and !ENV['COSMOS_NO_EXT']
61
+ @table = ''
62
+ else
63
+ @table = []
64
+ end
42
65
 
43
66
  # Determine which class we're using: Crc16, Crc32, Crc64
44
- digits = self.class.name[-2..-1].to_i
45
- case digits
67
+ @bit_size = self.class.name[-2..-1].to_i
68
+ case @bit_size
46
69
  when 16
47
70
  pack = 'S'
71
+ filter_mask = 0xFFFF
48
72
  when 32
49
73
  pack = 'I'
74
+ filter_mask = 0xFFFFFFFF
50
75
  when 64
51
76
  pack = 'Q'
77
+ filter_mask = 0xFFFFFFFFFFFFFFFF
52
78
  end
53
- (0..255).each do |index|
54
- @table << [compute_table_entry(index, digits)].pack(pack)
79
+ if RUBY_ENGINE == 'ruby' and !ENV['COSMOS_NO_EXT']
80
+ (0..255).each do |index|
81
+ @table << [compute_table_entry(index, @bit_size)].pack(pack)
82
+ end
83
+ else
84
+ (0..255).each do |index|
85
+ @table << (compute_table_entry(index, @bit_size) & filter_mask)
86
+ end
55
87
  end
56
88
  end
57
89
 
@@ -64,6 +96,76 @@ module Cosmos
64
96
  # to use the default seed set in the constructor.
65
97
  # @return [Integer] The CRC value
66
98
 
99
+ def bit_reverse_8(value)
100
+ BIT_REVERSE_TABLE[value & 0xFF]
101
+ end
102
+
103
+ def bit_reverse_16(value)
104
+ (BIT_REVERSE_TABLE[value & 0xFF] << 8) |
105
+ (BIT_REVERSE_TABLE[(value >> 8) & 0xFF])
106
+ end
107
+
108
+ def bit_reverse_32(value)
109
+ (BIT_REVERSE_TABLE[value & 0xFF] << 24) |
110
+ (BIT_REVERSE_TABLE[(value >> 8) & 0xFF] << 16) |
111
+ (BIT_REVERSE_TABLE[(value >> 16) & 0xFF] << 8) |
112
+ (BIT_REVERSE_TABLE[(value >> 24) & 0xFF])
113
+ end
114
+
115
+ def bit_reverse_64(value)
116
+ (BIT_REVERSE_TABLE[value & 0x00000000000000FF] << 56) |
117
+ (BIT_REVERSE_TABLE[(value >> 8) & 0x00000000000000FF] << 48) |
118
+ (BIT_REVERSE_TABLE[(value >> 16) & 0x00000000000000FF] << 40) |
119
+ (BIT_REVERSE_TABLE[(value >> 24) & 0x00000000000000FF] << 32) |
120
+ (BIT_REVERSE_TABLE[(value >> 32) & 0x00000000000000FF] << 24) |
121
+ (BIT_REVERSE_TABLE[(value >> 40) & 0x00000000000000FF] << 16) |
122
+ (BIT_REVERSE_TABLE[(value >> 48) & 0x00000000000000FF] << 8) |
123
+ (BIT_REVERSE_TABLE[(value >> 56) & 0x00000000000000FF])
124
+ end
125
+
126
+ if RUBY_ENGINE != 'ruby' or ENV['COSMOS_NO_EXT']
127
+ def calc(data, seed = @seed)
128
+ crc = seed
129
+
130
+ case @bit_size
131
+ when 16
132
+ right_shift = 8
133
+ filter_mask = 0xFFFF
134
+ final_bit_reverse = method(:bit_reverse_16)
135
+ when 32
136
+ right_shift = 24
137
+ filter_mask = 0xFFFFFFFF
138
+ final_bit_reverse = method(:bit_reverse_32)
139
+ when 64
140
+ right_shift = 56
141
+ filter_mask = 0xFFFFFFFFFFFFFFFF
142
+ final_bit_reverse = method(:bit_reverse_64)
143
+ end
144
+
145
+ if @reflect
146
+ data.each_byte do |byte|
147
+ crc = ((crc << 8) & filter_mask) ^ @table[(crc >> right_shift) ^ bit_reverse_8(byte)]
148
+ end
149
+
150
+ if @xor
151
+ return final_bit_reverse.call(crc ^ filter_mask)
152
+ else
153
+ return final_bit_reverse.call(crc)
154
+ end
155
+ else
156
+ data.each_byte do |byte|
157
+ crc = ((crc << 8) & filter_mask) ^ @table[(crc >> right_shift) ^ byte]
158
+ end
159
+
160
+ if @xor
161
+ return crc ^ filter_mask
162
+ else
163
+ return crc
164
+ end
165
+ end
166
+ end
167
+ end
168
+
67
169
  protected
68
170
 
69
171
  # Compute a single entry in the crc lookup table
@@ -11,7 +11,6 @@
11
11
  require 'csv'
12
12
 
13
13
  module Cosmos
14
-
15
14
  # Reads in a comma separated values (CSV) configuration file and
16
15
  # allows access via the Hash bracket syntax. It allows the user to write
17
16
  # back data to the configuration file to store state.
@@ -43,6 +42,47 @@ module Cosmos
43
42
  @hash[index]
44
43
  end
45
44
 
45
+ # Convenience method to access a value by key and convert it to a boolean.
46
+ # The csv value must be 'TRUE' or 'FALSE' (case doesn't matter)
47
+ # and will be converted to Ruby true or false values.
48
+ #
49
+ # @param item [String] Key to access the value
50
+ # @param index [Integer] Which value to return
51
+ # @return [Boolean] Single value converted to a boolean (true or false)
52
+ def bool(item, index = 0)
53
+ raise "#{item} not found" unless keys.include?(item)
54
+ case @hash[item][index].upcase
55
+ when 'TRUE'
56
+ true
57
+ when 'FALSE'
58
+ false
59
+ else
60
+ raise "#{item} value of #{@hash[item][index]} not boolean. Must be 'TRUE' 'or 'FALSE'."
61
+ end
62
+ end
63
+ alias boolean bool
64
+
65
+ # Convenience method to access a value by key and convert it to an integer
66
+ #
67
+ # @param item [String] Key to access the value
68
+ # @param index [Integer] Which value to return
69
+ # @return [Integer] Single value converted to an integer
70
+ def int(item, index = 0)
71
+ raise "#{item} not found" unless keys.include?(item)
72
+ @hash[item][index].to_i
73
+ end
74
+ alias integer int
75
+
76
+ # Convenience method to access a value by key and convert it to a float
77
+ #
78
+ # @param item [String] Key to access the value
79
+ # @param index [Integer] Which value to return
80
+ # @return [Float] Single value converted to a float
81
+ def float(item, index = 0)
82
+ raise "#{item} not found" unless keys.include?(item)
83
+ @hash[item][index].to_f
84
+ end
85
+
46
86
  # Creates a copy of the CSV file passed into the constructor. The file will
47
87
  # be prefixed by the current date and time to create a unique filename.
48
88
  # By default this file is created in the COSMOS/logs directory. Subsequent
@@ -52,10 +92,22 @@ module Cosmos
52
92
  # @param path [String] Path location to create the archive file. If nil the
53
93
  # file will be created in COSMOS/logs.
54
94
  def create_archive(path = nil)
55
- raise "Archive file \"#{@archive.path}\" already open." unless @archive.nil?
95
+ close_archive() if @archive
56
96
  path = System.paths['LOGS'] if path.nil?
57
- @archive_file = File.join(path, File.build_timestamped_filename([File.basename(@filename)], ''))
58
- @archive = File.open(@archive_file,"w")
97
+
98
+ attempt = nil
99
+ while true
100
+ name = File.build_timestamped_filename([File.basename(@filename, '.csv'), attempt], '.csv')
101
+ @archive_file = File.join(path, name)
102
+ if File.exist?(@archive_file)
103
+ attempt ||= 0
104
+ attempt += 1
105
+ else
106
+ break
107
+ end
108
+ end
109
+
110
+ @archive = File.open(@archive_file, "w")
59
111
  @hash.each do |key, values|
60
112
  @archive.puts "#{key},#{values.join(',')}"
61
113
  end
@@ -63,21 +115,23 @@ module Cosmos
63
115
  end
64
116
 
65
117
  # Write the archive file created by #{CSV#create_archive}. This method will
66
- # append a CSV row to the archive file by joining all the values in the
67
- # array into a CSV entry.
118
+ # append a row to the archive file by joining writing the value.
68
119
  #
69
- # @param [Array] values Array of values which will go in columns 1-n
70
- def write_archive(values)
71
- raise "Archive file not opened! Call create_archive." if @archive.nil?
72
- @archive.puts values.join(',')
120
+ # @param value [Objct|Array] Simply value to write to the end of the
121
+ # archive or array of values which will be written out as CSV
122
+ def write_archive(value)
123
+ create_archive() unless @archive
124
+ if value.is_a? Array
125
+ @archive.puts value.join(',')
126
+ else
127
+ @archive.puts value
128
+ end
73
129
  end
74
130
 
75
- # Closes the archive file created by #{CSV#create_archive}. Once this method is
76
- # called, {#write_archive} will throw an exception.
131
+ # Closes the archive file created by #{CSV#create_archive}.
77
132
  def close_archive
78
133
  @archive.close
79
134
  @archive = nil
80
135
  end
81
-
82
- end # class Csv
136
+ end
83
137
  end