cosmos 3.0.1 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.coveralls.yml +1 -0
- data/.gitignore +48 -48
- data/.travis.yml +7 -7
- data/CONTRIBUTING.txt +50 -50
- data/Gemfile +6 -6
- data/Guardfile +27 -27
- data/LICENSE.txt +879 -879
- data/Manifest.txt +1116 -1114
- data/README.md +109 -107
- data/Rakefile +214 -214
- data/autohotkey/config/data/diamond.STL +57 -57
- data/autohotkey/config/system/system.txt +34 -34
- data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
- data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
- data/autohotkey/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
- data/autohotkey/config/targets/COSMOS/target.txt +5 -5
- data/autohotkey/config/targets/INST/cmd_tlm/inst_cmds.txt +121 -121
- data/autohotkey/config/targets/INST/cmd_tlm/inst_tlm.txt +247 -247
- data/autohotkey/config/targets/INST/cmd_tlm_server.txt +5 -5
- data/autohotkey/config/targets/INST/lib/example_limits_response.rb +30 -30
- data/autohotkey/config/targets/INST/lib/sim_inst.rb +305 -294
- data/autohotkey/config/targets/INST/screens/adcs.txt +46 -46
- data/autohotkey/config/targets/INST/screens/array.txt +7 -7
- data/autohotkey/config/targets/INST/screens/block.txt +8 -8
- data/autohotkey/config/targets/INST/screens/commanding.txt +30 -30
- data/autohotkey/config/targets/INST/screens/graphs.txt +14 -14
- data/autohotkey/config/targets/INST/screens/ground.txt +25 -25
- data/autohotkey/config/targets/INST/screens/health_status.txt +33 -33
- data/autohotkey/config/targets/INST/screens/hs.txt +49 -49
- data/autohotkey/config/targets/INST/screens/image.txt +21 -21
- data/autohotkey/config/targets/INST/screens/latest.txt +23 -23
- data/autohotkey/config/targets/INST/screens/mech.txt +25 -25
- data/autohotkey/config/targets/INST/screens/other.txt +25 -25
- data/autohotkey/config/targets/INST/screens/params.txt +25 -25
- data/autohotkey/config/targets/INST/screens/tabs.txt +68 -68
- data/autohotkey/config/targets/INST/target.txt +26 -26
- data/autohotkey/config/targets/META/cmd_tlm/meta_cmd.txt +10 -10
- data/autohotkey/config/targets/META/cmd_tlm/meta_tlm.txt +9 -9
- data/autohotkey/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
- data/autohotkey/config/targets/SYSTEM/screens/error.txt +11 -11
- data/autohotkey/config/tools/cmd_tlm_server/cmd_tlm_server.txt +22 -22
- data/autohotkey/config/tools/data_viewer/data_viewer.txt +11 -11
- data/autohotkey/config/tools/handbook_creator/handbook_creator.txt +49 -49
- data/autohotkey/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
- data/autohotkey/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
- data/autohotkey/config/tools/handbook_creator/templates/footer.html.erb +9 -9
- data/autohotkey/config/tools/handbook_creator/templates/header.html.erb +25 -25
- data/autohotkey/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
- data/autohotkey/config/tools/handbook_creator/templates/nav.html.erb +27 -27
- data/autohotkey/config/tools/handbook_creator/templates/overview.html.erb +1 -1
- data/autohotkey/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
- data/autohotkey/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
- data/autohotkey/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
- data/autohotkey/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
- data/autohotkey/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
- data/autohotkey/config/tools/handbook_creator/templates/title.html.erb +1 -1
- data/autohotkey/config/tools/launcher/launcher.txt +38 -38
- data/autohotkey/config/tools/script_runner/script_runner.txt +3 -3
- data/autohotkey/config/tools/table_manager/ConfigTables_def.txt +8 -8
- data/autohotkey/config/tools/table_manager/OneDimensionalTable_def.txt +19 -19
- data/autohotkey/config/tools/table_manager/TwoDimensionalTable_def.txt +248 -248
- data/autohotkey/config/tools/test_runner/test_runner.txt +8 -8
- data/autohotkey/config/tools/test_runner/test_runner2.txt +11 -11
- data/autohotkey/config/tools/test_runner/test_runner3.txt +6 -6
- data/autohotkey/config/tools/test_runner/test_runner4.txt +1 -1
- data/autohotkey/config/tools/tlm_extractor/tlm_extractor.txt +13 -13
- data/autohotkey/config/tools/tlm_extractor/tlm_extractor2.txt +9 -9
- data/autohotkey/config/tools/tlm_grapher/bad.txt +50 -50
- data/autohotkey/config/tools/tlm_grapher/temp1-4.txt +51 -51
- data/autohotkey/config/tools/tlm_grapher/test2.txt +111 -111
- data/autohotkey/config/tools/tlm_viewer/tlm_viewer.txt +24 -24
- data/autohotkey/config/tools/tlm_viewer/tlm_viewer2.txt +4 -4
- data/autohotkey/config/tools/tlm_viewer/tlm_viewer3.txt +3 -3
- data/autohotkey/lib/example_background_task.rb +42 -42
- data/autohotkey/lib/user_version.rb +3 -3
- data/autohotkey/procedures/clear_util.rb +7 -7
- data/autohotkey/procedures/collect.rb +18 -18
- data/autohotkey/procedures/collect_util.rb +14 -14
- data/autohotkey/procedures/example_test.rb +67 -67
- data/autohotkey/procedures/example_test2.rb +74 -74
- data/autohotkey/procedures/script_test.rb +17 -17
- data/autohotkey/procedures/syntax_error.rb +18 -18
- data/autohotkey/tools/CmdExtractorAHK +16 -16
- data/autohotkey/tools/CmdSender +14 -14
- data/autohotkey/tools/CmdSenderAHK +18 -18
- data/autohotkey/tools/CmdTlmServer +14 -14
- data/autohotkey/tools/CmdTlmServerAHK +28 -28
- data/autohotkey/tools/CmdTlmServerAHK2 +17 -17
- data/autohotkey/tools/DataViewer +14 -14
- data/autohotkey/tools/DataViewerAHK +17 -17
- data/autohotkey/tools/HandbookCreatorAHK +20 -20
- data/autohotkey/tools/LauncherAHK +17 -17
- data/autohotkey/tools/LimitsMonitorAHK +20 -20
- data/autohotkey/tools/OpenGLBuilderAHK +20 -20
- data/autohotkey/tools/PacketViewer +14 -14
- data/autohotkey/tools/PacketViewerAHK +18 -18
- data/autohotkey/tools/PacketViewerAHK2 +17 -17
- data/autohotkey/tools/Replay +14 -14
- data/autohotkey/tools/Replay.bat +59 -59
- data/autohotkey/tools/ReplayAHK +17 -17
- data/autohotkey/tools/ScriptRunner +14 -14
- data/autohotkey/tools/ScriptRunnerAHK +20 -20
- data/autohotkey/tools/ScriptRunnerAHK2 +17 -17
- data/autohotkey/tools/TableManager +14 -14
- data/autohotkey/tools/TableManagerAHK +30 -30
- data/autohotkey/tools/TestRunner +15 -15
- data/autohotkey/tools/TestRunnerAHK +17 -17
- data/autohotkey/tools/TestRunnerAHK2 +17 -17
- data/autohotkey/tools/TestRunnerAHK3 +17 -17
- data/autohotkey/tools/TestRunnerAHK4 +17 -17
- data/autohotkey/tools/TlmExtractor +15 -15
- data/autohotkey/tools/TlmExtractorAHK +19 -19
- data/autohotkey/tools/TlmExtractorAHK2 +16 -16
- data/autohotkey/tools/TlmExtractorAHK3 +16 -16
- data/autohotkey/tools/TlmGrapher +14 -14
- data/autohotkey/tools/TlmGrapherAHK +19 -19
- data/autohotkey/tools/TlmGrapherAHK2 +23 -23
- data/autohotkey/tools/TlmGrapherAHK3 +17 -17
- data/autohotkey/tools/TlmGrapherAHK4 +17 -17
- data/autohotkey/tools/TlmViewer +14 -14
- data/autohotkey/tools/TlmViewerAHK +28 -28
- data/autohotkey/tools/TlmViewerAHK2 +18 -18
- data/autohotkey/tools/TlmViewerAHK3 +18 -18
- data/autohotkey/tools/TlmViewerAHK4 +18 -18
- data/autohotkey/tools/TlmViewerAHK5 +18 -18
- data/autohotkey/tools/autohotkey.rb +37 -37
- data/autohotkey/tools/cmd_extractor.ahk +27 -27
- data/autohotkey/tools/cmd_sender.ahk +182 -162
- data/autohotkey/tools/cmd_tlm_server.ahk +89 -89
- data/autohotkey/tools/cmd_tlm_server2.ahk +45 -45
- data/autohotkey/tools/data_viewer.ahk +135 -135
- data/autohotkey/tools/handbook_creator.ahk +23 -23
- data/autohotkey/tools/launcher.ahk +41 -41
- data/autohotkey/tools/limits_monitor.ahk +70 -70
- data/autohotkey/tools/open_gl_builder.ahk +134 -134
- data/autohotkey/tools/packet_viewer.ahk +143 -143
- data/autohotkey/tools/packet_viewer2.ahk +9 -9
- data/autohotkey/tools/replay.ahk +98 -98
- data/autohotkey/tools/script_runner.ahk +589 -589
- data/autohotkey/tools/script_runner2.ahk +34 -31
- data/autohotkey/tools/table_manager.ahk +220 -220
- data/autohotkey/tools/test_runner.ahk +262 -259
- data/autohotkey/tools/test_runner2.ahk +52 -52
- data/autohotkey/tools/test_runner3.ahk +13 -13
- data/autohotkey/tools/tlm_extractor.ahk +272 -272
- data/autohotkey/tools/tlm_grapher.ahk +642 -642
- data/autohotkey/tools/tlm_grapher2.ahk +115 -115
- data/autohotkey/tools/tlm_grapher3.ahk +24 -24
- data/autohotkey/tools/tlm_viewer.ahk +133 -133
- data/autohotkey/tools/tlm_viewer2.ahk +50 -49
- data/autohotkey/tools/tlm_viewer4.ahk +4 -4
- data/autohotkey/tools/tlm_viewer5.ahk +20 -20
- data/bin/cosmos +96 -96
- data/bin/cstol_converter +1166 -1166
- data/bin/rubysloc +85 -85
- data/cosmos.gemspec +98 -97
- data/data/about.txt +4 -4
- data/data/crc.txt +306 -305
- data/data/diamond.STL +57 -57
- data/data/legal.txt +9 -9
- data/demo/Gemfile +6 -6
- data/demo/Launcher +15 -15
- data/demo/Launcher.bat +59 -59
- data/demo/Rakefile +61 -61
- data/demo/config/data/crc.txt +222 -206
- data/demo/config/data/diamond.STL +57 -57
- data/demo/config/data/meta_init.txt +4 -4
- data/demo/config/system/system.txt +34 -34
- data/demo/config/system/system2.txt +33 -33
- data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
- data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
- data/demo/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
- data/demo/config/targets/COSMOS/screens/limits_change.txt +20 -20
- data/demo/config/targets/COSMOS/screens/version.txt +19 -19
- data/demo/config/targets/COSMOS/target.txt +11 -11
- data/demo/config/targets/EXAMPLE/cmd_tlm/example_cmds.txt +2 -2
- data/demo/config/targets/EXAMPLE/cmd_tlm/example_tlm.txt +3 -3
- data/demo/config/targets/EXAMPLE/cmd_tlm_server.txt +6 -6
- data/demo/config/targets/EXAMPLE/lib/example_interface.rb +22 -22
- data/demo/config/targets/EXAMPLE/target.txt +6 -6
- data/demo/config/targets/INST/cmd_tlm/inst_cmds.txt +121 -121
- data/demo/config/targets/INST/cmd_tlm/inst_tlm.txt +247 -247
- data/demo/config/targets/INST/cmd_tlm_server.txt +5 -5
- data/demo/config/targets/INST/lib/example_limits_response.rb +30 -30
- data/demo/config/targets/INST/lib/sim_inst.rb +305 -294
- data/demo/config/targets/INST/screens/adcs.txt +46 -46
- data/demo/config/targets/INST/screens/array.txt +15 -15
- data/demo/config/targets/INST/screens/block.txt +8 -8
- data/demo/config/targets/INST/screens/commanding.txt +30 -30
- data/demo/config/targets/INST/screens/graphs.txt +14 -14
- data/demo/config/targets/INST/screens/ground.txt +25 -25
- data/demo/config/targets/INST/screens/hs.txt +44 -44
- data/demo/config/targets/INST/screens/latest.txt +23 -23
- data/demo/config/targets/INST/screens/other.txt +29 -29
- data/demo/config/targets/INST/screens/tabs.txt +70 -70
- data/demo/config/targets/INST/target.txt +33 -33
- data/demo/config/targets/META/cmd_tlm/meta_cmd.txt +10 -10
- data/demo/config/targets/META/cmd_tlm/meta_tlm.txt +13 -13
- data/demo/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
- data/demo/config/targets/SYSTEM/cmd_tlm/override.txt +29 -29
- data/demo/config/targets/SYSTEM/screens/status.txt +12 -12
- data/demo/config/targets/TEMPLATED/cmd_tlm/templated_cmds.txt +13 -12
- data/demo/config/targets/TEMPLATED/cmd_tlm/templated_tlm.txt +3 -3
- data/demo/config/targets/TEMPLATED/cmd_tlm_server.txt +6 -6
- data/demo/config/targets/TEMPLATED/lib/templated_interface.rb +54 -48
- data/demo/config/targets/TEMPLATED/target.txt +6 -6
- data/demo/config/tools/cmd_tlm_server/cmd_tlm_server.txt +33 -33
- data/demo/config/tools/cmd_tlm_server/cmd_tlm_server2.txt +29 -29
- data/demo/config/tools/data_viewer/data_viewer.txt +11 -11
- data/demo/config/tools/handbook_creator/handbook_creator.txt +66 -66
- data/demo/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
- data/demo/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
- data/demo/config/tools/handbook_creator/templates/footer.html.erb +9 -9
- data/demo/config/tools/handbook_creator/templates/header.html.erb +25 -25
- data/demo/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
- data/demo/config/tools/handbook_creator/templates/nav.html.erb +27 -27
- data/demo/config/tools/handbook_creator/templates/overview.html.erb +1 -1
- data/demo/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
- data/demo/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
- data/demo/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
- data/demo/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
- data/demo/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
- data/demo/config/tools/handbook_creator/templates/title.html.erb +1 -1
- data/demo/config/tools/launcher/launcher.txt +45 -45
- data/demo/config/tools/launcher/launcher2.txt +45 -45
- data/demo/config/tools/script_runner/script_runner.txt +3 -3
- data/demo/config/tools/table_manager/ConfigTables_def.txt +8 -8
- data/demo/config/tools/table_manager/ExampleTableDefinition.txt +24 -24
- data/demo/config/tools/table_manager/MCConfigurationTable_fsw1_def.txt +25 -25
- data/demo/config/tools/table_manager/MCConfigurationTable_fsw2_def.txt +25 -25
- data/demo/config/tools/table_manager/PPSSelectionTable_def.txt +8 -8
- data/demo/config/tools/table_manager/TLMMonitoringTable_def.txt +248 -248
- data/demo/config/tools/test_runner/test_runner.txt +17 -17
- data/demo/config/tools/tlm_extractor/tlm_extractor.txt +13 -13
- data/demo/config/tools/tlm_extractor/tlm_extractor2.txt +2 -2
- data/demo/config/tools/tlm_extractor/tlm_extractor3.txt +2 -2
- data/demo/config/tools/tlm_extractor/tlm_extractor4.txt +2 -2
- data/demo/config/tools/tlm_viewer/tlm_viewer.txt +41 -41
- data/demo/lib/example_background_task.rb +57 -52
- data/demo/lib/example_target.rb +113 -108
- data/demo/lib/scpi_target.rb +74 -74
- data/demo/lib/user_version.rb +3 -3
- data/demo/procedures/checks.rb +11 -11
- data/demo/procedures/clear_util.rb +7 -7
- data/demo/procedures/collect.rb +18 -18
- data/demo/procedures/collect_util.rb +14 -14
- data/demo/procedures/cosmos_api_test.rb +293 -293
- data/demo/procedures/disconnect.rb +29 -29
- data/demo/procedures/example_test.rb +182 -182
- data/demo/procedures/plot_test.rb +8 -8
- data/demo/procedures/run_example_test.rb +3 -3
- data/demo/procedures/test.rb +51 -51
- data/demo/tools/CmdExtractor +15 -15
- data/demo/tools/CmdExtractor.bat +59 -59
- data/demo/tools/CmdSender +15 -15
- data/demo/tools/CmdSender.bat +59 -59
- data/demo/tools/CmdTlmServer +15 -15
- data/demo/tools/CmdTlmServer.bat +59 -59
- data/demo/tools/DataViewer +15 -15
- data/demo/tools/DataViewer.bat +59 -59
- data/demo/tools/ExampleTarget +15 -15
- data/demo/tools/ExampleTarget.bat +59 -59
- data/demo/tools/HandbookCreator +15 -15
- data/demo/tools/HandbookCreator.bat +61 -61
- data/demo/tools/Launcher +15 -15
- data/demo/tools/Launcher.bat +59 -59
- data/demo/tools/LimitsMonitor +15 -15
- data/demo/tools/LimitsMonitor.bat +59 -59
- data/demo/tools/OpenGLBuilder +15 -15
- data/demo/tools/OpenGLBuilder.bat +59 -59
- data/demo/tools/PacketViewer +15 -15
- data/demo/tools/PacketViewer.bat +59 -59
- data/demo/tools/Replay +15 -15
- data/demo/tools/Replay.bat +59 -59
- data/demo/tools/ScpiTarget +15 -15
- data/demo/tools/ScpiTarget.bat +59 -59
- data/demo/tools/ScriptRunner +15 -15
- data/demo/tools/ScriptRunner.bat +59 -59
- data/demo/tools/TableManager +15 -15
- data/demo/tools/TableManager.bat +59 -59
- data/demo/tools/TestRunner +15 -15
- data/demo/tools/TestRunner.bat +59 -59
- data/demo/tools/TlmExtractor +15 -15
- data/demo/tools/TlmExtractor.bat +59 -59
- data/demo/tools/TlmGrapher +15 -15
- data/demo/tools/TlmGrapher.bat +59 -59
- data/demo/tools/TlmViewer +15 -15
- data/demo/tools/TlmViewer.bat +59 -59
- data/demo/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +15 -15
- data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +6 -6
- data/demo/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +15 -15
- data/demo/tools/mac/CmdSender.app/Contents/MacOS/main.sh +6 -6
- data/demo/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +15 -15
- data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +6 -6
- data/demo/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +15 -15
- data/demo/tools/mac/DataViewer.app/Contents/MacOS/main.sh +6 -6
- data/demo/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +15 -15
- data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +6 -6
- data/demo/tools/mac/Launcher.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +15 -15
- data/demo/tools/mac/Launcher.app/Contents/MacOS/main.sh +6 -6
- data/demo/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +15 -15
- data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +6 -6
- data/demo/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +15 -15
- data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +6 -6
- data/demo/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +15 -15
- data/demo/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +6 -6
- data/demo/tools/mac/Replay.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/Replay.app/Contents/MacOS/Replay.rb +15 -15
- data/demo/tools/mac/Replay.app/Contents/MacOS/main.sh +6 -6
- data/demo/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +15 -15
- data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +6 -6
- data/demo/tools/mac/TableManager.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +15 -15
- data/demo/tools/mac/TableManager.app/Contents/MacOS/main.sh +6 -6
- data/demo/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +15 -15
- data/demo/tools/mac/TestRunner.app/Contents/MacOS/main.sh +6 -6
- data/demo/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +15 -15
- data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +6 -6
- data/demo/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +15 -15
- data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +6 -6
- data/demo/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
- data/demo/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +15 -15
- data/demo/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +6 -6
- data/ext/cosmos/ext/array/array.c +111 -111
- data/ext/cosmos/ext/array/extconf.rb +13 -13
- data/ext/cosmos/ext/buffered_file/buffered_file.c +167 -167
- data/ext/cosmos/ext/buffered_file/extconf.rb +13 -13
- data/ext/cosmos/ext/config_parser/config_parser.c +237 -237
- data/ext/cosmos/ext/config_parser/extconf.rb +13 -13
- data/ext/cosmos/ext/cosmos_io/cosmos_io.c +117 -117
- data/ext/cosmos/ext/cosmos_io/extconf.rb +13 -13
- data/ext/cosmos/ext/crc/crc.c +341 -341
- data/ext/cosmos/ext/crc/extconf.rb +12 -12
- data/ext/cosmos/ext/line_graph/extconf.rb +13 -13
- data/ext/cosmos/ext/line_graph/line_graph.c +501 -501
- data/ext/cosmos/ext/low_fragmentation_array/extconf.rb +12 -12
- data/ext/cosmos/ext/low_fragmentation_array/low_fragmentation_array.c +261 -261
- data/ext/cosmos/ext/packet/extconf.rb +13 -13
- data/ext/cosmos/ext/packet/packet.c +339 -339
- data/ext/cosmos/ext/platform/extconf.rb +13 -13
- data/ext/cosmos/ext/platform/platform.c +81 -81
- data/ext/cosmos/ext/polynomial_conversion/extconf.rb +13 -13
- data/ext/cosmos/ext/polynomial_conversion/polynomial_conversion.c +73 -73
- data/ext/cosmos/ext/string/extconf.rb +13 -13
- data/ext/cosmos/ext/string/string.c +49 -49
- data/ext/cosmos/ext/structure/structure.c +894 -894
- data/ext/cosmos/ext/tabbed_plots_config/extconf.rb +13 -13
- data/ext/cosmos/ext/tabbed_plots_config/tabbed_plots_config.c +51 -51
- data/ext/cosmos/ext/telemetry/extconf.rb +13 -13
- data/ext/cosmos/ext/telemetry/telemetry.c +306 -306
- data/ext/mkrf_conf.rb +40 -40
- data/install/Gemfile +6 -6
- data/install/Launcher +14 -14
- data/install/Launcher.bat +59 -59
- data/install/Rakefile +61 -61
- data/install/config/data/crc.txt +134 -133
- data/install/config/system/system.txt +29 -29
- data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
- data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
- data/install/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
- data/install/config/targets/COSMOS/screens/limits_change.txt +20 -20
- data/install/config/targets/COSMOS/screens/version.txt +19 -19
- data/install/config/targets/COSMOS/target.txt +8 -8
- data/install/config/tools/cmd_tlm_server/cmd_tlm_server.txt +2 -2
- data/install/config/tools/data_viewer/data_viewer.txt +3 -3
- data/install/config/tools/handbook_creator/handbook_creator.txt +49 -49
- data/install/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
- data/install/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
- data/install/config/tools/handbook_creator/templates/footer.html.erb +9 -9
- data/install/config/tools/handbook_creator/templates/header.html.erb +25 -25
- data/install/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
- data/install/config/tools/handbook_creator/templates/nav.html.erb +27 -27
- data/install/config/tools/handbook_creator/templates/overview.html.erb +1 -1
- data/install/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
- data/install/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
- data/install/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
- data/install/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
- data/install/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
- data/install/config/tools/handbook_creator/templates/title.html.erb +1 -1
- data/install/config/tools/launcher/launcher.txt +39 -39
- data/install/config/tools/script_runner/script_runner.txt +3 -3
- data/install/config/tools/test_runner/test_runner.txt +8 -8
- data/install/config/tools/tlm_viewer/tlm_viewer.txt +5 -5
- data/install/lib/user_version.rb +3 -3
- data/install/tools/CmdExtractor +15 -15
- data/install/tools/CmdExtractor.bat +59 -59
- data/install/tools/CmdSender +15 -15
- data/install/tools/CmdSender.bat +59 -59
- data/install/tools/CmdTlmServer +15 -15
- data/install/tools/CmdTlmServer.bat +59 -59
- data/install/tools/DataViewer +15 -15
- data/install/tools/DataViewer.bat +59 -59
- data/install/tools/HandbookCreator +15 -15
- data/install/tools/HandbookCreator.bat +61 -61
- data/install/tools/Launcher +15 -15
- data/install/tools/Launcher.bat +59 -59
- data/install/tools/LimitsMonitor +15 -15
- data/install/tools/LimitsMonitor.bat +59 -59
- data/install/tools/OpenGLBuilder +15 -15
- data/install/tools/OpenGLBuilder.bat +59 -59
- data/install/tools/PacketViewer +15 -15
- data/install/tools/PacketViewer.bat +59 -59
- data/install/tools/Replay +15 -15
- data/install/tools/Replay.bat +59 -59
- data/install/tools/ScriptRunner +15 -15
- data/install/tools/ScriptRunner.bat +59 -59
- data/install/tools/TableManager +15 -15
- data/install/tools/TableManager.bat +59 -59
- data/install/tools/TestRunner +15 -15
- data/install/tools/TestRunner.bat +59 -59
- data/install/tools/TlmExtractor +15 -15
- data/install/tools/TlmExtractor.bat +59 -59
- data/install/tools/TlmGrapher +15 -15
- data/install/tools/TlmGrapher.bat +59 -59
- data/install/tools/TlmViewer +15 -15
- data/install/tools/TlmViewer.bat +59 -59
- data/install/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
- data/install/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +15 -15
- data/install/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +6 -6
- data/install/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
- data/install/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +15 -15
- data/install/tools/mac/CmdSender.app/Contents/MacOS/main.sh +6 -6
- data/install/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
- data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +15 -15
- data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +6 -6
- data/install/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
- data/install/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +15 -15
- data/install/tools/mac/DataViewer.app/Contents/MacOS/main.sh +6 -6
- data/install/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
- data/install/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +15 -15
- data/install/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +6 -6
- data/install/tools/mac/Launcher.app/Contents/Info.plist +38 -38
- data/install/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +15 -15
- data/install/tools/mac/Launcher.app/Contents/MacOS/main.sh +6 -6
- data/install/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
- data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +15 -15
- data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +6 -6
- data/install/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
- data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +15 -15
- data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +6 -6
- data/install/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
- data/install/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +15 -15
- data/install/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +6 -6
- data/install/tools/mac/Replay.app/Contents/Info.plist +38 -38
- data/install/tools/mac/Replay.app/Contents/MacOS/Replay.rb +15 -15
- data/install/tools/mac/Replay.app/Contents/MacOS/main.sh +6 -6
- data/install/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
- data/install/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +15 -15
- data/install/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +6 -6
- data/install/tools/mac/TableManager.app/Contents/Info.plist +38 -38
- data/install/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +15 -15
- data/install/tools/mac/TableManager.app/Contents/MacOS/main.sh +6 -6
- data/install/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
- data/install/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +15 -15
- data/install/tools/mac/TestRunner.app/Contents/MacOS/main.sh +6 -6
- data/install/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
- data/install/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +15 -15
- data/install/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +6 -6
- data/install/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
- data/install/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +15 -15
- data/install/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +6 -6
- data/install/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
- data/install/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +15 -15
- data/install/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +6 -6
- data/lib/cosmos.rb +63 -63
- data/lib/cosmos/ccsds/ccsds_packet.rb +63 -63
- data/lib/cosmos/ccsds/ccsds_parser.rb +143 -143
- data/lib/cosmos/config/config_parser.rb +324 -324
- data/lib/cosmos/conversions.rb +13 -13
- data/lib/cosmos/conversions/conversion.rb +47 -47
- data/lib/cosmos/conversions/generic_conversion.rb +55 -55
- data/lib/cosmos/conversions/new_packet_log_conversion.rb +45 -45
- data/lib/cosmos/conversions/polynomial_conversion.rb +57 -57
- data/lib/cosmos/conversions/processor_conversion.rb +46 -46
- data/lib/cosmos/conversions/received_count_conversion.rb +33 -33
- data/lib/cosmos/conversions/received_time_formatted_conversion.rb +37 -37
- data/lib/cosmos/conversions/received_time_seconds_conversion.rb +37 -37
- data/lib/cosmos/conversions/segmented_polynomial_conversion.rb +128 -128
- data/lib/cosmos/conversions/unix_time_conversion.rb +50 -50
- data/lib/cosmos/conversions/unix_time_formatted_conversion.rb +44 -44
- data/lib/cosmos/conversions/unix_time_seconds_conversion.rb +44 -44
- data/lib/cosmos/core_ext.rb +18 -18
- data/lib/cosmos/core_ext/array.rb +354 -354
- data/lib/cosmos/core_ext/class.rb +51 -51
- data/lib/cosmos/core_ext/cosmos_io.rb +29 -29
- data/lib/cosmos/core_ext/exception.rb +52 -52
- data/lib/cosmos/core_ext/file.rb +75 -75
- data/lib/cosmos/core_ext/hash.rb +28 -28
- data/lib/cosmos/core_ext/io.rb +75 -75
- data/lib/cosmos/core_ext/kernel.rb +38 -38
- data/lib/cosmos/core_ext/math.rb +119 -119
- data/lib/cosmos/core_ext/matrix.rb +146 -146
- data/lib/cosmos/core_ext/objectspace.rb +29 -29
- data/lib/cosmos/core_ext/range.rb +22 -22
- data/lib/cosmos/core_ext/socket.rb +32 -32
- data/lib/cosmos/core_ext/string.rb +310 -310
- data/lib/cosmos/core_ext/stringio.rb +24 -24
- data/lib/cosmos/core_ext/time.rb +446 -446
- data/lib/cosmos/gui/choosers/combobox_chooser.rb +130 -130
- data/lib/cosmos/gui/choosers/file_chooser.rb +68 -68
- data/lib/cosmos/gui/choosers/float_chooser.rb +82 -82
- data/lib/cosmos/gui/choosers/integer_chooser.rb +80 -80
- data/lib/cosmos/gui/choosers/string_chooser.rb +53 -53
- data/lib/cosmos/gui/choosers/telemetry_chooser.rb +317 -317
- data/lib/cosmos/gui/dialogs/about_dialog.rb +128 -128
- data/lib/cosmos/gui/dialogs/calendar_dialog.rb +136 -136
- data/lib/cosmos/gui/dialogs/cmd_details_dialog.rb +52 -52
- data/lib/cosmos/gui/dialogs/cmd_tlm_raw_dialog.rb +149 -149
- data/lib/cosmos/gui/dialogs/details_dialog.rb +174 -174
- data/lib/cosmos/gui/dialogs/exception_dialog.rb +97 -97
- data/lib/cosmos/gui/dialogs/exception_list_dialog.rb +59 -59
- data/lib/cosmos/gui/dialogs/find_replace_dialog.rb +196 -196
- data/lib/cosmos/gui/dialogs/legal_dialog.rb +169 -168
- data/lib/cosmos/gui/dialogs/packet_log_dialog.rb +118 -118
- data/lib/cosmos/gui/dialogs/progress_dialog.rb +270 -262
- data/lib/cosmos/gui/dialogs/pry_dialog.rb +165 -161
- data/lib/cosmos/gui/dialogs/scroll_text_dialog.rb +37 -37
- data/lib/cosmos/gui/dialogs/select_dialog.rb +54 -54
- data/lib/cosmos/gui/dialogs/set_tlm_dialog.rb +131 -131
- data/lib/cosmos/gui/dialogs/splash.rb +113 -113
- data/lib/cosmos/gui/dialogs/tlm_details_dialog.rb +206 -206
- data/lib/cosmos/gui/dialogs/tlm_edit_dialog.rb +81 -81
- data/lib/cosmos/gui/line_graph/line_graph.rb +456 -456
- data/lib/cosmos/gui/line_graph/line_graph_dialog.rb +34 -34
- data/lib/cosmos/gui/line_graph/line_graph_drawing.rb +494 -494
- data/lib/cosmos/gui/line_graph/line_graph_popups.rb +116 -116
- data/lib/cosmos/gui/line_graph/line_graph_scaling.rb +460 -460
- data/lib/cosmos/gui/line_graph/line_graph_script.rb +26 -26
- data/lib/cosmos/gui/line_graph/lines.rb +290 -290
- data/lib/cosmos/gui/line_graph/overview_graph.rb +459 -459
- data/lib/cosmos/gui/opengl/earth_model.rb +22 -22
- data/lib/cosmos/gui/opengl/gl_bounds.rb +67 -67
- data/lib/cosmos/gui/opengl/gl_light.rb +39 -39
- data/lib/cosmos/gui/opengl/gl_material.rb +29 -29
- data/lib/cosmos/gui/opengl/gl_scene.rb +72 -72
- data/lib/cosmos/gui/opengl/gl_shape.rb +146 -146
- data/lib/cosmos/gui/opengl/gl_viewer.rb +724 -712
- data/lib/cosmos/gui/opengl/gl_viewport.rb +35 -35
- data/lib/cosmos/gui/opengl/moon_model.rb +22 -22
- data/lib/cosmos/gui/opengl/opengl.rb +8 -8
- data/lib/cosmos/gui/opengl/stl_reader.rb +211 -211
- data/lib/cosmos/gui/opengl/stl_shape.rb +124 -124
- data/lib/cosmos/gui/opengl/texture_mapped_sphere.rb +202 -202
- data/lib/cosmos/gui/qt.rb +813 -786
- data/lib/cosmos/gui/qt_tool.rb +378 -373
- data/lib/cosmos/gui/text/completion.rb +381 -381
- data/lib/cosmos/gui/text/completion_line_edit.rb +30 -30
- data/lib/cosmos/gui/text/completion_text_edit.rb +179 -179
- data/lib/cosmos/gui/text/ruby_editor.rb +395 -395
- data/lib/cosmos/gui/utilities/screenshot.rb +25 -25
- data/lib/cosmos/gui/utilities/script_module_gui.rb +203 -203
- data/lib/cosmos/gui/widgets/full_text_search_line_edit.rb +161 -161
- data/lib/cosmos/gui/widgets/packet_log_frame.rb +305 -305
- data/lib/cosmos/gui/widgets/realtime_button_bar.rb +98 -98
- data/lib/cosmos/interfaces.rb +11 -11
- data/lib/cosmos/interfaces/cmd_tlm_server_interface.rb +153 -149
- data/lib/cosmos/interfaces/interface.rb +213 -213
- data/lib/cosmos/interfaces/linc_interface.rb +360 -360
- data/lib/cosmos/interfaces/serial_interface.rb +76 -76
- data/lib/cosmos/interfaces/simulated_target_interface.rb +129 -128
- data/lib/cosmos/interfaces/stream_interface.rb +156 -156
- data/lib/cosmos/interfaces/tcpip_client_interface.rb +60 -60
- data/lib/cosmos/interfaces/tcpip_server_interface.rb +154 -154
- data/lib/cosmos/interfaces/udp_interface.rb +173 -173
- data/lib/cosmos/io/buffered_file.rb +11 -11
- data/lib/cosmos/io/cosmos_snmp.rb +50 -50
- data/lib/cosmos/io/io_multiplexer.rb +89 -89
- data/lib/cosmos/io/json_drb.rb +344 -320
- data/lib/cosmos/io/json_drb_object.rb +137 -137
- data/lib/cosmos/io/json_rpc.rb +365 -365
- data/lib/cosmos/io/posix_serial_driver.rb +145 -145
- data/lib/cosmos/io/raw_logger.rb +174 -174
- data/lib/cosmos/io/raw_logger_pair.rb +71 -71
- data/lib/cosmos/io/serial_driver.rb +85 -85
- data/lib/cosmos/io/stderr.rb +36 -36
- data/lib/cosmos/io/stdout.rb +36 -36
- data/lib/cosmos/io/tcpip_server.rb +583 -532
- data/lib/cosmos/io/udp_sockets.rb +152 -152
- data/lib/cosmos/io/win32_serial_driver.rb +147 -147
- data/lib/cosmos/packet_logs.rb +6 -6
- data/lib/cosmos/packet_logs/meta_packet_log_writer.rb +107 -107
- data/lib/cosmos/packet_logs/packet_log_reader.rb +441 -439
- data/lib/cosmos/packet_logs/packet_log_writer.rb +321 -309
- data/lib/cosmos/packet_logs/packet_log_writer_pair.rb +30 -30
- data/lib/cosmos/packets/binary_accessor.rb +921 -921
- data/lib/cosmos/packets/commands.rb +291 -291
- data/lib/cosmos/packets/limits.rb +263 -263
- data/lib/cosmos/packets/limits_response.rb +38 -38
- data/lib/cosmos/packets/packet.rb +714 -699
- data/lib/cosmos/packets/packet_config.rb +1034 -1034
- data/lib/cosmos/packets/packet_item.rb +317 -317
- data/lib/cosmos/packets/packet_item_limits.rb +128 -128
- data/lib/cosmos/packets/structure.rb +421 -386
- data/lib/cosmos/packets/structure_item.rb +233 -233
- data/lib/cosmos/packets/telemetry.rb +317 -317
- data/lib/cosmos/processors.rb +6 -6
- data/lib/cosmos/processors/new_packet_log_processor.rb +34 -34
- data/lib/cosmos/processors/processor.rb +71 -71
- data/lib/cosmos/processors/statistics_processor.rb +65 -65
- data/lib/cosmos/processors/watermark_processor.rb +44 -44
- data/lib/cosmos/script.rb +9 -9
- data/lib/cosmos/script/extract.rb +115 -115
- data/lib/cosmos/script/script.rb +1513 -1493
- data/lib/cosmos/streams/burst_stream_protocol.rb +25 -25
- data/lib/cosmos/streams/fixed_stream_protocol.rb +111 -111
- data/lib/cosmos/streams/length_stream_protocol.rb +140 -140
- data/lib/cosmos/streams/preidentified_stream_protocol.rb +118 -118
- data/lib/cosmos/streams/serial_stream.rb +152 -143
- data/lib/cosmos/streams/stream.rb +57 -57
- data/lib/cosmos/streams/stream_protocol.rb +369 -369
- data/lib/cosmos/streams/tcpip_client_stream.rb +77 -77
- data/lib/cosmos/streams/tcpip_socket_stream.rb +139 -139
- data/lib/cosmos/streams/template_stream_protocol.rb +140 -140
- data/lib/cosmos/streams/terminated_stream_protocol.rb +81 -81
- data/lib/cosmos/system.rb +4 -4
- data/lib/cosmos/system/system.rb +558 -558
- data/lib/cosmos/system/target.rb +178 -178
- data/lib/cosmos/tools/cmd_extractor/cmd_extractor.rb +254 -253
- data/lib/cosmos/tools/cmd_sender/cmd_sender.rb +716 -716
- data/lib/cosmos/tools/cmd_sender/cmd_sender_item_delegate.rb +77 -77
- data/lib/cosmos/tools/cmd_sender/cmd_sender_text_edit.rb +70 -70
- data/lib/cosmos/tools/cmd_tlm_server/api.rb +936 -940
- data/lib/cosmos/tools/cmd_tlm_server/background_task.rb +46 -46
- data/lib/cosmos/tools/cmd_tlm_server/background_tasks.rb +67 -63
- data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +511 -497
- data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_config.rb +241 -241
- data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +1033 -1008
- data/lib/cosmos/tools/cmd_tlm_server/commanding.rb +112 -112
- data/lib/cosmos/tools/cmd_tlm_server/connections.rb +176 -176
- data/lib/cosmos/tools/cmd_tlm_server/interface_thread.rb +241 -221
- data/lib/cosmos/tools/cmd_tlm_server/interfaces.rb +127 -127
- data/lib/cosmos/tools/cmd_tlm_server/packet_logging.rb +132 -132
- data/lib/cosmos/tools/cmd_tlm_server/router_thread.rb +66 -66
- data/lib/cosmos/tools/cmd_tlm_server/routers.rb +97 -97
- data/lib/cosmos/tools/data_viewer/data_viewer.rb +628 -600
- data/lib/cosmos/tools/data_viewer/data_viewer_component.rb +167 -167
- data/lib/cosmos/tools/data_viewer/dump_component.rb +40 -40
- data/lib/cosmos/tools/handbook_creator/handbook_creator.rb +149 -149
- data/lib/cosmos/tools/handbook_creator/handbook_creator_config.rb +360 -360
- data/lib/cosmos/tools/launcher/launcher.rb +184 -184
- data/lib/cosmos/tools/launcher/launcher_config.rb +175 -167
- data/lib/cosmos/tools/launcher/launcher_multitool.rb +40 -41
- data/lib/cosmos/tools/launcher/launcher_tool.rb +104 -104
- data/lib/cosmos/tools/limits_monitor/limits_monitor.rb +796 -768
- data/lib/cosmos/tools/opengl_builder/opengl_builder.rb +416 -416
- data/lib/cosmos/tools/opengl_builder/scene_config.rb +118 -118
- data/lib/cosmos/tools/packet_viewer/packet_viewer.rb +525 -525
- data/lib/cosmos/tools/replay/replay.rb +495 -488
- data/lib/cosmos/tools/replay/replay_server.rb +91 -91
- data/lib/cosmos/tools/script_runner/script_audit.rb +147 -139
- data/lib/cosmos/tools/script_runner/script_runner.rb +914 -914
- data/lib/cosmos/tools/script_runner/script_runner_config.rb +40 -40
- data/lib/cosmos/tools/script_runner/script_runner_frame.rb +1892 -1859
- data/lib/cosmos/tools/table_manager/table.rb +70 -70
- data/lib/cosmos/tools/table_manager/table_config.rb +764 -764
- data/lib/cosmos/tools/table_manager/table_item.rb +74 -74
- data/lib/cosmos/tools/table_manager/table_manager.rb +1065 -1065
- data/lib/cosmos/tools/table_manager/table_manager_core.rb +539 -539
- data/lib/cosmos/tools/test_runner/results_writer.rb +283 -283
- data/lib/cosmos/tools/test_runner/test.rb +480 -480
- data/lib/cosmos/tools/test_runner/test_runner.rb +1157 -1157
- data/lib/cosmos/tools/test_runner/test_runner_chooser.rb +338 -338
- data/lib/cosmos/tools/tlm_extractor/text_item_chooser.rb +60 -60
- data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +1008 -1008
- data/lib/cosmos/tools/tlm_extractor/tlm_extractor_config.rb +371 -371
- data/lib/cosmos/tools/tlm_extractor/tlm_extractor_processor.rb +60 -60
- data/lib/cosmos/tools/tlm_grapher/data_object_adders/housekeeping_data_object_adder.rb +75 -75
- data/lib/cosmos/tools/tlm_grapher/data_object_adders/singlexy_data_object_adder.rb +44 -44
- data/lib/cosmos/tools/tlm_grapher/data_object_adders/xy_data_object_adder.rb +94 -94
- data/lib/cosmos/tools/tlm_grapher/data_object_editors/data_object_editor.rb +61 -61
- data/lib/cosmos/tools/tlm_grapher/data_object_editors/housekeeping_data_object_editor.rb +180 -180
- data/lib/cosmos/tools/tlm_grapher/data_object_editors/linegraph_data_object_editor.rb +141 -141
- data/lib/cosmos/tools/tlm_grapher/data_object_editors/singlexy_data_object_editor.rb +30 -30
- data/lib/cosmos/tools/tlm_grapher/data_object_editors/xy_data_object_editor.rb +173 -173
- data/lib/cosmos/tools/tlm_grapher/data_objects/data_object.rb +177 -177
- data/lib/cosmos/tools/tlm_grapher/data_objects/housekeeping_data_object.rb +412 -409
- data/lib/cosmos/tools/tlm_grapher/data_objects/linegraph_data_object.rb +176 -176
- data/lib/cosmos/tools/tlm_grapher/data_objects/singlexy_data_object.rb +25 -25
- data/lib/cosmos/tools/tlm_grapher/data_objects/xy_data_object.rb +323 -320
- data/lib/cosmos/tools/tlm_grapher/plot_editors/linegraph_plot_editor.rb +181 -181
- data/lib/cosmos/tools/tlm_grapher/plot_editors/plot_editor.rb +28 -28
- data/lib/cosmos/tools/tlm_grapher/plot_editors/singlexy_plot_editor.rb +30 -30
- data/lib/cosmos/tools/tlm_grapher/plot_editors/xy_plot_editor.rb +59 -59
- data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/linegraph_plot_gui_object.rb +172 -172
- data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/singlexy_plot_gui_object.rb +27 -27
- data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/xy_plot_gui_object.rb +74 -74
- data/lib/cosmos/tools/tlm_grapher/plots/linegraph_plot.rb +201 -201
- data/lib/cosmos/tools/tlm_grapher/plots/plot.rb +69 -69
- data/lib/cosmos/tools/tlm_grapher/plots/singlexy_plot.rb +20 -20
- data/lib/cosmos/tools/tlm_grapher/plots/xy_plot.rb +61 -61
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots/overview_tabbed_plots.rb +1278 -1278
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_config.rb +430 -430
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_data_object_editor.rb +107 -107
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_logfile_thread.rb +111 -95
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_plot_editor.rb +101 -101
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_realtime_thread.rb +72 -66
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tab.rb +57 -57
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tool.rb +1004 -1004
- data/lib/cosmos/tools/tlm_grapher/tlm_grapher.rb +87 -87
- data/lib/cosmos/tools/tlm_viewer/screen.rb +486 -458
- data/lib/cosmos/tools/tlm_viewer/tlm_viewer.rb +563 -544
- data/lib/cosmos/tools/tlm_viewer/tlm_viewer_config.rb +287 -287
- data/lib/cosmos/tools/tlm_viewer/widgets.rb +53 -53
- data/lib/cosmos/tools/tlm_viewer/widgets/aging_widget.rb +110 -110
- data/lib/cosmos/tools/tlm_viewer/widgets/array_widget.rb +70 -70
- data/lib/cosmos/tools/tlm_viewer/widgets/block_widget.rb +61 -61
- data/lib/cosmos/tools/tlm_viewer/widgets/button_widget.rb +39 -39
- data/lib/cosmos/tools/tlm_viewer/widgets/canvas_widget.rb +62 -62
- data/lib/cosmos/tools/tlm_viewer/widgets/canvasimage_widget.rb +41 -41
- data/lib/cosmos/tools/tlm_viewer/widgets/canvasimagevalue_widget.rb +57 -57
- data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabel_widget.rb +37 -37
- data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabelvalue_widget.rb +56 -56
- data/lib/cosmos/tools/tlm_viewer/widgets/canvasline_widget.rb +55 -55
- data/lib/cosmos/tools/tlm_viewer/widgets/canvaslinevalue_widget.rb +66 -66
- data/lib/cosmos/tools/tlm_viewer/widgets/canvasvalue_widget.rb +124 -124
- data/lib/cosmos/tools/tlm_viewer/widgets/checkbutton_widget.rb +31 -31
- data/lib/cosmos/tools/tlm_viewer/widgets/combobox_widget.rb +30 -30
- data/lib/cosmos/tools/tlm_viewer/widgets/formatfontvalue_widget.rb +36 -36
- data/lib/cosmos/tools/tlm_viewer/widgets/formatvalue_widget.rb +35 -35
- data/lib/cosmos/tools/tlm_viewer/widgets/horizontal_widget.rb +27 -27
- data/lib/cosmos/tools/tlm_viewer/widgets/horizontalbox_widget.rb +31 -31
- data/lib/cosmos/tools/tlm_viewer/widgets/horizontalline_widget.rb +26 -26
- data/lib/cosmos/tools/tlm_viewer/widgets/label_widget.rb +29 -29
- data/lib/cosmos/tools/tlm_viewer/widgets/labelformatvalue_widget.rb +39 -39
- data/lib/cosmos/tools/tlm_viewer/widgets/labelprogressbar_widget.rb +38 -38
- data/lib/cosmos/tools/tlm_viewer/widgets/labeltrendlimitsbar_widget.rb +38 -38
- data/lib/cosmos/tools/tlm_viewer/widgets/labelvalue_widget.rb +39 -39
- data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluedesc_widget.rb +42 -42
- data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluelimitsbar_widget.rb +37 -37
- data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluerangebar_widget.rb +37 -37
- data/lib/cosmos/tools/tlm_viewer/widgets/layout_widget.rb +34 -34
- data/lib/cosmos/tools/tlm_viewer/widgets/limitsbar_widget.rb +178 -178
- data/lib/cosmos/tools/tlm_viewer/widgets/linegraph_widget.rb +54 -54
- data/lib/cosmos/tools/tlm_viewer/widgets/matrixbycolumns_widget.rb +47 -47
- data/lib/cosmos/tools/tlm_viewer/widgets/multi_widget.rb +116 -116
- data/lib/cosmos/tools/tlm_viewer/widgets/progressbar_widget.rb +34 -34
- data/lib/cosmos/tools/tlm_viewer/widgets/radiobutton_widget.rb +30 -30
- data/lib/cosmos/tools/tlm_viewer/widgets/rangebar_widget.rb +57 -57
- data/lib/cosmos/tools/tlm_viewer/widgets/screenshotbutton_widget.rb +34 -34
- data/lib/cosmos/tools/tlm_viewer/widgets/scrollwindow_widget.rb +35 -35
- data/lib/cosmos/tools/tlm_viewer/widgets/sectionheader_widget.rb +33 -33
- data/lib/cosmos/tools/tlm_viewer/widgets/tabbook_widget.rb +26 -26
- data/lib/cosmos/tools/tlm_viewer/widgets/tabitem_widget.rb +28 -28
- data/lib/cosmos/tools/tlm_viewer/widgets/textbox_widget.rb +47 -47
- data/lib/cosmos/tools/tlm_viewer/widgets/textfield_widget.rb +26 -26
- data/lib/cosmos/tools/tlm_viewer/widgets/timegraph_widget.rb +88 -88
- data/lib/cosmos/tools/tlm_viewer/widgets/title_widget.rb +27 -27
- data/lib/cosmos/tools/tlm_viewer/widgets/trendbar_widget.rb +130 -130
- data/lib/cosmos/tools/tlm_viewer/widgets/trendlimitsbar_widget.rb +46 -46
- data/lib/cosmos/tools/tlm_viewer/widgets/value_widget.rb +43 -43
- data/lib/cosmos/tools/tlm_viewer/widgets/valuelimitsbar_widget.rb +37 -37
- data/lib/cosmos/tools/tlm_viewer/widgets/valuerangebar_widget.rb +37 -37
- data/lib/cosmos/tools/tlm_viewer/widgets/vertical_widget.rb +35 -35
- data/lib/cosmos/tools/tlm_viewer/widgets/verticalbox_widget.rb +37 -37
- data/lib/cosmos/tools/tlm_viewer/widgets/widget.rb +257 -257
- data/lib/cosmos/top_level.rb +647 -596
- data/lib/cosmos/utilities.rb +11 -10
- data/lib/cosmos/utilities/crc.rb +166 -166
- data/lib/cosmos/utilities/csv.rb +83 -83
- data/lib/cosmos/utilities/logger.rb +137 -137
- data/lib/cosmos/utilities/low_fragmentation_array.rb +11 -11
- data/lib/cosmos/utilities/message_log.rb +74 -74
- data/lib/cosmos/utilities/quaternion.rb +258 -258
- data/lib/cosmos/utilities/ruby_lex_utils.rb +313 -313
- data/lib/cosmos/utilities/simulated_target.rb +99 -99
- data/lib/cosmos/utilities/sleeper.rb +44 -0
- data/lib/cosmos/version.rb +12 -12
- data/lib/cosmos/win32/excel.rb +66 -66
- data/lib/cosmos/win32/win32.rb +387 -387
- data/lib/cosmos/win32/win32_main.rb +311 -311
- data/roodi.yml +24 -24
- data/run_gui_tests.bat +32 -32
- data/spec/ccsds/ccsds_packet_spec.rb +67 -67
- data/spec/ccsds/ccsds_parser_spec.rb +148 -148
- data/spec/config/config_parser_spec.rb +322 -322
- data/spec/conversions/conversion_spec.rb +31 -31
- data/spec/conversions/generic_conversion_spec.rb +45 -45
- data/spec/conversions/new_packet_log_conversion_spec.rb +39 -39
- data/spec/conversions/polynomial_conversion_spec.rb +40 -40
- data/spec/conversions/processor_conversion_spec.rb +45 -45
- data/spec/conversions/received_count_conversion_spec.rb +43 -43
- data/spec/conversions/received_time_formatted_conversion_spec.rb +49 -49
- data/spec/conversions/received_time_seconds_conversion_spec.rb +50 -50
- data/spec/conversions/segmented_polynomial_conversion_spec.rb +51 -51
- data/spec/conversions/unix_time_formatted_conversion_spec.rb +74 -74
- data/spec/conversions/unix_time_seconds_conversion_spec.rb +76 -76
- data/spec/core_ext/array_spec.rb +186 -186
- data/spec/core_ext/class_spec.rb +36 -36
- data/spec/core_ext/cosmos_io_spec.rb +77 -77
- data/spec/core_ext/exception_spec.rb +91 -91
- data/spec/core_ext/file_spec.rb +72 -72
- data/spec/core_ext/hash_spec.rb +24 -24
- data/spec/core_ext/io_spec.rb +46 -46
- data/spec/core_ext/kernel_spec.rb +54 -54
- data/spec/core_ext/math_spec.rb +116 -116
- data/spec/core_ext/matrix_spec.rb +66 -66
- data/spec/core_ext/objectspace_spec.rb +29 -29
- data/spec/core_ext/range_spec.rb +21 -21
- data/spec/core_ext/socket_spec.rb +32 -32
- data/spec/core_ext/string_spec.rb +223 -223
- data/spec/core_ext/stringio_spec.rb +21 -21
- data/spec/core_ext/time_spec.rb +151 -151
- data/spec/gui/line_graph/line_clip_spec.rb +322 -322
- data/spec/install/config/system/system.txt +33 -33
- data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
- data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
- data/spec/install/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
- data/spec/install/config/targets/COSMOS/screens/limits_change.txt +20 -20
- data/spec/install/config/targets/COSMOS/screens/version.txt +19 -19
- data/spec/install/config/targets/COSMOS/target.txt +5 -5
- data/spec/install/config/targets/INST/cmd_tlm/inst_cmd_linc.txt +30 -30
- data/spec/install/config/targets/INST/cmd_tlm/inst_cmds.txt +111 -111
- data/spec/install/config/targets/INST/cmd_tlm/inst_tlm.txt +236 -236
- data/spec/install/config/targets/INST/cmd_tlm/inst_tlm_linc.txt +25 -25
- data/spec/install/config/targets/INST/cmd_tlm_server.txt +5 -5
- data/spec/install/config/targets/INST/lib/sim_inst.rb +305 -294
- data/spec/install/config/targets/INST/target.txt +10 -10
- data/spec/install/config/targets/META/cmd_tlm/meta_cmd.txt +4 -4
- data/spec/install/config/targets/META/cmd_tlm/meta_tlm.txt +4 -4
- data/spec/install/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
- data/spec/interfaces/cmd_tlm_server_interface_spec.rb +150 -150
- data/spec/interfaces/interface_spec.rb +130 -131
- data/spec/interfaces/linc_interface_spec.rb +199 -199
- data/spec/interfaces/serial_interface_spec.rb +56 -56
- data/spec/interfaces/simulated_target_interface_spec.rb +128 -128
- data/spec/interfaces/stream_interface_spec.rb +157 -157
- data/spec/interfaces/tcpip_client_interface_spec.rb +54 -54
- data/spec/interfaces/tcpip_server_interface_spec.rb +151 -151
- data/spec/interfaces/udp_interface_spec.rb +175 -177
- data/spec/io/buffered_file_spec.rb +113 -113
- data/spec/io/io_multiplexer_spec.rb +94 -94
- data/spec/io/json_drb_object_spec.rb +99 -99
- data/spec/io/json_drb_spec.rb +311 -311
- data/spec/io/json_rpc_spec.rb +264 -264
- data/spec/io/raw_logger_pair_spec.rb +76 -76
- data/spec/io/raw_logger_spec.rb +133 -133
- data/spec/io/serial_driver_spec.rb +61 -61
- data/spec/io/stderr_spec.rb +32 -32
- data/spec/io/stdout_spec.rb +32 -32
- data/spec/io/tcpip_server_spec.rb +338 -338
- data/spec/io/udp_sockets_spec.rb +94 -94
- data/spec/io/win32_serial_driver_spec.rb +88 -88
- data/spec/packet_logs/meta_packet_log_writer_spec.rb +170 -170
- data/spec/packet_logs/packet_log_reader_spec.rb +408 -408
- data/spec/packet_logs/packet_log_writer_pair_spec.rb +30 -30
- data/spec/packet_logs/packet_log_writer_spec.rb +223 -223
- data/spec/packets/binary_accessor_spec.rb +2073 -2073
- data/spec/packets/commands_spec.rb +369 -369
- data/spec/packets/limits_response_spec.rb +25 -25
- data/spec/packets/limits_spec.rb +326 -326
- data/spec/packets/packet_config_spec.rb +1620 -1620
- data/spec/packets/packet_item_limits_spec.rb +161 -161
- data/spec/packets/packet_item_spec.rb +386 -386
- data/spec/packets/packet_spec.rb +1057 -949
- data/spec/packets/structure_item_spec.rb +195 -195
- data/spec/packets/structure_spec.rb +419 -419
- data/spec/packets/telemetry_spec.rb +535 -535
- data/spec/processors/new_packet_log_processor_spec.rb +39 -39
- data/spec/processors/processor_spec.rb +55 -55
- data/spec/processors/statistics_processor_spec.rb +60 -60
- data/spec/processors/watermark_processor_spec.rb +51 -51
- data/spec/script/script_spec.rb +654 -654
- data/spec/spec_helper.rb +154 -148
- data/spec/streams/burst_stream_protocol_spec.rb +32 -32
- data/spec/streams/fixed_stream_protocol_spec.rb +110 -110
- data/spec/streams/length_stream_protocol_spec.rb +297 -297
- data/spec/streams/preidentified_stream_protocol_spec.rb +118 -118
- data/spec/streams/serial_stream_spec.rb +105 -105
- data/spec/streams/stream_protocol_spec.rb +332 -332
- data/spec/streams/stream_spec.rb +29 -29
- data/spec/streams/tcpip_client_stream_spec.rb +54 -54
- data/spec/streams/tcpip_socket_stream_spec.rb +146 -146
- data/spec/streams/template_stream_protocol_spec.rb +151 -151
- data/spec/streams/terminated_stream_protocol_spec.rb +123 -123
- data/spec/system/system_spec.rb +645 -645
- data/spec/system/target_spec.rb +248 -248
- data/spec/tools/cmd_tlm_server/api_spec.rb +1087 -1113
- data/spec/tools/cmd_tlm_server/background_task_spec.rb +32 -32
- data/spec/tools/cmd_tlm_server/background_tasks_spec.rb +81 -81
- data/spec/tools/cmd_tlm_server/cmd_tlm_server_config_spec.rb +411 -411
- data/spec/tools/cmd_tlm_server/cmd_tlm_server_spec.rb +415 -415
- data/spec/tools/cmd_tlm_server/commanding_spec.rb +123 -123
- data/spec/tools/cmd_tlm_server/connections_spec.rb +147 -147
- data/spec/tools/cmd_tlm_server/interface_thread_spec.rb +306 -306
- data/spec/tools/cmd_tlm_server/interfaces_spec.rb +252 -238
- data/spec/tools/cmd_tlm_server/packet_logging_spec.rb +143 -143
- data/spec/tools/cmd_tlm_server/router_thread_spec.rb +98 -101
- data/spec/tools/cmd_tlm_server/routers_spec.rb +223 -208
- data/spec/top_level/top_level_spec.rb +334 -321
- data/spec/utilities/crc_spec.rb +45 -45
- data/spec/utilities/csv_spec.rb +97 -97
- data/spec/utilities/logger_spec.rb +102 -102
- data/spec/utilities/message_log_spec.rb +89 -89
- data/spec/utilities/quaternion_spec.rb +107 -107
- data/spec/utilities/ruby_lex_utils_spec.rb +86 -86
- data/tasks/manifest.rake +22 -22
- data/tasks/spec.rake +23 -23
- metadata +18 -2
|
@@ -1,894 +1,894 @@
|
|
|
1
|
-
/*
|
|
2
|
-
# Copyright 2014 Ball Aerospace & Technologies Corp.
|
|
3
|
-
# All Rights Reserved.
|
|
4
|
-
#
|
|
5
|
-
# This program is free software; you can modify and/or redistribute it
|
|
6
|
-
# under the terms of the GNU Lesser General Public License
|
|
7
|
-
# as published by the Free Software Foundation; version 3 with
|
|
8
|
-
# attribution addendums as found in the LICENSE.txt
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
#include "ruby.h"
|
|
12
|
-
#include "stdio.h"
|
|
13
|
-
|
|
14
|
-
static const int endianness_check = 1;
|
|
15
|
-
static VALUE HOST_ENDIANNESS = Qnil;
|
|
16
|
-
static VALUE ZERO_STRING = Qnil;
|
|
17
|
-
static VALUE ASCII_8BIT_STRING = Qnil;
|
|
18
|
-
|
|
19
|
-
static VALUE mCosmos = Qnil;
|
|
20
|
-
static VALUE cBinaryAccessor = Qnil;
|
|
21
|
-
static VALUE cStructure = Qnil;
|
|
22
|
-
static VALUE cStructureItem = Qnil;
|
|
23
|
-
|
|
24
|
-
static ID id_method_to_s = 0;
|
|
25
|
-
static ID id_method_raise_buffer_error = 0;
|
|
26
|
-
static ID id_method_read_array = 0;
|
|
27
|
-
static ID id_method_force_encoding = 0;
|
|
28
|
-
static ID id_method_freeze = 0;
|
|
29
|
-
|
|
30
|
-
static ID id_ivar_buffer = 0;
|
|
31
|
-
static ID id_ivar_bit_offset = 0;
|
|
32
|
-
static ID id_ivar_bit_size = 0;
|
|
33
|
-
static ID id_ivar_array_size = 0;
|
|
34
|
-
static ID id_ivar_endianness = 0;
|
|
35
|
-
static ID id_ivar_data_type = 0;
|
|
36
|
-
static ID id_ivar_default_endianness = 0;
|
|
37
|
-
static ID id_ivar_item_class = 0;
|
|
38
|
-
static ID id_ivar_items = 0;
|
|
39
|
-
static ID id_ivar_sorted_items = 0;
|
|
40
|
-
static ID id_ivar_defined_length = 0;
|
|
41
|
-
static ID id_ivar_defined_length_bits = 0;
|
|
42
|
-
static ID id_ivar_pos_bit_size = 0;
|
|
43
|
-
static ID id_ivar_neg_bit_size = 0;
|
|
44
|
-
static ID id_ivar_fixed_size = 0;
|
|
45
|
-
static ID id_ivar_short_buffer_allowed = 0;
|
|
46
|
-
static ID id_ivar_mutex = 0;
|
|
47
|
-
|
|
48
|
-
static ID id_const_ZERO_STRING = 0;
|
|
49
|
-
|
|
50
|
-
static VALUE symbol_LITTLE_ENDIAN = Qnil;
|
|
51
|
-
static VALUE symbol_BIG_ENDIAN = Qnil;
|
|
52
|
-
static VALUE symbol_INT = Qnil;
|
|
53
|
-
static VALUE symbol_UINT = Qnil;
|
|
54
|
-
static VALUE symbol_FLOAT = Qnil;
|
|
55
|
-
static VALUE symbol_STRING = Qnil;
|
|
56
|
-
static VALUE symbol_BLOCK = Qnil;
|
|
57
|
-
static VALUE symbol_DERIVED = Qnil;
|
|
58
|
-
static VALUE symbol_read = Qnil;
|
|
59
|
-
|
|
60
|
-
/*
|
|
61
|
-
* Perform an left bit shift on a string
|
|
62
|
-
*/
|
|
63
|
-
static void left_shift_byte_array (unsigned char* array, int array_length, int shift)
|
|
64
|
-
{
|
|
65
|
-
int current_index = 0;
|
|
66
|
-
int previous_index = 0;
|
|
67
|
-
unsigned char saved_bits = 0;
|
|
68
|
-
unsigned char saved_bits_mask = (0xFF << (8 - shift));
|
|
69
|
-
unsigned char sign_extension_remove_mask = ~(0xFF << shift);
|
|
70
|
-
|
|
71
|
-
for (current_index = 0; current_index < array_length; current_index++)
|
|
72
|
-
{
|
|
73
|
-
/* Save bits that will be lost */
|
|
74
|
-
saved_bits = ((array[current_index] & saved_bits_mask) >> (8 - shift)) & sign_extension_remove_mask;
|
|
75
|
-
|
|
76
|
-
/* Perform shift on current byte */
|
|
77
|
-
array[current_index] <<= shift;
|
|
78
|
-
|
|
79
|
-
/* Add Saved bits to end of previous byte */
|
|
80
|
-
if (current_index > 0)
|
|
81
|
-
{
|
|
82
|
-
array[previous_index] |= saved_bits;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
/* Update previous index */
|
|
86
|
-
previous_index = current_index;
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
/*
|
|
91
|
-
* Perform an unsigned right bit shift on a string
|
|
92
|
-
*/
|
|
93
|
-
static void unsigned_right_shift_byte_array (unsigned char* array, int array_length, int shift)
|
|
94
|
-
{
|
|
95
|
-
int current_index = 0;
|
|
96
|
-
int previous_index = 0;
|
|
97
|
-
unsigned char saved_bits = 0;
|
|
98
|
-
unsigned char saved_bits_mask = ~(0xFF << shift);
|
|
99
|
-
unsigned char sign_extension_remove_mask = ~(0xFF << (8 - shift));
|
|
100
|
-
|
|
101
|
-
for (current_index = array_length - 1; current_index >= 0; current_index--)
|
|
102
|
-
{
|
|
103
|
-
/* Save bits that will be lost */
|
|
104
|
-
saved_bits = (array[current_index] & saved_bits_mask) << (8 - shift);
|
|
105
|
-
|
|
106
|
-
/* Perform shift on current byte */
|
|
107
|
-
array[current_index] = (array[current_index] >> shift) & sign_extension_remove_mask;
|
|
108
|
-
|
|
109
|
-
/* Add Saved bits to beginning of previous byte */
|
|
110
|
-
if (current_index != (array_length - 1))
|
|
111
|
-
{
|
|
112
|
-
array[previous_index] |= saved_bits;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
/* Update previous index */
|
|
116
|
-
previous_index = current_index;
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
/*
|
|
121
|
-
* Perform an signed right bit shift on a string
|
|
122
|
-
*/
|
|
123
|
-
static void signed_right_shift_byte_array (unsigned char* array, int array_length, int shift)
|
|
124
|
-
{
|
|
125
|
-
unsigned char start_bits_mask = (0xFF << (8 - shift));
|
|
126
|
-
int is_signed = (0x80 & array[0]);
|
|
127
|
-
|
|
128
|
-
unsigned_right_shift_byte_array(array, array_length, shift);
|
|
129
|
-
|
|
130
|
-
if (is_signed)
|
|
131
|
-
{
|
|
132
|
-
array[0] |= start_bits_mask;
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
/*
|
|
137
|
-
* Perform an unsigned bit shift on a string
|
|
138
|
-
*/
|
|
139
|
-
static void unsigned_shift_byte_array (unsigned char* array, int array_length, int shift)
|
|
140
|
-
{
|
|
141
|
-
if (shift < 0)
|
|
142
|
-
{
|
|
143
|
-
left_shift_byte_array(array, array_length, -shift);
|
|
144
|
-
}
|
|
145
|
-
else if (shift > 0)
|
|
146
|
-
{
|
|
147
|
-
unsigned_right_shift_byte_array(array, array_length, shift);
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
/*
|
|
152
|
-
* Reverse the byte order in a string.
|
|
153
|
-
*/
|
|
154
|
-
static void reverse_bytes (unsigned char* array, int array_length)
|
|
155
|
-
{
|
|
156
|
-
int first_index = 0;
|
|
157
|
-
int second_index = 0;
|
|
158
|
-
unsigned char temp_byte = 0;
|
|
159
|
-
|
|
160
|
-
for (first_index = 0; first_index < (array_length / 2); first_index++)
|
|
161
|
-
{
|
|
162
|
-
second_index = array_length - 1 - first_index;
|
|
163
|
-
temp_byte = array[first_index];
|
|
164
|
-
array[first_index] = array[second_index];
|
|
165
|
-
array[second_index] = temp_byte;
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
static void read_aligned_16(int lower_bound, int upper_bound, VALUE endianness, unsigned char *buffer, unsigned char *read_value) {
|
|
170
|
-
if (endianness == HOST_ENDIANNESS)
|
|
171
|
-
{
|
|
172
|
-
read_value[1] = buffer[upper_bound];
|
|
173
|
-
read_value[0] = buffer[lower_bound];
|
|
174
|
-
}
|
|
175
|
-
else
|
|
176
|
-
{
|
|
177
|
-
read_value[0] = buffer[upper_bound];
|
|
178
|
-
read_value[1] = buffer[lower_bound];
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
static void read_aligned_32(int lower_bound, int upper_bound, VALUE endianness, unsigned char *buffer, unsigned char *read_value) {
|
|
183
|
-
if (endianness == HOST_ENDIANNESS)
|
|
184
|
-
{
|
|
185
|
-
read_value[3] = buffer[upper_bound];
|
|
186
|
-
read_value[2] = buffer[upper_bound - 1];
|
|
187
|
-
read_value[1] = buffer[lower_bound + 1];
|
|
188
|
-
read_value[0] = buffer[lower_bound];
|
|
189
|
-
}
|
|
190
|
-
else
|
|
191
|
-
{
|
|
192
|
-
read_value[0] = buffer[upper_bound];
|
|
193
|
-
read_value[1] = buffer[upper_bound - 1];
|
|
194
|
-
read_value[2] = buffer[lower_bound + 1];
|
|
195
|
-
read_value[3] = buffer[lower_bound];
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
static void read_aligned_64(int lower_bound, int upper_bound, VALUE endianness, unsigned char *buffer, unsigned char *read_value) {
|
|
200
|
-
if (endianness == HOST_ENDIANNESS)
|
|
201
|
-
{
|
|
202
|
-
read_value[7] = buffer[upper_bound];
|
|
203
|
-
read_value[6] = buffer[upper_bound - 1];
|
|
204
|
-
read_value[5] = buffer[upper_bound - 2];
|
|
205
|
-
read_value[4] = buffer[upper_bound - 3];
|
|
206
|
-
read_value[3] = buffer[lower_bound + 3];
|
|
207
|
-
read_value[2] = buffer[lower_bound + 2];
|
|
208
|
-
read_value[1] = buffer[lower_bound + 1];
|
|
209
|
-
read_value[0] = buffer[lower_bound];
|
|
210
|
-
}
|
|
211
|
-
else
|
|
212
|
-
{
|
|
213
|
-
read_value[0] = buffer[upper_bound];
|
|
214
|
-
read_value[1] = buffer[upper_bound - 1];
|
|
215
|
-
read_value[2] = buffer[upper_bound - 2];
|
|
216
|
-
read_value[3] = buffer[upper_bound - 3];
|
|
217
|
-
read_value[4] = buffer[lower_bound + 3];
|
|
218
|
-
read_value[5] = buffer[lower_bound + 2];
|
|
219
|
-
read_value[6] = buffer[lower_bound + 1];
|
|
220
|
-
read_value[7] = buffer[lower_bound];
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
static void read_bitfield(int lower_bound, int upper_bound, int bit_offset, int bit_size, int given_bit_offset, int given_bit_size, VALUE endianness, unsigned char* buffer, int buffer_length, unsigned char* read_value) {
|
|
225
|
-
/* Local variables */
|
|
226
|
-
int num_bytes = 0;
|
|
227
|
-
int total_bits = 0;
|
|
228
|
-
int start_bits = 0;
|
|
229
|
-
int end_bits = 0;
|
|
230
|
-
int temp_upper = 0;
|
|
231
|
-
unsigned char end_mask = 0;
|
|
232
|
-
|
|
233
|
-
/* Copy Data For Bitfield into read_value */
|
|
234
|
-
if (endianness == symbol_LITTLE_ENDIAN)
|
|
235
|
-
{
|
|
236
|
-
/* Bitoffset always refers to the most significant bit of a bitfield */
|
|
237
|
-
num_bytes = (((bit_offset % 8) + bit_size - 1) / 8) + 1;
|
|
238
|
-
upper_bound = bit_offset / 8;
|
|
239
|
-
lower_bound = upper_bound - num_bytes + 1;
|
|
240
|
-
|
|
241
|
-
if (lower_bound < 0) {
|
|
242
|
-
rb_raise(rb_eArgError, "LITTLE_ENDIAN bitfield with bit_offset %d and bit_size %d is invalid", given_bit_offset, given_bit_size);
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
memcpy(read_value, &buffer[lower_bound], num_bytes);
|
|
246
|
-
reverse_bytes(read_value, num_bytes);
|
|
247
|
-
}
|
|
248
|
-
else
|
|
249
|
-
{
|
|
250
|
-
num_bytes = upper_bound - lower_bound + 1;
|
|
251
|
-
memcpy(read_value, &buffer[lower_bound], num_bytes);
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
/* Determine temp upper bound */
|
|
255
|
-
temp_upper = upper_bound - lower_bound;
|
|
256
|
-
|
|
257
|
-
/* Handle Bitfield */
|
|
258
|
-
total_bits = (temp_upper + 1) * 8;
|
|
259
|
-
start_bits = bit_offset % 8;
|
|
260
|
-
end_bits = total_bits - start_bits - bit_size;
|
|
261
|
-
end_mask = 0xFF << end_bits;
|
|
262
|
-
|
|
263
|
-
/* Mask off unwanted bits at end */
|
|
264
|
-
read_value[temp_upper] &= end_mask;
|
|
265
|
-
|
|
266
|
-
/* Shift off unwanted bits at beginning */
|
|
267
|
-
unsigned_shift_byte_array(read_value, num_bytes, -start_bits);
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
/*
|
|
271
|
-
* Reads binary data of any data type from a buffer
|
|
272
|
-
*
|
|
273
|
-
* @param bit_offset [Integer] Bit offset to the start of the item. A
|
|
274
|
-
* negative number means to offset from the end of the buffer.
|
|
275
|
-
* @param bit_size [Integer] Size of the item in bits
|
|
276
|
-
* @param data_type [Symbol] {DATA_TYPES}
|
|
277
|
-
* @param buffer [String] Binary string buffer to read from
|
|
278
|
-
* @param endianness [Symbol] {ENDIANNESS}
|
|
279
|
-
* @return [Integer] value read from the buffer
|
|
280
|
-
*/
|
|
281
|
-
static VALUE binary_accessor_read(VALUE self, VALUE param_bit_offset, VALUE param_bit_size, VALUE param_data_type, VALUE param_buffer, VALUE param_endianness)
|
|
282
|
-
{
|
|
283
|
-
/* Convert Parameters to C Data Types */
|
|
284
|
-
int bit_offset = FIX2INT(param_bit_offset);
|
|
285
|
-
int bit_size = FIX2INT(param_bit_size);
|
|
286
|
-
|
|
287
|
-
/* Local Variables */
|
|
288
|
-
int given_bit_offset = bit_offset;
|
|
289
|
-
int given_bit_size = bit_size;
|
|
290
|
-
signed char signed_char_value = 0;
|
|
291
|
-
unsigned char unsigned_char_value = 0;
|
|
292
|
-
signed short signed_short_value = 0;
|
|
293
|
-
unsigned short unsigned_short_value = 0;
|
|
294
|
-
signed int signed_int_value = 0;
|
|
295
|
-
signed long signed_long_value = 0;
|
|
296
|
-
unsigned int unsigned_int_value = 0;
|
|
297
|
-
signed long long signed_long_long_value = 0;
|
|
298
|
-
unsigned long long unsigned_long_long_value = 0;
|
|
299
|
-
unsigned char* unsigned_char_array = NULL;
|
|
300
|
-
int array_length = 0;
|
|
301
|
-
char* string = NULL;
|
|
302
|
-
int string_length = 0;
|
|
303
|
-
float float_value = 0.0;
|
|
304
|
-
double double_value = 0.0;
|
|
305
|
-
int shift_needed = 0;
|
|
306
|
-
int shift_count = 0;
|
|
307
|
-
int index = 0;
|
|
308
|
-
int num_bits = 0;
|
|
309
|
-
int num_bytes = 0;
|
|
310
|
-
int num_words = 0;
|
|
311
|
-
int upper_bound = 0;
|
|
312
|
-
int lower_bound = 0;
|
|
313
|
-
int byte_aligned = 0;
|
|
314
|
-
VALUE temp_value = Qnil;
|
|
315
|
-
VALUE return_value = Qnil;
|
|
316
|
-
|
|
317
|
-
unsigned char* buffer = NULL;
|
|
318
|
-
long buffer_length = 0;
|
|
319
|
-
|
|
320
|
-
Check_Type(param_buffer, T_STRING);
|
|
321
|
-
buffer = (unsigned char*) RSTRING_PTR(param_buffer);
|
|
322
|
-
buffer_length = RSTRING_LEN(param_buffer);
|
|
323
|
-
|
|
324
|
-
/* Handle negative bit offsets */
|
|
325
|
-
if (bit_offset < 0) {
|
|
326
|
-
if (given_bit_size <= 0) {
|
|
327
|
-
rb_raise(rb_eArgError, "negative or zero bit_sizes (%d) cannot be given with negative bit_offsets (%d)", given_bit_size, given_bit_offset);
|
|
328
|
-
} else {
|
|
329
|
-
bit_offset = (((int)buffer_length * 8) + bit_offset);
|
|
330
|
-
if (bit_offset < 0) {
|
|
331
|
-
rb_funcall(self, id_method_raise_buffer_error, 5, symbol_read, param_buffer, param_data_type, param_bit_offset, param_bit_size);
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
/* Handle negative and zero bit sizes */
|
|
337
|
-
if (bit_size <= 0) {
|
|
338
|
-
if ((param_data_type == symbol_STRING) || (param_data_type == symbol_BLOCK)) {
|
|
339
|
-
bit_size = (((int)buffer_length * 8) - bit_offset + bit_size);
|
|
340
|
-
if (bit_size == 0) {
|
|
341
|
-
return rb_str_new2("");
|
|
342
|
-
} else if (bit_size < 0) {
|
|
343
|
-
rb_funcall(self, id_method_raise_buffer_error, 5, symbol_read, param_buffer, param_data_type, param_bit_offset, param_bit_size);
|
|
344
|
-
}
|
|
345
|
-
} else {
|
|
346
|
-
rb_raise(rb_eArgError, "bit_size %d must be positive for data types other than :STRING and :BLOCK", given_bit_size);
|
|
347
|
-
}
|
|
348
|
-
}
|
|
349
|
-
|
|
350
|
-
/* define bounds of string to access this item */
|
|
351
|
-
lower_bound = (bit_offset / 8);
|
|
352
|
-
upper_bound = ((bit_offset + bit_size - 1) / 8);
|
|
353
|
-
|
|
354
|
-
/* Check for byte alignment */
|
|
355
|
-
byte_aligned = ((bit_offset % 8) == 0);
|
|
356
|
-
|
|
357
|
-
/* Sanity check buffer size */
|
|
358
|
-
if (upper_bound >= buffer_length) {
|
|
359
|
-
/* Check special case of little endian bit field */
|
|
360
|
-
if ((param_endianness == symbol_LITTLE_ENDIAN) && ((param_data_type == symbol_INT) || (param_data_type == symbol_UINT)) && (!((byte_aligned) && ((bit_size == 8) || (bit_size == 16) || (bit_size == 32) || (bit_size == 64)))) && (lower_bound < buffer_length)) {
|
|
361
|
-
/* Ok little endian bit field */
|
|
362
|
-
} else {
|
|
363
|
-
rb_funcall(self, id_method_raise_buffer_error, 5, symbol_read, param_buffer, param_data_type, param_bit_offset, param_bit_size);
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
if ((param_data_type == symbol_STRING) || (param_data_type == symbol_BLOCK)) {
|
|
368
|
-
|
|
369
|
-
/*#######################################
|
|
370
|
-
*# Handle :STRING and :BLOCK data types
|
|
371
|
-
*#######################################*/
|
|
372
|
-
|
|
373
|
-
if (byte_aligned) {
|
|
374
|
-
string_length = upper_bound - lower_bound + 1;
|
|
375
|
-
string = malloc(string_length + 1);
|
|
376
|
-
memcpy(string, buffer + lower_bound, string_length);
|
|
377
|
-
string[string_length] = 0;
|
|
378
|
-
if (param_data_type == symbol_STRING) {
|
|
379
|
-
return_value = rb_str_new2(string);
|
|
380
|
-
} else /* param_data_type == symbol_BLOCK */ {
|
|
381
|
-
return_value = rb_str_new(string, string_length);
|
|
382
|
-
}
|
|
383
|
-
free(string);
|
|
384
|
-
} else {
|
|
385
|
-
rb_raise(rb_eArgError, "bit_offset %d is not byte aligned for data_type %s", given_bit_offset, RSTRING_PTR(rb_funcall(param_data_type, id_method_to_s, 0)));
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
} else if (param_data_type == symbol_INT) {
|
|
389
|
-
|
|
390
|
-
/*###################################
|
|
391
|
-
*# Handle :INT data type
|
|
392
|
-
*###################################*/
|
|
393
|
-
|
|
394
|
-
if ((byte_aligned) && ((bit_size == 8) || (bit_size == 16) || (bit_size == 32) || (bit_size == 64))) {
|
|
395
|
-
/*###########################################################
|
|
396
|
-
*# Handle byte-aligned 8, 16, 32, and 64 bit :INT
|
|
397
|
-
*###########################################################*/
|
|
398
|
-
|
|
399
|
-
if (bit_size == 8)
|
|
400
|
-
{
|
|
401
|
-
signed_char_value = *((signed char*) &buffer[lower_bound]);
|
|
402
|
-
return_value = INT2FIX(signed_char_value);
|
|
403
|
-
}
|
|
404
|
-
else if (bit_size == 16)
|
|
405
|
-
{
|
|
406
|
-
read_aligned_16(lower_bound, upper_bound, param_endianness, buffer, (unsigned char*) &signed_short_value);
|
|
407
|
-
return_value = INT2FIX(signed_short_value);
|
|
408
|
-
}
|
|
409
|
-
else if (bit_size == 32)
|
|
410
|
-
{
|
|
411
|
-
read_aligned_32(lower_bound, upper_bound, param_endianness, buffer, (unsigned char*) &signed_int_value);
|
|
412
|
-
return_value = INT2NUM(signed_int_value);
|
|
413
|
-
}
|
|
414
|
-
else /* bit_size == 64 */
|
|
415
|
-
{
|
|
416
|
-
read_aligned_64(lower_bound, upper_bound, param_endianness, buffer, (unsigned char*) &signed_long_long_value);
|
|
417
|
-
return_value = LL2NUM(signed_long_long_value);
|
|
418
|
-
}
|
|
419
|
-
} else {
|
|
420
|
-
string_length = ((bit_size - 1)/ 8) + 1;
|
|
421
|
-
array_length = string_length + 4; /* Required number of bytes plus slack */
|
|
422
|
-
unsigned_char_array = (unsigned char*) malloc(array_length);
|
|
423
|
-
read_bitfield(lower_bound, upper_bound, bit_offset, bit_size, given_bit_offset, given_bit_size, param_endianness, buffer, (int)buffer_length, unsigned_char_array);
|
|
424
|
-
|
|
425
|
-
num_words = ((string_length - 1) / 4) + 1;
|
|
426
|
-
num_bytes = num_words * 4;
|
|
427
|
-
num_bits = num_bytes * 8;
|
|
428
|
-
shift_needed = num_bits - bit_size;
|
|
429
|
-
shift_count = shift_needed / 8;
|
|
430
|
-
shift_needed = shift_needed % 8;
|
|
431
|
-
|
|
432
|
-
if (bit_size > 1) {
|
|
433
|
-
for (index = 0; index < shift_count; index++) {
|
|
434
|
-
signed_right_shift_byte_array(unsigned_char_array, num_bytes, 8);
|
|
435
|
-
}
|
|
436
|
-
|
|
437
|
-
if (shift_needed > 0) {
|
|
438
|
-
signed_right_shift_byte_array(unsigned_char_array, num_bytes, shift_needed);
|
|
439
|
-
}
|
|
440
|
-
} else {
|
|
441
|
-
for (index = 0; index < shift_count; index++) {
|
|
442
|
-
unsigned_right_shift_byte_array(unsigned_char_array, num_bytes, 8);
|
|
443
|
-
}
|
|
444
|
-
|
|
445
|
-
if (shift_needed > 0) {
|
|
446
|
-
unsigned_right_shift_byte_array(unsigned_char_array, num_bytes, shift_needed);
|
|
447
|
-
}
|
|
448
|
-
}
|
|
449
|
-
|
|
450
|
-
if (HOST_ENDIANNESS == symbol_LITTLE_ENDIAN) {
|
|
451
|
-
for (index = 0; index < num_bytes; index += 4) {
|
|
452
|
-
reverse_bytes(&(unsigned_char_array[index]), 4);
|
|
453
|
-
}
|
|
454
|
-
}
|
|
455
|
-
|
|
456
|
-
if (bit_size <= 31) {
|
|
457
|
-
return_value = INT2FIX(*((int*) unsigned_char_array));
|
|
458
|
-
} else if (bit_size == 32) {
|
|
459
|
-
return_value = INT2NUM(*((int*) unsigned_char_array));
|
|
460
|
-
} else {
|
|
461
|
-
return_value = rb_int2big(*((int*) unsigned_char_array));
|
|
462
|
-
temp_value = INT2FIX(32);
|
|
463
|
-
for (index = 4; index < num_bytes; index += 4) {
|
|
464
|
-
return_value = rb_big_lshift(return_value, temp_value);
|
|
465
|
-
if (FIXNUM_P(return_value)) {
|
|
466
|
-
signed_long_value = FIX2LONG(return_value);
|
|
467
|
-
return_value = rb_int2big(signed_long_value);
|
|
468
|
-
}
|
|
469
|
-
return_value = rb_big_plus(return_value, rb_uint2big(*((unsigned int*) &(unsigned_char_array[index]))));
|
|
470
|
-
if (FIXNUM_P(return_value)) {
|
|
471
|
-
signed_long_value = FIX2LONG(return_value);
|
|
472
|
-
return_value = rb_int2big(signed_long_value);
|
|
473
|
-
}
|
|
474
|
-
}
|
|
475
|
-
return_value = rb_big_norm(return_value);
|
|
476
|
-
}
|
|
477
|
-
|
|
478
|
-
free(unsigned_char_array);
|
|
479
|
-
}
|
|
480
|
-
|
|
481
|
-
} else if (param_data_type == symbol_UINT) {
|
|
482
|
-
|
|
483
|
-
/*###################################
|
|
484
|
-
*# Handle :UINT data type
|
|
485
|
-
*###################################*/
|
|
486
|
-
|
|
487
|
-
if ((byte_aligned) && ((bit_size == 8) || (bit_size == 16) || (bit_size == 32) || (bit_size == 64))) {
|
|
488
|
-
/*###########################################################
|
|
489
|
-
*# Handle byte-aligned 8, 16, 32, and 64 bit :UINT
|
|
490
|
-
*###########################################################*/
|
|
491
|
-
|
|
492
|
-
if (bit_size == 8)
|
|
493
|
-
{
|
|
494
|
-
unsigned_char_value = buffer[lower_bound];
|
|
495
|
-
return_value = INT2FIX(unsigned_char_value);
|
|
496
|
-
}
|
|
497
|
-
else if (bit_size == 16)
|
|
498
|
-
{
|
|
499
|
-
read_aligned_16(lower_bound, upper_bound, param_endianness, buffer, (unsigned char*) &unsigned_short_value);
|
|
500
|
-
return_value = INT2FIX(unsigned_short_value);
|
|
501
|
-
}
|
|
502
|
-
else if (bit_size == 32)
|
|
503
|
-
{
|
|
504
|
-
read_aligned_32(lower_bound, upper_bound, param_endianness, buffer, (unsigned char*) &unsigned_int_value);
|
|
505
|
-
return_value = UINT2NUM(unsigned_int_value);
|
|
506
|
-
}
|
|
507
|
-
else /* bit_size == 64 */
|
|
508
|
-
{
|
|
509
|
-
read_aligned_64(lower_bound, upper_bound, param_endianness, buffer, (unsigned char*) &unsigned_long_long_value);
|
|
510
|
-
return_value = ULL2NUM(unsigned_long_long_value);
|
|
511
|
-
}
|
|
512
|
-
} else {
|
|
513
|
-
string_length = ((bit_size - 1)/ 8) + 1;
|
|
514
|
-
array_length = string_length + 4; /* Required number of bytes plus slack */
|
|
515
|
-
unsigned_char_array = (unsigned char*) malloc(array_length);
|
|
516
|
-
read_bitfield(lower_bound, upper_bound, bit_offset, bit_size, given_bit_offset, given_bit_size, param_endianness, buffer, (int)buffer_length, unsigned_char_array);
|
|
517
|
-
|
|
518
|
-
num_words = ((string_length - 1) / 4) + 1;
|
|
519
|
-
num_bytes = num_words * 4;
|
|
520
|
-
num_bits = num_bytes * 8;
|
|
521
|
-
shift_needed = num_bits - bit_size;
|
|
522
|
-
shift_count = shift_needed / 8;
|
|
523
|
-
shift_needed = shift_needed % 8;
|
|
524
|
-
|
|
525
|
-
for (index = 0; index < shift_count; index++) {
|
|
526
|
-
unsigned_right_shift_byte_array(unsigned_char_array, num_bytes, 8);
|
|
527
|
-
}
|
|
528
|
-
|
|
529
|
-
if (shift_needed > 0) {
|
|
530
|
-
unsigned_right_shift_byte_array(unsigned_char_array, num_bytes, shift_needed);
|
|
531
|
-
}
|
|
532
|
-
|
|
533
|
-
if (HOST_ENDIANNESS == symbol_LITTLE_ENDIAN) {
|
|
534
|
-
for (index = 0; index < num_bytes; index += 4) {
|
|
535
|
-
reverse_bytes(&(unsigned_char_array[index]), 4);
|
|
536
|
-
}
|
|
537
|
-
}
|
|
538
|
-
|
|
539
|
-
if (bit_size <= 30) {
|
|
540
|
-
return_value = INT2FIX(*((int*) unsigned_char_array));
|
|
541
|
-
} else if (bit_size <= 32) {
|
|
542
|
-
return_value = UINT2NUM(*((unsigned int*) unsigned_char_array));
|
|
543
|
-
} else {
|
|
544
|
-
return_value = rb_uint2big(*((unsigned int*) unsigned_char_array));
|
|
545
|
-
temp_value = INT2FIX(32);
|
|
546
|
-
for (index = 4; index < num_bytes; index += 4) {
|
|
547
|
-
return_value = rb_big_lshift(return_value, temp_value);
|
|
548
|
-
if (FIXNUM_P(return_value)) {
|
|
549
|
-
signed_long_value = FIX2LONG(return_value);
|
|
550
|
-
return_value = rb_int2big(signed_long_value);
|
|
551
|
-
}
|
|
552
|
-
return_value = rb_big_plus(return_value, rb_uint2big(*((unsigned int*) &(unsigned_char_array[index]))));
|
|
553
|
-
if (FIXNUM_P(return_value)) {
|
|
554
|
-
signed_long_value = FIX2LONG(return_value);
|
|
555
|
-
return_value = rb_int2big(signed_long_value);
|
|
556
|
-
}
|
|
557
|
-
}
|
|
558
|
-
return_value = rb_big_norm(return_value);
|
|
559
|
-
}
|
|
560
|
-
|
|
561
|
-
free(unsigned_char_array);
|
|
562
|
-
}
|
|
563
|
-
|
|
564
|
-
} else if (param_data_type == symbol_FLOAT) {
|
|
565
|
-
|
|
566
|
-
/*##########################
|
|
567
|
-
*# Handle :FLOAT data type
|
|
568
|
-
*##########################*/
|
|
569
|
-
|
|
570
|
-
if (byte_aligned) {
|
|
571
|
-
switch (bit_size) {
|
|
572
|
-
case 32:
|
|
573
|
-
read_aligned_32(lower_bound, upper_bound, param_endianness, buffer, (unsigned char*) &float_value);
|
|
574
|
-
return_value = rb_float_new(float_value);
|
|
575
|
-
break;
|
|
576
|
-
|
|
577
|
-
case 64:
|
|
578
|
-
read_aligned_64(lower_bound, upper_bound, param_endianness, buffer, (unsigned char*) &double_value);
|
|
579
|
-
return_value = rb_float_new(double_value);
|
|
580
|
-
break;
|
|
581
|
-
|
|
582
|
-
default:
|
|
583
|
-
rb_raise(rb_eArgError, "bit_size is %d but must be 32 or 64 for data_type %s", given_bit_size, RSTRING_PTR(rb_funcall(param_data_type, id_method_to_s, 0)));
|
|
584
|
-
break;
|
|
585
|
-
};
|
|
586
|
-
} else {
|
|
587
|
-
rb_raise(rb_eArgError, "bit_offset %d is not byte aligned for data_type %s", given_bit_offset, RSTRING_PTR(rb_funcall(param_data_type, id_method_to_s, 0)));
|
|
588
|
-
}
|
|
589
|
-
|
|
590
|
-
} else {
|
|
591
|
-
|
|
592
|
-
/*############################
|
|
593
|
-
*# Handle Unknown data types
|
|
594
|
-
*############################*/
|
|
595
|
-
|
|
596
|
-
rb_raise(rb_eArgError, "data_type %s is not recognized", RSTRING_PTR(rb_funcall(param_data_type, id_method_to_s, 0)));
|
|
597
|
-
}
|
|
598
|
-
|
|
599
|
-
return return_value;
|
|
600
|
-
}
|
|
601
|
-
|
|
602
|
-
/*
|
|
603
|
-
* Returns the actual length as an integer.
|
|
604
|
-
*
|
|
605
|
-
* get_int_length(self) #=> 324
|
|
606
|
-
*/
|
|
607
|
-
static int get_int_length(VALUE self)
|
|
608
|
-
{
|
|
609
|
-
VALUE buffer = rb_ivar_get(self, id_ivar_buffer);
|
|
610
|
-
if (RTEST(buffer)) {
|
|
611
|
-
return (int)RSTRING_LEN(buffer);
|
|
612
|
-
} else {
|
|
613
|
-
return 0;
|
|
614
|
-
}
|
|
615
|
-
}
|
|
616
|
-
|
|
617
|
-
/*
|
|
618
|
-
* Returns the actual structure length.
|
|
619
|
-
*
|
|
620
|
-
* structure.length #=> 324
|
|
621
|
-
*/
|
|
622
|
-
static VALUE structure_length(VALUE self) {
|
|
623
|
-
return INT2FIX(get_int_length(self));
|
|
624
|
-
}
|
|
625
|
-
|
|
626
|
-
static VALUE read_item_internal(VALUE self, VALUE item, VALUE buffer) {
|
|
627
|
-
VALUE bit_offset = Qnil;
|
|
628
|
-
VALUE bit_size = Qnil;
|
|
629
|
-
VALUE data_type = Qnil;
|
|
630
|
-
VALUE array_size = Qnil;
|
|
631
|
-
VALUE endianness = Qnil;
|
|
632
|
-
|
|
633
|
-
data_type = rb_ivar_get(item, id_ivar_data_type);
|
|
634
|
-
if (data_type == symbol_DERIVED) {
|
|
635
|
-
return Qnil;
|
|
636
|
-
}
|
|
637
|
-
|
|
638
|
-
if (RTEST(buffer)) {
|
|
639
|
-
bit_offset = rb_ivar_get(item, id_ivar_bit_offset);
|
|
640
|
-
bit_size = rb_ivar_get(item, id_ivar_bit_size);
|
|
641
|
-
array_size = rb_ivar_get(item, id_ivar_array_size);
|
|
642
|
-
endianness = rb_ivar_get(item, id_ivar_endianness);
|
|
643
|
-
if (RTEST(array_size)) {
|
|
644
|
-
return rb_funcall(cBinaryAccessor, id_method_read_array, 6, bit_offset, bit_size, data_type, array_size, buffer, endianness);
|
|
645
|
-
} else {
|
|
646
|
-
return binary_accessor_read(cBinaryAccessor, bit_offset, bit_size, data_type, buffer, endianness);
|
|
647
|
-
}
|
|
648
|
-
} else {
|
|
649
|
-
rb_raise(rb_eRuntimeError, "No buffer given to read_item");
|
|
650
|
-
}
|
|
651
|
-
}
|
|
652
|
-
|
|
653
|
-
/*
|
|
654
|
-
* Read an item in the structure
|
|
655
|
-
*
|
|
656
|
-
* @param item [StructureItem] Instance of StructureItem or one of its subclasses
|
|
657
|
-
* @param value_type [Symbol] Not used. Subclasses should overload this
|
|
658
|
-
* parameter to check whether to perform conversions on the item.
|
|
659
|
-
* @param buffer [String] The binary buffer to read the item from
|
|
660
|
-
* @return Value based on the item definition. This could be a string, integer,
|
|
661
|
-
* float, or array of values.
|
|
662
|
-
*/
|
|
663
|
-
static VALUE read_item(int argc, VALUE* argv, VALUE self)
|
|
664
|
-
{
|
|
665
|
-
VALUE item = Qnil;
|
|
666
|
-
VALUE buffer = Qnil;
|
|
667
|
-
|
|
668
|
-
switch (argc)
|
|
669
|
-
{
|
|
670
|
-
case 1:
|
|
671
|
-
case 2:
|
|
672
|
-
item = argv[0];
|
|
673
|
-
buffer = rb_ivar_get(self, id_ivar_buffer);
|
|
674
|
-
break;
|
|
675
|
-
case 3:
|
|
676
|
-
item = argv[0];
|
|
677
|
-
buffer = argv[2];
|
|
678
|
-
break;
|
|
679
|
-
default:
|
|
680
|
-
/* Invalid number of arguments given */
|
|
681
|
-
rb_raise(rb_eArgError, "wrong number of arguments (%d for 1..3)", argc);
|
|
682
|
-
break;
|
|
683
|
-
};
|
|
684
|
-
|
|
685
|
-
return read_item_internal(self, item, buffer);
|
|
686
|
-
}
|
|
687
|
-
|
|
688
|
-
/*
|
|
689
|
-
* Comparison Operator based on bit_offset. This means that StructureItems
|
|
690
|
-
* with different names or bit sizes are equal if they have the same bit
|
|
691
|
-
* offset.
|
|
692
|
-
*/
|
|
693
|
-
static VALUE structure_item_spaceship(VALUE self, VALUE other_item) {
|
|
694
|
-
int bit_offset = FIX2INT(rb_ivar_get(self, id_ivar_bit_offset));
|
|
695
|
-
int other_bit_offset = FIX2INT(rb_ivar_get(other_item, id_ivar_bit_offset));
|
|
696
|
-
int bit_size = 0;
|
|
697
|
-
int other_bit_size = 0;
|
|
698
|
-
|
|
699
|
-
/* Handle same bit offset case */
|
|
700
|
-
if ((bit_offset == 0) && (other_bit_offset == 0)) {
|
|
701
|
-
/* Both bit_offsets are 0 so sort by bit_size
|
|
702
|
-
* This allows derived items with bit_size of 0 to be listed first
|
|
703
|
-
* Compare based on bit size */
|
|
704
|
-
bit_size = FIX2INT(rb_ivar_get(self, id_ivar_bit_size));
|
|
705
|
-
other_bit_size = FIX2INT(rb_ivar_get(other_item, id_ivar_bit_size));
|
|
706
|
-
if (bit_size == other_bit_size) {
|
|
707
|
-
return INT2FIX(0);
|
|
708
|
-
} if (bit_size < other_bit_size) {
|
|
709
|
-
return INT2FIX(-1);
|
|
710
|
-
} else {
|
|
711
|
-
return INT2FIX(1);
|
|
712
|
-
}
|
|
713
|
-
}
|
|
714
|
-
|
|
715
|
-
/* Handle different bit offsets */
|
|
716
|
-
if (((bit_offset >= 0) && (other_bit_offset >= 0)) || ((bit_offset < 0) && (other_bit_offset < 0))) {
|
|
717
|
-
/* Both Have Same Sign */
|
|
718
|
-
if (bit_offset == other_bit_offset) {
|
|
719
|
-
return INT2FIX(0);
|
|
720
|
-
} else if (bit_offset < other_bit_offset) {
|
|
721
|
-
return INT2FIX(-1);
|
|
722
|
-
} else {
|
|
723
|
-
return INT2FIX(1);
|
|
724
|
-
}
|
|
725
|
-
} else {
|
|
726
|
-
/* Different Signs */
|
|
727
|
-
if (bit_offset == other_bit_offset) {
|
|
728
|
-
return INT2FIX(0);
|
|
729
|
-
} else if (bit_offset < other_bit_offset) {
|
|
730
|
-
return INT2FIX(1);
|
|
731
|
-
} else {
|
|
732
|
-
return INT2FIX(-1);
|
|
733
|
-
}
|
|
734
|
-
}
|
|
735
|
-
}
|
|
736
|
-
|
|
737
|
-
/* Structure constructor
|
|
738
|
-
*
|
|
739
|
-
* @param default_endianness [Symbol] Must be one of
|
|
740
|
-
* {BinaryAccessor::ENDIANNESS}. By default it uses
|
|
741
|
-
* BinaryAccessor::HOST_ENDIANNESS to determine the endianness of the host platform.
|
|
742
|
-
* @param buffer [String] Buffer used to store the structure
|
|
743
|
-
* @param item_class [Class] Class used to instantiate new structure items.
|
|
744
|
-
* Must be StructureItem or one of its subclasses.
|
|
745
|
-
*/
|
|
746
|
-
static VALUE structure_initialize(int argc, VALUE* argv, VALUE self) {
|
|
747
|
-
VALUE default_endianness = Qnil;
|
|
748
|
-
VALUE buffer = Qnil;
|
|
749
|
-
VALUE item_class = Qnil;
|
|
750
|
-
|
|
751
|
-
switch (argc)
|
|
752
|
-
{
|
|
753
|
-
case 0:
|
|
754
|
-
default_endianness = HOST_ENDIANNESS;
|
|
755
|
-
buffer = rb_str_new2("");
|
|
756
|
-
item_class = cStructureItem;
|
|
757
|
-
break;
|
|
758
|
-
case 1:
|
|
759
|
-
default_endianness = argv[0];
|
|
760
|
-
buffer = rb_str_new2("");
|
|
761
|
-
item_class = cStructureItem;
|
|
762
|
-
break;
|
|
763
|
-
case 2:
|
|
764
|
-
default_endianness = argv[0];
|
|
765
|
-
buffer = argv[1];
|
|
766
|
-
item_class = cStructureItem;
|
|
767
|
-
break;
|
|
768
|
-
case 3:
|
|
769
|
-
default_endianness = argv[0];
|
|
770
|
-
buffer = argv[1];
|
|
771
|
-
item_class = argv[2];
|
|
772
|
-
break;
|
|
773
|
-
default:
|
|
774
|
-
/* Invalid number of arguments given */
|
|
775
|
-
rb_raise(rb_eArgError, "wrong number of arguments (%d for 0..3)", argc);
|
|
776
|
-
break;
|
|
777
|
-
};
|
|
778
|
-
|
|
779
|
-
if ((default_endianness == symbol_BIG_ENDIAN) || (default_endianness == symbol_LITTLE_ENDIAN)) {
|
|
780
|
-
rb_ivar_set(self, id_ivar_default_endianness, default_endianness);
|
|
781
|
-
if (RTEST(buffer)) {
|
|
782
|
-
Check_Type(buffer, T_STRING);
|
|
783
|
-
rb_funcall(buffer, id_method_force_encoding, 1, ASCII_8BIT_STRING);
|
|
784
|
-
rb_ivar_set(self, id_ivar_buffer, buffer);
|
|
785
|
-
} else {
|
|
786
|
-
rb_ivar_set(self, id_ivar_buffer, Qnil);
|
|
787
|
-
}
|
|
788
|
-
rb_ivar_set(self, id_ivar_item_class, item_class);
|
|
789
|
-
rb_ivar_set(self, id_ivar_items, rb_hash_new());
|
|
790
|
-
rb_ivar_set(self, id_ivar_sorted_items, rb_ary_new());
|
|
791
|
-
rb_ivar_set(self, id_ivar_defined_length, INT2FIX(0));
|
|
792
|
-
rb_ivar_set(self, id_ivar_defined_length_bits, INT2FIX(0));
|
|
793
|
-
rb_ivar_set(self, id_ivar_pos_bit_size, INT2FIX(0));
|
|
794
|
-
rb_ivar_set(self, id_ivar_neg_bit_size, INT2FIX(0));
|
|
795
|
-
rb_ivar_set(self, id_ivar_fixed_size, Qtrue);
|
|
796
|
-
rb_ivar_set(self, id_ivar_short_buffer_allowed, Qfalse);
|
|
797
|
-
rb_ivar_set(self, id_ivar_mutex, Qnil);
|
|
798
|
-
} else {
|
|
799
|
-
rb_raise(rb_eArgError, "Unrecognized endianness: %s - Must be :BIG_ENDIAN or :LITTLE_ENDIAN", RSTRING_PTR(rb_funcall(default_endianness, id_method_to_s, 0)));
|
|
800
|
-
}
|
|
801
|
-
|
|
802
|
-
return self;
|
|
803
|
-
}
|
|
804
|
-
|
|
805
|
-
/*
|
|
806
|
-
* Resize the buffer at least the defined length of the structure
|
|
807
|
-
*/
|
|
808
|
-
static VALUE resize_buffer(VALUE self)
|
|
809
|
-
{
|
|
810
|
-
VALUE buffer = rb_ivar_get(self, id_ivar_buffer);
|
|
811
|
-
if (RTEST(buffer)) {
|
|
812
|
-
VALUE value_defined_length = rb_ivar_get(self, id_ivar_defined_length);
|
|
813
|
-
long defined_length = FIX2INT(value_defined_length);
|
|
814
|
-
long current_length = RSTRING_LEN(buffer);
|
|
815
|
-
|
|
816
|
-
/* Extend data size */
|
|
817
|
-
if (current_length < defined_length)
|
|
818
|
-
{
|
|
819
|
-
rb_str_concat(buffer, rb_str_times(ZERO_STRING, INT2FIX(defined_length - current_length)));
|
|
820
|
-
}
|
|
821
|
-
}
|
|
822
|
-
|
|
823
|
-
return self;
|
|
824
|
-
}
|
|
825
|
-
|
|
826
|
-
/*
|
|
827
|
-
* Initialize all Packet methods
|
|
828
|
-
*/
|
|
829
|
-
void Init_structure (void)
|
|
830
|
-
{
|
|
831
|
-
int zero = 0;
|
|
832
|
-
|
|
833
|
-
id_method_to_s = rb_intern("to_s");
|
|
834
|
-
id_method_raise_buffer_error = rb_intern("raise_buffer_error");
|
|
835
|
-
id_method_read_array = rb_intern("read_array");
|
|
836
|
-
id_method_force_encoding = rb_intern("force_encoding");
|
|
837
|
-
id_method_freeze = rb_intern("freeze");
|
|
838
|
-
|
|
839
|
-
ASCII_8BIT_STRING = rb_str_new2("ASCII-8BIT");
|
|
840
|
-
rb_funcall(ASCII_8BIT_STRING, id_method_freeze, 0);
|
|
841
|
-
|
|
842
|
-
ZERO_STRING = rb_str_new((char*) &zero, 1);
|
|
843
|
-
rb_funcall(ZERO_STRING, id_method_freeze, 0);
|
|
844
|
-
id_const_ZERO_STRING = rb_intern("ZERO_STRING");
|
|
845
|
-
|
|
846
|
-
id_ivar_buffer = rb_intern("@buffer");
|
|
847
|
-
id_ivar_bit_offset = rb_intern("@bit_offset");
|
|
848
|
-
id_ivar_bit_size = rb_intern("@bit_size");
|
|
849
|
-
id_ivar_array_size = rb_intern("@array_size");
|
|
850
|
-
id_ivar_endianness = rb_intern("@endianness");
|
|
851
|
-
id_ivar_data_type = rb_intern("@data_type");
|
|
852
|
-
id_ivar_default_endianness = rb_intern("@default_endianness");
|
|
853
|
-
id_ivar_item_class = rb_intern("@item_class");
|
|
854
|
-
id_ivar_items = rb_intern("@items");
|
|
855
|
-
id_ivar_sorted_items = rb_intern("@sorted_items");
|
|
856
|
-
id_ivar_defined_length = rb_intern("@defined_length");
|
|
857
|
-
id_ivar_defined_length_bits = rb_intern("@defined_length_bits");
|
|
858
|
-
id_ivar_pos_bit_size = rb_intern("@pos_bit_size");
|
|
859
|
-
id_ivar_neg_bit_size = rb_intern("@neg_bit_size");
|
|
860
|
-
id_ivar_fixed_size = rb_intern("@fixed_size");
|
|
861
|
-
id_ivar_short_buffer_allowed = rb_intern("@short_buffer_allowed");
|
|
862
|
-
id_ivar_mutex = rb_intern("@mutex");
|
|
863
|
-
|
|
864
|
-
symbol_LITTLE_ENDIAN = ID2SYM(rb_intern("LITTLE_ENDIAN"));
|
|
865
|
-
symbol_BIG_ENDIAN = ID2SYM(rb_intern("BIG_ENDIAN"));
|
|
866
|
-
symbol_INT = ID2SYM(rb_intern("INT"));
|
|
867
|
-
symbol_UINT = ID2SYM(rb_intern("UINT"));
|
|
868
|
-
symbol_FLOAT = ID2SYM(rb_intern("FLOAT"));
|
|
869
|
-
symbol_STRING = ID2SYM(rb_intern("STRING"));
|
|
870
|
-
symbol_BLOCK = ID2SYM(rb_intern("BLOCK"));
|
|
871
|
-
symbol_DERIVED = ID2SYM(rb_intern("DERIVED"));
|
|
872
|
-
symbol_read = ID2SYM(rb_intern("read"));
|
|
873
|
-
|
|
874
|
-
if ((*((char *) &endianness_check)) == 1) {
|
|
875
|
-
HOST_ENDIANNESS = symbol_LITTLE_ENDIAN;
|
|
876
|
-
} else {
|
|
877
|
-
HOST_ENDIANNESS = symbol_BIG_ENDIAN;
|
|
878
|
-
}
|
|
879
|
-
|
|
880
|
-
mCosmos = rb_define_module("Cosmos");
|
|
881
|
-
|
|
882
|
-
cBinaryAccessor = rb_define_class_under(mCosmos, "BinaryAccessor", rb_cObject);
|
|
883
|
-
rb_define_singleton_method(cBinaryAccessor, "read", binary_accessor_read, 5);
|
|
884
|
-
|
|
885
|
-
cStructure = rb_define_class_under(mCosmos, "Structure", rb_cObject);
|
|
886
|
-
rb_const_set(cStructure, id_const_ZERO_STRING, ZERO_STRING);
|
|
887
|
-
rb_define_method(cStructure, "initialize", structure_initialize, -1);
|
|
888
|
-
rb_define_method(cStructure, "length", structure_length, 0);
|
|
889
|
-
rb_define_method(cStructure, "read_item", read_item, -1);
|
|
890
|
-
rb_define_method(cStructure, "resize_buffer", resize_buffer, 0);
|
|
891
|
-
|
|
892
|
-
cStructureItem = rb_define_class_under(mCosmos, "StructureItem", rb_cObject);
|
|
893
|
-
rb_define_method(cStructureItem, "<=>", structure_item_spaceship, 1);
|
|
894
|
-
}
|
|
1
|
+
/*
|
|
2
|
+
# Copyright 2014 Ball Aerospace & Technologies Corp.
|
|
3
|
+
# All Rights Reserved.
|
|
4
|
+
#
|
|
5
|
+
# This program is free software; you can modify and/or redistribute it
|
|
6
|
+
# under the terms of the GNU Lesser General Public License
|
|
7
|
+
# as published by the Free Software Foundation; version 3 with
|
|
8
|
+
# attribution addendums as found in the LICENSE.txt
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
#include "ruby.h"
|
|
12
|
+
#include "stdio.h"
|
|
13
|
+
|
|
14
|
+
static const int endianness_check = 1;
|
|
15
|
+
static VALUE HOST_ENDIANNESS = Qnil;
|
|
16
|
+
static VALUE ZERO_STRING = Qnil;
|
|
17
|
+
static VALUE ASCII_8BIT_STRING = Qnil;
|
|
18
|
+
|
|
19
|
+
static VALUE mCosmos = Qnil;
|
|
20
|
+
static VALUE cBinaryAccessor = Qnil;
|
|
21
|
+
static VALUE cStructure = Qnil;
|
|
22
|
+
static VALUE cStructureItem = Qnil;
|
|
23
|
+
|
|
24
|
+
static ID id_method_to_s = 0;
|
|
25
|
+
static ID id_method_raise_buffer_error = 0;
|
|
26
|
+
static ID id_method_read_array = 0;
|
|
27
|
+
static ID id_method_force_encoding = 0;
|
|
28
|
+
static ID id_method_freeze = 0;
|
|
29
|
+
|
|
30
|
+
static ID id_ivar_buffer = 0;
|
|
31
|
+
static ID id_ivar_bit_offset = 0;
|
|
32
|
+
static ID id_ivar_bit_size = 0;
|
|
33
|
+
static ID id_ivar_array_size = 0;
|
|
34
|
+
static ID id_ivar_endianness = 0;
|
|
35
|
+
static ID id_ivar_data_type = 0;
|
|
36
|
+
static ID id_ivar_default_endianness = 0;
|
|
37
|
+
static ID id_ivar_item_class = 0;
|
|
38
|
+
static ID id_ivar_items = 0;
|
|
39
|
+
static ID id_ivar_sorted_items = 0;
|
|
40
|
+
static ID id_ivar_defined_length = 0;
|
|
41
|
+
static ID id_ivar_defined_length_bits = 0;
|
|
42
|
+
static ID id_ivar_pos_bit_size = 0;
|
|
43
|
+
static ID id_ivar_neg_bit_size = 0;
|
|
44
|
+
static ID id_ivar_fixed_size = 0;
|
|
45
|
+
static ID id_ivar_short_buffer_allowed = 0;
|
|
46
|
+
static ID id_ivar_mutex = 0;
|
|
47
|
+
|
|
48
|
+
static ID id_const_ZERO_STRING = 0;
|
|
49
|
+
|
|
50
|
+
static VALUE symbol_LITTLE_ENDIAN = Qnil;
|
|
51
|
+
static VALUE symbol_BIG_ENDIAN = Qnil;
|
|
52
|
+
static VALUE symbol_INT = Qnil;
|
|
53
|
+
static VALUE symbol_UINT = Qnil;
|
|
54
|
+
static VALUE symbol_FLOAT = Qnil;
|
|
55
|
+
static VALUE symbol_STRING = Qnil;
|
|
56
|
+
static VALUE symbol_BLOCK = Qnil;
|
|
57
|
+
static VALUE symbol_DERIVED = Qnil;
|
|
58
|
+
static VALUE symbol_read = Qnil;
|
|
59
|
+
|
|
60
|
+
/*
|
|
61
|
+
* Perform an left bit shift on a string
|
|
62
|
+
*/
|
|
63
|
+
static void left_shift_byte_array (unsigned char* array, int array_length, int shift)
|
|
64
|
+
{
|
|
65
|
+
int current_index = 0;
|
|
66
|
+
int previous_index = 0;
|
|
67
|
+
unsigned char saved_bits = 0;
|
|
68
|
+
unsigned char saved_bits_mask = (0xFF << (8 - shift));
|
|
69
|
+
unsigned char sign_extension_remove_mask = ~(0xFF << shift);
|
|
70
|
+
|
|
71
|
+
for (current_index = 0; current_index < array_length; current_index++)
|
|
72
|
+
{
|
|
73
|
+
/* Save bits that will be lost */
|
|
74
|
+
saved_bits = ((array[current_index] & saved_bits_mask) >> (8 - shift)) & sign_extension_remove_mask;
|
|
75
|
+
|
|
76
|
+
/* Perform shift on current byte */
|
|
77
|
+
array[current_index] <<= shift;
|
|
78
|
+
|
|
79
|
+
/* Add Saved bits to end of previous byte */
|
|
80
|
+
if (current_index > 0)
|
|
81
|
+
{
|
|
82
|
+
array[previous_index] |= saved_bits;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/* Update previous index */
|
|
86
|
+
previous_index = current_index;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/*
|
|
91
|
+
* Perform an unsigned right bit shift on a string
|
|
92
|
+
*/
|
|
93
|
+
static void unsigned_right_shift_byte_array (unsigned char* array, int array_length, int shift)
|
|
94
|
+
{
|
|
95
|
+
int current_index = 0;
|
|
96
|
+
int previous_index = 0;
|
|
97
|
+
unsigned char saved_bits = 0;
|
|
98
|
+
unsigned char saved_bits_mask = ~(0xFF << shift);
|
|
99
|
+
unsigned char sign_extension_remove_mask = ~(0xFF << (8 - shift));
|
|
100
|
+
|
|
101
|
+
for (current_index = array_length - 1; current_index >= 0; current_index--)
|
|
102
|
+
{
|
|
103
|
+
/* Save bits that will be lost */
|
|
104
|
+
saved_bits = (array[current_index] & saved_bits_mask) << (8 - shift);
|
|
105
|
+
|
|
106
|
+
/* Perform shift on current byte */
|
|
107
|
+
array[current_index] = (array[current_index] >> shift) & sign_extension_remove_mask;
|
|
108
|
+
|
|
109
|
+
/* Add Saved bits to beginning of previous byte */
|
|
110
|
+
if (current_index != (array_length - 1))
|
|
111
|
+
{
|
|
112
|
+
array[previous_index] |= saved_bits;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/* Update previous index */
|
|
116
|
+
previous_index = current_index;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/*
|
|
121
|
+
* Perform an signed right bit shift on a string
|
|
122
|
+
*/
|
|
123
|
+
static void signed_right_shift_byte_array (unsigned char* array, int array_length, int shift)
|
|
124
|
+
{
|
|
125
|
+
unsigned char start_bits_mask = (0xFF << (8 - shift));
|
|
126
|
+
int is_signed = (0x80 & array[0]);
|
|
127
|
+
|
|
128
|
+
unsigned_right_shift_byte_array(array, array_length, shift);
|
|
129
|
+
|
|
130
|
+
if (is_signed)
|
|
131
|
+
{
|
|
132
|
+
array[0] |= start_bits_mask;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/*
|
|
137
|
+
* Perform an unsigned bit shift on a string
|
|
138
|
+
*/
|
|
139
|
+
static void unsigned_shift_byte_array (unsigned char* array, int array_length, int shift)
|
|
140
|
+
{
|
|
141
|
+
if (shift < 0)
|
|
142
|
+
{
|
|
143
|
+
left_shift_byte_array(array, array_length, -shift);
|
|
144
|
+
}
|
|
145
|
+
else if (shift > 0)
|
|
146
|
+
{
|
|
147
|
+
unsigned_right_shift_byte_array(array, array_length, shift);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/*
|
|
152
|
+
* Reverse the byte order in a string.
|
|
153
|
+
*/
|
|
154
|
+
static void reverse_bytes (unsigned char* array, int array_length)
|
|
155
|
+
{
|
|
156
|
+
int first_index = 0;
|
|
157
|
+
int second_index = 0;
|
|
158
|
+
unsigned char temp_byte = 0;
|
|
159
|
+
|
|
160
|
+
for (first_index = 0; first_index < (array_length / 2); first_index++)
|
|
161
|
+
{
|
|
162
|
+
second_index = array_length - 1 - first_index;
|
|
163
|
+
temp_byte = array[first_index];
|
|
164
|
+
array[first_index] = array[second_index];
|
|
165
|
+
array[second_index] = temp_byte;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
static void read_aligned_16(int lower_bound, int upper_bound, VALUE endianness, unsigned char *buffer, unsigned char *read_value) {
|
|
170
|
+
if (endianness == HOST_ENDIANNESS)
|
|
171
|
+
{
|
|
172
|
+
read_value[1] = buffer[upper_bound];
|
|
173
|
+
read_value[0] = buffer[lower_bound];
|
|
174
|
+
}
|
|
175
|
+
else
|
|
176
|
+
{
|
|
177
|
+
read_value[0] = buffer[upper_bound];
|
|
178
|
+
read_value[1] = buffer[lower_bound];
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
static void read_aligned_32(int lower_bound, int upper_bound, VALUE endianness, unsigned char *buffer, unsigned char *read_value) {
|
|
183
|
+
if (endianness == HOST_ENDIANNESS)
|
|
184
|
+
{
|
|
185
|
+
read_value[3] = buffer[upper_bound];
|
|
186
|
+
read_value[2] = buffer[upper_bound - 1];
|
|
187
|
+
read_value[1] = buffer[lower_bound + 1];
|
|
188
|
+
read_value[0] = buffer[lower_bound];
|
|
189
|
+
}
|
|
190
|
+
else
|
|
191
|
+
{
|
|
192
|
+
read_value[0] = buffer[upper_bound];
|
|
193
|
+
read_value[1] = buffer[upper_bound - 1];
|
|
194
|
+
read_value[2] = buffer[lower_bound + 1];
|
|
195
|
+
read_value[3] = buffer[lower_bound];
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
static void read_aligned_64(int lower_bound, int upper_bound, VALUE endianness, unsigned char *buffer, unsigned char *read_value) {
|
|
200
|
+
if (endianness == HOST_ENDIANNESS)
|
|
201
|
+
{
|
|
202
|
+
read_value[7] = buffer[upper_bound];
|
|
203
|
+
read_value[6] = buffer[upper_bound - 1];
|
|
204
|
+
read_value[5] = buffer[upper_bound - 2];
|
|
205
|
+
read_value[4] = buffer[upper_bound - 3];
|
|
206
|
+
read_value[3] = buffer[lower_bound + 3];
|
|
207
|
+
read_value[2] = buffer[lower_bound + 2];
|
|
208
|
+
read_value[1] = buffer[lower_bound + 1];
|
|
209
|
+
read_value[0] = buffer[lower_bound];
|
|
210
|
+
}
|
|
211
|
+
else
|
|
212
|
+
{
|
|
213
|
+
read_value[0] = buffer[upper_bound];
|
|
214
|
+
read_value[1] = buffer[upper_bound - 1];
|
|
215
|
+
read_value[2] = buffer[upper_bound - 2];
|
|
216
|
+
read_value[3] = buffer[upper_bound - 3];
|
|
217
|
+
read_value[4] = buffer[lower_bound + 3];
|
|
218
|
+
read_value[5] = buffer[lower_bound + 2];
|
|
219
|
+
read_value[6] = buffer[lower_bound + 1];
|
|
220
|
+
read_value[7] = buffer[lower_bound];
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
static void read_bitfield(int lower_bound, int upper_bound, int bit_offset, int bit_size, int given_bit_offset, int given_bit_size, VALUE endianness, unsigned char* buffer, int buffer_length, unsigned char* read_value) {
|
|
225
|
+
/* Local variables */
|
|
226
|
+
int num_bytes = 0;
|
|
227
|
+
int total_bits = 0;
|
|
228
|
+
int start_bits = 0;
|
|
229
|
+
int end_bits = 0;
|
|
230
|
+
int temp_upper = 0;
|
|
231
|
+
unsigned char end_mask = 0;
|
|
232
|
+
|
|
233
|
+
/* Copy Data For Bitfield into read_value */
|
|
234
|
+
if (endianness == symbol_LITTLE_ENDIAN)
|
|
235
|
+
{
|
|
236
|
+
/* Bitoffset always refers to the most significant bit of a bitfield */
|
|
237
|
+
num_bytes = (((bit_offset % 8) + bit_size - 1) / 8) + 1;
|
|
238
|
+
upper_bound = bit_offset / 8;
|
|
239
|
+
lower_bound = upper_bound - num_bytes + 1;
|
|
240
|
+
|
|
241
|
+
if (lower_bound < 0) {
|
|
242
|
+
rb_raise(rb_eArgError, "LITTLE_ENDIAN bitfield with bit_offset %d and bit_size %d is invalid", given_bit_offset, given_bit_size);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
memcpy(read_value, &buffer[lower_bound], num_bytes);
|
|
246
|
+
reverse_bytes(read_value, num_bytes);
|
|
247
|
+
}
|
|
248
|
+
else
|
|
249
|
+
{
|
|
250
|
+
num_bytes = upper_bound - lower_bound + 1;
|
|
251
|
+
memcpy(read_value, &buffer[lower_bound], num_bytes);
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/* Determine temp upper bound */
|
|
255
|
+
temp_upper = upper_bound - lower_bound;
|
|
256
|
+
|
|
257
|
+
/* Handle Bitfield */
|
|
258
|
+
total_bits = (temp_upper + 1) * 8;
|
|
259
|
+
start_bits = bit_offset % 8;
|
|
260
|
+
end_bits = total_bits - start_bits - bit_size;
|
|
261
|
+
end_mask = 0xFF << end_bits;
|
|
262
|
+
|
|
263
|
+
/* Mask off unwanted bits at end */
|
|
264
|
+
read_value[temp_upper] &= end_mask;
|
|
265
|
+
|
|
266
|
+
/* Shift off unwanted bits at beginning */
|
|
267
|
+
unsigned_shift_byte_array(read_value, num_bytes, -start_bits);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/*
|
|
271
|
+
* Reads binary data of any data type from a buffer
|
|
272
|
+
*
|
|
273
|
+
* @param bit_offset [Integer] Bit offset to the start of the item. A
|
|
274
|
+
* negative number means to offset from the end of the buffer.
|
|
275
|
+
* @param bit_size [Integer] Size of the item in bits
|
|
276
|
+
* @param data_type [Symbol] {DATA_TYPES}
|
|
277
|
+
* @param buffer [String] Binary string buffer to read from
|
|
278
|
+
* @param endianness [Symbol] {ENDIANNESS}
|
|
279
|
+
* @return [Integer] value read from the buffer
|
|
280
|
+
*/
|
|
281
|
+
static VALUE binary_accessor_read(VALUE self, VALUE param_bit_offset, VALUE param_bit_size, VALUE param_data_type, VALUE param_buffer, VALUE param_endianness)
|
|
282
|
+
{
|
|
283
|
+
/* Convert Parameters to C Data Types */
|
|
284
|
+
int bit_offset = FIX2INT(param_bit_offset);
|
|
285
|
+
int bit_size = FIX2INT(param_bit_size);
|
|
286
|
+
|
|
287
|
+
/* Local Variables */
|
|
288
|
+
int given_bit_offset = bit_offset;
|
|
289
|
+
int given_bit_size = bit_size;
|
|
290
|
+
signed char signed_char_value = 0;
|
|
291
|
+
unsigned char unsigned_char_value = 0;
|
|
292
|
+
signed short signed_short_value = 0;
|
|
293
|
+
unsigned short unsigned_short_value = 0;
|
|
294
|
+
signed int signed_int_value = 0;
|
|
295
|
+
signed long signed_long_value = 0;
|
|
296
|
+
unsigned int unsigned_int_value = 0;
|
|
297
|
+
signed long long signed_long_long_value = 0;
|
|
298
|
+
unsigned long long unsigned_long_long_value = 0;
|
|
299
|
+
unsigned char* unsigned_char_array = NULL;
|
|
300
|
+
int array_length = 0;
|
|
301
|
+
char* string = NULL;
|
|
302
|
+
int string_length = 0;
|
|
303
|
+
float float_value = 0.0;
|
|
304
|
+
double double_value = 0.0;
|
|
305
|
+
int shift_needed = 0;
|
|
306
|
+
int shift_count = 0;
|
|
307
|
+
int index = 0;
|
|
308
|
+
int num_bits = 0;
|
|
309
|
+
int num_bytes = 0;
|
|
310
|
+
int num_words = 0;
|
|
311
|
+
int upper_bound = 0;
|
|
312
|
+
int lower_bound = 0;
|
|
313
|
+
int byte_aligned = 0;
|
|
314
|
+
VALUE temp_value = Qnil;
|
|
315
|
+
VALUE return_value = Qnil;
|
|
316
|
+
|
|
317
|
+
unsigned char* buffer = NULL;
|
|
318
|
+
long buffer_length = 0;
|
|
319
|
+
|
|
320
|
+
Check_Type(param_buffer, T_STRING);
|
|
321
|
+
buffer = (unsigned char*) RSTRING_PTR(param_buffer);
|
|
322
|
+
buffer_length = RSTRING_LEN(param_buffer);
|
|
323
|
+
|
|
324
|
+
/* Handle negative bit offsets */
|
|
325
|
+
if (bit_offset < 0) {
|
|
326
|
+
if (given_bit_size <= 0) {
|
|
327
|
+
rb_raise(rb_eArgError, "negative or zero bit_sizes (%d) cannot be given with negative bit_offsets (%d)", given_bit_size, given_bit_offset);
|
|
328
|
+
} else {
|
|
329
|
+
bit_offset = (((int)buffer_length * 8) + bit_offset);
|
|
330
|
+
if (bit_offset < 0) {
|
|
331
|
+
rb_funcall(self, id_method_raise_buffer_error, 5, symbol_read, param_buffer, param_data_type, param_bit_offset, param_bit_size);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/* Handle negative and zero bit sizes */
|
|
337
|
+
if (bit_size <= 0) {
|
|
338
|
+
if ((param_data_type == symbol_STRING) || (param_data_type == symbol_BLOCK)) {
|
|
339
|
+
bit_size = (((int)buffer_length * 8) - bit_offset + bit_size);
|
|
340
|
+
if (bit_size == 0) {
|
|
341
|
+
return rb_str_new2("");
|
|
342
|
+
} else if (bit_size < 0) {
|
|
343
|
+
rb_funcall(self, id_method_raise_buffer_error, 5, symbol_read, param_buffer, param_data_type, param_bit_offset, param_bit_size);
|
|
344
|
+
}
|
|
345
|
+
} else {
|
|
346
|
+
rb_raise(rb_eArgError, "bit_size %d must be positive for data types other than :STRING and :BLOCK", given_bit_size);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
/* define bounds of string to access this item */
|
|
351
|
+
lower_bound = (bit_offset / 8);
|
|
352
|
+
upper_bound = ((bit_offset + bit_size - 1) / 8);
|
|
353
|
+
|
|
354
|
+
/* Check for byte alignment */
|
|
355
|
+
byte_aligned = ((bit_offset % 8) == 0);
|
|
356
|
+
|
|
357
|
+
/* Sanity check buffer size */
|
|
358
|
+
if (upper_bound >= buffer_length) {
|
|
359
|
+
/* Check special case of little endian bit field */
|
|
360
|
+
if ((param_endianness == symbol_LITTLE_ENDIAN) && ((param_data_type == symbol_INT) || (param_data_type == symbol_UINT)) && (!((byte_aligned) && ((bit_size == 8) || (bit_size == 16) || (bit_size == 32) || (bit_size == 64)))) && (lower_bound < buffer_length)) {
|
|
361
|
+
/* Ok little endian bit field */
|
|
362
|
+
} else {
|
|
363
|
+
rb_funcall(self, id_method_raise_buffer_error, 5, symbol_read, param_buffer, param_data_type, param_bit_offset, param_bit_size);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
if ((param_data_type == symbol_STRING) || (param_data_type == symbol_BLOCK)) {
|
|
368
|
+
|
|
369
|
+
/*#######################################
|
|
370
|
+
*# Handle :STRING and :BLOCK data types
|
|
371
|
+
*#######################################*/
|
|
372
|
+
|
|
373
|
+
if (byte_aligned) {
|
|
374
|
+
string_length = upper_bound - lower_bound + 1;
|
|
375
|
+
string = malloc(string_length + 1);
|
|
376
|
+
memcpy(string, buffer + lower_bound, string_length);
|
|
377
|
+
string[string_length] = 0;
|
|
378
|
+
if (param_data_type == symbol_STRING) {
|
|
379
|
+
return_value = rb_str_new2(string);
|
|
380
|
+
} else /* param_data_type == symbol_BLOCK */ {
|
|
381
|
+
return_value = rb_str_new(string, string_length);
|
|
382
|
+
}
|
|
383
|
+
free(string);
|
|
384
|
+
} else {
|
|
385
|
+
rb_raise(rb_eArgError, "bit_offset %d is not byte aligned for data_type %s", given_bit_offset, RSTRING_PTR(rb_funcall(param_data_type, id_method_to_s, 0)));
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
} else if (param_data_type == symbol_INT) {
|
|
389
|
+
|
|
390
|
+
/*###################################
|
|
391
|
+
*# Handle :INT data type
|
|
392
|
+
*###################################*/
|
|
393
|
+
|
|
394
|
+
if ((byte_aligned) && ((bit_size == 8) || (bit_size == 16) || (bit_size == 32) || (bit_size == 64))) {
|
|
395
|
+
/*###########################################################
|
|
396
|
+
*# Handle byte-aligned 8, 16, 32, and 64 bit :INT
|
|
397
|
+
*###########################################################*/
|
|
398
|
+
|
|
399
|
+
if (bit_size == 8)
|
|
400
|
+
{
|
|
401
|
+
signed_char_value = *((signed char*) &buffer[lower_bound]);
|
|
402
|
+
return_value = INT2FIX(signed_char_value);
|
|
403
|
+
}
|
|
404
|
+
else if (bit_size == 16)
|
|
405
|
+
{
|
|
406
|
+
read_aligned_16(lower_bound, upper_bound, param_endianness, buffer, (unsigned char*) &signed_short_value);
|
|
407
|
+
return_value = INT2FIX(signed_short_value);
|
|
408
|
+
}
|
|
409
|
+
else if (bit_size == 32)
|
|
410
|
+
{
|
|
411
|
+
read_aligned_32(lower_bound, upper_bound, param_endianness, buffer, (unsigned char*) &signed_int_value);
|
|
412
|
+
return_value = INT2NUM(signed_int_value);
|
|
413
|
+
}
|
|
414
|
+
else /* bit_size == 64 */
|
|
415
|
+
{
|
|
416
|
+
read_aligned_64(lower_bound, upper_bound, param_endianness, buffer, (unsigned char*) &signed_long_long_value);
|
|
417
|
+
return_value = LL2NUM(signed_long_long_value);
|
|
418
|
+
}
|
|
419
|
+
} else {
|
|
420
|
+
string_length = ((bit_size - 1)/ 8) + 1;
|
|
421
|
+
array_length = string_length + 4; /* Required number of bytes plus slack */
|
|
422
|
+
unsigned_char_array = (unsigned char*) malloc(array_length);
|
|
423
|
+
read_bitfield(lower_bound, upper_bound, bit_offset, bit_size, given_bit_offset, given_bit_size, param_endianness, buffer, (int)buffer_length, unsigned_char_array);
|
|
424
|
+
|
|
425
|
+
num_words = ((string_length - 1) / 4) + 1;
|
|
426
|
+
num_bytes = num_words * 4;
|
|
427
|
+
num_bits = num_bytes * 8;
|
|
428
|
+
shift_needed = num_bits - bit_size;
|
|
429
|
+
shift_count = shift_needed / 8;
|
|
430
|
+
shift_needed = shift_needed % 8;
|
|
431
|
+
|
|
432
|
+
if (bit_size > 1) {
|
|
433
|
+
for (index = 0; index < shift_count; index++) {
|
|
434
|
+
signed_right_shift_byte_array(unsigned_char_array, num_bytes, 8);
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
if (shift_needed > 0) {
|
|
438
|
+
signed_right_shift_byte_array(unsigned_char_array, num_bytes, shift_needed);
|
|
439
|
+
}
|
|
440
|
+
} else {
|
|
441
|
+
for (index = 0; index < shift_count; index++) {
|
|
442
|
+
unsigned_right_shift_byte_array(unsigned_char_array, num_bytes, 8);
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
if (shift_needed > 0) {
|
|
446
|
+
unsigned_right_shift_byte_array(unsigned_char_array, num_bytes, shift_needed);
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
if (HOST_ENDIANNESS == symbol_LITTLE_ENDIAN) {
|
|
451
|
+
for (index = 0; index < num_bytes; index += 4) {
|
|
452
|
+
reverse_bytes(&(unsigned_char_array[index]), 4);
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
if (bit_size <= 31) {
|
|
457
|
+
return_value = INT2FIX(*((int*) unsigned_char_array));
|
|
458
|
+
} else if (bit_size == 32) {
|
|
459
|
+
return_value = INT2NUM(*((int*) unsigned_char_array));
|
|
460
|
+
} else {
|
|
461
|
+
return_value = rb_int2big(*((int*) unsigned_char_array));
|
|
462
|
+
temp_value = INT2FIX(32);
|
|
463
|
+
for (index = 4; index < num_bytes; index += 4) {
|
|
464
|
+
return_value = rb_big_lshift(return_value, temp_value);
|
|
465
|
+
if (FIXNUM_P(return_value)) {
|
|
466
|
+
signed_long_value = FIX2LONG(return_value);
|
|
467
|
+
return_value = rb_int2big(signed_long_value);
|
|
468
|
+
}
|
|
469
|
+
return_value = rb_big_plus(return_value, rb_uint2big(*((unsigned int*) &(unsigned_char_array[index]))));
|
|
470
|
+
if (FIXNUM_P(return_value)) {
|
|
471
|
+
signed_long_value = FIX2LONG(return_value);
|
|
472
|
+
return_value = rb_int2big(signed_long_value);
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
return_value = rb_big_norm(return_value);
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
free(unsigned_char_array);
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
} else if (param_data_type == symbol_UINT) {
|
|
482
|
+
|
|
483
|
+
/*###################################
|
|
484
|
+
*# Handle :UINT data type
|
|
485
|
+
*###################################*/
|
|
486
|
+
|
|
487
|
+
if ((byte_aligned) && ((bit_size == 8) || (bit_size == 16) || (bit_size == 32) || (bit_size == 64))) {
|
|
488
|
+
/*###########################################################
|
|
489
|
+
*# Handle byte-aligned 8, 16, 32, and 64 bit :UINT
|
|
490
|
+
*###########################################################*/
|
|
491
|
+
|
|
492
|
+
if (bit_size == 8)
|
|
493
|
+
{
|
|
494
|
+
unsigned_char_value = buffer[lower_bound];
|
|
495
|
+
return_value = INT2FIX(unsigned_char_value);
|
|
496
|
+
}
|
|
497
|
+
else if (bit_size == 16)
|
|
498
|
+
{
|
|
499
|
+
read_aligned_16(lower_bound, upper_bound, param_endianness, buffer, (unsigned char*) &unsigned_short_value);
|
|
500
|
+
return_value = INT2FIX(unsigned_short_value);
|
|
501
|
+
}
|
|
502
|
+
else if (bit_size == 32)
|
|
503
|
+
{
|
|
504
|
+
read_aligned_32(lower_bound, upper_bound, param_endianness, buffer, (unsigned char*) &unsigned_int_value);
|
|
505
|
+
return_value = UINT2NUM(unsigned_int_value);
|
|
506
|
+
}
|
|
507
|
+
else /* bit_size == 64 */
|
|
508
|
+
{
|
|
509
|
+
read_aligned_64(lower_bound, upper_bound, param_endianness, buffer, (unsigned char*) &unsigned_long_long_value);
|
|
510
|
+
return_value = ULL2NUM(unsigned_long_long_value);
|
|
511
|
+
}
|
|
512
|
+
} else {
|
|
513
|
+
string_length = ((bit_size - 1)/ 8) + 1;
|
|
514
|
+
array_length = string_length + 4; /* Required number of bytes plus slack */
|
|
515
|
+
unsigned_char_array = (unsigned char*) malloc(array_length);
|
|
516
|
+
read_bitfield(lower_bound, upper_bound, bit_offset, bit_size, given_bit_offset, given_bit_size, param_endianness, buffer, (int)buffer_length, unsigned_char_array);
|
|
517
|
+
|
|
518
|
+
num_words = ((string_length - 1) / 4) + 1;
|
|
519
|
+
num_bytes = num_words * 4;
|
|
520
|
+
num_bits = num_bytes * 8;
|
|
521
|
+
shift_needed = num_bits - bit_size;
|
|
522
|
+
shift_count = shift_needed / 8;
|
|
523
|
+
shift_needed = shift_needed % 8;
|
|
524
|
+
|
|
525
|
+
for (index = 0; index < shift_count; index++) {
|
|
526
|
+
unsigned_right_shift_byte_array(unsigned_char_array, num_bytes, 8);
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
if (shift_needed > 0) {
|
|
530
|
+
unsigned_right_shift_byte_array(unsigned_char_array, num_bytes, shift_needed);
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
if (HOST_ENDIANNESS == symbol_LITTLE_ENDIAN) {
|
|
534
|
+
for (index = 0; index < num_bytes; index += 4) {
|
|
535
|
+
reverse_bytes(&(unsigned_char_array[index]), 4);
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
if (bit_size <= 30) {
|
|
540
|
+
return_value = INT2FIX(*((int*) unsigned_char_array));
|
|
541
|
+
} else if (bit_size <= 32) {
|
|
542
|
+
return_value = UINT2NUM(*((unsigned int*) unsigned_char_array));
|
|
543
|
+
} else {
|
|
544
|
+
return_value = rb_uint2big(*((unsigned int*) unsigned_char_array));
|
|
545
|
+
temp_value = INT2FIX(32);
|
|
546
|
+
for (index = 4; index < num_bytes; index += 4) {
|
|
547
|
+
return_value = rb_big_lshift(return_value, temp_value);
|
|
548
|
+
if (FIXNUM_P(return_value)) {
|
|
549
|
+
signed_long_value = FIX2LONG(return_value);
|
|
550
|
+
return_value = rb_int2big(signed_long_value);
|
|
551
|
+
}
|
|
552
|
+
return_value = rb_big_plus(return_value, rb_uint2big(*((unsigned int*) &(unsigned_char_array[index]))));
|
|
553
|
+
if (FIXNUM_P(return_value)) {
|
|
554
|
+
signed_long_value = FIX2LONG(return_value);
|
|
555
|
+
return_value = rb_int2big(signed_long_value);
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
return_value = rb_big_norm(return_value);
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
free(unsigned_char_array);
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
} else if (param_data_type == symbol_FLOAT) {
|
|
565
|
+
|
|
566
|
+
/*##########################
|
|
567
|
+
*# Handle :FLOAT data type
|
|
568
|
+
*##########################*/
|
|
569
|
+
|
|
570
|
+
if (byte_aligned) {
|
|
571
|
+
switch (bit_size) {
|
|
572
|
+
case 32:
|
|
573
|
+
read_aligned_32(lower_bound, upper_bound, param_endianness, buffer, (unsigned char*) &float_value);
|
|
574
|
+
return_value = rb_float_new(float_value);
|
|
575
|
+
break;
|
|
576
|
+
|
|
577
|
+
case 64:
|
|
578
|
+
read_aligned_64(lower_bound, upper_bound, param_endianness, buffer, (unsigned char*) &double_value);
|
|
579
|
+
return_value = rb_float_new(double_value);
|
|
580
|
+
break;
|
|
581
|
+
|
|
582
|
+
default:
|
|
583
|
+
rb_raise(rb_eArgError, "bit_size is %d but must be 32 or 64 for data_type %s", given_bit_size, RSTRING_PTR(rb_funcall(param_data_type, id_method_to_s, 0)));
|
|
584
|
+
break;
|
|
585
|
+
};
|
|
586
|
+
} else {
|
|
587
|
+
rb_raise(rb_eArgError, "bit_offset %d is not byte aligned for data_type %s", given_bit_offset, RSTRING_PTR(rb_funcall(param_data_type, id_method_to_s, 0)));
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
} else {
|
|
591
|
+
|
|
592
|
+
/*############################
|
|
593
|
+
*# Handle Unknown data types
|
|
594
|
+
*############################*/
|
|
595
|
+
|
|
596
|
+
rb_raise(rb_eArgError, "data_type %s is not recognized", RSTRING_PTR(rb_funcall(param_data_type, id_method_to_s, 0)));
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
return return_value;
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
/*
|
|
603
|
+
* Returns the actual length as an integer.
|
|
604
|
+
*
|
|
605
|
+
* get_int_length(self) #=> 324
|
|
606
|
+
*/
|
|
607
|
+
static int get_int_length(VALUE self)
|
|
608
|
+
{
|
|
609
|
+
VALUE buffer = rb_ivar_get(self, id_ivar_buffer);
|
|
610
|
+
if (RTEST(buffer)) {
|
|
611
|
+
return (int)RSTRING_LEN(buffer);
|
|
612
|
+
} else {
|
|
613
|
+
return 0;
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
/*
|
|
618
|
+
* Returns the actual structure length.
|
|
619
|
+
*
|
|
620
|
+
* structure.length #=> 324
|
|
621
|
+
*/
|
|
622
|
+
static VALUE structure_length(VALUE self) {
|
|
623
|
+
return INT2FIX(get_int_length(self));
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
static VALUE read_item_internal(VALUE self, VALUE item, VALUE buffer) {
|
|
627
|
+
VALUE bit_offset = Qnil;
|
|
628
|
+
VALUE bit_size = Qnil;
|
|
629
|
+
VALUE data_type = Qnil;
|
|
630
|
+
VALUE array_size = Qnil;
|
|
631
|
+
VALUE endianness = Qnil;
|
|
632
|
+
|
|
633
|
+
data_type = rb_ivar_get(item, id_ivar_data_type);
|
|
634
|
+
if (data_type == symbol_DERIVED) {
|
|
635
|
+
return Qnil;
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
if (RTEST(buffer)) {
|
|
639
|
+
bit_offset = rb_ivar_get(item, id_ivar_bit_offset);
|
|
640
|
+
bit_size = rb_ivar_get(item, id_ivar_bit_size);
|
|
641
|
+
array_size = rb_ivar_get(item, id_ivar_array_size);
|
|
642
|
+
endianness = rb_ivar_get(item, id_ivar_endianness);
|
|
643
|
+
if (RTEST(array_size)) {
|
|
644
|
+
return rb_funcall(cBinaryAccessor, id_method_read_array, 6, bit_offset, bit_size, data_type, array_size, buffer, endianness);
|
|
645
|
+
} else {
|
|
646
|
+
return binary_accessor_read(cBinaryAccessor, bit_offset, bit_size, data_type, buffer, endianness);
|
|
647
|
+
}
|
|
648
|
+
} else {
|
|
649
|
+
rb_raise(rb_eRuntimeError, "No buffer given to read_item");
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
|
|
653
|
+
/*
|
|
654
|
+
* Read an item in the structure
|
|
655
|
+
*
|
|
656
|
+
* @param item [StructureItem] Instance of StructureItem or one of its subclasses
|
|
657
|
+
* @param value_type [Symbol] Not used. Subclasses should overload this
|
|
658
|
+
* parameter to check whether to perform conversions on the item.
|
|
659
|
+
* @param buffer [String] The binary buffer to read the item from
|
|
660
|
+
* @return Value based on the item definition. This could be a string, integer,
|
|
661
|
+
* float, or array of values.
|
|
662
|
+
*/
|
|
663
|
+
static VALUE read_item(int argc, VALUE* argv, VALUE self)
|
|
664
|
+
{
|
|
665
|
+
VALUE item = Qnil;
|
|
666
|
+
VALUE buffer = Qnil;
|
|
667
|
+
|
|
668
|
+
switch (argc)
|
|
669
|
+
{
|
|
670
|
+
case 1:
|
|
671
|
+
case 2:
|
|
672
|
+
item = argv[0];
|
|
673
|
+
buffer = rb_ivar_get(self, id_ivar_buffer);
|
|
674
|
+
break;
|
|
675
|
+
case 3:
|
|
676
|
+
item = argv[0];
|
|
677
|
+
buffer = argv[2];
|
|
678
|
+
break;
|
|
679
|
+
default:
|
|
680
|
+
/* Invalid number of arguments given */
|
|
681
|
+
rb_raise(rb_eArgError, "wrong number of arguments (%d for 1..3)", argc);
|
|
682
|
+
break;
|
|
683
|
+
};
|
|
684
|
+
|
|
685
|
+
return read_item_internal(self, item, buffer);
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
/*
|
|
689
|
+
* Comparison Operator based on bit_offset. This means that StructureItems
|
|
690
|
+
* with different names or bit sizes are equal if they have the same bit
|
|
691
|
+
* offset.
|
|
692
|
+
*/
|
|
693
|
+
static VALUE structure_item_spaceship(VALUE self, VALUE other_item) {
|
|
694
|
+
int bit_offset = FIX2INT(rb_ivar_get(self, id_ivar_bit_offset));
|
|
695
|
+
int other_bit_offset = FIX2INT(rb_ivar_get(other_item, id_ivar_bit_offset));
|
|
696
|
+
int bit_size = 0;
|
|
697
|
+
int other_bit_size = 0;
|
|
698
|
+
|
|
699
|
+
/* Handle same bit offset case */
|
|
700
|
+
if ((bit_offset == 0) && (other_bit_offset == 0)) {
|
|
701
|
+
/* Both bit_offsets are 0 so sort by bit_size
|
|
702
|
+
* This allows derived items with bit_size of 0 to be listed first
|
|
703
|
+
* Compare based on bit size */
|
|
704
|
+
bit_size = FIX2INT(rb_ivar_get(self, id_ivar_bit_size));
|
|
705
|
+
other_bit_size = FIX2INT(rb_ivar_get(other_item, id_ivar_bit_size));
|
|
706
|
+
if (bit_size == other_bit_size) {
|
|
707
|
+
return INT2FIX(0);
|
|
708
|
+
} if (bit_size < other_bit_size) {
|
|
709
|
+
return INT2FIX(-1);
|
|
710
|
+
} else {
|
|
711
|
+
return INT2FIX(1);
|
|
712
|
+
}
|
|
713
|
+
}
|
|
714
|
+
|
|
715
|
+
/* Handle different bit offsets */
|
|
716
|
+
if (((bit_offset >= 0) && (other_bit_offset >= 0)) || ((bit_offset < 0) && (other_bit_offset < 0))) {
|
|
717
|
+
/* Both Have Same Sign */
|
|
718
|
+
if (bit_offset == other_bit_offset) {
|
|
719
|
+
return INT2FIX(0);
|
|
720
|
+
} else if (bit_offset < other_bit_offset) {
|
|
721
|
+
return INT2FIX(-1);
|
|
722
|
+
} else {
|
|
723
|
+
return INT2FIX(1);
|
|
724
|
+
}
|
|
725
|
+
} else {
|
|
726
|
+
/* Different Signs */
|
|
727
|
+
if (bit_offset == other_bit_offset) {
|
|
728
|
+
return INT2FIX(0);
|
|
729
|
+
} else if (bit_offset < other_bit_offset) {
|
|
730
|
+
return INT2FIX(1);
|
|
731
|
+
} else {
|
|
732
|
+
return INT2FIX(-1);
|
|
733
|
+
}
|
|
734
|
+
}
|
|
735
|
+
}
|
|
736
|
+
|
|
737
|
+
/* Structure constructor
|
|
738
|
+
*
|
|
739
|
+
* @param default_endianness [Symbol] Must be one of
|
|
740
|
+
* {BinaryAccessor::ENDIANNESS}. By default it uses
|
|
741
|
+
* BinaryAccessor::HOST_ENDIANNESS to determine the endianness of the host platform.
|
|
742
|
+
* @param buffer [String] Buffer used to store the structure
|
|
743
|
+
* @param item_class [Class] Class used to instantiate new structure items.
|
|
744
|
+
* Must be StructureItem or one of its subclasses.
|
|
745
|
+
*/
|
|
746
|
+
static VALUE structure_initialize(int argc, VALUE* argv, VALUE self) {
|
|
747
|
+
VALUE default_endianness = Qnil;
|
|
748
|
+
VALUE buffer = Qnil;
|
|
749
|
+
VALUE item_class = Qnil;
|
|
750
|
+
|
|
751
|
+
switch (argc)
|
|
752
|
+
{
|
|
753
|
+
case 0:
|
|
754
|
+
default_endianness = HOST_ENDIANNESS;
|
|
755
|
+
buffer = rb_str_new2("");
|
|
756
|
+
item_class = cStructureItem;
|
|
757
|
+
break;
|
|
758
|
+
case 1:
|
|
759
|
+
default_endianness = argv[0];
|
|
760
|
+
buffer = rb_str_new2("");
|
|
761
|
+
item_class = cStructureItem;
|
|
762
|
+
break;
|
|
763
|
+
case 2:
|
|
764
|
+
default_endianness = argv[0];
|
|
765
|
+
buffer = argv[1];
|
|
766
|
+
item_class = cStructureItem;
|
|
767
|
+
break;
|
|
768
|
+
case 3:
|
|
769
|
+
default_endianness = argv[0];
|
|
770
|
+
buffer = argv[1];
|
|
771
|
+
item_class = argv[2];
|
|
772
|
+
break;
|
|
773
|
+
default:
|
|
774
|
+
/* Invalid number of arguments given */
|
|
775
|
+
rb_raise(rb_eArgError, "wrong number of arguments (%d for 0..3)", argc);
|
|
776
|
+
break;
|
|
777
|
+
};
|
|
778
|
+
|
|
779
|
+
if ((default_endianness == symbol_BIG_ENDIAN) || (default_endianness == symbol_LITTLE_ENDIAN)) {
|
|
780
|
+
rb_ivar_set(self, id_ivar_default_endianness, default_endianness);
|
|
781
|
+
if (RTEST(buffer)) {
|
|
782
|
+
Check_Type(buffer, T_STRING);
|
|
783
|
+
rb_funcall(buffer, id_method_force_encoding, 1, ASCII_8BIT_STRING);
|
|
784
|
+
rb_ivar_set(self, id_ivar_buffer, buffer);
|
|
785
|
+
} else {
|
|
786
|
+
rb_ivar_set(self, id_ivar_buffer, Qnil);
|
|
787
|
+
}
|
|
788
|
+
rb_ivar_set(self, id_ivar_item_class, item_class);
|
|
789
|
+
rb_ivar_set(self, id_ivar_items, rb_hash_new());
|
|
790
|
+
rb_ivar_set(self, id_ivar_sorted_items, rb_ary_new());
|
|
791
|
+
rb_ivar_set(self, id_ivar_defined_length, INT2FIX(0));
|
|
792
|
+
rb_ivar_set(self, id_ivar_defined_length_bits, INT2FIX(0));
|
|
793
|
+
rb_ivar_set(self, id_ivar_pos_bit_size, INT2FIX(0));
|
|
794
|
+
rb_ivar_set(self, id_ivar_neg_bit_size, INT2FIX(0));
|
|
795
|
+
rb_ivar_set(self, id_ivar_fixed_size, Qtrue);
|
|
796
|
+
rb_ivar_set(self, id_ivar_short_buffer_allowed, Qfalse);
|
|
797
|
+
rb_ivar_set(self, id_ivar_mutex, Qnil);
|
|
798
|
+
} else {
|
|
799
|
+
rb_raise(rb_eArgError, "Unrecognized endianness: %s - Must be :BIG_ENDIAN or :LITTLE_ENDIAN", RSTRING_PTR(rb_funcall(default_endianness, id_method_to_s, 0)));
|
|
800
|
+
}
|
|
801
|
+
|
|
802
|
+
return self;
|
|
803
|
+
}
|
|
804
|
+
|
|
805
|
+
/*
|
|
806
|
+
* Resize the buffer at least the defined length of the structure
|
|
807
|
+
*/
|
|
808
|
+
static VALUE resize_buffer(VALUE self)
|
|
809
|
+
{
|
|
810
|
+
VALUE buffer = rb_ivar_get(self, id_ivar_buffer);
|
|
811
|
+
if (RTEST(buffer)) {
|
|
812
|
+
VALUE value_defined_length = rb_ivar_get(self, id_ivar_defined_length);
|
|
813
|
+
long defined_length = FIX2INT(value_defined_length);
|
|
814
|
+
long current_length = RSTRING_LEN(buffer);
|
|
815
|
+
|
|
816
|
+
/* Extend data size */
|
|
817
|
+
if (current_length < defined_length)
|
|
818
|
+
{
|
|
819
|
+
rb_str_concat(buffer, rb_str_times(ZERO_STRING, INT2FIX(defined_length - current_length)));
|
|
820
|
+
}
|
|
821
|
+
}
|
|
822
|
+
|
|
823
|
+
return self;
|
|
824
|
+
}
|
|
825
|
+
|
|
826
|
+
/*
|
|
827
|
+
* Initialize all Packet methods
|
|
828
|
+
*/
|
|
829
|
+
void Init_structure (void)
|
|
830
|
+
{
|
|
831
|
+
int zero = 0;
|
|
832
|
+
|
|
833
|
+
id_method_to_s = rb_intern("to_s");
|
|
834
|
+
id_method_raise_buffer_error = rb_intern("raise_buffer_error");
|
|
835
|
+
id_method_read_array = rb_intern("read_array");
|
|
836
|
+
id_method_force_encoding = rb_intern("force_encoding");
|
|
837
|
+
id_method_freeze = rb_intern("freeze");
|
|
838
|
+
|
|
839
|
+
ASCII_8BIT_STRING = rb_str_new2("ASCII-8BIT");
|
|
840
|
+
rb_funcall(ASCII_8BIT_STRING, id_method_freeze, 0);
|
|
841
|
+
|
|
842
|
+
ZERO_STRING = rb_str_new((char*) &zero, 1);
|
|
843
|
+
rb_funcall(ZERO_STRING, id_method_freeze, 0);
|
|
844
|
+
id_const_ZERO_STRING = rb_intern("ZERO_STRING");
|
|
845
|
+
|
|
846
|
+
id_ivar_buffer = rb_intern("@buffer");
|
|
847
|
+
id_ivar_bit_offset = rb_intern("@bit_offset");
|
|
848
|
+
id_ivar_bit_size = rb_intern("@bit_size");
|
|
849
|
+
id_ivar_array_size = rb_intern("@array_size");
|
|
850
|
+
id_ivar_endianness = rb_intern("@endianness");
|
|
851
|
+
id_ivar_data_type = rb_intern("@data_type");
|
|
852
|
+
id_ivar_default_endianness = rb_intern("@default_endianness");
|
|
853
|
+
id_ivar_item_class = rb_intern("@item_class");
|
|
854
|
+
id_ivar_items = rb_intern("@items");
|
|
855
|
+
id_ivar_sorted_items = rb_intern("@sorted_items");
|
|
856
|
+
id_ivar_defined_length = rb_intern("@defined_length");
|
|
857
|
+
id_ivar_defined_length_bits = rb_intern("@defined_length_bits");
|
|
858
|
+
id_ivar_pos_bit_size = rb_intern("@pos_bit_size");
|
|
859
|
+
id_ivar_neg_bit_size = rb_intern("@neg_bit_size");
|
|
860
|
+
id_ivar_fixed_size = rb_intern("@fixed_size");
|
|
861
|
+
id_ivar_short_buffer_allowed = rb_intern("@short_buffer_allowed");
|
|
862
|
+
id_ivar_mutex = rb_intern("@mutex");
|
|
863
|
+
|
|
864
|
+
symbol_LITTLE_ENDIAN = ID2SYM(rb_intern("LITTLE_ENDIAN"));
|
|
865
|
+
symbol_BIG_ENDIAN = ID2SYM(rb_intern("BIG_ENDIAN"));
|
|
866
|
+
symbol_INT = ID2SYM(rb_intern("INT"));
|
|
867
|
+
symbol_UINT = ID2SYM(rb_intern("UINT"));
|
|
868
|
+
symbol_FLOAT = ID2SYM(rb_intern("FLOAT"));
|
|
869
|
+
symbol_STRING = ID2SYM(rb_intern("STRING"));
|
|
870
|
+
symbol_BLOCK = ID2SYM(rb_intern("BLOCK"));
|
|
871
|
+
symbol_DERIVED = ID2SYM(rb_intern("DERIVED"));
|
|
872
|
+
symbol_read = ID2SYM(rb_intern("read"));
|
|
873
|
+
|
|
874
|
+
if ((*((char *) &endianness_check)) == 1) {
|
|
875
|
+
HOST_ENDIANNESS = symbol_LITTLE_ENDIAN;
|
|
876
|
+
} else {
|
|
877
|
+
HOST_ENDIANNESS = symbol_BIG_ENDIAN;
|
|
878
|
+
}
|
|
879
|
+
|
|
880
|
+
mCosmos = rb_define_module("Cosmos");
|
|
881
|
+
|
|
882
|
+
cBinaryAccessor = rb_define_class_under(mCosmos, "BinaryAccessor", rb_cObject);
|
|
883
|
+
rb_define_singleton_method(cBinaryAccessor, "read", binary_accessor_read, 5);
|
|
884
|
+
|
|
885
|
+
cStructure = rb_define_class_under(mCosmos, "Structure", rb_cObject);
|
|
886
|
+
rb_const_set(cStructure, id_const_ZERO_STRING, ZERO_STRING);
|
|
887
|
+
rb_define_method(cStructure, "initialize", structure_initialize, -1);
|
|
888
|
+
rb_define_method(cStructure, "length", structure_length, 0);
|
|
889
|
+
rb_define_method(cStructure, "read_item", read_item, -1);
|
|
890
|
+
rb_define_method(cStructure, "resize_buffer", resize_buffer, 0);
|
|
891
|
+
|
|
892
|
+
cStructureItem = rb_define_class_under(mCosmos, "StructureItem", rb_cObject);
|
|
893
|
+
rb_define_method(cStructureItem, "<=>", structure_item_spaceship, 1);
|
|
894
|
+
}
|