78 data.
pos.
x = transformInputData(getADCValue(MUX::SingleEnded_AIN0));
79 data.
pos.
y = transformInputData(getADCValue(MUX::SingleEnded_AIN1));
81 data.
pressed = LeftJoyStickButton;
83 if(data.
mag < Joystick::s_deadzone) {
99 data.
pos.
x = -transformInputData(getADCValue(MUX::SingleEnded_AIN2));
100 data.
pos.
y = -transformInputData(getADCValue(MUX::SingleEnded_AIN3));
102 data.
pressed = RightJoyStickButton;
104 if(data.
mag < Joystick::s_deadzone) {
117 if (deadzone < PositionMax)
118 Joystick::s_deadzone = deadzone;
127 return Joystick::s_deadzone;
135 enum class RegisterID :
u8 {
136 ConversionRegister = 0x00,
137 ConfigurationRegister = 0x01,
143 enum class MUX :
u8 {
144 Differential_AIN0_AIN1 = 0x00,
145 Differential_AIN0_AIN3 = 0x01,
146 Differential_AIN1_AIN3 = 0x02,
147 Differential_AIN2_AIN3 = 0x03,
148 SingleEnded_AIN0 = 0x04,
149 SingleEnded_AIN1 = 0x05,
150 SingleEnded_AIN2 = 0x06,
151 SingleEnded_AIN3 = 0x07,
157 enum class PGA :
u8 {
169 enum class MODE :
u8 {
190 struct ConfigurationRegister {
199 static_assert(
sizeof(ConfigurationRegister) ==
sizeof(
u16),
"Configuration register definition wrong");
202 constexpr
static inline u8 DeviceAddress = 0x90;
203 constexpr
static inline u8 ReservedBits = 0x03;
204 constexpr
static inline u16 ConversionDone = 0x8000;
206 constexpr
static inline u16 CenterPosition = 0x34A;
207 constexpr
static inline u16 MaxADCValue = 0x56A;
208 constexpr
static inline u16 MinADCValue = 0x100;
209 constexpr
static inline i8 PositionRange = 200;
210 constexpr
static inline i8 PositionMin = -100;
211 constexpr
static inline i8 PositionMax = 100;
213 static inline i8 s_deadzone = 5;
223 static u16 getADCValue(MUX channel) {
224 ConfigurationRegister configRegister = {0};
225 configRegister.OS = 1;
227 configRegister.PGA =
enumValue(PGA::FSR_4p096);
228 configRegister.MODE =
enumValue(MODE::SingleShot);
229 configRegister.DR =
enumValue(DR::SPS1600);
230 configRegister.Reserved = ReservedBits;
232 bsp::I2CA::write<ByteSwapped<u16>>(DeviceAddress,
enumValue(RegisterID::ConfigurationRegister), bit_cast<u16>(configRegister));
234 while((bsp::I2CA::read<ByteSwapped<u16>>(DeviceAddress,
enumValue(RegisterID::ConfigurationRegister)) & ConversionDone) == ConversionDone) {
238 auto adcData = bsp::I2CA::read<ByteSwapped<u16>>(DeviceAddress,
enumValue(RegisterID::ConversionRegister));
249 static inline i16 transformInputData(
u16 adcData) {
250 return ((((
static_cast<i16>(adcData >> 4) - MinADCValue) /
float(MaxADCValue - MinADCValue)) * 2.0F) - 1.0F) * 100.0F;