2020
2121from logging import getLogger
2222
23+ from openlcb .memoryservice import MemorySpace
2324from openlcb .message import Message
25+ from openlcb .metadataprocessor import MetadataProcessor
2426from openlcb .mti import MTI
27+ from openlcb .nodeid import NodeID
28+ from openlcb .openlcbnetwork import OpenLCBNetwork
2529
2630try :
2731 import tkinter as tk
4145from openlcb import emit_cast , formatted_ex
4246from openlcb .tcplink .mdnsconventions import id_from_tcp_service_name
4347
44- from typing import OrderedDict as TypingOrderedDict
48+ from typing import Callable , OrderedDict as TypingOrderedDict
4549
4650zeroconf_enabled = False
4751try :
@@ -454,11 +458,8 @@ def _gui(self, parent):
454458 self .cdi_refresh_button .grid (row = self .cdi_row , column = 1 )
455459
456460 self .cdi_row += 1
457- self .cdi_form = CDIForm (self .cdi_tab ) # OpenLCBNetwork() subclass
458- # ^ CDIForm has ttk.Treeview etc.
459- self .cdi_form .canLink .registerMessageReceivedListener (
460- self .handleMessage )
461- self .cdi_form .grid (row = self .cdi_row )
461+ self .network = None
462+ self .cdi_form = None
462463
463464 self .example_tab = ttk .Frame (self .notebook )
464465 self .example_tab .columnconfigure (index = 0 , weight = 1 )
@@ -486,6 +487,15 @@ def _gui(self, parent):
486487 # self.rowconfigure(row, weight=1)
487488 # self.rowconfigure(self.row_count-1, weight=1) # make last row expand
488489
490+ def setupNetwork (self ):
491+ self .network = OpenLCBNetwork (self .getValue ('localNodeID' ))
492+ self .cdi_form = CDIForm (self .network .canLink , self .cdi_tab ) # MetadataProcessor subclass
493+ # ^ formerly OpenLCBNetwork() subclass
494+ # ^ CDIForm has ttk.Treeview etc.
495+ self .cdi_form .canLink .registerMessageReceivedListener (
496+ self .handleMessage )
497+ self .cdi_form .grid (row = self .cdi_row )
498+
489499 def handleMessage (self , message : Message ):
490500 """Off-thread message handler.
491501 This is called by the OpenLCB network stack which is controlled
@@ -527,6 +537,12 @@ def _handleConnect(self):
527537 print (ready_message )
528538
529539 def _connect (self ):
540+ userNodeID = NodeID (self .getValue ('localNodeID' )) # assert good NodeID
541+ if self .network is None :
542+ self .setupNetwork ()
543+ elif self .network .canLink .localNodeID != userNodeID :
544+ self .network .physicalLayer .physicalLayerDown ()
545+ self .setupNetwork ()
530546 host_var = self .fields .get ('host' )
531547 host = host_var .get ()
532548 port_var = self .fields .get ('port' )
@@ -535,8 +551,6 @@ def _connect(self):
535551 port = int (port )
536552 else :
537553 raise TypeError ("Expected int, got {}" .format (emit_cast (port )))
538- localNodeID_var = self .fields .get ('localNodeID' )
539- localNodeID = localNodeID_var .get ()
540554 # self.cdi_form.connect(host, port, localNodeID)
541555 self .saveSettings ()
542556 self .cdi_connect_button .configure (state = tk .DISABLED )
@@ -553,9 +567,8 @@ def _connect(self):
553567 self ._tcp_socket .connect (host , port )
554568 # self.cdi_form.setConnectHandler(self.connectStateChanged)
555569 # ^ See message.mti == MTI Link_Layer_Down instead.
556- result = self .cdi_form .startListening (
570+ result = self .network .startListening (
557571 self ._tcp_socket ,
558- localNodeID ,
559572 )
560573 self ._connect_thread = None
561574 except Exception as ex :
@@ -587,12 +600,19 @@ def cdiRefreshClicked(self):
587600 print ("Querying farNodeID={}" .format (repr (farNodeID )))
588601 self .setStatus ("Downloading CDI..." )
589602 threading .Thread (
590- target = self .cdi_form . downloadCDI ,
591- args = (farNodeID ,),
603+ target = self .downloadCDI ,
604+ args = (farNodeID , MemorySpace . CDI ),
592605 kwargs = {'callback' : self .cdi_form .on_cdi_element },
593606 daemon = True ,
594607 ).start ()
595608
609+ def downloadCDI (self , farNodeID : str , space : MemorySpace ,
610+ callback : Callable [[dict ], None ] = None ):
611+ self .setStatus ("Downloading CDI..." )
612+ self .cdi_form .onStartDownload ()
613+ assert isinstance (space , MemorySpace )
614+ self .network .download (farNodeID , self .cdi_form , callback = callback )
615+
596616 def getValue (self , key ):
597617 field = self .fields .get (key )
598618 if not field :
@@ -728,7 +748,12 @@ def fillDefaultPort(self):
728748 def fillDefault (self , key ):
729749 self .fields [key ].set (self .settings .getDefault (key ))
730750
751+ def getStatus (self ):
752+ # See also CDIForm
753+ return self .statusLabel .get ()
754+
731755 def setStatus (self , msg ):
756+ # See also CDIForm
732757 self .statusLabel .configure (text = msg )
733758
734759 def setTooltip (self , key , msg ):
0 commit comments