diff --git a/src/main/java/xbot/common/controls/sensors/XSpiController.java b/src/main/java/xbot/common/controls/sensors/XSpiController.java new file mode 100644 index 00000000..c383f2c1 --- /dev/null +++ b/src/main/java/xbot/common/controls/sensors/XSpiController.java @@ -0,0 +1,24 @@ +package xbot.common.controls.sensors; + +import java.nio.ByteBuffer; + +import edu.wpi.first.wpilibj.SPI; +import xbot.common.injection.DevicePolice; +import xbot.common.injection.DevicePolice.DeviceType; + +public abstract class XSpiController { + public interface XSpiControllerFactory { + XSpiController create( + SPI.Port port); + } + + public XSpiController( + SPI.Port port, + DevicePolice police) { + + police.registerDevice(DeviceType.SPI, port.value, this); + } + + public abstract int write(ByteBuffer dataToSend, int size); + public abstract void close(); +} diff --git a/src/main/java/xbot/common/controls/sensors/mock_adapters/MockSpiController.java b/src/main/java/xbot/common/controls/sensors/mock_adapters/MockSpiController.java new file mode 100644 index 00000000..a910499e --- /dev/null +++ b/src/main/java/xbot/common/controls/sensors/mock_adapters/MockSpiController.java @@ -0,0 +1,47 @@ +package xbot.common.controls.sensors.mock_adapters; + +import java.nio.ByteBuffer; + +import org.json.JSONObject; + +import dagger.assisted.Assisted; +import dagger.assisted.AssistedFactory; +import dagger.assisted.AssistedInject; +import edu.wpi.first.wpilibj.SPI.Port; +import xbot.common.controls.sensors.XSpiController; +import xbot.common.controls.sensors.XEncoder.XEncoderFactory; +import xbot.common.controls.sensors.XSpiController.XSpiControllerFactory; +import xbot.common.injection.DevicePolice; +import xbot.common.properties.PropertyFactory; +import xbot.common.simulation.ISimulatableSensor; + +public class MockSpiController extends XSpiController implements ISimulatableSensor{ + + @AssistedFactory + public abstract static class MockSpiControllerFactory implements XSpiControllerFactory { + public abstract MockSpiController create( + @Assisted("port") Port port); + } + + @AssistedInject + public MockSpiController( + @Assisted("port") Port port, + DevicePolice police) { + super(port, police); + } + + @Override + public int write(ByteBuffer dataToSend, int size) { + return 0; + } + + @Override + public void close() {} + + @Override + public void ingestSimulationData(JSONObject payload) { + // TODO + throw new UnsupportedOperationException("Unimplemented method 'ingestSimulationData'"); + } + +} \ No newline at end of file diff --git a/src/main/java/xbot/common/controls/sensors/wpi_adapters/SpiWPIAdapter.java b/src/main/java/xbot/common/controls/sensors/wpi_adapters/SpiWPIAdapter.java new file mode 100644 index 00000000..dc4b8aaa --- /dev/null +++ b/src/main/java/xbot/common/controls/sensors/wpi_adapters/SpiWPIAdapter.java @@ -0,0 +1,53 @@ +package xbot.common.controls.sensors.wpi_adapters; + +import java.nio.ByteBuffer; +import java.util.Arrays; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import dagger.assisted.Assisted; +import dagger.assisted.AssistedFactory; +import dagger.assisted.AssistedInject; +import edu.wpi.first.wpilibj.SPI; +import edu.wpi.first.wpilibj.SPI.Port; +import xbot.common.injection.DevicePolice; +import xbot.common.controls.sensors.XSpiController; + +public class SpiWPIAdapter extends XSpiController { + private static final Character END_CHARACTER = '\uffff'; + private SPI internalSpi; + private Logger log = LogManager.getLogger(SpiWPIAdapter.class); + + @AssistedFactory + public abstract static class SpiWPIAdapterFactory implements XSpiControllerFactory { + @Override + public abstract SpiWPIAdapter create( + @Assisted("port") Port port); + } + + @AssistedInject + public SpiWPIAdapter( + @Assisted("port")Port port, + DevicePolice police + ) { + super(port, police); + internalSpi = new SPI(port); + } + + @Override + public int write(ByteBuffer dataToSend, int size) { + //add end char \uffff to signal end of package + int packetSize = size + Character.BYTES; + ByteBuffer packet = ByteBuffer.allocate(packetSize); + packet.put(dataToSend.array()); + packet.putChar(END_CHARACTER); + + return internalSpi.write(packet, packetSize); + } + + @Override + public void close() { + internalSpi.close(); + } +} diff --git a/src/main/java/xbot/common/injection/components/BaseComponent.java b/src/main/java/xbot/common/injection/components/BaseComponent.java index ba8d1e37..93da2b51 100644 --- a/src/main/java/xbot/common/injection/components/BaseComponent.java +++ b/src/main/java/xbot/common/injection/components/BaseComponent.java @@ -16,6 +16,8 @@ import xbot.common.controls.sensors.XDutyCycleEncoder; import xbot.common.controls.sensors.XLaserCAN; import xbot.common.controls.sensors.XSettableTimerImpl; +import xbot.common.controls.sensors.XSpiController; +import xbot.common.controls.sensors.XSpiController.XSpiControllerFactory; import xbot.common.controls.sensors.XTimerImpl; import xbot.common.controls.sensors.XAbsoluteEncoder.XAbsoluteEncoderFactory; import xbot.common.controls.sensors.XAnalogDistanceSensor.XAnalogDistanceSensorFactory; @@ -173,4 +175,6 @@ public abstract class BaseComponent { public abstract XDutyCycleEncoder.XDutyCycleEncoderFactory dutyCycleEncoderFactory(); public abstract XLaserCAN.XLaserCANFactory laserCANFactory(); + + public abstract XSpiControllerFactory spiControllerFactory(); } diff --git a/src/main/java/xbot/common/injection/modules/MockDevicesModule.java b/src/main/java/xbot/common/injection/modules/MockDevicesModule.java index ebb8dbb1..b4adbc70 100644 --- a/src/main/java/xbot/common/injection/modules/MockDevicesModule.java +++ b/src/main/java/xbot/common/injection/modules/MockDevicesModule.java @@ -32,6 +32,7 @@ import xbot.common.controls.sensors.XEncoder.XEncoderFactory; import xbot.common.controls.sensors.XGyro.XGyroFactory; import xbot.common.controls.sensors.XLaserCAN; +import xbot.common.controls.sensors.XSpiController; import xbot.common.controls.sensors.XLidarLite.XLidarLiteFactory; import xbot.common.controls.sensors.XPowerDistributionPanel.XPowerDistributionPanelFactory; import xbot.common.controls.sensors.mock_adapters.MockAbsoluteEncoder.MockAbsoluteEncoderFactory; @@ -40,6 +41,7 @@ import xbot.common.controls.sensors.mock_adapters.MockEncoder.MockEncoderFactory; import xbot.common.controls.sensors.mock_adapters.MockGyro.MockGyroFactory; import xbot.common.controls.sensors.mock_adapters.MockLaserCAN; +import xbot.common.controls.sensors.mock_adapters.MockSpiController; import xbot.common.networking.MockZeromqListener.MockZeromqListenerFactory; import xbot.common.networking.XZeromqListener.XZeromqListenerFactory; @@ -129,4 +131,8 @@ public abstract class MockDevicesModule { @Binds @Singleton public abstract XLaserCAN.XLaserCANFactory getLaserCANFactory(MockLaserCAN.MockLaserCANFactory impl); + + @Binds + @Singleton + public abstract XSpiController.XSpiControllerFactory getSpiControllerFactory(MockSpiController.MockSpiControllerFactory impl); } diff --git a/src/main/java/xbot/common/injection/modules/RealDevicesModule.java b/src/main/java/xbot/common/injection/modules/RealDevicesModule.java index 6bc343d4..c7f53ee7 100644 --- a/src/main/java/xbot/common/injection/modules/RealDevicesModule.java +++ b/src/main/java/xbot/common/injection/modules/RealDevicesModule.java @@ -28,6 +28,7 @@ import xbot.common.controls.sensors.XEncoder.XEncoderFactory; import xbot.common.controls.sensors.XGyro.XGyroFactory; import xbot.common.controls.sensors.XLaserCAN; +import xbot.common.controls.sensors.XSpiController; import xbot.common.controls.sensors.XLidarLite.XLidarLiteFactory; import xbot.common.controls.sensors.XPowerDistributionPanel.XPowerDistributionPanelFactory; import xbot.common.controls.sensors.wpi_adapters.AnalogInputWPIAdapater.AnalogInputWPIAdapaterFactory; @@ -37,6 +38,7 @@ import xbot.common.controls.sensors.wpi_adapters.EncoderWPIAdapter.EncoderWPIAdapterFactory; import xbot.common.controls.sensors.wpi_adapters.InertialMeasurementUnitAdapter.InertialMeasurementUnitAdapterFactory; import xbot.common.controls.sensors.wpi_adapters.LaserCANWpiAdapter; +import xbot.common.controls.sensors.wpi_adapters.SpiWPIAdapter; import xbot.common.controls.sensors.wpi_adapters.LidarLiteWpiAdapter.LidarLiteWpiAdapterFactory; import xbot.common.controls.sensors.wpi_adapters.PowerDistributionPanelWPIAdapter.PowerDistributionPanelWPIAdapaterFactory; import xbot.common.networking.XZeromqListener.XZeromqListenerFactory; @@ -128,4 +130,8 @@ public abstract class RealDevicesModule { @Binds @Singleton public abstract XLaserCAN.XLaserCANFactory getLaserCANFactory(LaserCANWpiAdapter.LaserCANWpiAdapterFactory impl); + + @Binds + @Singleton + public abstract XSpiController.XSpiControllerFactory getSpiControllerFactory(SpiWPIAdapter.SpiWPIAdapterFactory impl); }