Class SignalAnalyzerApiImpl

java.lang.Object
pl.polsl.rtsa.api.SignalAnalyzerApiImpl
All Implemented Interfaces:
SignalAnalyzerApi, DataListener

public class SignalAnalyzerApiImpl extends Object implements SignalAnalyzerApi, DataListener
Production implementation of the SignalAnalyzerApi.

This class bridges the low-level hardware communication with the high-level API used by the JavaFX frontend. It handles:

  • Connection lifecycle management
  • State tracking and synchronization
  • Data transformation from raw to DTOs
  • Callback dispatch to UI layer

Thread Safety:

This implementation is fully thread-safe. All state is protected by atomic references and the underlying DeviceClient handles its own threading.
  • Field Details

  • Constructor Details

    • SignalAnalyzerApiImpl

      public SignalAnalyzerApiImpl(boolean useMock)
      Creates a new API implementation.
      Parameters:
      useMock - If true, uses MockDeviceClient for testing.
  • Method Details

    • getAvailablePorts

      public AvailablePorts getAvailablePorts()
      Description copied from interface: SignalAnalyzerApi
      Gets the list of available serial ports.
      Specified by:
      getAvailablePorts in interface SignalAnalyzerApi
      Returns:
      AvailablePorts containing port names and metadata.
    • refreshPorts

      public AvailablePorts refreshPorts()
      Description copied from interface: SignalAnalyzerApi
      Refreshes the list of available serial ports. Useful after plugging/unplugging devices.
      Specified by:
      refreshPorts in interface SignalAnalyzerApi
      Returns:
      Updated AvailablePorts.
    • connect

      public void connect(String portName)
      Description copied from interface: SignalAnalyzerApi
      Connects to a device on the specified port.

      This method performs handshake validation and will throw if the device does not respond correctly.

      Specified by:
      connect in interface SignalAnalyzerApi
      Parameters:
      portName - The system port name (e.g., "COM3", "/dev/ttyACM0").
    • disconnect

      public void disconnect()
      Description copied from interface: SignalAnalyzerApi
      Disconnects from the currently connected device. Safe to call even if not connected.
      Specified by:
      disconnect in interface SignalAnalyzerApi
    • getConnectionStatus

      public ConnectionStatus getConnectionStatus()
      Description copied from interface: SignalAnalyzerApi
      Gets the current connection status.
      Specified by:
      getConnectionStatus in interface SignalAnalyzerApi
      Returns:
      ConnectionStatus with connection details.
    • isConnected

      public boolean isConnected()
      Description copied from interface: SignalAnalyzerApi
      Checks if a device is currently connected.
      Specified by:
      isConnected in interface SignalAnalyzerApi
      Returns:
      true if connected, false otherwise.
    • startAcquisition

      public void startAcquisition()
      Description copied from interface: SignalAnalyzerApi
      Starts data acquisition. Must be connected first.
      Specified by:
      startAcquisition in interface SignalAnalyzerApi
    • stopAcquisition

      public void stopAcquisition()
      Description copied from interface: SignalAnalyzerApi
      Stops data acquisition. Safe to call even if not acquiring.
      Specified by:
      stopAcquisition in interface SignalAnalyzerApi
    • isAcquiring

      public boolean isAcquiring()
      Description copied from interface: SignalAnalyzerApi
      Checks if acquisition is currently active.
      Specified by:
      isAcquiring in interface SignalAnalyzerApi
      Returns:
      true if acquiring data, false otherwise.
    • getAcquisitionConfig

      public AcquisitionConfig getAcquisitionConfig()
      Description copied from interface: SignalAnalyzerApi
      Gets the current acquisition configuration.
      Specified by:
      getAcquisitionConfig in interface SignalAnalyzerApi
      Returns:
      AcquisitionConfig with current settings.
    • setSampleRate1kHz

      public void setSampleRate1kHz()
      Description copied from interface: SignalAnalyzerApi
      Sets the sample rate to 1 kHz.
      Specified by:
      setSampleRate1kHz in interface SignalAnalyzerApi
    • setSampleRate10kHz

      public void setSampleRate10kHz()
      Description copied from interface: SignalAnalyzerApi
      Sets the sample rate to 10 kHz.
      Specified by:
      setSampleRate10kHz in interface SignalAnalyzerApi
    • setSampleRate20kHz

      public void setSampleRate20kHz()
      Description copied from interface: SignalAnalyzerApi
      Sets the sample rate to 20 kHz (Turbo Mode).

      Note: Turbo mode may have reduced impedance tolerance.

      Specified by:
      setSampleRate20kHz in interface SignalAnalyzerApi
    • setSampleRate

      private void setSampleRate(DeviceCommand command, double rate)
    • getCurrentSampleRate

      public double getCurrentSampleRate()
      Description copied from interface: SignalAnalyzerApi
      Gets the current sample rate.
      Specified by:
      getCurrentSampleRate in interface SignalAnalyzerApi
      Returns:
      Sample rate in Hz.
    • setDataCallback

      public void setDataCallback(Consumer<SignalData> callback)
      Description copied from interface: SignalAnalyzerApi
      Sets the callback for receiving signal data updates.

      The callback is invoked on a background thread. Use Platform.runLater() for UI updates.

      Specified by:
      setDataCallback in interface SignalAnalyzerApi
      Parameters:
      callback - Consumer that receives SignalData updates, or null to clear.
    • setErrorCallback

      public void setErrorCallback(Consumer<String> callback)
      Description copied from interface: SignalAnalyzerApi
      Sets the callback for receiving error notifications.

      The callback is invoked on a background thread.

      Specified by:
      setErrorCallback in interface SignalAnalyzerApi
      Parameters:
      callback - Consumer that receives error messages, or null to clear.
    • setConnectionCallback

      public void setConnectionCallback(Consumer<ConnectionStatus> callback)
      Description copied from interface: SignalAnalyzerApi
      Sets the callback for connection state changes.
      Specified by:
      setConnectionCallback in interface SignalAnalyzerApi
      Parameters:
      callback - Consumer that receives ConnectionStatus updates, or null to clear.
    • getLastSignalData

      public SignalData getLastSignalData()
      Description copied from interface: SignalAnalyzerApi
      Gets the last received signal data. Returns null if no data has been received yet.
      Specified by:
      getLastSignalData in interface SignalAnalyzerApi
      Returns:
      The most recent SignalData, or null.
    • computeFFT

      public double[] computeFFT(double[] voltageData, double sampleRate)
      Description copied from interface: SignalAnalyzerApi
      Computes FFT for the given voltage data. Useful for processing external data.
      Specified by:
      computeFFT in interface SignalAnalyzerApi
      Parameters:
      voltageData - Time-domain voltage samples.
      sampleRate - Sample rate used to capture the data.
      Returns:
      FFT magnitude spectrum.
    • convertToVoltage

      public double[] convertToVoltage(int[] rawData)
      Description copied from interface: SignalAnalyzerApi
      Converts raw ADC values to voltage.
      Specified by:
      convertToVoltage in interface SignalAnalyzerApi
      Parameters:
      rawData - Raw 10-bit ADC values (0-1023).
      Returns:
      Voltage values (0.0-5.0V).
    • computeStatistics

      public SignalStatistics computeStatistics(double[] voltageData, double[] freqData, double sampleRate)
      Description copied from interface: SignalAnalyzerApi
      Computes signal statistics for the given data.
      Specified by:
      computeStatistics in interface SignalAnalyzerApi
      Parameters:
      voltageData - Time-domain voltage samples.
      freqData - Frequency-domain magnitude data.
      sampleRate - Sample rate in Hz.
      Returns:
      Computed SignalStatistics.
    • shutdown

      public void shutdown()
      Description copied from interface: SignalAnalyzerApi
      Shuts down the API and releases all resources.

      This method should be called when the application is closing. It stops acquisition, disconnects, and shuts down all background threads.

      Specified by:
      shutdown in interface SignalAnalyzerApi
    • isShutdown

      public boolean isShutdown()
      Description copied from interface: SignalAnalyzerApi
      Checks if the API has been shut down.
      Specified by:
      isShutdown in interface SignalAnalyzerApi
      Returns:
      true if shutdown() has been called.
    • onNewData

      public void onNewData(SignalResult result)
      Description copied from interface: DataListener
      Called when a new batch of signal data is available.
      Specified by:
      onNewData in interface DataListener
      Parameters:
      result - The SignalResult containing time and frequency domain data.
    • onError

      public void onError(String message)
      Description copied from interface: DataListener
      Called when an error occurs within the device client.
      Specified by:
      onError in interface DataListener
      Parameters:
      message - A descriptive error message.
    • checkNotShutdown

      private void checkNotShutdown()
    • checkConnected

      private void checkConnected()
    • notifyConnectionChange

      private void notifyConnectionChange()