diff --git a/lib/palette.rb b/lib/palette.rb index 0156bf4..75dcb9d 100644 --- a/lib/palette.rb +++ b/lib/palette.rb @@ -1,26 +1,27 @@ module TAC module Palette - TACNET_CONNECTED = Gosu::Color.new(0xff008000) - TACNET_CONNECTING = Gosu::Color.new(0xffff8800) - TACNET_CONNECTION_ERROR = Gosu::Color.new(0xff800000) + TACNET_CONNECTED = Gosu::Color.new(0xff_008000) + TACNET_CONNECTING = Gosu::Color.new(0xff_ff8800) + TACNET_CONNECTION_ERROR = Gosu::Color.new(0xff_800000) + TACNET_NOT_CONNECTED = Gosu::Color.new(0xff_222222) - TIMECRAFTERS_PRIMARY = Gosu::Color.new(0xff008000) - TIMECRAFTERS_SECONDARY = Gosu::Color.new(0xff006000) - TIMECRAFTERS_TERTIARY = Gosu::Color.new(0xff00d000) + TIMECRAFTERS_PRIMARY = Gosu::Color.new(0xff_008000) + TIMECRAFTERS_SECONDARY = Gosu::Color.new(0xff_006000) + TIMECRAFTERS_TERTIARY = Gosu::Color.new(0xff_00d000) - TACNET_PRIMARY = Gosu::Color.new(0xff000080) - TACNET_SECONDARY = Gosu::Color.new(0xff000060) + TACNET_PRIMARY = Gosu::Color.new(0xff_000080) + TACNET_SECONDARY = Gosu::Color.new(0xff_000060) - GROUPS_PRIMARY = Gosu::Color.new(0xff444444) - GROUPS_SECONDARY = Gosu::Color.new(0xff444444) + GROUPS_PRIMARY = Gosu::Color.new(0xff_444444) + GROUPS_SECONDARY = Gosu::Color.new(0xff_444444) - ACTIONS_PRIMARY = Gosu::Color.new(0xff4444aa) - ACTIONS_SECONDARY = Gosu::Color.new(0xff040404) + ACTIONS_PRIMARY = Gosu::Color.new(0xff_4444aa) + ACTIONS_SECONDARY = Gosu::Color.new(0xff_040404) - VALUES_PRIMARY = Gosu::Color.new(0xff660066) - VALUES_SECONDARY = Gosu::Color.new(0xff440044) + VALUES_PRIMARY = Gosu::Color.new(0xff_660066) + VALUES_SECONDARY = Gosu::Color.new(0xff_440044) - EDITOR_PRIMARY = Gosu::Color.new(0xff446688) - EDITOR_SECONDARY = Gosu::Color.new(0xff224466) + EDITOR_PRIMARY = Gosu::Color.new(0xff_446688) + EDITOR_SECONDARY = Gosu::Color.new(0xff_224466) end end \ No newline at end of file diff --git a/lib/states/editor.rb b/lib/states/editor.rb index feea587..fa82659 100644 --- a/lib/states/editor.rb +++ b/lib/states/editor.rb @@ -50,9 +50,19 @@ module TAC end stack width: 0.499 do - @tacnet_status = label "Connection Error", background: TAC::Palette::TACNET_CONNECTION_ERROR, text_size: 18, padding: 5, margin_top: 2 - @tacnet_connection_button = button "Connect", text_size: 18 do - window.backend.tacnet.connect("localhost") + @tacnet_status = label "Not Connected", background: TAC::Palette::TACNET_NOT_CONNECTED, width: 1.0, text_size: 18, padding: 5, margin_top: 2, border_thickness: 1, border_color: Gosu::Color::GRAY + flow width: 1.0 do + @tacnet_connection_button = button "Connect", width: 0.475, text_size: 18 do + case window.backend.tacnet.status + when :connected, :connecting + window.backend.tacnet.close + when :not_connected, :connection_error + window.backend.tacnet.connect("localhost") + end + end + button "Status", text_size: 18, width: 0.475 do + push_state(Dialog::AlertDialog, title: "TACNET Status", message: window.backend.tacnet.full_status) + end end end end @@ -112,6 +122,37 @@ module TAC end populate_groups_list + + @tacnet_status_monitor = CyberarmEngine::Timer.new(250) do + case window.backend.tacnet.status + when :connected + @tacnet_status.value = "Connected" + @tacnet_status.background = TAC::Palette::TACNET_CONNECTED + + @tacnet_connection_button.value = "Disconnect" + when :connecting + @tacnet_status.value = "Connecting..." + @tacnet_status.background = TAC::Palette::TACNET_CONNECTING + + @tacnet_connection_button.value = "Disconnect" + when :connection_error + @tacnet_status.value = "Connection Error" + @tacnet_status.background = TAC::Palette::TACNET_CONNECTION_ERROR + + @tacnet_connection_button.value = "Connect" + when :not_connected + @tacnet_status.value = "Not Connected" + @tacnet_status.background = TAC::Palette::TACNET_NOT_CONNECTED + + @tacnet_connection_button.value = "Connect" + end + end + end + + def update + super + + @tacnet_status_monitor.update end def create_group(name) diff --git a/lib/tacnet.rb b/lib/tacnet.rb index 60c76de..e8f3be8 100644 --- a/lib/tacnet.rb +++ b/lib/tacnet.rb @@ -10,33 +10,66 @@ module TAC @connection = nil end - def connect(hostname = DEFAULT_HOSTNAME, port = DEFAULT_PORT, error_callback = proc {}) + def connect(hostname = DEFAULT_HOSTNAME, port = DEFAULT_PORT) return if @connection && @connection.connected? @connection = Connection.new(hostname, port) - @connection.connect(error_callback) + @connection.connect + end + + def status + if connected? + :connected + elsif @connection && !@connection.client.socket_error? + :connecting + elsif @connection && @connection.client.socket_error? + :connection_error + else + :not_connected + end + end + + def full_status + _status = status.to_s.split("_").map { |c| c.capitalize }.join(" ") + + if connected? + net_stats = "" + net_stats += "Connection Statistics:\n" + net_stats += "Packets Sent: #{client.packets_sent}\n" + net_stats += "Packets Received: #{client.packets_received}\n\n" + net_stats += "Data Sent: #{client.data_sent} bytes\n" + net_stats += "Data Received: #{client.data_received} bytes\n" + + "Status: #{_status}\n\n#{net_stats}" + elsif @connection && @connection.client && @connection.client.socket_error? + "Status: #{_status}\n\n#{@connection.client.last_socket_error.to_s.chars.each_slice(32).to_a.map { |c| c.join }.join("\n")}" + else + pp client + "Status: #{_status}" + end end def connected? @connection && @connection.connected? end - def client + def close if connected? - @connection.client + @connection.close + @connection = nil end end + def client + @connection.client if connected? + end + def puts(packet) - if connected? - @connection.puts(packet) - end + @connection.puts(packet) if connected? end def gets - if connected? - @connection.gets - end + @connection.gets if connected? end end end \ No newline at end of file diff --git a/lib/tacnet/client.rb b/lib/tacnet/client.rb index 5088327..f8b8eea 100644 --- a/lib/tacnet/client.rb +++ b/lib/tacnet/client.rb @@ -7,7 +7,7 @@ module TAC attr_reader :uuid, :read_queue, :write_queue, :socket, :packets_sent, :packets_received, :data_sent, :data_received - attr_accessor :sync_interval + attr_accessor :sync_interval, :last_socket_error, :socket_error def initialize @uuid = SecureRandom.uuid @read_queue = [] @@ -15,6 +15,10 @@ module TAC @sync_interval = 100 + @last_socket_error = nil + @socket_error = false + @bound = false + @packets_sent, @packets_received = 0, 0 @data_sent, @data_received = 0, 0 end @@ -25,6 +29,7 @@ module TAC def socket=(socket) @socket = socket + @bound = true listen end @@ -82,12 +87,16 @@ module TAC end end - def connected? - !closed? + def socket_error? + @socket_error end - def bound? - @socket.bound? if @socket + def connected? + if closed? == true || closed? == nil + false + else + true + end end def closed? @@ -97,7 +106,9 @@ module TAC def write(message) begin @socket.puts("#{message}\r\n\n") - rescue Errno::EPIPE, IOError => error + rescue => error + @last_socket_error = error + @socket_error = true log.e(TAG, error.message) close end @@ -109,7 +120,10 @@ module TAC begin data = @socket.readpartial(CHUNK_SIZE) message += data - rescue Errno::EPIPE, EOFError + rescue => error + @last_socket_error = error + @socket_error = true + message = "" break end until message.end_with?("\r\n\n") diff --git a/lib/tacnet/connection.rb b/lib/tacnet/connection.rb index c5792c6..2454af5 100644 --- a/lib/tacnet/connection.rb +++ b/lib/tacnet/connection.rb @@ -7,6 +7,8 @@ module TAC @hostname = hostname @port = port + @client = nil + @last_sync_time = 0 @sync_interval = SYNC_INTERVAL @@ -20,7 +22,7 @@ module TAC @packet_handler = PacketHandler.new(host_is_a_connection: true) end - def connect(error_callback) + def connect return if @client @client = Client.new @@ -39,8 +41,13 @@ module TAC end rescue => error - p error - error_callback.call(error) + log.e(TAG, error) + + if @client + @client.close + @client.last_socket_error = error + @client.socket_error = true + end end end end @@ -68,12 +75,16 @@ module TAC end def connected? - !closed? + @client.connected? if @client end def closed? @client.closed? if @client end + + def close + @client.close if @client + end end end end \ No newline at end of file diff --git a/lib/tacnet/server.rb b/lib/tacnet/server.rb index 7d3c0b6..faadbb7 100644 --- a/lib/tacnet/server.rb +++ b/lib/tacnet/server.rb @@ -35,7 +35,7 @@ module TAC begin log.i(TAG, "Starting server...") @socket = TCPServer.new(@port) - rescue => error + rescue IOError => error log.e(TAG, error) @connection_attempts += 1 @@ -46,8 +46,8 @@ module TAC while @socket && !@socket.closed? begin run_server - rescue => error - p error + rescue IOError => error + log.e(TAG, error) @socket.close if @socket end end