Method: OpenC3::InterfaceThread#start

Defined in:
lib/openc3/tools/cmd_tlm_server/interface_thread.rb

#startObject

Create and start the Ruby thread that will encapsulate the interface. Creates a while loop that waits for OpenC3::Interface#connect to succeed. Then calls OpenC3::Interface#read and handles all the incoming packets.



65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
# File 'lib/openc3/tools/cmd_tlm_server/interface_thread.rb', line 65

def start
  @thread_sleeper = Sleeper.new
  @thread = Thread.new do
    @cancel_thread = false
    begin
      if @interface.read_allowed?
        Logger.info "Starting packet reading for #{@interface.name}"
      else
        Logger.info "Starting connection maintenance for #{@interface.name}"
      end
      while true
        break if @cancel_thread

        unless @interface.connected?
          begin
            @mutex.synchronize do
              # We need to make sure connect is not called after stop() has been called
              connect() unless @cancel_thread
            end
            break if @cancel_thread
          rescue Exception => connect_error
            handle_connection_failed(connect_error)
            if @cancel_thread
              break
            else
              next
            end
          end
        end

        if @interface.read_allowed?
          begin
            packet = @interface.read
            unless packet
              Logger.info "Clean disconnect from #{@interface.name} (returned nil)"
              handle_connection_lost(nil)
              if @cancel_thread
                break
              else
                next
              end
            end
            packet.received_time = Time.now.sys unless packet.received_time
          rescue Exception => err
            handle_connection_lost(err)
            if @cancel_thread
              break
            else
              next
            end
          end

          handle_packet(packet)
        else
          @thread_sleeper.sleep(1)
          handle_connection_lost(nil) if !@interface.connected?
        end
      end # loop
    rescue Exception => error
      if @fatal_exception_callback
        @fatal_exception_callback.call(error)
      else
        Logger.error "Packet reading thread unexpectedly died for #{@interface.name}"
        OpenC3.handle_fatal_exception(error)
      end
    end
    Logger.info "Stopped packet reading for #{@interface.name}"
  end # Thread.new
end