151def read(ctx, obj, readall, continuous, print_out, read_period, save, file_name):
152 '''
153 Read the content of the endpoint master readout buffer.
154 '''
155 lDevice = obj.mDevice
156 lHSI = obj.mHSI
157
158 read_events=0
159 if continuous:
160 secho("[INFO] Starting HSI data readout", fg='green')
161 if not (save or print_out):
162 secho('[WARNING] you have chosen to neither save or print the HSI data', fg='yellow')
163 last_ts=0
164 if save:
165 h5_file_name = datetime.now().strftime("hsi_data_%d_%m_%Y_%H_%M_%S.hdf5")
166 if file_name is not None:
167 h5_file_name=file_name
168
169 f = h5py.File(h5_file_name, "w")
170 hsi_dataset = f.create_dataset("hsi_frames", (0,7), maxshape=(None, 7), chunks=True, dtype='u4')
171 else:
172 if file_name is not None:
173 secho('[WARNING] You have provided a file name but chosen not to save the readout data', fg='yellow')
174
175 with toolbox.InterruptHandler() as h:
176 while(True):
177 n_words=0
178 hsi_words = lHSI.read_data_buffer(n_words,False,False)
179 n_hsi_events = len(hsi_words) // kHSIWordsNumber
180
181 if save:
182 hsi_dataset_start_index=hsi_dataset.shape[0]
183 hsi_dataset.resize(hsi_dataset_start_index+n_hsi_events, axis=0)
184
185 if (len(hsi_words) % kHSIWordsNumber == 0 and hsi_words.size() > 0):
186
187 for i in range(0,n_hsi_events):
188 start_index = i * kHSIWordsNumber
189 end_index = start_index + kHSIWordsNumber
190 raw_event=hsi_words[start_index:end_index]
191
192 header = raw_event[0]
193 ts_low = raw_event[1]
194 ts_high = raw_event[2]
195 data = raw_event[3]
196 trigger = raw_event[4]
197
198 ts = ts_low | (ts_high << 32)
199
200
201 counter = header & 0x0000ffff
202
203 if (header >> 16) != 0xaa00:
204 secho("[ERROR] Invalid HSIEventHeader", fg='red')
205 continue
206
207 if ts == 0:
208 secho("[ERROR] Invalid HSIEvent timestamp", fg='red')
209 continue
210
211 delta_ticks=ts-last_ts
212 if last_ts == 0:
213 delta_ticks=0
214 last_ts=ts
215
216 if print_out:
217 print(f"[INFO] got event: {counter} ts: {ts} signals: {data} delta ts: {delta_ticks}")
218
219 read_events=read_events+1
220 if save:
221 hsi_dataset[hsi_dataset_start_index+i,0]=(0x1 << 6) | 0x1
222 hsi_dataset[hsi_dataset_start_index+i,1]=ts_low
223 hsi_dataset[hsi_dataset_start_index+i,2]=ts_high
224 hsi_dataset[hsi_dataset_start_index+i,3]=data
225 hsi_dataset[hsi_dataset_start_index+i,4]=0x0
226 hsi_dataset[hsi_dataset_start_index+i,5]=trigger
227 hsi_dataset[hsi_dataset_start_index+i,6]=counter
228
229 elif len(hsi_words) != 0:
230 secho(f"[ERROR] unexpected n words {len(hsi_words)}", fg='red')
231 if h.interrupted:
232 secho(f"[INFO] Stopping HSI data readout after {read_events} events", fg='green')
233 break
234 time.sleep(read_period*1e-3)
235 if save:
236 f.close()
237 else:
238 echo(lHSI.get_data_buffer_table(readall,False))
239