sync repository
[mardrone] / mardrone / dronelib / joystick.cpp
1 #include "joystick.h"
2
3 JoyStick::JoyStick(QObject *parent) :
4     QObject(parent)
5 {
6     qDebug() << "JoyStick::JoyStick()";
7     m_joySettings=new QSettings("katix.org","joystick");
8 #ifdef HAVE_SDL
9     joyStick=NULL;
10 #endif
11     m_haveJoyStick=false;
12     m_rawAxis1=0;
13     m_rawAxis2=0;
14     m_rawAxis3=0;
15     m_rawAxis4=0;
16     m_rawAxis5=0;
17     m_rawAxis6=0;
18     m_minAxis1=0;
19     m_minAxis2=0;
20     m_minAxis3=0;
21     m_minAxis4=0;
22     m_minAxis5=0;
23     m_minAxis6=0;
24     m_maxAxis1=0;
25     m_maxAxis2=0;
26     m_maxAxis3=0;
27     m_maxAxis4=0;
28     m_maxAxis5=0;
29     m_maxAxis6=0;
30 #ifdef HAVE_SDL
31     if ( SDL_Init(SDL_INIT_JOYSTICK) == 0 ) {
32       if(0< SDL_NumJoysticks()) {
33          m_haveJoyStick=true;
34          m_joyStickName=SDL_JoystickName(0);
35          joyStick = SDL_JoystickOpen(0);
36          qDebug() << "Have JoyStick" << SDL_NumJoysticks() << SDL_JoystickName(0) << joyStick;
37          m_minAxis1= m_joySettings->value(m_joyStickName+"/MinAxis1",-1).toInt();
38          m_minAxis2= m_joySettings->value(m_joyStickName+"/MinAxis2",-1).toInt();
39          m_minAxis3= m_joySettings->value(m_joyStickName+"/MinAxis3",-1).toInt();
40          m_minAxis4= m_joySettings->value(m_joyStickName+"/MinAxis4",-1).toInt();
41          m_minAxis5= m_joySettings->value(m_joyStickName+"/MinAxis5",-1).toInt();
42          m_minAxis6= m_joySettings->value(m_joyStickName+"/MinAxis6",-1).toInt();
43          m_maxAxis1= m_joySettings->value(m_joyStickName+"/MaxAxis1",1).toInt();
44          m_maxAxis2= m_joySettings->value(m_joyStickName+"/MaxAxis2",1).toInt();
45          m_maxAxis3= m_joySettings->value(m_joyStickName+"/MaxAxis3",1).toInt();
46          m_maxAxis4= m_joySettings->value(m_joyStickName+"/MaxAxis4",1).toInt();
47          m_maxAxis5= m_joySettings->value(m_joyStickName+"/MaxAxis5",1).toInt();
48          m_maxAxis6= m_joySettings->value(m_joyStickName+"/MaxAxis6",1).toInt();
49          m_mapAxis[0]= m_joySettings->value(m_joyStickName+"/MapAxis1",1).toInt();
50          m_mapAxis[1]= m_joySettings->value(m_joyStickName+"/MapAxis2",2).toInt();
51          m_mapAxis[2]= m_joySettings->value(m_joyStickName+"/MapAxis3",3).toInt();
52          m_mapAxis[3]= m_joySettings->value(m_joyStickName+"/MapAxis4",4).toInt();
53          m_mapAxis[4]= m_joySettings->value(m_joyStickName+"/MapAxis5",5).toInt();
54          m_mapAxis[5]= m_joySettings->value(m_joyStickName+"/MapAxis6",6).toInt();
55          m_invertAxis1= m_joySettings->value(m_joyStickName+"/InvertAxis1",0).toBool();
56          m_invertAxis2= m_joySettings->value(m_joyStickName+"/InvertAxis2",0).toBool();
57          m_invertAxis3= m_joySettings->value(m_joyStickName+"/InvertAxis3",0).toBool();
58          m_invertAxis4= m_joySettings->value(m_joyStickName+"/InvertAxis4",0).toBool();
59          m_invertAxis5= m_joySettings->value(m_joyStickName+"/InvertAxis5",0).toBool();
60          m_invertAxis6= m_joySettings->value(m_joyStickName+"/InvertAxis6",0).toBool();
61          connect(&joyStickTimer, SIGNAL(timeout()), this, SLOT(updateJoyStick()));
62          joyStickTimer.start(50);
63       }
64    }
65 #endif
66 }
67
68  JoyStick::~JoyStick()
69 {
70 #ifdef HAVE_SDL
71      if(joyStick) SDL_JoystickClose(joyStick);
72      SDL_Quit();
73 #endif
74      m_joySettings->~QSettings();
75 };
76
77 void JoyStick::setCalibrate(bool val)
78 {
79     if(m_joyCal && !val ) saveCalibration();
80     m_joyCal=val;
81
82 };
83
84  void JoyStick::saveCalibration()
85  {
86      m_joySettings->setValue(m_joyStickName+"/MinAxis1",m_minAxis1);
87      m_joySettings->setValue(m_joyStickName+"/MinAxis2",m_minAxis2);
88      m_joySettings->setValue(m_joyStickName+"/MinAxis3",m_minAxis3);
89      m_joySettings->setValue(m_joyStickName+"/MinAxis4",m_minAxis4);
90      m_joySettings->setValue(m_joyStickName+"/MinAxis5",m_minAxis5);
91      m_joySettings->setValue(m_joyStickName+"/MinAxis6",m_minAxis6);
92      m_joySettings->setValue(m_joyStickName+"/MaxAxis1",m_maxAxis1);
93      m_joySettings->setValue(m_joyStickName+"/MaxAxis2",m_maxAxis2);
94      m_joySettings->setValue(m_joyStickName+"/MaxAxis3",m_maxAxis3);
95      m_joySettings->setValue(m_joyStickName+"/MaxAxis4",m_maxAxis4);
96      m_joySettings->setValue(m_joyStickName+"/MaxAxis5",m_maxAxis5);
97      m_joySettings->setValue(m_joyStickName+"/MaxAxis6",m_maxAxis6);
98      m_joySettings->setValue(m_joyStickName+"/InvertAxis1",m_invertAxis1);
99      m_joySettings->setValue(m_joyStickName+"/InvertAxis2",m_invertAxis2);
100      m_joySettings->setValue(m_joyStickName+"/InvertAxis3",m_invertAxis3);
101      m_joySettings->setValue(m_joyStickName+"/InvertAxis4",m_invertAxis4);
102      m_joySettings->setValue(m_joyStickName+"/InvertAxis5",m_invertAxis5);
103      m_joySettings->setValue(m_joyStickName+"/InvertAxis6",m_invertAxis6);
104      m_joySettings->setValue(m_joyStickName+"/MapAxis1",m_mapAxis[0]);
105      m_joySettings->setValue(m_joyStickName+"/MapAxis2",m_mapAxis[1]);
106      m_joySettings->setValue(m_joyStickName+"/MapAxis3",m_mapAxis[2]);
107      m_joySettings->setValue(m_joyStickName+"/MapAxis4",m_mapAxis[3]);
108      m_joySettings->setValue(m_joyStickName+"/MapAxis5",m_mapAxis[4]);
109      m_joySettings->setValue(m_joyStickName+"/MapAxis6",m_mapAxis[5]);
110  }
111
112 void JoyStick::setMapped(int axis, float value)
113 {
114     switch(axis) {
115     case 1: m_axis1=value;
116     case 2: m_axis2=value;
117     case 3: m_axis3=value;
118     case 4: m_axis4=value;
119     case 5: m_axis5=value;
120     case 6: m_axis6=value;
121     }
122 }
123
124 void JoyStick::updateJoyStick()
125 {
126     float joyScale=33000.0;
127 #ifdef HAVE_SDL
128     SDL_JoystickUpdate();
129     m_rawAxis1=SDL_JoystickGetAxis(joyStick, 0);
130     m_rawAxis2=SDL_JoystickGetAxis(joyStick, 1);
131     m_rawAxis3=SDL_JoystickGetAxis(joyStick, 2);
132     m_rawAxis4=SDL_JoystickGetAxis(joyStick, 3);
133     m_rawAxis5=SDL_JoystickGetAxis(joyStick, 4);
134     m_rawAxis6=SDL_JoystickGetAxis(joyStick, 5);
135     if(m_joyCal && m_rawAxis1>m_maxAxis1) m_maxAxis1=m_rawAxis1;
136     if(m_joyCal && m_rawAxis2>m_maxAxis2) m_maxAxis2=m_rawAxis2;
137     if(m_joyCal && m_rawAxis3>m_maxAxis3) m_maxAxis3=m_rawAxis3;
138     if(m_joyCal && m_rawAxis4>m_maxAxis4) m_maxAxis4=m_rawAxis4;
139     if(m_joyCal && m_rawAxis5>m_maxAxis5) m_maxAxis5=m_rawAxis5;
140     if(m_joyCal && m_rawAxis6>m_maxAxis6) m_maxAxis6=m_rawAxis6;
141     if(m_joyCal && m_rawAxis1<m_minAxis1) m_minAxis1=m_rawAxis1;
142     if(m_joyCal && m_rawAxis2<m_minAxis2) m_minAxis2=m_rawAxis2;
143     if(m_joyCal && m_rawAxis3<m_minAxis3) m_minAxis3=m_rawAxis3;
144     if(m_joyCal && m_rawAxis4<m_minAxis4) m_minAxis4=m_rawAxis4;
145     if(m_joyCal && m_rawAxis5<m_minAxis5) m_minAxis5=m_rawAxis5;
146     if(m_joyCal && m_rawAxis6<m_minAxis6) m_minAxis6=m_rawAxis6;
147     m_calAxis1=(m_rawAxis1 >0 ? 1.0 * m_rawAxis1/m_maxAxis1 :-1.0*m_rawAxis1/m_minAxis1)*(m_invertAxis1?-1.0:1.0);
148     m_calAxis2=(m_rawAxis2 >0 ? 1.0 * m_rawAxis2/m_maxAxis2 :-1.0*m_rawAxis2/m_minAxis2)*(m_invertAxis2?-1.0:1.0);
149     m_calAxis3=(m_rawAxis3 >0 ? 1.0 * m_rawAxis3/m_maxAxis3 :-1.0*m_rawAxis3/m_minAxis3)*(m_invertAxis3?-1.0:1.0);
150     m_calAxis4=(m_rawAxis4 >0 ? 1.0 * m_rawAxis4/m_maxAxis4 :-1.0*m_rawAxis4/m_minAxis4)*(m_invertAxis4?-1.0:1.0);
151     m_calAxis5=(m_rawAxis5 >0 ? 1.0 * m_rawAxis5/m_maxAxis5 :-1.0*m_rawAxis5/m_minAxis5)*(m_invertAxis5?-1.0:1.0);
152     m_calAxis6=(m_rawAxis6 >0 ? 1.0 * m_rawAxis6/m_maxAxis6 :-1.0*m_rawAxis6/m_minAxis6)*(m_invertAxis6?-1.0:1.0);
153     setMapped(m_mapAxis[0],m_calAxis1);
154     setMapped(m_mapAxis[1],m_calAxis2);
155     setMapped(m_mapAxis[2],m_calAxis3);
156     setMapped(m_mapAxis[3],m_calAxis4);
157     setMapped(m_mapAxis[4],m_calAxis5);
158     setMapped(m_mapAxis[5],m_calAxis6);
159
160     emit joyStickChanged();
161  //   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);
162 #endif
163 }