Skip to content

Commit 740ba0a

Browse files
authored
Merge pull request #1039 from OpenC3/ensure_disconnect
Ensure disconnect called at least once on interface.
2 parents c313ed1 + c75c399 commit 740ba0a

File tree

4 files changed

+39
-17
lines changed

4 files changed

+39
-17
lines changed

openc3/lib/openc3/interfaces/interface.rb

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -198,14 +198,16 @@ def connect
198198
log_dont_log.upcase!
199199
period = "#{period.to_f}s"
200200
@scheduler.every period do
201-
begin
202-
if log_dont_log == 'DONT_LOG'
203-
cmd(cmd_string, log_message: false)
204-
else
205-
cmd(cmd_string)
201+
if connected?()
202+
begin
203+
if log_dont_log == 'DONT_LOG'
204+
cmd(cmd_string, log_message: false)
205+
else
206+
cmd(cmd_string)
207+
end
208+
rescue Exception => err
209+
Logger.error("Error sending periodic cmd(#{cmd_string}):\n#{err.formatted}")
206210
end
207-
rescue Exception => err
208-
Logger.error("Error sending periodic cmd(#{cmd_string}):\n#{err.formatted}")
209211
end
210212
end
211213
end

openc3/lib/openc3/microservices/interface_microservice.rb

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -613,7 +613,16 @@ def handle_connection_lost(err = nil, reconnect: true)
613613

614614
def connect
615615
@logger.info "#{@interface.name}: Connecting ..."
616-
@interface.connect
616+
begin
617+
@interface.connect
618+
rescue Exception => error
619+
begin
620+
@interface.disconnect # Ensure disconnect is called at least once on a partial connect
621+
rescue Exception
622+
# We want to report any connect errors, not disconnect in this case
623+
end
624+
raise error
625+
end
617626
@interface.state = 'CONNECTED'
618627
if @interface_or_router == 'INTERFACE'
619628
InterfaceStatusModel.set(@interface.as_json(:allow_nan => true), scope: @scope)

openc3/python/openc3/interfaces/interface.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -487,15 +487,16 @@ def protocol_cmd(self, cmd_name, *cmd_args, read_write="READ_WRITE", index=-1):
487487
return handled
488488

489489
def run_periodic_cmd(self, log_dont_log, cmd_string):
490-
try:
491-
if log_dont_log == "DONT_LOG":
492-
cmd(cmd_string, log_message=False)
493-
else:
494-
cmd(cmd_string)
495-
except Exception as error:
496-
Logger.error(
497-
f"Error sending periodic cmd({cmd_string}):\n{traceback.format_exception(error)}"
498-
)
490+
if self.connected():
491+
try:
492+
if log_dont_log == "DONT_LOG":
493+
cmd(cmd_string, log_message=False)
494+
else:
495+
cmd(cmd_string)
496+
except Exception as error:
497+
Logger.error(
498+
f"Error sending periodic cmd({cmd_string}):\n{traceback.format_exception(error)}"
499+
)
499500

500501
def scheduler_thread_body(self):
501502
next_time = time.time()

openc3/python/openc3/microservices/interface_microservice.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -692,6 +692,16 @@ def handle_connection_lost(self, error=None, reconnect=True):
692692

693693
def connect(self):
694694
self.logger.info(f"{self.interface.name}: Connecting :")
695+
696+
try:
697+
self.interface.connect()
698+
except RuntimeError as error:
699+
try:
700+
self.interface.disconnect() # Ensure disconnect is called at least once on a partial connect
701+
except RuntimeError:
702+
pass # We want to report any connect errors, not disconnect in this case
703+
raise error
704+
695705
self.interface.connect()
696706
self.interface.state = "CONNECTED"
697707
if self.interface_or_router == "INTERFACE":

0 commit comments

Comments
 (0)