def on_event(self, event, device_id): """Called when an event is broadcast from the Saleae API wrapper.""" if event.id == EVENT_ID_ONCONNECT: device = PyDevicesManager.get_device(device_id) if device is not None: print("Device connected with id %d" % device_id) device.set_analyzer(self.analyzer) # There is a long-standing issue with the Logic16 device API where the number of channels # seems to matter, and also needs to be a power of two. Using 3 channels causes major # fluctuations in data, but using 4 channels seems much more stable. device.set_active_channels(list(range(4))) # Arbitrarily pick 40MHz as the sampling rate device.set_sampling_rate_hz(40000000) device.set_use_5_volts(False) print("Analyzing channel %d with %s" % (CHANNEL_NUMBER, self.analyzer.get_name())) device.read_start() self.analyzing = True elif event.id == EVENT_ID_ONDISCONNECT: self.stop() elif event.id == EVENT_ID_ONERROR: print("\nDevice: %d, Event ID: %d, Event Name: %s, Message: %s" % (device_id, event.id, event.name, event.data))
DLL_FOLDER = 'dependencies' os.environ['PATH'] = os.path.join(os.getcwd(), DLL_FOLDER) + ';' + os.environ['PATH'] from SaleaeDevice import PyDevicesManager, EVENT_ID_ALL_EVENTS, EVENT_ID_ONCONNECT, \ EVENT_ID_ONDISCONNECT, EVENT_ID_ONERROR, EVENT_ID_ONREADDATA, \ EVENT_ID_ONANALYZERDATA class SaleaeEventListener(object): def on_event(self, event, device_id): """Called when an event is broadcast from the Saleae API wrapper.""" print("Device: %d, Event ID: %d, Event Name: %s, Data: %s" % (device_id, event.id, event.name, event.data)) # -------------------------------------------------------------------------- if __name__ == "__main__": listener = SaleaeEventListener() PyDevicesManager.register_listener(listener, EVENT_ID_ALL_EVENTS) # Alternatively we could register to listen for specific events as shown below # PyDevicesManager.register_listener(listener, EVENT_ID_ONCONNECT) # PyDevicesManager.register_listener(listener, EVENT_ID_ONDISCONNECT) # PyDevicesManager.register_listener(listener, EVENT_ID_ONERROR) # PyDevicesManager.register_listener(listener, EVENT_ID_ONREADDATA) # PyDevicesManager.register_listener(listener, EVENT_ID_ONANALYZERDATA) # Start looking for events PyDevicesManager.begin_connect() print("Listening for events. Press spacebar to exit.") while not msvcrt.kbhit() or msvcrt.getch() != b' ': time.sleep(0.01)
def __init__(self, parent=None): super(MainWindow, self).__init__(parent) self._ui = Ui_MainWindow() self._ui.setupUi(self) self.device = None self.analyzer = None self.in_error = False self.current_expected_pcm_clock_rate = None self.error_ticks = 0 self.error_counts = 0 self.audio = pyaudio.PyAudio() self.event_listener = SaleaeEventListener() self.event_listener.saleae_event_received.connect(self.on_saleae_event) self.play_sound_thread = SoundOutputRenderer(self.audio) self.analyzed_data_received_event.connect(self.play_sound_thread.on_data_received) PyDevicesManager.register_listener(self.event_listener, EVENT_ID_ONCONNECT) PyDevicesManager.register_listener(self.event_listener, EVENT_ID_ONDISCONNECT) PyDevicesManager.register_listener(self.event_listener, EVENT_ID_ONERROR) PyDevicesManager.register_listener(self.event_listener, EVENT_ID_ONREADDATA) PyDevicesManager.register_listener(self.event_listener, EVENT_ID_ONANALYZERDATA) self.audio_output_devices = [] for i in range(self.audio.get_device_count()): info = self.audio.get_device_info_by_index(i) if info['maxOutputChannels'] > 0: self.audio_output_devices.append(info) self.initialize_ui_items() self.recording_state = STATE_IDLE self.last_record_start = time.clock() self.realtime_timer = QtCore.QTimer() self.realtime_timer.timeout.connect(self.realtime_timer_timeout) self.plot_timer = QtCore.QTimer() self.plot_timer.timeout.connect(self.plot_timer_timeout) self.figure = Figure(dpi=100) self.plotCanvas = FigureCanvas(self.figure) self.plotCanvas.setParent(self._ui.plotWidget) # Hook this up so we can resize the plot canvas dynamically self._ui.plotWidget.installEventFilter(self) self.fft_axis = self.figure.add_subplot(111) self.fft_line = None ytick_values = range(-140, -6, 6) self.fft_axis.set_yticks(ytick_values) self.fft_axis.set_yticklabels(["%d" % w for w in ytick_values], size='xx-small') self.fft_axis.set_xlabel("Frequency (kHz)", size='small') self.fft_axis.set_ylabel("dBFS", size='small') self.fft_axis.grid(True) self.fft_axis.autoscale(enable=False, axis='both') self.plot_background = None self.update_controls() self.show_message("Waiting for a Logic device to connect...") self.event_listener.start() PyDevicesManager.begin_connect()