@@ -71,73 +71,72 @@ class Joystick : public Core::Device
class HapticEffect : public Output
{
public:
HapticEffect(SDL_Haptic* haptic) : m_haptic(haptic), m_id(-1) {}
~HapticEffect()
{
m_effect.type = 0;
Update();
}
HapticEffect(SDL_Haptic* haptic);
~HapticEffect();

protected:
void Update();
virtual void SetSDLHapticEffect(ControlState state) = 0;
virtual bool UpdateParameters(s16 value) = 0;
static void SetDirection(SDL_HapticDirection* dir);

SDL_HapticEffect m_effect = {};

SDL_HapticEffect m_effect;
SDL_Haptic* m_haptic;
int m_id;
static constexpr u16 DISABLED_EFFECT_TYPE = 0;

private:
virtual void SetState(ControlState state) override final;
void UpdateEffect();
SDL_Haptic* const m_haptic;
int m_id = -1;
};

class ConstantEffect : public HapticEffect
{
public:
ConstantEffect(SDL_Haptic* haptic) : HapticEffect(haptic) {}
ConstantEffect(SDL_Haptic* haptic);
std::string GetName() const override;

private:
void SetSDLHapticEffect(ControlState state) override;
bool UpdateParameters(s16 value) override;
};

class RampEffect : public HapticEffect
{
public:
RampEffect(SDL_Haptic* haptic) : HapticEffect(haptic) {}
RampEffect(SDL_Haptic* haptic);
std::string GetName() const override;

private:
void SetSDLHapticEffect(ControlState state) override;
bool UpdateParameters(s16 value) override;
};

class SineEffect : public HapticEffect
class PeriodicEffect : public HapticEffect
{
public:
SineEffect(SDL_Haptic* haptic) : HapticEffect(haptic) {}
PeriodicEffect(SDL_Haptic* haptic, u16 waveform);
std::string GetName() const override;

private:
void SetSDLHapticEffect(ControlState state) override;
};

class TriangleEffect : public HapticEffect
{
public:
TriangleEffect(SDL_Haptic* haptic) : HapticEffect(haptic) {}
std::string GetName() const override;
bool UpdateParameters(s16 value) override;

private:
void SetSDLHapticEffect(ControlState state) override;
const u16 m_waveform;
};

class LeftRightEffect : public HapticEffect
{
public:
LeftRightEffect(SDL_Haptic* haptic) : HapticEffect(haptic) {}
enum class Motor : u8
{
Weak,
Strong,
};

LeftRightEffect(SDL_Haptic* haptic, Motor motor);
std::string GetName() const override;

private:
void SetSDLHapticEffect(ControlState state) override;
bool UpdateParameters(s16 value) override;

const Motor m_motor;
};
#endif

@@ -159,5 +158,5 @@ class Joystick : public Core::Device
SDL_Haptic* m_haptic;
#endif
};
}
}
} // namespace SDL
} // namespace ciface
@@ -256,8 +256,8 @@ evdevDevice::evdevDevice(const std::string& devnode) : m_devfile(devnode)
// Rumble (i.e. Left/Right) (i.e. Strong/Weak) effect
if (libevdev_has_event_code(m_dev, EV_FF, FF_RUMBLE))
{
AddOutput(new RumbleEffect(m_fd, RumbleEffect::Motor::STRONG));
AddOutput(new RumbleEffect(m_fd, RumbleEffect::Motor::WEAK));
AddOutput(new RumbleEffect(m_fd, RumbleEffect::Motor::Strong));
AddOutput(new RumbleEffect(m_fd, RumbleEffect::Motor::Weak));
}

// TODO: Add leds as output devices
@@ -388,7 +388,7 @@ std::string evdevDevice::PeriodicEffect::GetName() const

std::string evdevDevice::RumbleEffect::GetName() const
{
return (Motor::STRONG == m_motor) ? "Strong" : "Weak";
return (Motor::Strong == m_motor) ? "Strong" : "Weak";
}

void evdevDevice::Effect::SetState(ControlState state)
@@ -482,7 +482,7 @@ bool evdevDevice::PeriodicEffect::UpdateParameters(ControlState state)

bool evdevDevice::RumbleEffect::UpdateParameters(ControlState state)
{
u16& value = (Motor::STRONG == m_motor) ? m_effect.u.rumble.strong_magnitude :
u16& value = (Motor::Strong == m_motor) ? m_effect.u.rumble.strong_magnitude :
m_effect.u.rumble.weak_magnitude;
const u16 old_value = value;

@@ -90,8 +90,8 @@ class evdevDevice : public Core::Device
public:
enum class Motor : u8
{
WEAK,
STRONG,
Weak,
Strong,
};

RumbleEffect(int fd, Motor motor);