@@ -136,40 +136,31 @@ def reset(self):
136136 machine .lightsleep (100 )
137137 self ._write_reg (0x0000 , 0x01 )
138138
139+ def start_ranging (self ):
140+ self ._write_reg (0x0087 , 0x40 )
141+
142+ def stop_ranging (self ):
143+ self ._write_reg (0x0087 , 0x00 )
144+
145+ def _is_data_ready (self ):
146+ polarity = self ._read_reg (0x0030 ) & 0x10
147+ ready_val = 1 if polarity == 0 else 0
148+ return (self ._read_reg (0x0031 ) & 0x01 ) == ready_val
149+
150+ def _clear_interrupt (self ):
151+ self ._write_reg (0x0086 , 0x01 )
152+
153+ def _ensure_data (self ):
154+ if not self ._is_data_ready ():
155+ self .start_ranging ()
156+ for _ in range (100 ):
157+ if self ._is_data_ready ():
158+ return
159+ machine .lightsleep (10 )
160+
139161 def read (self ):
140- data = self .i2c .readfrom_mem (self .address , 0x0089 , 17 , addrsize = 16 ) # RESULT__RANGE_STATUS
141- # range_status = data[0]
142- # report_status = data[1]
143- # stream_count = data[2]
144- # dss_actual_effective_spads_sd0 = (data[3] << 8) + data[4]
145- # peak_signal_count_rate_mcps_sd0 = (data[5]<<8) + data[6]
146- # ambient_count_rate_mcps_sd0 = (data[7] << 8) + data[8]
147- # sigma_sd0 = (data[9]<<8) + data[10]
148- # phase_sd0 = (data[11]<<8) + data[12]
162+ self ._ensure_data ()
163+ data = self .i2c .readfrom_mem (self .address , 0x0089 , 17 , addrsize = 16 )
149164 final_crosstalk_corrected_range_mm_sd0 = (data [13 ] << 8 ) + data [14 ]
150- # peak_signal_count_rate_crosstalk_corrected_mcps_sd0 = (data[15] << 8) + data[16]
151- # status = None
152- # if range_status in (17, 2, 1, 3):
153- # status = "HardwareFail"
154- # elif range_status == 13:
155- # status = "MinRangeFail"
156- # elif range_status == 18:
157- # status = "SynchronizationInt"
158- # elif range_status == 5:
159- # status = "OutOfBoundsFail"
160- # elif range_status == 4:
161- # status = "SignalFail"
162- # elif range_status == 6:
163- # status = "SignalFail"
164- # elif range_status == 7:
165- # status = "WrapTargetFail"
166- # elif range_status == 12:
167- # status = "XtalkSignalFail"
168- # elif range_status == 8:
169- # status = "RangeValidMinRangeClipped"
170- # elif range_status == 9:
171- # if stream_count == 0:
172- # status = "RangeValidNoWrapCheckFail"
173- # else:
174- # status = "OK"
165+ self ._clear_interrupt ()
175166 return final_crosstalk_corrected_range_mm_sd0
0 commit comments