]> Devoid-pointer.net GitWeb - FFBChecker.git/commitdiff
- Fix updatable effects handling 0.2d
authorMichal Malý <madcatxster@prifuk.cz>
Sun, 15 Dec 2013 11:09:52 +0000 (12:09 +0100)
committerMichal Malý <madcatxster@prifuk.cz>
Sun, 15 Dec 2013 11:09:52 +0000 (12:09 +0100)
- Version bump

ffbconditioneffect.cpp
ffbconditioneffect.h
ffbdevice.cpp
ffbdevice.h
ffbperiodiceffect.cpp
ffbperiodiceffect.h
globals.h

index 56961c2cbb6e6478f545a8c383837c29f029710e..7e6ef2138de29fc6b3040c74f27cd05546ec8e86 100644 (file)
@@ -125,3 +125,17 @@ bool FFBConditionEffect::setParameters(const std::shared_ptr<FFBConditionEffectP
   m_params = params;
   return true;
 }
+
+bool FFBConditionEffect::operator==(const FFBEffect& other) const
+{
+  if (this->type() != other.type())
+    return false;
+  else {
+    try {
+      const FFBConditionEffect& cother = dynamic_cast<const FFBConditionEffect&>(other);
+      return this->m_params->subtype == cother.m_params->subtype;
+    } catch (std::bad_cast&) {
+      return false;
+    }
+  }
+}
index 34a3699db1e416b78b64acf9bd022276b39b9277..8bc78698150ee35c6762d7d1cff3042a82fcc2ae 100644 (file)
@@ -12,6 +12,7 @@ public:
   inline const std::shared_ptr<FFBEffectParameters> parameters() const { return m_params; }
   bool setParameters(const std::shared_ptr<FFBEffectParameters> params);
   bool setParameters(const std::shared_ptr<FFBConditionEffectParameters> params);
+  bool operator==(const FFBEffect& other) const;
 
 private:
   std::shared_ptr<FFBConditionEffectParameters> m_params;
index 63ec856e0995eca637d3b969113d66f13c6e9157..b3c93f57cf611e0c7977d46c15f257fc5476817d 100644 (file)
@@ -110,24 +110,6 @@ unsigned int FFBDevice::effectTypeToIdx(FFBEffectTypes type)
   return 0;
 }
 
-bool FFBDevice::isEffectUpdateable(const std::shared_ptr<FFBEffect> effect, const std::shared_ptr<FFBEffectParameters> params, const FFBEffectTypes type)
-{
-  if (effect->type() != type)
-    return false;
-  if (type == FFBEffectTypes::PERIODIC) {
-    const std::shared_ptr<FFBPeriodicEffectParameters> pParams;
-    try {
-      PeriodicWaveforms waveform = std::dynamic_pointer_cast<FFBPeriodicEffectParameters>(effect->parameters())->waveform;
-      if (waveform != std::dynamic_pointer_cast<FFBPeriodicEffectParameters>(params)->waveform)
-        return false;
-    } catch (std::bad_cast& ex) {
-      qDebug() << ex.what();
-      return false;
-    }
-  }
-  return true;
-}
-
 QString FFBDevice::waveformName(const PeriodicWaveforms waveform) const
 {
   switch (waveform) {
@@ -241,6 +223,16 @@ bool FFBDevice::removeEffect(const int idx)
 
 bool FFBDevice::startEffect(const int idx, FFBEffectTypes type, std::shared_ptr<FFBEffectParameters> params)
 {
+  std::shared_ptr<FFBEffect> effect = FFBEffectFactory::createEffect(type);
+  if (effect == nullptr) {
+    qDebug() << "Unable to create effect";
+    return false;
+  }
+  if (!effect->setParameters(params)) {
+    qDebug() << "Unable to set effect parameters, some values are probably invalid.";
+    return false;
+  }
+
   if (idx < 0 || idx > c_maxEffectCount) {
     qCritical() << "Effect index out of bounds";
     return false;
@@ -248,30 +240,17 @@ bool FFBDevice::startEffect(const int idx, FFBEffectTypes type, std::shared_ptr<
 
   /* There is no effect in the selected slot */
   if (m_effects[idx]->type() == FFBEffectTypes::NONE) {
-    std::shared_ptr<FFBEffect> effect = FFBEffectFactory::createEffect(type);
-    if (effect == nullptr) {
-      qWarning() << "Unable to create FFBEffect";
-      return false;
-    }
-    m_effects[idx] = effect;
     qDebug() << "Creating new effect";
   } else {
-    if (!isEffectUpdateable(m_effects[idx], params, type)) {
+    if (*m_effects[idx] != *effect) {
       removeEffect(idx);
-      m_effects[idx] = FFBEffectFactory::createEffect(type);
-      if (m_effects[idx] == nullptr) {
-        qDebug() << "Effect was not recreated.";
-        return false;
-      }
       qDebug() << "Recreating effect" << idx;
-    } else
+    } else {
+      effect->setInternalIdx(m_effects[idx]->internalIdx());
       qDebug() << "Updating effect" << idx;
+    }
   }
-
-  if (!m_effects[idx]->setParameters(params)) {
-    qDebug() << "Unable to set effect parameters, some values are probably invalid.";
-    return false;
-  }
+  m_effects[idx] = effect;
 
   struct ff_effect* kernelEff = nullptr;
   kernelEff = m_effects[idx]->createFFStruct();
@@ -280,6 +259,7 @@ bool FFBDevice::startEffect(const int idx, FFBEffectTypes type, std::shared_ptr<
     qDebug() << "struct ff_effect not created";
     return false;
   }
+
   int ret = uploadEffect(kernelEff);
   if (ret < 0) {
     QMessageBox::critical(nullptr, "FFB Device", "Effect could not have been uploaded, error code: " + QString::number(ret));
@@ -291,6 +271,8 @@ bool FFBDevice::startEffect(const int idx, FFBEffectTypes type, std::shared_ptr<
   m_effects[idx]->setInternalIdx(kernelEff->id);
   m_effects[idx]->setStatus(FFBEffect::FFBEffectStatus::STOPPED);
 
+  qDebug() << "idx" << "internal idx" << kernelEff->id;
+
   /* Start playback */
   struct input_event evt;
   evt.type = EV_FF;
index e366ca78d0c459de3d3d88a814507c202c0e4137..bcf05b7afcbdee6cc8bd8549019c67669c08e836 100644 (file)
@@ -40,7 +40,6 @@ public:
   inline PeriodicWaveforms waveformByIdx(const int idx) const { return m_availablePeriodicWaveforms[idx]; }
 
 private:
-  bool isEffectUpdateable(const std::shared_ptr<FFBEffect> effect, const std::shared_ptr<FFBEffectParameters> params, const FFBEffectTypes type);
   bool removeEffect(const int idx);
   int uploadEffect(struct ff_effect* effect);
   std::vector<ConditionSubtypes> m_availableConditionSubtypes;
index b07200ab40d5bca418b52b5f9566540b05819fd0..0dea0d6f5513cff1f4b49524f56b5557158c2e35 100644 (file)
@@ -128,11 +128,6 @@ bool FFBPeriodicEffect::operator==(const FFBEffect& other) const
   }
 }
 
-bool FFBPeriodicEffect::operator!=(const FFBEffect& other) const
-{
-  return !(*this == other);
-}
-
 FFBPeriodicEffect::~FFBPeriodicEffect()
 {
 }
index 2a5b5ad04ad23aac515e6e17ccfe6bba4a913138..14891b0943ed6d72fff319126b52580905bba14e 100644 (file)
@@ -14,7 +14,6 @@ public:
   bool setParameters(const std::shared_ptr<FFBEffectParameters> params);
   bool setParameters(const std::shared_ptr<FFBPeriodicEffectParameters> params);
   bool operator==(const FFBEffect& other) const;
-  bool operator!=(const FFBEffect& other) const;
 
 private:
   std::shared_ptr<FFBPeriodicEffectParameters> m_params;
index 9dff3a3f337861846ddeff491564cfec0fa90811..aa211495efd02938eeb7e3d187b81a88f1c15c37 100644 (file)
--- a/globals.h
+++ b/globals.h
@@ -4,7 +4,7 @@
 #define APP_NAME "FFBChecker"
 static const int APP_VERSION_MAJOR(0);
 static const int APP_VERSION_MINOR(2);
-static const char APP_VERSION_REL('c');
+static const char APP_VERSION_REL('d');
 
 enum class FFBEffectTypes { NONE, CONSTANT, PERIODIC, RAMP, CONDITION, RUMBLE};
 enum class PeriodicWaveforms { NONE, SQUARE, TRIANGLE, SINE, SAW_UP, SAW_DOWN };