Module: Cosmos::Widget

Overview

The Widget module must be included by all widget classes used to display telemetry by COSMOS. It provides methods to process settings applied in Telemetry Viewer screen definitions as well as adding a context menu for all widgets which take a value.

Defined Under Namespace

Modules: ClassMethods

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#itemObject (readonly)

Returns the value of attribute item.



31
32
33
# File 'lib/cosmos/tools/tlm_viewer/widgets/widget.rb', line 31

def item
  @item
end

#item_nameObject (readonly)

Returns the value of attribute item_name.



30
31
32
# File 'lib/cosmos/tools/tlm_viewer/widgets/widget.rb', line 30

def item_name
  @item_name
end

#limits_setObject

Returns the value of attribute limits_set.



33
34
35
# File 'lib/cosmos/tools/tlm_viewer/widgets/widget.rb', line 33

def limits_set
  @limits_set
end

#limits_stateObject

Returns the value of attribute limits_state.



23
24
25
# File 'lib/cosmos/tools/tlm_viewer/widgets/widget.rb', line 23

def limits_state
  @limits_state
end

#packetObject (readonly)

Returns the value of attribute packet.



32
33
34
# File 'lib/cosmos/tools/tlm_viewer/widgets/widget.rb', line 32

def packet
  @packet
end

#packet_nameObject (readonly)

Returns the value of attribute packet_name.



29
30
31
# File 'lib/cosmos/tools/tlm_viewer/widgets/widget.rb', line 29

def packet_name
  @packet_name
end

#polling_periodObject

Returns the value of attribute polling_period.



25
26
27
# File 'lib/cosmos/tools/tlm_viewer/widgets/widget.rb', line 25

def polling_period
  @polling_period
end

#screenObject

Returns the value of attribute screen.



26
27
28
# File 'lib/cosmos/tools/tlm_viewer/widgets/widget.rb', line 26

def screen
  @screen
end

#settingsObject

Returns the value of attribute settings.



24
25
26
# File 'lib/cosmos/tools/tlm_viewer/widgets/widget.rb', line 24

def settings
  @settings
end

#target_nameObject (readonly)

Returns the value of attribute target_name.



28
29
30
# File 'lib/cosmos/tools/tlm_viewer/widgets/widget.rb', line 28

def target_name
  @target_name
end

#valueObject

Returns the value of attribute value.



34
35
36
# File 'lib/cosmos/tools/tlm_viewer/widgets/widget.rb', line 34

def value
  @value
end

#value_typeObject

Returns the value of attribute value_type.



22
23
24
# File 'lib/cosmos/tools/tlm_viewer/widgets/widget.rb', line 22

def value_type
  @value_type
end

Class Method Details

.included(base) ⇒ Object



82
83
84
# File 'lib/cosmos/tools/tlm_viewer/widgets/widget.rb', line 82

def self.included(base)
  base.extend(ClassMethods)
end

Instance Method Details

#context_menuObject



209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
# File 'lib/cosmos/tools/tlm_viewer/widgets/widget.rb', line 209

def context_menu
  menu = Qt::Menu.new
  details = Qt::Action.new("Details #{@target_name} #{@packet_name} #{@item_name}", menu)
  details.connect(SIGNAL('triggered()')) do
    if @target_name and @packet_name and @item_name
      if @packet_name.upcase == Telemetry::LATEST_PACKET_NAME
        packets = System.telemetry.latest_packets(@target_name, @item_name)
        offset = 0
        packets.each do |packet|
          @dialogs << TlmDetailsDialog.new(nil, @target_name, packet.packet_name, @item_name)
          @dialogs[-1].move(dialog.x + offset, dialog.y + offset)
          offset += 30
        end
      else
        @dialogs << TlmDetailsDialog.new(nil, @target_name, @packet_name, @item_name)
      end
    end
  end
  menu.addAction(details)

  edit = Qt::Action.new("Edit #{@target_name} #{@packet_name} #{@item_name}", menu)
  edit.connect(SIGNAL('triggered()')) do
    if @packet_name.upcase != Telemetry::LATEST_PACKET_NAME
      @dialogs << TlmEditDialog.new(self.window, @target_name, @packet_name, @item_name)
    end
  end
  menu.addAction(edit)

  graph = Qt::Action.new("Graph #{@target_name} #{@packet_name} #{@item_name}", menu)
  graph.connect(SIGNAL('triggered()')) do
    if Kernel.is_windows?
      Cosmos.run_process("rubyw tools/TlmGrapher -i \"#{@target_name} #{@packet_name} #{@item_name}\" --system #{File.basename(System.initial_filename)}")
    elsif Kernel.is_mac? and File.exist?("tools/mac/TlmGrapher.app")
      Cosmos.run_process("open tools/mac/TlmGrapher.app --args -i \"#{@target_name} #{@packet_name} #{@item_name}\" --system #{File.basename(System.initial_filename)}")
    else
      Cosmos.run_process("ruby tools/TlmGrapher -i \"#{@target_name} #{@packet_name} #{@item_name}\" --system #{File.basename(System.initial_filename)}")
    end
  end
  menu.addAction(graph)

  point = Qt::Point.new(0,0)
  menu.exec(mapToGlobal(point))
  point.dispose
  menu.dispose
end

#get_tooltip_textObject



110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# File 'lib/cosmos/tools/tlm_viewer/widgets/widget.rb', line 110

def get_tooltip_text
  tooltip_text = ''
  if @item
    if @item.limits.values
      limits = @item.limits.values[@limits_set]
      limits = @item.limits.values[:DEFAULT] unless limits
      if limits
        red_low = limits[0]
        yellow_low = limits[1]
        yellow_high = limits[2]
        red_high = limits[3]
        green_low = limits[4]
        green_high = limits[5]
        if green_low and green_high
          tooltip_text = "#{@target_name} #{@packet_name} #{@item_name}\n#{@item.description}\nRed High Limit = #{red_high}\nYellow High Limit = #{yellow_high}\nGreen High Limit = #{green_high}\nGreen Low Limit = #{green_low}\nYellow Low Limit = #{yellow_low}\nRed Low Limit = #{red_low}"
        else
          tooltip_text = "#{@target_name} #{@packet_name} #{@item_name}\n#{@item.description}\nRed High Limit = #{red_high}\nYellow High Limit = #{yellow_high}\nYellow Low Limit = #{yellow_low}\nRed Low Limit = #{red_low}"
        end
      else
        tooltip_text = "#{@target_name} #{@packet_name} #{@item_name}\n#{@item.description}"
      end
    else
      tooltip_text = "#{@target_name} #{@packet_name} #{@item_name}\n#{@item.description}"
    end
  end
  return tooltip_text
end

#initialize(target_name = nil, packet_name = nil, item_name = nil, value_type = :CONVERTED, *args) ⇒ Object



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/cosmos/tools/tlm_viewer/widgets/widget.rb', line 36

def initialize(target_name = nil, packet_name = nil, item_name = nil, value_type = :CONVERTED, *args)
  super(*args)
  @target_name = ConfigParser.handle_nil(target_name)
  @packet_name = ConfigParser.handle_nil(packet_name)
  @item_name = ConfigParser.handle_nil(item_name)
  @item = nil
  if @item_name
    @packet, @item = System.telemetry.packet_and_item(@target_name, @packet_name, @item_name)
  end
  if value_type
    @value_type = value_type.to_s.upcase.to_sym
    Kernel::raise "Unknown value type #{@value_type} given to #{self.class}" unless [:RAW, :CONVERTED, :FORMATTED, :WITH_UNITS].include?(@value_type)
  else
    raise "Nil value type given to #{self.class}" if @item_name
    @value_type = nil
  end
  @value = nil
  @limits_state = nil
  @limits_set = :DEFAULT
  @settings = {'RAW'=>['']}
  @polling_period = nil
  @screen = nil
  @dialogs = []

  if self.is_a? Qt::Widget
    setToolTip(get_tooltip_text())
  end

  if self.class.takes_value? and self.kind_of?(Qt::Widget)
    setContextMenuPolicy(Qt::CustomContextMenu)
    connect(SIGNAL('customContextMenuRequested(const QPoint&)')) do
      context_menu()
    end
  end
end

#process_settingsObject



150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
# File 'lib/cosmos/tools/tlm_viewer/widgets/widget.rb', line 150

def process_settings
  errors = ""
  sheet = []
  @settings.each do |setting_name, setting_values|
    begin
      case setting_name
      when 'BACKCOLOR'
        case setting_values.size
        when 1 # color name
          sheet << "background-color:#{setting_values[0]}"
        when 3 # RGB values
          sheet << "background-color:rgb(#{setting_values[0].to_i},#{setting_values[1].to_i},#{setting_values[2].to_i})"
        end
      when 'TEXTCOLOR'
        case setting_values.size
        when 1 # color name
          sheet << "color:#{setting_values[0]}"
        when 3 # RGB values
          sheet << "color:rgb(#{setting_values[0].to_i},#{setting_values[1].to_i},#{setting_values[2].to_i})"
        end
      when 'BORDERCOLOR'
        # Setting the color requires a defined width and style
        sheet << "border-width:1px"
        sheet << "border-style:solid"
        case setting_values.size
        when 1 # color name
          sheet << "border-color:#{setting_values[0]}"
        when 3 # RGB values
          sheet << "border-color:rgb(#{setting_values[0].to_i}, #{setting_values[1].to_i}, #{setting_values[2].to_i})"
        end
      when 'WIDTH'
        sheet << "min-width:#{setting_values[0].to_i}px"
        sheet << "max-width:#{setting_values[0].to_i}px"
      when 'HEIGHT'
        sheet << "min-height:#{setting_values[0].to_i}px"
        sheet << "max-height:#{setting_values[0].to_i}px"
      when 'RAW'
        next if setting_values[0] == '' # ignore the blank default
        sheet << setting_values[0]
      end
    rescue => err
      errors << "Error processing settings due to: #{err}"
    end
  end
  # Only apply the stylesheet if we have settings to apply and this is a widget (not a layout)
  unless sheet.empty?
    if self.is_a? Qt::Widget
      # Set the object name so we can uniquely assign the stylesheet to it
      setObjectName(self.object_id.to_s)
      setStyleSheet("QWidget##{self.objectName} { #{sheet.join(';')} }")
    elsif parentWidget
      pw = parentWidget
      pw.setObjectName(pw.object_id.to_s)
      pw.setStyleSheet("QWidget##{pw.objectName} { #{sheet.join(';')} }")
    end
  end
  errors
end

#set_setting(setting_name, setting_values) ⇒ Object



138
139
140
141
142
143
144
# File 'lib/cosmos/tools/tlm_viewer/widgets/widget.rb', line 138

def set_setting(setting_name, setting_values)
  if setting_name.upcase == 'RAW'
    @settings['RAW'] = [@settings['RAW'][0] + setting_values[0]]
  else
    @settings[setting_name.to_s.upcase] = setting_values
  end
end

#set_subsetting(widget_index, setting_name, setting_values) ⇒ Object



146
147
148
# File 'lib/cosmos/tools/tlm_viewer/widgets/widget.rb', line 146

def set_subsetting(widget_index, setting_name, setting_values)
  # Only Multi-Widgets have subsettings - Ignore
end

#shutdownObject



86
87
88
# File 'lib/cosmos/tools/tlm_viewer/widgets/widget.rb', line 86

def shutdown
  # Normally do nothing
end

#update_widgetObject

This is called for widgets without values in case they need some form of periodic update



92
93
94
# File 'lib/cosmos/tools/tlm_viewer/widgets/widget.rb', line 92

def update_widget
  # Normally do nothing
end