0.2 version add desktop components multitouch, joystick, multicast
[mardrone] / mardrone / dronelib / joystick.cpp
diff --git a/mardrone/dronelib/joystick.cpp b/mardrone/dronelib/joystick.cpp
new file mode 100644 (file)
index 0000000..5cc8bee
--- /dev/null
@@ -0,0 +1,163 @@
+#include "joystick.h"
+
+JoyStick::JoyStick(QObject *parent) :
+    QObject(parent)
+{
+    qDebug() << "JoyStick::JoyStick()";
+    m_joySettings=new QSettings("katix.org","joystick");
+#ifdef HAVE_SDL
+    joyStick=NULL;
+#endif
+    m_haveJoyStick=false;
+    m_rawAxis1=0;
+    m_rawAxis2=0;
+    m_rawAxis3=0;
+    m_rawAxis4=0;
+    m_rawAxis5=0;
+    m_rawAxis6=0;
+    m_minAxis1=0;
+    m_minAxis2=0;
+    m_minAxis3=0;
+    m_minAxis4=0;
+    m_minAxis5=0;
+    m_minAxis6=0;
+    m_maxAxis1=0;
+    m_maxAxis2=0;
+    m_maxAxis3=0;
+    m_maxAxis4=0;
+    m_maxAxis5=0;
+    m_maxAxis6=0;
+#ifdef HAVE_SDL
+    if ( SDL_Init(SDL_INIT_JOYSTICK) == 0 ) {
+      if(0< SDL_NumJoysticks()) {
+         m_haveJoyStick=true;
+         m_joyStickName=SDL_JoystickName(0);
+         joyStick = SDL_JoystickOpen(0);
+         qDebug() << "Have JoyStick" << SDL_NumJoysticks() << SDL_JoystickName(0) << joyStick;
+         m_minAxis1= m_joySettings->value(m_joyStickName+"/MinAxis1",-1).toInt();
+         m_minAxis2= m_joySettings->value(m_joyStickName+"/MinAxis2",-1).toInt();
+         m_minAxis3= m_joySettings->value(m_joyStickName+"/MinAxis3",-1).toInt();
+         m_minAxis4= m_joySettings->value(m_joyStickName+"/MinAxis4",-1).toInt();
+         m_minAxis5= m_joySettings->value(m_joyStickName+"/MinAxis5",-1).toInt();
+         m_minAxis6= m_joySettings->value(m_joyStickName+"/MinAxis6",-1).toInt();
+         m_maxAxis1= m_joySettings->value(m_joyStickName+"/MaxAxis1",1).toInt();
+         m_maxAxis2= m_joySettings->value(m_joyStickName+"/MaxAxis2",1).toInt();
+         m_maxAxis3= m_joySettings->value(m_joyStickName+"/MaxAxis3",1).toInt();
+         m_maxAxis4= m_joySettings->value(m_joyStickName+"/MaxAxis4",1).toInt();
+         m_maxAxis5= m_joySettings->value(m_joyStickName+"/MaxAxis5",1).toInt();
+         m_maxAxis6= m_joySettings->value(m_joyStickName+"/MaxAxis6",1).toInt();
+         m_mapAxis[0]= m_joySettings->value(m_joyStickName+"/MapAxis1",1).toInt();
+         m_mapAxis[1]= m_joySettings->value(m_joyStickName+"/MapAxis2",2).toInt();
+         m_mapAxis[2]= m_joySettings->value(m_joyStickName+"/MapAxis3",3).toInt();
+         m_mapAxis[3]= m_joySettings->value(m_joyStickName+"/MapAxis4",4).toInt();
+         m_mapAxis[4]= m_joySettings->value(m_joyStickName+"/MapAxis5",5).toInt();
+         m_mapAxis[5]= m_joySettings->value(m_joyStickName+"/MapAxis6",6).toInt();
+         m_invertAxis1= m_joySettings->value(m_joyStickName+"/InvertAxis1",0).toBool();
+         m_invertAxis2= m_joySettings->value(m_joyStickName+"/InvertAxis2",0).toBool();
+         m_invertAxis3= m_joySettings->value(m_joyStickName+"/InvertAxis3",0).toBool();
+         m_invertAxis4= m_joySettings->value(m_joyStickName+"/InvertAxis4",0).toBool();
+         m_invertAxis5= m_joySettings->value(m_joyStickName+"/InvertAxis5",0).toBool();
+         m_invertAxis6= m_joySettings->value(m_joyStickName+"/InvertAxis6",0).toBool();
+         connect(&joyStickTimer, SIGNAL(timeout()), this, SLOT(updateJoyStick()));
+         joyStickTimer.start(50);
+      }
+   }
+#endif
+}
+
+ JoyStick::~JoyStick()
+{
+#ifdef HAVE_SDL
+     if(joyStick) SDL_JoystickClose(joyStick);
+     SDL_Quit();
+#endif
+     m_joySettings->~QSettings();
+};
+
+void JoyStick::setCalibrate(bool val)
+{
+    if(m_joyCal && !val ) saveCalibration();
+    m_joyCal=val;
+
+};
+
+ void JoyStick::saveCalibration()
+ {
+     m_joySettings->setValue(m_joyStickName+"/MinAxis1",m_minAxis1);
+     m_joySettings->setValue(m_joyStickName+"/MinAxis2",m_minAxis2);
+     m_joySettings->setValue(m_joyStickName+"/MinAxis3",m_minAxis3);
+     m_joySettings->setValue(m_joyStickName+"/MinAxis4",m_minAxis4);
+     m_joySettings->setValue(m_joyStickName+"/MinAxis5",m_minAxis5);
+     m_joySettings->setValue(m_joyStickName+"/MinAxis6",m_minAxis6);
+     m_joySettings->setValue(m_joyStickName+"/MaxAxis1",m_maxAxis1);
+     m_joySettings->setValue(m_joyStickName+"/MaxAxis2",m_maxAxis2);
+     m_joySettings->setValue(m_joyStickName+"/MaxAxis3",m_maxAxis3);
+     m_joySettings->setValue(m_joyStickName+"/MaxAxis4",m_maxAxis4);
+     m_joySettings->setValue(m_joyStickName+"/MaxAxis5",m_maxAxis5);
+     m_joySettings->setValue(m_joyStickName+"/MaxAxis6",m_maxAxis6);
+     m_joySettings->setValue(m_joyStickName+"/InvertAxis1",m_invertAxis1);
+     m_joySettings->setValue(m_joyStickName+"/InvertAxis2",m_invertAxis2);
+     m_joySettings->setValue(m_joyStickName+"/InvertAxis3",m_invertAxis3);
+     m_joySettings->setValue(m_joyStickName+"/InvertAxis4",m_invertAxis4);
+     m_joySettings->setValue(m_joyStickName+"/InvertAxis5",m_invertAxis5);
+     m_joySettings->setValue(m_joyStickName+"/InvertAxis6",m_invertAxis6);
+     m_joySettings->setValue(m_joyStickName+"/MapAxis1",m_mapAxis[0]);
+     m_joySettings->setValue(m_joyStickName+"/MapAxis2",m_mapAxis[1]);
+     m_joySettings->setValue(m_joyStickName+"/MapAxis3",m_mapAxis[2]);
+     m_joySettings->setValue(m_joyStickName+"/MapAxis4",m_mapAxis[3]);
+     m_joySettings->setValue(m_joyStickName+"/MapAxis5",m_mapAxis[4]);
+     m_joySettings->setValue(m_joyStickName+"/MapAxis6",m_mapAxis[5]);
+ }
+
+void JoyStick::setMapped(int axis, float value)
+{
+    switch(axis) {
+    case 1: m_axis1=value;
+    case 2: m_axis2=value;
+    case 3: m_axis3=value;
+    case 4: m_axis4=value;
+    case 5: m_axis5=value;
+    case 6: m_axis6=value;
+    }
+}
+
+void JoyStick::updateJoyStick()
+{
+    float joyScale=33000.0;
+#ifdef HAVE_SDL
+    SDL_JoystickUpdate();
+    m_rawAxis1=SDL_JoystickGetAxis(joyStick, 0);
+    m_rawAxis2=SDL_JoystickGetAxis(joyStick, 1);
+    m_rawAxis3=SDL_JoystickGetAxis(joyStick, 2);
+    m_rawAxis4=SDL_JoystickGetAxis(joyStick, 3);
+    m_rawAxis5=SDL_JoystickGetAxis(joyStick, 4);
+    m_rawAxis6=SDL_JoystickGetAxis(joyStick, 5);
+    if(m_joyCal && m_rawAxis1>m_maxAxis1) m_maxAxis1=m_rawAxis1;
+    if(m_joyCal && m_rawAxis2>m_maxAxis2) m_maxAxis2=m_rawAxis2;
+    if(m_joyCal && m_rawAxis3>m_maxAxis3) m_maxAxis3=m_rawAxis3;
+    if(m_joyCal && m_rawAxis4>m_maxAxis4) m_maxAxis4=m_rawAxis4;
+    if(m_joyCal && m_rawAxis5>m_maxAxis5) m_maxAxis5=m_rawAxis5;
+    if(m_joyCal && m_rawAxis6>m_maxAxis6) m_maxAxis6=m_rawAxis6;
+    if(m_joyCal && m_rawAxis1<m_minAxis1) m_minAxis1=m_rawAxis1;
+    if(m_joyCal && m_rawAxis2<m_minAxis2) m_minAxis2=m_rawAxis2;
+    if(m_joyCal && m_rawAxis3<m_minAxis3) m_minAxis3=m_rawAxis3;
+    if(m_joyCal && m_rawAxis4<m_minAxis4) m_minAxis4=m_rawAxis4;
+    if(m_joyCal && m_rawAxis5<m_minAxis5) m_minAxis5=m_rawAxis5;
+    if(m_joyCal && m_rawAxis6<m_minAxis6) m_minAxis6=m_rawAxis6;
+    m_calAxis1=(m_rawAxis1 >0 ? 1.0 * m_rawAxis1/m_maxAxis1 :-1.0*m_rawAxis1/m_minAxis1)*(m_invertAxis1?-1.0:1.0);
+    m_calAxis2=(m_rawAxis2 >0 ? 1.0 * m_rawAxis2/m_maxAxis2 :-1.0*m_rawAxis2/m_minAxis2)*(m_invertAxis2?-1.0:1.0);
+    m_calAxis3=(m_rawAxis3 >0 ? 1.0 * m_rawAxis3/m_maxAxis3 :-1.0*m_rawAxis3/m_minAxis3)*(m_invertAxis3?-1.0:1.0);
+    m_calAxis4=(m_rawAxis4 >0 ? 1.0 * m_rawAxis4/m_maxAxis4 :-1.0*m_rawAxis4/m_minAxis4)*(m_invertAxis4?-1.0:1.0);
+    m_calAxis5=(m_rawAxis5 >0 ? 1.0 * m_rawAxis5/m_maxAxis5 :-1.0*m_rawAxis5/m_minAxis5)*(m_invertAxis5?-1.0:1.0);
+    m_calAxis6=(m_rawAxis6 >0 ? 1.0 * m_rawAxis6/m_maxAxis6 :-1.0*m_rawAxis6/m_minAxis6)*(m_invertAxis6?-1.0:1.0);
+    setMapped(m_mapAxis[0],m_calAxis1);
+    setMapped(m_mapAxis[1],m_calAxis2);
+    setMapped(m_mapAxis[2],m_calAxis3);
+    setMapped(m_mapAxis[3],m_calAxis4);
+    setMapped(m_mapAxis[4],m_calAxis5);
+    setMapped(m_mapAxis[5],m_calAxis6);
+
+    emit joyStickChanged();
+ //   qDebug("JoyStickRaw %d %d %d %d %d %d mapped %1.2f %1.2f %1.2f %1.2f",m_rawAxis1,m_rawAxis2,m_rawAxis3,m_rawAxis4,m_rawAxis5,m_rawAxis6,m_axis1,m_axis2,m_axis3,m_axis4);
+#endif
+}