/*----------------------------------------------------------------------------*/ /* Copyright (c) FIRST 2008-2016. All Rights Reserved. */ /* Open Source Software - may be modified and shared by FRC teams. The code */ /* must be accompanied by the FIRST BSD license file in the root directory of */ /* the project. */ /*----------------------------------------------------------------------------*/ #pragma once #include "HAL/HAL.hpp" #include "SensorBase.h" class DigitalOutput; class DigitalInput; /** * SPI bus interface class. * * This class is intended to be used by sensor (and other SPI device) drivers. * It probably should not be used directly. * */ class SPI : public SensorBase { public: enum Port { kOnboardCS0, kOnboardCS1, kOnboardCS2, kOnboardCS3, kMXP }; SPI(Port SPIport); virtual ~SPI(); SPI(const SPI&) = delete; SPI& operator=(const SPI&) = delete; void SetClockRate(double hz); void SetMSBFirst(); void SetLSBFirst(); void SetSampleDataOnFalling(); void SetSampleDataOnRising(); void SetClockActiveLow(); void SetClockActiveHigh(); void SetChipSelectActiveHigh(); void SetChipSelectActiveLow(); virtual int32_t Write(uint8_t* data, uint8_t size); virtual int32_t Read(bool initiate, uint8_t* dataReceived, uint8_t size); virtual int32_t Transaction(uint8_t* dataToSend, uint8_t* dataReceived, uint8_t size); void InitAccumulator(double period, uint32_t cmd, uint8_t xfer_size, uint32_t valid_mask, uint32_t valid_value, uint8_t data_shift, uint8_t data_size, bool is_signed, bool big_endian); void FreeAccumulator(); void ResetAccumulator(); void SetAccumulatorCenter(int32_t center); void SetAccumulatorDeadband(int32_t deadband); int32_t GetAccumulatorLastValue() const; int64_t GetAccumulatorValue() const; uint32_t GetAccumulatorCount() const; double GetAccumulatorAverage() const; void GetAccumulatorOutput(int64_t &value, uint32_t &count) const; protected: uint8_t m_port; bool m_msbFirst = false; // default little-endian bool m_sampleOnTrailing = false; // default data updated on falling edge bool m_clk_idle_high = false; // default clock active high private: void Init(); };