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))
Пример #2
0
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)
Пример #3
0
    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()