]> Devoid-pointer.net GitWeb - FFBChecker.git/commitdiff
Add an option to set autocentering strength
authorMichal Malý <madcatxster@devoid-pointer.net>
Sun, 2 Aug 2015 10:34:30 +0000 (12:34 +0200)
committerMichal Malý <madcatxster@devoid-pointer.net>
Sun, 2 Aug 2015 10:34:30 +0000 (12:34 +0200)
ffbdevice.h
linuxffbdevice.cpp
linuxffbdevice.h
mainwindow.cpp
mainwindow.h
mainwindow.ui
sdl2ffbdevice.cpp
sdl2ffbdevice.h

index ed3ddc055241a16b06e19b106c03ba79a6c9af9c..baa51040e2379b0cff8457cf27ded61ebb319125 100644 (file)
@@ -21,6 +21,7 @@ public:
   virtual void close() = 0;
   virtual bool queryDeviceCapabilities() = 0;
   virtual bool removeAndEraseEffect(const int idx) = 0;
+  virtual bool setAutocentering(const int strength) = 0;
   virtual bool setGain(const int gain) = 0;
   virtual bool startEffect(const int idx, const FFBEffectTypes type, std::shared_ptr<FFBEffectParameters> parameters) = 0;
   virtual bool stopEffect(const int idx) = 0;
@@ -33,6 +34,7 @@ protected:
   std::vector<ConditionSubtypes> m_availableConditionSubtypes;
   std::vector<FFBEffectTypes> m_availableEffects;
   std::vector<PeriodicWaveforms> m_availablePeriodicWaveforms;
+  bool m_adjustableAC;
   bool m_adjustableGain;
 
   std::vector<std::shared_ptr<FFBEffect>> m_effects;
index 9afcd3373af727b6866d98ca82b7df372482bdac..4ab6b7e4625ba98ec93dc5e2973cd0e5f0b3ec85 100644 (file)
@@ -78,6 +78,8 @@ bool LinuxFFBDevice::queryDeviceCapabilities()
   /* Query device-wide capabilities */
   if (testBit(FF_GAIN, caps))
     m_adjustableGain = true;
+  if (testBit(FF_AUTOCENTER, caps))
+    m_adjustableAC = true;
 
   return true;
 }
@@ -120,6 +122,34 @@ bool LinuxFFBDevice::removeEffect(const int idx)
   return true;
 }
 
+bool LinuxFFBDevice::setAutocentering(const int strength)
+{
+  struct input_event evt;
+  int ret;
+
+  if (!m_adjustableAC) {
+    QMessageBox::warning(nullptr, LNXDEV_ERR_CAPTION, "Device does not have adjustable autocentering");
+    return false;
+  }
+
+  if (strength < 0 || strength > 0xFFFF) {
+    QMessageBox::warning(nullptr, LNXDEV_ERR_CAPTION, "Autocentering strength must be within <0; 65535>");
+    return false;
+  }
+
+  evt.type = EV_FF;
+  evt.code = FF_AUTOCENTER;
+  evt.value = strength;
+  ret = write(c_fd, &evt, sizeof(struct input_event));
+  if (ret != sizeof(struct input_event)) {
+    QMessageBox::warning(nullptr, LNXDEV_ERR_CAPTION, "Unable to set autocentering strength");
+    return false;
+  }
+
+  return true;
+}
+
+
 bool LinuxFFBDevice::setGain(const int gain)
 {
   struct input_event evt;
index 52460bdb5571cd318c9033513d877b4b23d7f528..66289c991313dffc8dfe2d226cc4e13bead4854c 100644 (file)
@@ -14,6 +14,7 @@ public:
   void close();
   bool queryDeviceCapabilities();
   bool removeAndEraseEffect(const int idx);
+  bool setAutocentering(const int strength);
   bool setGain(const int gain);
   bool startEffect(const int idx, const FFBEffectTypes type, std::shared_ptr<FFBEffectParameters> parameters);
   bool stopEffect(const int idx);
index f260c06deb2cad7015cbb177128e6544d27625fc..351d7b65a3afbaf80480bf07083457e5f39998b2 100644 (file)
@@ -53,6 +53,7 @@ MainWindow::MainWindow(const QString& title, QWidget* parent) :
   connect(ui->cbox_interfaces, SIGNAL(activated(int)), this, SLOT(onInterfaceSelected(const int)));
   connect(ui->qpb_refreshDevices, SIGNAL(clicked()), this, SLOT(onRefreshDevicesClicked()));
   connect(ui->qpb_remove, SIGNAL(clicked()), this, SLOT(onRemoveEffectClicked()));
+  connect(ui->qpb_setAC, SIGNAL(clicked()), this, SLOT(onSetACClicked()));
   connect(ui->qpb_setGain, SIGNAL(clicked()), this, SLOT(onSetGainClicked()));
   connect(ui->qpb_start, SIGNAL(clicked()), this, SLOT(onStartEffectClicked()));
   connect(ui->qpb_stop, SIGNAL(clicked()), this, SLOT(onStopEffectClicked()));
@@ -273,6 +274,24 @@ void MainWindow::onRemoveEffectClicked()
     setEffectStatusText(m_activeDevice->effectStatusByIdx(effectIdx));
 }
 
+void MainWindow::onSetACClicked()
+{
+  bool ok;
+  int strength;
+
+  if (m_activeDevice == nullptr)
+    return;
+
+  strength = ui->qle_autocentering->text().toInt(&ok);
+  if (!ok) {
+    QMessageBox::warning(this, res_inputFormatErrCap, "Invalid autocentering strength value");
+    return;
+  }
+
+  m_activeDevice->setAutocentering(strength);
+}
+
+
 void MainWindow::onSetGainClicked()
 {
   bool ok;
index 36c0322ccd5901cb4fced2cf91aa84a606617e8a..2776b749226fa48ef7b74602f6b659de8db05015 100644 (file)
@@ -70,6 +70,7 @@ private slots:
   void onInterfaceSelected(const int cboxIdx);
   void onRefreshDevicesClicked();
   void onRemoveEffectClicked();
+  void onSetACClicked();
   void onSetGainClicked();
   void onStartEffectClicked();
   void onStopEffectClicked();
index 96460689b9c21ad3586a27846164a6036e0e35d3..a80af5b76aaab2c04809342313be0fbdb54aea8d 100644 (file)
@@ -7,7 +7,7 @@
     <x>0</x>
     <y>0</y>
     <width>444</width>
-    <height>623</height>
+    <height>670</height>
    </rect>
   </property>
   <property name="windowTitle">
         <item row="0" column="1">
          <widget class="QComboBox" name="cbox_devices"/>
         </item>
-        <item row="1" column="0">
-         <widget class="QLabel" name="ql_effectSlots">
-          <property name="text">
-           <string>Effect slots:</string>
-          </property>
-         </widget>
-        </item>
-        <item row="1" column="1">
-         <widget class="QComboBox" name="cbox_effectSlots"/>
-        </item>
         <item row="3" column="0" colspan="2">
          <widget class="QPushButton" name="qpb_refreshDevices">
           <property name="text">
         </property>
        </widget>
       </item>
+      <item row="1" column="0">
+       <widget class="QLabel" name="ql_autocentering">
+        <property name="text">
+         <string>Autocentering:</string>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="1">
+       <widget class="QLineEdit" name="qle_autocentering">
+        <property name="text">
+         <string>65535</string>
+        </property>
+        <property name="alignment">
+         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="2">
+       <widget class="QPushButton" name="qpb_setAC">
+        <property name="text">
+         <string>Set AC</string>
+        </property>
+       </widget>
+      </item>
      </layout>
     </item>
     <item>
       </property>
      </widget>
     </item>
+    <item>
+     <layout class="QFormLayout" name="formLayout_4">
+      <item row="0" column="0">
+       <widget class="QLabel" name="ql_effectSlots">
+        <property name="text">
+         <string>Effect slots:</string>
+        </property>
+       </widget>
+      </item>
+      <item row="0" column="1">
+       <widget class="QComboBox" name="cbox_effectSlots"/>
+      </item>
+     </layout>
+    </item>
     <item>
      <widget class="QLabel" name="ql_effectStatus">
       <property name="font">
index eeb73110c84f2c539b27601437b4eea9a196ca39..45fed88d9244809f9644650ab2f84e1da3513d2c 100644 (file)
@@ -81,6 +81,9 @@ bool SDL2FFBDevice::queryDeviceCapabilities()
   if (caps & SDL_HAPTIC_GAIN)
     m_adjustableGain = true;
 
+  if (caps & SDL_HAPTIC_AUTOCENTER)
+    m_adjustableAC = true;
+
   return true;
 }
 
@@ -125,6 +128,27 @@ bool SDL2FFBDevice::removeAndEraseEffect(const int idx)
   return true;
 }
 
+bool SDL2FFBDevice::setAutocentering(const int strength)
+{
+  if (!m_adjustableAC) {
+    QMessageBox::warning(nullptr, SDL2DEV_ERR_CAPTION, "Device does not have adjustable autocentering");
+    return false;
+  }
+
+  if (strength < 0 || strength > 100) {
+    QMessageBox::warning(nullptr, SDL2DEV_ERR_CAPTION, "Autocentering strength must be within <0; 100>");
+    return false;
+  }
+
+  if (SDL_HapticSetAutocenter(c_haptic, strength) < 0) {
+    QMessageBox::warning(nullptr, SDL2DEV_ERR_CAPTION, QString("Unable to set autocentering:\n%1").arg(SDL_GetError()));
+    return false;
+  }
+
+  return true;
+}
+
+
 bool SDL2FFBDevice::setGain(const int gain)
 {
   if (!m_adjustableGain) {
index e25cd757c6dabd075ad7c7f220aaa65e4832a1d5..fa89c4d18e4346b053f2109df1edbba333f33920 100644 (file)
@@ -10,6 +10,7 @@ public:
   void close();
   bool queryDeviceCapabilities();
   bool removeAndEraseEffect(const int idx);
+  bool setAutocentering(const int strength);
   bool setGain(const int idx);
   bool startEffect(const int idx, const FFBEffectTypes type, std::shared_ptr<FFBEffectParameters> parameters);
   bool stopEffect(const int idx);