1212from openlifu .io .LIFUUart import LIFUUart
1313from openlifu .util .units import getunitconversion
1414
15- NUM_TRANSMITTERS = 2
15+ DEFAULT_NUM_TRANSMITTERS = 2
1616ADDRESS_GLOBAL_MODE = 0x0
1717ADDRESS_STANDBY = 0x1
1818ADDRESS_DYNPWR_2 = 0x6
@@ -761,10 +761,16 @@ def enter_dfu(self) -> bool:
761761 logger .error ("Unexpected error during process: %s" , e )
762762 raise # Re-raise the exception for the caller to handle
763763
764- def enum_tx7332_devices (self , _num_transmitters = 2 ) -> int :
764+ def enum_tx7332_devices (self , num_devices : int | None = None ) -> int :
765765 """
766766 Enumerate TX7332 devices connected to the TX device.
767767
768+ Args:
769+ num_transmitters (int): The number of transmitters expected to be enumerated. If None, the number of
770+ transmitters will be determined from the response. If provided and the number enumerated does not
771+ match the expected number, an error will be raised. If the UART is in demo mode, this argument is
772+ used to set the number of transmitters for the demo (or set to a default if omitted/None)
773+
768774 Returns:
769775 n_transmitters: number of devices detected.
770776
@@ -774,24 +780,23 @@ def enum_tx7332_devices(self, _num_transmitters=2) -> int:
774780 """
775781 try :
776782 if self .uart .demo_mode :
777- n_transmitters = _num_transmitters
778- self .tx_registers = TxDeviceRegisters (num_transmitters = n_transmitters )
779- return n_transmitters
780-
781- if not self .uart .is_connected ():
782- raise ValueError ("TX Device not connected" )
783-
784- r = self .uart .send_packet (id = None , packetType = OW_TX7332 , command = OW_TX7332_ENUM )
785- self .uart .clear_buffer ()
786- # r.print_packet()
787- if r .packet_type != OW_ERROR and r .reserved > 0 :
788- n_transmitters = r .reserved
783+ num_detected_devices = num_devices
789784 else :
790- logger .info ("Error enumerating TX devices." )
785+ if not self .uart .is_connected ():
786+ raise ValueError ("TX Device not connected" )
791787
792- self .tx_registers = TxDeviceRegisters (num_transmitters = n_transmitters )
793- logger .info ("TX Device Count: %d" , n_transmitters )
794- return n_transmitters
788+ r = self .uart .send_packet (id = None , packetType = OW_TX7332 , command = OW_TX7332_ENUM )
789+ self .uart .clear_buffer ()
790+ # r.print_packet()
791+ if r .packet_type != OW_ERROR and r .reserved > 0 :
792+ num_detected_devices = r .reserved
793+ else :
794+ logger .info ("Error enumerating TX devices." )
795+ if num_devices is not None and num_detected_devices != num_devices :
796+ raise ValueError (f"Expected { num_devices } devices, but detected { num_detected_devices } devices" )
797+ self .tx_registers = TxDeviceRegisters (num_transmitters = num_detected_devices )
798+ logger .info ("TX Device Count: %d" , num_detected_devices )
799+ return num_detected_devices
795800 except ValueError as v :
796801 logger .error ("ValueError: %s" , v )
797802 raise # Re-raise the exception for the caller to handle
@@ -1222,6 +1227,10 @@ def set_solution(self,
12221227 if apodizations .ndim == 1 :
12231228 apodizations = apodizations .reshape (1 , - 1 )
12241229 n = delays .shape [0 ]
1230+ n_elements = delays .shape [1 ]
1231+ n_required_devices = int (n_elements / NUM_CHANNELS )
1232+ self .enum_tx7332_devices (num_devices = n_required_devices )
1233+
12251234 if n != apodizations .shape [0 ]:
12261235 raise ValueError ("Delays and apodizations must have the same number of rows" )
12271236 if n > 1 :
@@ -1787,7 +1796,7 @@ class TxDeviceRegisters:
17871796 _profiles_list : List [Tx7332PulseProfile ] = field (default_factory = list )
17881797 active_delay_profile : int | None = None
17891798 active_profile : int | None = None
1790- num_transmitters : int = NUM_TRANSMITTERS
1799+ num_transmitters : int = DEFAULT_NUM_TRANSMITTERS
17911800
17921801 def __post_init__ (self ):
17931802 self .transmitters = tuple ([Tx7332Registers (bf_clk = self .bf_clk ) for _ in range (self .num_transmitters )])
0 commit comments