001// Copyright (c) FIRST and other WPILib contributors.
002// Open Source Software; you can modify and/or share it under the terms of
003// the WPILib BSD license file in the root directory of this project.
004
005package edu.wpi.first.wpilibj.simulation;
006
007import edu.wpi.first.hal.simulation.BufferCallback;
008import edu.wpi.first.hal.simulation.ConstBufferCallback;
009import edu.wpi.first.hal.simulation.NotifyCallback;
010import edu.wpi.first.hal.simulation.SPIDataJNI;
011import edu.wpi.first.hal.simulation.SpiReadAutoReceiveBufferCallback;
012
013/** A class for controlling a simulated SPI device. */
014public class SPISim {
015  private final int m_index;
016
017  /** Create a new simulated SPI device. */
018  public SPISim() {
019    m_index = 0;
020  }
021
022  /**
023   * Register a callback to be run when this device is initialized.
024   *
025   * @param callback the callback
026   * @param initialNotify whether to run the callback with the initial state
027   * @return the {@link CallbackStore} object associated with this callback. Save a reference to
028   *     this object so GC doesn't cancel the callback.
029   */
030  public CallbackStore registerInitializedCallback(NotifyCallback callback, boolean initialNotify) {
031    int uid = SPIDataJNI.registerInitializedCallback(m_index, callback, initialNotify);
032    return new CallbackStore(m_index, uid, SPIDataJNI::cancelInitializedCallback);
033  }
034
035  /**
036   * Check whether this device has been initialized.
037   *
038   * @return true if initialized
039   */
040  public boolean getInitialized() {
041    return SPIDataJNI.getInitialized(m_index);
042  }
043
044  /**
045   * Define whether this device has been initialized.
046   *
047   * @param initialized whether this object is initialized
048   */
049  public void setInitialized(boolean initialized) {
050    SPIDataJNI.setInitialized(m_index, initialized);
051  }
052
053  /**
054   * Register a callback to be run whenever a `read` operation is executed.
055   *
056   * @param callback the callback
057   * @return the {@link CallbackStore} object associated with this callback. Save a reference to
058   *     this object so GC doesn't cancel the callback.
059   */
060  public CallbackStore registerReadCallback(BufferCallback callback) {
061    int uid = SPIDataJNI.registerReadCallback(m_index, callback);
062    return new CallbackStore(m_index, uid, SPIDataJNI::cancelReadCallback);
063  }
064
065  /**
066   * Register a callback to be run whenever a `write` operation is executed.
067   *
068   * @param callback the callback
069   * @return the {@link CallbackStore} object associated with this callback. Save a reference to
070   *     this object so GC doesn't cancel the callback.
071   */
072  public CallbackStore registerWriteCallback(ConstBufferCallback callback) {
073    int uid = SPIDataJNI.registerWriteCallback(m_index, callback);
074    return new CallbackStore(m_index, uid, SPIDataJNI::cancelWriteCallback);
075  }
076
077  /**
078   * Register a callback to be run whenever an auto receive buffer is received.
079   *
080   * @param callback the callback
081   * @return the {@link CallbackStore} object associated with this callback. Save a reference to
082   *     this object so GC doesn't cancel the callback.
083   */
084  public CallbackStore registerReadAutoReceiveBufferCallback(
085      SpiReadAutoReceiveBufferCallback callback) {
086    int uid = SPIDataJNI.registerReadAutoReceiveBufferCallback(m_index, callback);
087    return new CallbackStore(m_index, uid, SPIDataJNI::cancelReadAutoReceiveBufferCallback);
088  }
089
090  /** Reset all simulation data. */
091  public void resetData() {
092    SPIDataJNI.resetData(m_index);
093  }
094}