cosmos 4.4.0-java → 4.5.1-java
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/.dockerignore +2 -0
- data/.gitignore +1 -0
- data/.travis.yml +6 -6
- data/Dockerfile +70 -0
- data/Manifest.txt +37 -2
- data/README.md +9 -0
- data/Rakefile +55 -5
- data/appveyor.yml +18 -8
- data/autohotkey/config/tools/cmd_sequence/cmd_sequence.txt +2 -0
- data/autohotkey/lib/cmd_sequence_exporter.rb +52 -0
- data/autohotkey/procedures/collect.rb +2 -2
- data/autohotkey/procedures/collect_util.rb +1 -1
- data/autohotkey/procedures/script_test.rb +1 -1
- data/autohotkey/tools/CmdSenderAHK2 +18 -0
- data/autohotkey/tools/cmd_extractor.ahk +11 -9
- data/autohotkey/tools/cmd_sender.ahk +35 -7
- data/autohotkey/tools/cmd_sender2.ahk +4 -0
- data/autohotkey/tools/cmd_sequence.ahk +22 -9
- data/autohotkey/tools/config_editor.ahk +4 -4
- data/autohotkey/tools/data_viewer.ahk +1 -1
- data/autohotkey/tools/limits_monitor.ahk +1 -1
- data/autohotkey/tools/packet_viewer.ahk +1 -1
- data/autohotkey/tools/script_runner.ahk +1 -1
- data/autohotkey/tools/test_runner2.ahk +1 -1
- data/autohotkey/tools/tlm_grapher.ahk +1 -1
- data/autohotkey/tools/tlm_grapher3.ahk +1 -1
- data/autohotkey/tools/tlm_viewer.ahk +1 -1
- data/autohotkey/tools/tlm_viewer2.ahk +1 -1
- data/autohotkey/tools/tlm_viewer5.ahk +1 -1
- data/bin/cstol_converter +1 -1
- data/bin/rubysloc +73 -28
- data/bin/xtce_converter +1 -1
- data/cosmos.gemspec +2 -2
- data/data/config/command_modifiers.yaml +16 -1
- data/data/config/interface_modifiers.yaml +3 -2
- data/data/config/param_item_modifiers.yaml +5 -0
- data/data/config/system.yaml +110 -23
- data/data/config/telemetry_modifiers.yaml +16 -1
- data/data/crc.txt +416 -411
- data/demo/Rakefile +4 -4
- data/demo/config/dart/Gemfile +1 -6
- data/demo/config/data/crc.txt +233 -232
- data/demo/config/system/system.txt +17 -6
- data/demo/config/system/system2.txt +17 -6
- data/demo/config/system/system_alt_ports.txt +17 -6
- data/demo/config/targets/INST/cmd_tlm/inst_cmds.txt +4 -4
- data/demo/config/targets/INST/cmd_tlm/inst_tlm.txt +4 -0
- data/demo/config/targets/INST/cmd_tlm/inst_tlm_override.txt +12 -0
- data/demo/config/targets/INST/lib/sim_inst.rb +2 -2
- data/demo/config/targets/INST/target.txt +1 -0
- data/demo/config/tools/handbook_creator/default_toc.xsl +59 -59
- data/demo/procedures/cosmos_api_test.rb +8 -8
- data/ext/cosmos/ext/buffered_file/buffered_file.c +2 -2
- data/ext/cosmos/ext/config_parser/config_parser.c +1 -2
- data/ext/cosmos/ext/line_graph/line_graph.c +53 -94
- data/ext/cosmos/ext/platform/platform.c +56 -21
- data/ext/cosmos/ext/polynomial_conversion/polynomial_conversion.c +4 -8
- data/ext/cosmos/ext/structure/structure.c +12 -0
- data/extensions/vscode/.gitignore +4 -0
- data/extensions/vscode/.vscode/launch.json +32 -0
- data/extensions/vscode/.vscode/settings.json +13 -0
- data/extensions/vscode/.vscode/tasks.json +79 -0
- data/extensions/vscode/License.txt +879 -0
- data/extensions/vscode/README.md +9 -0
- data/extensions/vscode/client/License.txt +879 -0
- data/extensions/vscode/client/README.md +39 -0
- data/extensions/vscode/client/cosmos.configuration.json +23 -0
- data/extensions/vscode/client/images/icon.png +0 -0
- data/extensions/vscode/client/package-lock.json +414 -0
- data/extensions/vscode/client/package.json +105 -0
- data/extensions/vscode/client/src/extension.ts +132 -0
- data/extensions/vscode/client/src/screen_preview.rb +25 -0
- data/extensions/vscode/client/syntaxes/cosmos.tmLanguage.json +219 -0
- data/extensions/vscode/client/tsconfig.json +17 -0
- data/extensions/vscode/package-lock.json +26 -0
- data/extensions/vscode/package.json +35 -0
- data/extensions/vscode/server/License.txt +879 -0
- data/extensions/vscode/server/package-lock.json +236 -0
- data/extensions/vscode/server/package.json +29 -0
- data/extensions/vscode/server/src/server.ts +59 -0
- data/extensions/vscode/server/tsconfig.json +16 -0
- data/install/Rakefile +4 -4
- data/install/config/dart/Gemfile +2 -7
- data/install/config/data/crc.txt +137 -137
- data/install/config/system/system.txt +17 -6
- data/install/config/tools/handbook_creator/default_toc.xsl +59 -59
- data/lib/cosmos/config/config_parser.rb +2 -10
- data/lib/cosmos/core_ext/class.rb +10 -0
- data/lib/cosmos/core_ext/time.rb +5 -3
- data/lib/cosmos/dart/config/boot.rb +1 -1
- data/lib/cosmos/dart/config/database.yml +2 -0
- data/lib/cosmos/dart/examples/dart_decom_client.rb +1 -1
- data/lib/cosmos/dart/lib/dart_common.rb +12 -5
- data/lib/cosmos/dart/lib/dart_constants.rb +15 -0
- data/lib/cosmos/dart/lib/dart_decom_query.rb +5 -6
- data/lib/cosmos/dart/lib/dart_decommutator.rb +64 -54
- data/lib/cosmos/dart/lib/dart_master_query.rb +71 -0
- data/lib/cosmos/dart/lib/dart_reducer_worker_thread.rb +165 -134
- data/lib/cosmos/dart/processes/dart.rb +4 -2
- data/lib/cosmos/dart/processes/dart_decom_server.rb +3 -3
- data/lib/cosmos/dart/processes/dart_ingester.rb +38 -1
- data/lib/cosmos/dart/processes/dart_master.rb +44 -0
- data/lib/cosmos/dart/processes/dart_util.rb +115 -0
- data/lib/cosmos/dart/spec/dart/dart_database_cleaner_spec.rb +2 -2
- data/lib/cosmos/gui/qt.rb +10 -10
- data/lib/cosmos/gui/qt_tool.rb +17 -12
- data/lib/cosmos/gui/text/completion_text_edit.rb +2 -0
- data/lib/cosmos/gui/widgets/dart_meta_frame.rb +22 -3
- data/lib/cosmos/interfaces/dart_status_interface.rb +1 -1
- data/lib/cosmos/interfaces/linc_interface.rb +3 -3
- data/lib/cosmos/interfaces/protocols/burst_protocol.rb +1 -1
- data/lib/cosmos/interfaces/protocols/crc_protocol.rb +1 -1
- data/lib/cosmos/interfaces/protocols/length_protocol.rb +5 -0
- data/lib/cosmos/interfaces/protocols/template_protocol.rb +3 -3
- data/lib/cosmos/interfaces/serial_interface.rb +7 -1
- data/lib/cosmos/interfaces/stream_interface.rb +1 -1
- data/lib/cosmos/interfaces/tcpip_server_interface.rb +16 -16
- data/lib/cosmos/io/io_multiplexer.rb +6 -2
- data/lib/cosmos/io/json_drb.rb +5 -5
- data/lib/cosmos/io/json_drb_object.rb +7 -2
- data/lib/cosmos/io/json_drb_rack.rb +25 -5
- data/lib/cosmos/io/json_rpc.rb +1 -1
- data/lib/cosmos/io/posix_serial_driver.rb +60 -22
- data/lib/cosmos/io/serial_driver.rb +11 -8
- data/lib/cosmos/io/win32_serial_driver.rb +31 -3
- data/lib/cosmos/packet_logs/packet_log_reader.rb +2 -2
- data/lib/cosmos/packets/packet.rb +9 -9
- data/lib/cosmos/packets/packet_config.rb +27 -9
- data/lib/cosmos/packets/parsers/xtce_converter.rb +10 -10
- data/lib/cosmos/packets/parsers/xtce_parser.rb +3 -0
- data/lib/cosmos/packets/structure.rb +35 -5
- data/lib/cosmos/packets/structure_item.rb +5 -1
- data/lib/cosmos/packets/telemetry.rb +7 -1
- data/lib/cosmos/script/api_shared.rb +18 -1
- data/lib/cosmos/script/extract.rb +1 -1
- data/lib/cosmos/script/script.rb +4 -11
- data/lib/cosmos/streams/serial_stream.rb +11 -6
- data/lib/cosmos/system/system.rb +155 -57
- data/lib/cosmos/tools/cmd_sender/cmd_param_table_item_delegate.rb +15 -0
- data/lib/cosmos/tools/cmd_sender/cmd_params.rb +382 -0
- data/lib/cosmos/tools/cmd_sender/cmd_sender.rb +29 -318
- data/lib/cosmos/tools/cmd_sequence/cmd_sequence.rb +14 -17
- data/lib/cosmos/tools/cmd_sequence/sequence_item.rb +38 -331
- data/lib/cosmos/tools/cmd_sequence/sequence_list.rb +16 -11
- data/lib/cosmos/tools/cmd_tlm_server/api.rb +10 -8
- data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +2 -2
- data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +1 -0
- data/lib/cosmos/tools/cmd_tlm_server/gui/logging_tab.rb +1 -1
- data/lib/cosmos/tools/cmd_tlm_server/interface_thread.rb +29 -26
- data/lib/cosmos/tools/cmd_tlm_server/limits_groups_background_task.rb +1 -1
- data/lib/cosmos/tools/cmd_tlm_server/router_thread.rb +5 -0
- data/lib/cosmos/tools/config_editor/config_editor.rb +34 -3
- data/lib/cosmos/tools/config_editor/config_editor_frame.rb +8 -9
- data/lib/cosmos/tools/config_editor/system_config_dialog.rb +158 -0
- data/lib/cosmos/tools/handbook_creator/handbook_creator.rb +1 -1
- data/lib/cosmos/tools/handbook_creator/handbook_creator_config.rb +1 -1
- data/lib/cosmos/tools/script_runner/script_runner_frame.rb +7 -4
- data/lib/cosmos/tools/test_runner/test.rb +6 -3
- data/lib/cosmos/tools/test_runner/test_runner.rb +6 -6
- data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +3 -3
- data/lib/cosmos/tools/tlm_extractor/tlm_extractor_config.rb +1 -4
- data/lib/cosmos/tools/tlm_extractor/tlm_extractor_processor.rb +20 -16
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_dart_thread.rb +21 -17
- data/lib/cosmos/tools/tlm_grapher/tlm_grapher.rb +18 -11
- data/lib/cosmos/tools/tlm_viewer/tlm_viewer.rb +17 -6
- data/lib/cosmos/tools/tlm_viewer/widgets/canvasdot_widget.rb +2 -0
- data/lib/cosmos/top_level.rb +1 -1
- data/lib/cosmos/utilities/ruby_lex_utils.rb +34 -30
- data/lib/cosmos/utilities/simulated_target.rb +1 -1
- data/lib/cosmos/version.rb +5 -5
- data/lib/cosmos/win32/excel.rb +23 -17
- data/run_gui_tests.bat +1 -0
- data/spec/core_ext/class_spec.rb +54 -0
- data/spec/core_ext/socket_spec.rb +1 -1
- data/spec/core_ext/time_spec.rb +4 -0
- data/spec/install/yaml_docs_spec.rb +26 -6
- data/spec/interfaces/linc_interface_spec.rb +1 -1
- data/spec/interfaces/protocols/length_protocol_spec.rb +39 -0
- data/spec/interfaces/serial_interface_spec.rb +1 -5
- data/spec/io/json_drb_rack_spec.rb +166 -0
- data/spec/io/json_drb_spec.rb +14 -0
- data/spec/io/json_rpc_spec.rb +4 -5
- data/spec/io/posix_serial_driver_spec.rb +81 -0
- data/spec/io/win32_serial_driver_spec.rb +33 -3
- data/spec/packet_logs/packet_log_reader_spec.rb +36 -37
- data/spec/packets/structure_spec.rb +52 -2
- data/spec/packets/telemetry_spec.rb +29 -1
- data/spec/script/extract_spec.rb +4 -1
- data/spec/system/system_spec.rb +111 -3
- data/spec/tools/cmd_tlm_server/api_spec.rb +12 -12
- data/spec/tools/cmd_tlm_server/background_tasks_spec.rb +2 -2
- data/spec/tools/cmd_tlm_server/interface_thread_spec.rb +4 -3
- data/spec/tools/cmd_tlm_server/router_thread_spec.rb +2 -3
- data/spec/utilities/logger_spec.rb +3 -3
- data/spec/utilities/message_log_spec.rb +6 -3
- data/tasks/gemfile_stats.rake +22 -13
- data/test/performance/Rakefile +4 -4
- data/test/performance/config/data/crc.txt +67 -48
- metadata +44 -9
- data/demo/outputs/dart/logs/README.txt +0 -1
- data/lib/cosmos/dart/Gemfile +0 -69
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
# encoding: ascii-8bit
|
|
2
|
+
|
|
3
|
+
# Copyright 2014 Ball Aerospace & Technologies Corp.
|
|
4
|
+
# All Rights Reserved.
|
|
5
|
+
#
|
|
6
|
+
# This program is free software; you can modify and/or redistribute it
|
|
7
|
+
# under the terms of the GNU General Public License
|
|
8
|
+
# as published by the Free Software Foundation; version 3 with
|
|
9
|
+
# attribution addendums as found in the LICENSE.txt
|
|
10
|
+
|
|
11
|
+
require 'cosmos'
|
|
12
|
+
Cosmos.catch_fatal_exception do
|
|
13
|
+
require 'cosmos/tools/cmd_sender/cmd_param_table_item_delegate'
|
|
14
|
+
require 'cosmos/gui/dialogs/cmd_details_dialog'
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
module Cosmos
|
|
18
|
+
# Builds a command parameter widget for use in Command Sender and Command Sequence.
|
|
19
|
+
# The main method is update_cmd_params which builds all the widgets. It can take
|
|
20
|
+
# existing values for use in populating the command parameter widgets.
|
|
21
|
+
class CmdParams < Qt::Widget
|
|
22
|
+
# Class instance variables which apply to all command parameters
|
|
23
|
+
@states_in_hex = false
|
|
24
|
+
@show_ignored = false
|
|
25
|
+
class << self
|
|
26
|
+
attr_accessor :states_in_hex, :show_ignored
|
|
27
|
+
end
|
|
28
|
+
MANUALLY = CmdParamTableItemDelegate::MANUALLY
|
|
29
|
+
# Emit the modified signal to allow changes to propagate upwards
|
|
30
|
+
signals 'modified()'
|
|
31
|
+
|
|
32
|
+
def initialize
|
|
33
|
+
super()
|
|
34
|
+
@param_widgets = []
|
|
35
|
+
@table = nil
|
|
36
|
+
@packet = nil
|
|
37
|
+
@file_dir = System.paths['LOGS']
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Changes the display of items with states to hex if checked is true.
|
|
41
|
+
# Otherwise state values are displayed as decimal.
|
|
42
|
+
# @param checked [Boolean] Whether to display state values in hex
|
|
43
|
+
def states_in_hex(checked)
|
|
44
|
+
CmdParams.states_in_hex = checked
|
|
45
|
+
@param_widgets.each do |_, _, state_value_item|
|
|
46
|
+
next unless state_value_item
|
|
47
|
+
text = state_value_item.text
|
|
48
|
+
quotes_removed = text.remove_quotes
|
|
49
|
+
if text == quotes_removed
|
|
50
|
+
if checked
|
|
51
|
+
if text.is_int?
|
|
52
|
+
@table.blockSignals(true)
|
|
53
|
+
state_value_item.text = sprintf("0x%X", text.to_i)
|
|
54
|
+
@table.blockSignals(false)
|
|
55
|
+
end
|
|
56
|
+
else
|
|
57
|
+
if text.is_hex?
|
|
58
|
+
@table.blockSignals(true)
|
|
59
|
+
state_value_item.text = Integer(text).to_s
|
|
60
|
+
@table.blockSignals(false)
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# @return [Hash] Hash keyed by parameter name with String formatted value
|
|
68
|
+
def params_text(raw = false)
|
|
69
|
+
params = {}
|
|
70
|
+
Qt.execute_in_main_thread do
|
|
71
|
+
@param_widgets.each do |packet_item, value_item, state_value_item|
|
|
72
|
+
text = value_item.text
|
|
73
|
+
text = state_value_item.text if state_value_item && (text == MANUALLY or raw)
|
|
74
|
+
quotes_removed = text.remove_quotes
|
|
75
|
+
if text == quotes_removed
|
|
76
|
+
if (packet_item.data_type == :STRING or packet_item.data_type == :BLOCK) and text.upcase.start_with?("0X")
|
|
77
|
+
params[packet_item.name] = text.hex_to_byte_string
|
|
78
|
+
else
|
|
79
|
+
params[packet_item.name] = text.convert_to_value
|
|
80
|
+
end
|
|
81
|
+
else
|
|
82
|
+
params[packet_item.name] = quotes_removed
|
|
83
|
+
end
|
|
84
|
+
Kernel.raise "#{packet_item.name} is required." if quotes_removed == '' && packet_item.required
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
params
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# Primary method which builds the command parameter table. The passed in command packet
|
|
91
|
+
# is used to get all the command parameters to build. Existing parameters can be passed
|
|
92
|
+
# in to set the initial values for all command parameters. You can also specify whether
|
|
93
|
+
# to display the ignored parameters when building the command parameter table. Note that
|
|
94
|
+
# each time this method is called the TableWidget is disposed and rebuilt.
|
|
95
|
+
#
|
|
96
|
+
# @param packet [Packet] The command packet to build a parameter list for
|
|
97
|
+
# @param existing [Hash] Hash keyed by parameter name with text values.
|
|
98
|
+
# These values will be used as the defaults for all command parameters.
|
|
99
|
+
# @param show_ignored [Boolean] Whether to display the ignored
|
|
100
|
+
# parameters. Pass nil (the default) to keep the existing setting.
|
|
101
|
+
def update_cmd_params(packet, existing: nil, show_ignored: nil)
|
|
102
|
+
@packet = packet
|
|
103
|
+
old_params = {}
|
|
104
|
+
old_params = get_params(show_ignored) if !show_ignored.nil?
|
|
105
|
+
old_params = set_existing(packet, existing) if existing
|
|
106
|
+
|
|
107
|
+
# Determine which items to display
|
|
108
|
+
target = System.targets[packet.target_name]
|
|
109
|
+
packet_items = packet.sorted_items
|
|
110
|
+
shown_packet_items = []
|
|
111
|
+
packet_items.each do |packet_item|
|
|
112
|
+
next if target && target.ignored_parameters.include?(packet_item.name) && !CmdParams.show_ignored
|
|
113
|
+
shown_packet_items << packet_item
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# Destroy the old table widget and parameters
|
|
117
|
+
@table.dispose if @table
|
|
118
|
+
@table = nil
|
|
119
|
+
@param_widgets = []
|
|
120
|
+
row = 0
|
|
121
|
+
shown_packet_items.each do |packet_item|
|
|
122
|
+
value_item = nil
|
|
123
|
+
state_value_item = nil
|
|
124
|
+
@table = create_table(shown_packet_items.length) unless @table
|
|
125
|
+
|
|
126
|
+
# Parameter Name
|
|
127
|
+
item = Qt::TableWidgetItem.new("#{packet_item.name}:")
|
|
128
|
+
item.setTextAlignment(Qt::AlignRight | Qt::AlignVCenter)
|
|
129
|
+
item.setFlags(Qt::NoItemFlags | Qt::ItemIsSelectable | Qt::ItemIsEnabled)
|
|
130
|
+
@table.setItem(row, 0, item)
|
|
131
|
+
|
|
132
|
+
# Parameter Value
|
|
133
|
+
if packet_item.states
|
|
134
|
+
value_item, state_value_item = create_state_item(packet_item, old_params, row)
|
|
135
|
+
else
|
|
136
|
+
value_item = create_item(packet_item, old_params, row)
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
# Units
|
|
140
|
+
item = Qt::TableWidgetItem.new(packet_item.units.to_s)
|
|
141
|
+
item.setTextAlignment(Qt::AlignRight | Qt::AlignVCenter)
|
|
142
|
+
item.setFlags(Qt::NoItemFlags | Qt::ItemIsSelectable | Qt::ItemIsEnabled)
|
|
143
|
+
@table.setItem(row, 3, item)
|
|
144
|
+
|
|
145
|
+
# Description
|
|
146
|
+
item = Qt::TableWidgetItem.new(packet_item.description.to_s)
|
|
147
|
+
item.setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter)
|
|
148
|
+
item.setFlags(Qt::NoItemFlags | Qt::ItemIsSelectable | Qt::ItemIsEnabled)
|
|
149
|
+
@table.setItem(row, 4, item)
|
|
150
|
+
|
|
151
|
+
@param_widgets << [packet_item, value_item, state_value_item]
|
|
152
|
+
row += 1
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
connect_table_item_changed() if @table
|
|
156
|
+
@table
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
# If the user right clicks over a table item, this method displays a context
|
|
160
|
+
# menu with various options.
|
|
161
|
+
# @param point [Qt::Point] Point to display the context menu
|
|
162
|
+
def context_menu(point)
|
|
163
|
+
item = @table.itemAt(point)
|
|
164
|
+
if item
|
|
165
|
+
target_name = @packet.target_name
|
|
166
|
+
packet_name = @packet.packet_name
|
|
167
|
+
item_name = @table.item(item.row, 0).text[0..-2] # Remove :
|
|
168
|
+
if target_name.length > 0 && packet_name.length > 0 && item_name.length > 0
|
|
169
|
+
menu = Qt::Menu.new()
|
|
170
|
+
|
|
171
|
+
details_action = Qt::Action.new("Details #{target_name} #{packet_name} #{item_name}", self)
|
|
172
|
+
details_action.statusTip = "Popup details about #{target_name} #{packet_name} #{item_name}"
|
|
173
|
+
details_action.connect(SIGNAL('triggered()')) do
|
|
174
|
+
CmdDetailsDialog.new(nil, target_name, packet_name, item_name)
|
|
175
|
+
end
|
|
176
|
+
menu.addAction(details_action)
|
|
177
|
+
|
|
178
|
+
file_chooser_action = Qt::Action.new("Insert Filename", self)
|
|
179
|
+
file_chooser_action.statusTip = "Select a file and place its name into this parameter"
|
|
180
|
+
file_chooser_action.connect(SIGNAL('triggered()')) do
|
|
181
|
+
filename = Qt::FileDialog::getOpenFileName(self, "Insert Filename:", @file_dir, "All Files (*)")
|
|
182
|
+
if filename && !filename.empty?
|
|
183
|
+
@file_dir = File.dirname(filename)
|
|
184
|
+
_, value_item, state_value_item = @param_widgets[item.row]
|
|
185
|
+
if state_value_item
|
|
186
|
+
state_value_item.setText(filename)
|
|
187
|
+
elsif value_item
|
|
188
|
+
value_item.setText(filename)
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
menu.addAction(file_chooser_action)
|
|
193
|
+
|
|
194
|
+
menu.exec(@table.mapToGlobal(point))
|
|
195
|
+
menu.dispose
|
|
196
|
+
end
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
private
|
|
201
|
+
|
|
202
|
+
def get_params(show_ignored)
|
|
203
|
+
params = {}
|
|
204
|
+
CmdParams.show_ignored = show_ignored
|
|
205
|
+
# Save parameter values
|
|
206
|
+
@param_widgets.each do |packet_item, value_item, state_value_item|
|
|
207
|
+
text = value_item.text
|
|
208
|
+
if state_value_item
|
|
209
|
+
params[packet_item.name] = [text, state_value_item.text]
|
|
210
|
+
else
|
|
211
|
+
params[packet_item.name] = text
|
|
212
|
+
end
|
|
213
|
+
end
|
|
214
|
+
params
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
def set_existing(packet, existing)
|
|
218
|
+
params = {}
|
|
219
|
+
existing.each do |param_name, param_value|
|
|
220
|
+
packet_item = packet.items[param_name]
|
|
221
|
+
if packet_item.states
|
|
222
|
+
state_value = packet_item.states[param_value]
|
|
223
|
+
unless state_value # If we couldn't lookup the value by the name it's manual
|
|
224
|
+
state_value = param_value
|
|
225
|
+
param_value = MANUALLY
|
|
226
|
+
end
|
|
227
|
+
params[param_name] = [param_value.to_s, state_value.to_s]
|
|
228
|
+
else
|
|
229
|
+
params[param_name] = param_value.to_s
|
|
230
|
+
end
|
|
231
|
+
end
|
|
232
|
+
params
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
def create_table(length)
|
|
236
|
+
table = Qt::TableWidget.new()
|
|
237
|
+
table.setSizePolicy(Qt::SizePolicy::Expanding, Qt::SizePolicy::Expanding)
|
|
238
|
+
table.setWordWrap(true)
|
|
239
|
+
table.setRowCount(length)
|
|
240
|
+
table.setColumnCount(5)
|
|
241
|
+
table.setHorizontalHeaderLabels(['Name', ' Value or State ', ' ', 'Units', 'Description'])
|
|
242
|
+
table.horizontalHeader.setStretchLastSection(true)
|
|
243
|
+
table.verticalHeader.setVisible(false)
|
|
244
|
+
table.setItemDelegate(CmdParamTableItemDelegate.new(table, @param_widgets, @production))
|
|
245
|
+
table.setContextMenuPolicy(Qt::CustomContextMenu)
|
|
246
|
+
table.verticalHeader.setResizeMode(Qt::HeaderView::ResizeToContents)
|
|
247
|
+
table.setEditTriggers(Qt::AbstractItemView::DoubleClicked | Qt::AbstractItemView::SelectedClicked | Qt::AbstractItemView::AnyKeyPressed)
|
|
248
|
+
table.setSelectionMode(Qt::AbstractItemView::NoSelection)
|
|
249
|
+
table.connect(SIGNAL('customContextMenuRequested(const QPoint&)')) {|point| context_menu(point) }
|
|
250
|
+
table.connect(SIGNAL('itemClicked(QTableWidgetItem*)')) do |item|
|
|
251
|
+
table.editItem(item) if (item.flags & Qt::ItemIsEditable) != 0
|
|
252
|
+
end
|
|
253
|
+
return table
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
def create_state_item(packet_item, old_params, row)
|
|
257
|
+
default_state = packet_item.states.key(packet_item.default)
|
|
258
|
+
if old_params[packet_item.name]
|
|
259
|
+
value_item = Qt::TableWidgetItem.new(old_params[packet_item.name][0])
|
|
260
|
+
else
|
|
261
|
+
if default_state
|
|
262
|
+
value_item = Qt::TableWidgetItem.new(default_state.to_s)
|
|
263
|
+
elsif @production
|
|
264
|
+
value_item = Qt::TableWidgetItem.new(packet_item.states.keys[0])
|
|
265
|
+
else
|
|
266
|
+
value_item = Qt::TableWidgetItem.new(MANUALLY)
|
|
267
|
+
end
|
|
268
|
+
end
|
|
269
|
+
value_item.setTextAlignment(Qt::AlignRight | Qt::AlignVCenter)
|
|
270
|
+
value_item.setFlags(Qt::NoItemFlags | Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable)
|
|
271
|
+
@table.setItem(row, 1, value_item)
|
|
272
|
+
|
|
273
|
+
state_value = packet_item.default.to_s
|
|
274
|
+
if old_params[packet_item.name]
|
|
275
|
+
state_value = old_params[packet_item.name][1]
|
|
276
|
+
end
|
|
277
|
+
is_integer = Integer(state_value) rescue false
|
|
278
|
+
if CmdParams.states_in_hex && is_integer
|
|
279
|
+
state_value_item = Qt::TableWidgetItem.new(sprintf("0x%X", state_value))
|
|
280
|
+
else
|
|
281
|
+
if state_value.is_printable?
|
|
282
|
+
state_value_item = Qt::TableWidgetItem.new(state_value)
|
|
283
|
+
else
|
|
284
|
+
state_value_item = Qt::TableWidgetItem.new("0x" + state_value.simple_formatted)
|
|
285
|
+
end
|
|
286
|
+
end
|
|
287
|
+
state_value_item.setTextAlignment(Qt::AlignRight | Qt::AlignVCenter)
|
|
288
|
+
if @production
|
|
289
|
+
state_value_item.setFlags(Qt::NoItemFlags)
|
|
290
|
+
else
|
|
291
|
+
state_value_item.setFlags(Qt::NoItemFlags | Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable)
|
|
292
|
+
end
|
|
293
|
+
@table.setItem(row, 2, state_value_item)
|
|
294
|
+
|
|
295
|
+
# If the parameter is required clear the combobox and
|
|
296
|
+
# clear the value field so they have to choose something
|
|
297
|
+
if packet_item.required && !old_params[packet_item.name]
|
|
298
|
+
value_item.setText('')
|
|
299
|
+
state_value_item.setText('')
|
|
300
|
+
end
|
|
301
|
+
return [value_item, state_value_item]
|
|
302
|
+
end
|
|
303
|
+
|
|
304
|
+
def create_item(packet_item, old_params, row)
|
|
305
|
+
if old_params[packet_item.name]
|
|
306
|
+
value_text = old_params[packet_item.name]
|
|
307
|
+
elsif packet_item.required
|
|
308
|
+
value_text = ''
|
|
309
|
+
else
|
|
310
|
+
if packet_item.format_string
|
|
311
|
+
begin
|
|
312
|
+
value_text = sprintf(packet_item.format_string, packet_item.default)
|
|
313
|
+
rescue
|
|
314
|
+
# Oh well - Don't use the format string
|
|
315
|
+
value_text = packet_item.default.to_s
|
|
316
|
+
end
|
|
317
|
+
else
|
|
318
|
+
value_text = packet_item.default.to_s
|
|
319
|
+
end
|
|
320
|
+
end
|
|
321
|
+
if !value_text.is_printable?
|
|
322
|
+
value_text = "0x" + value_text.simple_formatted
|
|
323
|
+
# Add quotes around STRING or BLOCK defaults so they are interpreted correctly
|
|
324
|
+
elsif (packet_item.data_type == :STRING or packet_item.data_type == :BLOCK)
|
|
325
|
+
value_text = "'#{value_text}'"
|
|
326
|
+
end
|
|
327
|
+
value_item = Qt::TableWidgetItem.new(value_text)
|
|
328
|
+
value_item.setTextAlignment(Qt::AlignRight | Qt::AlignVCenter)
|
|
329
|
+
value_item.setFlags(Qt::NoItemFlags | Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable)
|
|
330
|
+
@table.setItem(row, 1, value_item)
|
|
331
|
+
@table.setSpan(row, 1, 1, 2)
|
|
332
|
+
return value_item
|
|
333
|
+
end
|
|
334
|
+
|
|
335
|
+
def connect_table_item_changed
|
|
336
|
+
@table.connect(SIGNAL('itemChanged(QTableWidgetItem*)')) do |item|
|
|
337
|
+
packet_item, value_item, state_value_item = @param_widgets[item.row]
|
|
338
|
+
if item.column == 1
|
|
339
|
+
if packet_item.states
|
|
340
|
+
value = packet_item.states[value_item.text]
|
|
341
|
+
if packet_item.hazardous && packet_item.hazardous.key?(value_item.text)
|
|
342
|
+
desc = packet_item.hazardous[value]
|
|
343
|
+
# Hazardous states aren't required to have a description so use the item description
|
|
344
|
+
desc = packet_item.description unless desc
|
|
345
|
+
@table.item(item.row, 4).setText("(Hazardous) #{desc}")
|
|
346
|
+
else
|
|
347
|
+
@table.item(item.row, 4).setText(packet_item.description)
|
|
348
|
+
end
|
|
349
|
+
@table.blockSignals(true)
|
|
350
|
+
if CmdParams.states_in_hex && value.kind_of?(Integer)
|
|
351
|
+
state_value_item.setText(sprintf("0x%X", value))
|
|
352
|
+
else
|
|
353
|
+
state_value_item.setText(value.to_s)
|
|
354
|
+
end
|
|
355
|
+
@table.blockSignals(false)
|
|
356
|
+
end
|
|
357
|
+
elsif item.column == 2
|
|
358
|
+
@table.blockSignals(true)
|
|
359
|
+
@table.item(item.row, 1).setText(MANUALLY)
|
|
360
|
+
@table.blockSignals(false)
|
|
361
|
+
end
|
|
362
|
+
calculate_height()
|
|
363
|
+
emit modified()
|
|
364
|
+
end
|
|
365
|
+
calculate_height()
|
|
366
|
+
end
|
|
367
|
+
|
|
368
|
+
def calculate_height
|
|
369
|
+
@table.resizeColumnsToContents()
|
|
370
|
+
@table.resizeRowsToContents()
|
|
371
|
+
height = @table.horizontalHeader.height + 2 # 2 = Header frame?
|
|
372
|
+
@table.rowCount.times do |i|
|
|
373
|
+
# TODO: rowHeight does not reflect word wrapping ... it's always 37
|
|
374
|
+
height += @table.rowHeight(i)
|
|
375
|
+
# NOTE: Checking the fontMetrics boundingRect also does not refect word wrapping
|
|
376
|
+
# e.g. Cosmos.getFontMetrics(@table.font).boundingRect(@table.item(x,y).text).height
|
|
377
|
+
end
|
|
378
|
+
@table.setMaximumHeight(height)
|
|
379
|
+
@table.setMinimumHeight(height)
|
|
380
|
+
end
|
|
381
|
+
end
|
|
382
|
+
end
|