@@ -39,7 +39,7 @@ def __init__(self) -> None:
3939
4040 gpio_model = self ._gpio_model (self .vss , self .vdd )
4141 self .xshut = self .Port (DigitalSink .from_bidir (gpio_model ))
42- self .gpio1 = self .Port (gpio_model , optional = True )
42+ self .gpio1 = self .Port (DigitalSingleSource . low_from_supply ( self . vss ) , optional = True )
4343
4444 # TODO: support addresses, the default is 0x29 though it's software remappable
4545 self .i2c = self .Port (I2cTarget (self ._i2c_io_model (self .vss , self .vdd )), [Output ])
@@ -70,17 +70,17 @@ def contents(self):
7070
7171
7272@abstract_block_default (lambda : Vl53l0x )
73- class Vl53l0xBase (DistanceSensor , Block ):
74- """Abstract base class for VL53L0x application circuits """
73+ class Vl53l0xBase (Resettable , DistanceSensor , Block ):
74+ """Abstract base class for VL53L0x devices """
7575 def __init__ (self ) -> None :
7676 super ().__init__ ()
7777
78- self .pwr = self .Port (VoltageSink .empty (), [Power ])
7978 self .gnd = self .Port (Ground .empty (), [Common ])
79+ self .pwr = self .Port (VoltageSink .empty (), [Power ])
8080
8181 self .i2c = self .Port (I2cTarget .empty ())
82- self .xshut = self .Port (DigitalSink .empty (), optional = True )
83- self . gpio1 = self . Port ( DigitalBidir . empty (), optional = True )
82+ self .int = self .Port (DigitalSingleSource .empty (), optional = True ,
83+ doc = "Interrupt output for new data available" )
8484
8585
8686class Vl53l0xConnector (Vl53l0x_DeviceBase , Vl53l0xBase , GeneratorBlock ):
@@ -89,40 +89,41 @@ class Vl53l0xConnector(Vl53l0x_DeviceBase, Vl53l0xBase, GeneratorBlock):
8989 This has an onboard 2.8v regulator, but thankfully the IO tolerance is not referenced to Vdd"""
9090 def contents (self ):
9191 super ().contents ()
92- self .generator_param (self .xshut .is_connected ())
92+ self .generator_param (self .reset . is_connected (), self . int .is_connected ())
9393
9494 def generate (self ):
9595 super ().generate ()
9696 self .conn = self .Block (PassiveConnector (length = 6 ))
9797 self .connect (self .pwr , self .conn .pins .request ('1' ).adapt_to (self ._vdd_model ()))
9898 self .connect (self .gnd , self .conn .pins .request ('2' ).adapt_to (Ground ()))
9999
100- gpio_model = self ._gpio_model (self .gnd , self .pwr )
101-
102- self .connect (self .gpio1 , self .conn .pins .request ('5' ).adapt_to (gpio_model ))
103100 i2c_io_model = self ._i2c_io_model (self .gnd , self .pwr )
104101 self .connect (self .i2c .scl , self .conn .pins .request ('3' ).adapt_to (i2c_io_model ))
105102 self .connect (self .i2c .sda , self .conn .pins .request ('4' ).adapt_to (i2c_io_model ))
106103 self .i2c .init_from (I2cTarget (DigitalBidir .empty (), []))
107104
108105 gpio_model = self ._gpio_model (self .gnd , self .pwr )
109- if self .get (self .xshut .is_connected ()):
110- self .connect (self .xshut , self .conn .pins .request ('6' ).adapt_to (gpio_model ))
106+ if self .get (self .reset .is_connected ()):
107+ self .connect (self .reset , self .conn .pins .request ('6' ).adapt_to (gpio_model ))
111108 else :
112109 self .connect (self .pwr .as_digital_source (), self .conn .pins .request ('6' ).adapt_to (gpio_model ))
113110
111+ if self .get (self .int .is_connected ()):
112+ self .connect (self .int , self .conn .pins .request ('5' ).adapt_to (
113+ DigitalSingleSource .low_from_supply (self .gnd )
114+ ))
115+
114116
115117class Vl53l0x (Vl53l0xBase , GeneratorBlock ):
116- """Board-mount laser ToF sensor"""
118+ """Time-of-flight laser ranging sensor, up to 2m """
117119 def contents (self ):
118120 super ().contents ()
119121 self .ic = self .Block (Vl53l0x_Device ())
120122 self .connect (self .pwr , self .ic .vdd )
121123 self .connect (self .gnd , self .ic .vss )
122124
123125 self .connect (self .i2c , self .ic .i2c )
124- self .connect (self .gpio1 , self .ic .gpio1 )
125- self .generator_param (self .xshut .is_connected ())
126+ self .generator_param (self .reset .is_connected (), self .int .is_connected ())
126127
127128 # Datasheet Figure 3, two decoupling capacitors
128129 self .vdd_cap = ElementDict [DecouplingCapacitor ]()
@@ -131,26 +132,29 @@ def contents(self):
131132
132133 def generate (self ):
133134 super ().generate ()
134- if self .get (self .xshut .is_connected ()):
135- self .connect (self .xshut , self .ic .xshut )
135+ if self .get (self .reset .is_connected ()):
136+ self .connect (self .reset , self .ic .xshut )
136137 else :
137138 self .connect (self .pwr .as_digital_source (), self .ic .xshut )
138139
140+ if self .get (self .int .is_connected ()):
141+ self .connect (self .int , self .ic .gpio1 )
139142
140143class Vl53l0xArray (DistanceSensor , GeneratorBlock ):
141144 """Array of Vl53l0x with common I2C but individually exposed XSHUT pins and optionally GPIO1 (interrupt)."""
142145 @init_in_parent
143- def __init__ (self , count : IntLike , * , first_xshut_fixed : BoolLike = False ):
146+ def __init__ (self , count : IntLike , * , first_reset_fixed : BoolLike = False ):
144147 super ().__init__ ()
145148 self .pwr = self .Port (VoltageSink .empty (), [Power ])
146149 self .gnd = self .Port (Ground .empty (), [Common ])
147150 self .i2c = self .Port (I2cTarget .empty ())
148- self .xshut = self .Port (Vector (DigitalSink .empty ()))
149- self .gpio1 = self .Port (Vector (DigitalBidir .empty ()), optional = True )
151+ self .reset = self .Port (Vector (DigitalSink .empty ()))
152+ # TODO better support for optional vectors so the inner doesn't connect if the outer doesn't connect
153+ # self.int = self.Port(Vector(DigitalSingleSource.empty()), optional=True)
150154
151155 self .count = self .ArgParameter (count )
152- self .first_xshut_fixed = self .ArgParameter (first_xshut_fixed )
153- self .generator_param (self .count , self .first_xshut_fixed )
156+ self .first_reset_fixed = self .ArgParameter (first_reset_fixed )
157+ self .generator_param (self .count , self .first_reset_fixed )
154158
155159 def generate (self ):
156160 super ().generate ()
@@ -160,9 +164,7 @@ def generate(self):
160164 self .connect (self .pwr , elt .pwr )
161165 self .connect (self .gnd , elt .gnd )
162166 self .connect (self .i2c , elt .i2c )
163- if self .get (self .first_xshut_fixed ) and elt_i == 0 :
164- self .connect (elt .pwr .as_digital_source (), elt .xshut )
167+ if self .get (self .first_reset_fixed ) and elt_i == 0 :
168+ self .connect (elt .pwr .as_digital_source (), elt .reset )
165169 else :
166- self .connect (self .xshut .append_elt (DigitalSink .empty (), str (elt_i )), elt .xshut )
167-
168- self .connect (self .gpio1 .append_elt (DigitalBidir .empty (), str (elt_i )), elt .gpio1 )
170+ self .connect (self .reset .append_elt (DigitalSink .empty (), str (elt_i )), elt .reset )
0 commit comments