1 /*==================================================================
3 ! mardrone application AR-Drone for MeeGo
5 ! Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
8 ! Author:Kate Alhola kate.alhola@nokia.com
10 ! GNU Lesser General Public License Usage
11 ! This file may be used under the terms of the GNU Lesser
12 ! General Public License version 2.1 as published by the Free Software
13 ! Foundation and appearing in the file LICENSE.LGPL included in the
14 ! packaging of this file. Please review the following information to
15 ! ensure the GNU Lesser General Public License version 2.1 requirements
16 ! will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
20 *===================================================================*/
21 #include "dronecontrol.h"
24 DroneControl::DroneControl():QObject()
26 qDebug() << "DroneControl::DroneControl";
28 // ctlSock=new QTcpSocket();
29 // ctlSock->bind(QHostAddress::Any,5559);
30 // navSock=new QUdpSocket();
31 // navSock->bind(QHostAddress::Any,5554)
32 //connect(navSocket,SIGNAL(readyRead()),SLOT(navDataReady()));
33 droneHost.setAddress("192.168.1.1");
34 droneThread=new DroneThread(this,droneHost);
35 connect(droneThread->navData(),SIGNAL(navDataUpdated()),this,SLOT(navDataUpdated()));
36 connect(droneThread->navData(),SIGNAL(stateUpdated()),this,SLOT(statusUpdated()));
37 droneSettings=new QSettings("katix.org","ardrone");
42 droneThread->setDroneGain(confForwardGain(),confBackwardGain(),confLeftGain(),confRightGain());
45 void DroneControl::navDataUpdated()
47 emit navDataChanged();
50 void DroneControl::statusUpdated()
56 void DroneControl::setPitch(float val_)
59 // qDebug() << "setPitch=" << val_;
60 droneThread->setDroneControl(m_pitch,m_roll,m_yaw,m_vv);
62 float DroneControl::pitch() {return m_pitch;};
64 void DroneControl::setRoll(float val_)
67 // qDebug() << "setRoll=" << val_;
68 droneThread->setDroneControl(m_pitch,m_roll,m_yaw,m_vv);
70 float DroneControl::roll() {return m_roll;};
71 void DroneControl::setYaw(float val_) {
73 // qDebug() << "setYaw=" << val_;
74 droneThread->setDroneControl(m_pitch,m_roll,m_yaw,m_vv);
76 float DroneControl::yaw() {return m_yaw;};
77 void DroneControl::setVVelocity(float val_) {
79 // qDebug() << "setVv=" << val_;
80 droneThread->setDroneControl(m_pitch,m_roll,m_yaw,m_vv);
82 float DroneControl::vVelocity() {return m_vv;};
83 void DroneControl::setAltitude(float val_) {
86 float DroneControl::altitude() {return m_altitude;};
87 void DroneControl::setEnabled(int val_) { m_enabled=val_;};
88 int DroneControl::enabled() {return m_enabled;};
89 void DroneControl::setFly(bool val_)
92 qDebug() << "setFly=" << val_;
93 droneThread->setFly(m_fly);
95 bool DroneControl::fly() {return m_fly;};
96 void DroneControl::setEmergency(bool val_)
99 qDebug() << "setEmergency=" << val_;
100 droneThread->setEmergency(m_emergency);
102 bool DroneControl::emergency() {return m_emergency;};
105 // Getters to drone actual valyes sent by drone
106 float DroneControl::droneAltitude()
108 return droneThread->navData()->altitude;
110 float DroneControl::dronePitch()
112 return droneThread->navData()->pitch;
114 float DroneControl::droneRoll()
116 return droneThread->navData()->roll;
118 float DroneControl::droneYaw()
120 return droneThread->navData()->yaw;
122 float DroneControl::droneVBat()
124 return droneThread->navData()->vbat;
126 QString DroneControl::decodedStatus()
128 return droneThread->navData()->decodedState;
130 int DroneControl::pwm_motor1()
132 return droneThread->navData()->pwm_motor1;
134 int DroneControl::pwm_motor2()
136 return droneThread->navData()->pwm_motor2;
138 int DroneControl::pwm_motor3()
140 return droneThread->navData()->pwm_motor3;
142 int DroneControl::pwm_motor4()
144 return droneThread->navData()->pwm_motor4;
151 QString DroneControl::confDroneIp()
153 qDebug() << "confDroneIp:" << droneSettings->value("droneIp","192.168.1.1").toString();
154 return droneSettings->value("droneIp","192.168.1.1").toString();
156 void DroneControl::setConfDroneIp(QString ip)
158 qDebug() << "setConfDroneIp:" << ip;
159 droneSettings->setValue("droneIp",ip);
160 emit configChanged();
162 bool DroneControl::confShowDebug()
164 return droneSettings->value("showDebug",true).toBool();
166 void DroneControl::setConfShowDebug(bool val)
168 droneSettings->setValue("showDebug",val);
169 emit configChanged();
171 bool DroneControl::confShowHorizon()
173 return droneSettings->value("showHorizon",true).toBool();
175 void DroneControl::setConfShowHorizon(bool val)
177 droneSettings->setValue("showHorizon",val);
178 emit configChanged();
180 bool DroneControl::confShowGauges()
182 return droneSettings->value("showGuges",true).toBool();
184 void DroneControl::setConfShowGauges(bool val)
186 droneSettings->setValue("showGauges",val);
187 emit configChanged();
189 bool DroneControl::confUseAccel()
191 return droneSettings->value("useAccel",false).toBool();
193 void DroneControl::setConfUseAccel(bool val)
195 droneSettings->setValue("useAccel",val);
196 emit configChanged();
198 bool DroneControl::confUseJoyStick()
200 return droneSettings->value("useJouStick",false).toBool();
202 void DroneControl::setConfUseJoyStick(bool val)
204 droneSettings->setValue("useJoyStick",val);
205 emit configChanged();
208 bool DroneControl::confFullScreen()
210 return droneSettings->value("fullScreen",true).toBool();
212 void DroneControl::setConfFullScreen(bool val)
214 droneSettings->setValue("fullScreen",val);
215 emit configChanged();
218 float DroneControl::confForwardGain()
220 return droneSettings->value("forwardGain",1.0).toFloat();
222 void DroneControl::setConfForwardGain(float val)
224 droneSettings->setValue("forwardGain",val);
225 droneThread->setDroneGain(confForwardGain(),confBackwardGain(),confLeftGain(),confRightGain());
226 emit configChanged();
230 float DroneControl::confBackwardGain()
232 return droneSettings->value("backwardGain",1.0).toFloat();
234 void DroneControl::setConfBackwardGain(float val)
236 droneSettings->setValue("backwardGain",val);
237 droneThread->setDroneGain(confForwardGain(),confBackwardGain(),confLeftGain(),confRightGain());
238 emit configChanged();
241 float DroneControl::confLeftGain()
243 return droneSettings->value("leftGain",1.0).toFloat();
245 void DroneControl::setConfLeftGain(float val)
247 droneSettings->setValue("leftGain",val);
248 droneThread->setDroneGain(confForwardGain(),confBackwardGain(),confLeftGain(),confRightGain());
249 emit configChanged();
251 float DroneControl::confRightGain()
253 return droneSettings->value("rightGain",1.0).toFloat();
255 void DroneControl::setConfRightGain(float val)
257 droneSettings->setValue("rightGain",val);
258 droneThread->setDroneGain(confForwardGain(),confBackwardGain(),confLeftGain(),confRightGain());
259 emit configChanged();
262 /*=================================================
264 DroneThread class starts here
266 ==================================================*/
269 void DroneThread::setFly(bool fly)
274 stateTimer->setInterval(50); // More frequent updates
275 sendCmd(QString("AT*FTRIM=%1\r").arg(seq++));
280 stateTimer->setInterval(200); // Less frequent updates
285 sendCmd(QString("AT*REF=%1,%2\r").arg(seq++).arg((1<<18) + (1<<20) + (1<<22) + (1<<24) +(1<<28) +(state==flying ? 1<<9:0)));
288 void DroneThread::setEmergency(bool emg)
291 sendCmd(QString("AT*REF=%1,%2\r").arg(seq++).arg((1<<18) + (1<<20) + (1<<22) + (1<<24) +(1<<28) + (m_emergency ? 1<<8:0)));
292 // if(m_emergency==1)
295 void DroneThread::setDroneControl(float pitch,float roll,float yaw,float vv)
297 m_pitch=pitch/200.0*m_fgain;
298 m_roll=roll/200.0*m_rgain;
301 qDebug() << QString("pitch=%1 roll=%2 yaw=%3 vv=%4\r").arg(m_pitch,3,'F',2).arg(m_roll,3,'F',2).arg(m_yaw,3,'F',2).arg(m_vv,3,'F',2);
304 void DroneThread::setDroneGain(float fgain,float bgain,float lgain,float rgain)
312 void DroneThread::sendCmd(QString cmd)
316 if(cmd.contains("%")) seqCmd=cmd.arg(seq++);
317 dgram=seqCmd.toLatin1();
318 cmdSock->writeDatagram(dgram.data(),dgram.size(),droneHost,5556);
319 seqCmd.chop(1); // Remove training cr
320 qDebug() << "DroneThread::sendCmd= " << seqCmd << "to " << droneHost ;
323 void DroneThread::navDataReady()
329 while(navSock->hasPendingDatagrams()) l=navSock->readDatagram(buf,sizeof(buf),&host,&port);
330 // qDebug() << "DroneThread::navDataReady state=" << state <<" l=" << l << "read=" << buf << "from" << host ;
331 nd.parseRawNavData((char *)&buf,l);
332 if(nd.state& (ARDRONE_COM_WATCHDOG_MASK ))
333 sendCmd(QString("AT*COMWDG=%1\r").arg(seq++));
336 sendCmd("AT*CONFIG=%1,\"general:navdata_demo\",\"FALSE\"\r");
340 sendCmd("AT*CTRL=0\r");
348 void DroneThread::sendNav(QString cmd)
351 dgram=cmd.toLatin1();
352 qDebug() << "DroneThread::sendNav= " << cmd+"\n" << "to " << droneHost ;
353 navSock->writeDatagram(dgram.data(),dgram.size(),droneHost,5554);
357 DroneThread::DroneThread(DroneControl *parentp,QHostAddress host)
359 qDebug() << "DroneThread::DroneThread";
361 state=notInitialized;
363 navSock=new QUdpSocket();
364 navSock->bind(QHostAddress::Any,5554);
365 cmdSock=new QUdpSocket();
366 cmdSock->bind(QHostAddress::Any,5556);
382 void DroneThread::run()
384 qDebug() << "DroneThread::DroneThread";
385 stateTimer=new QTimer(this);
386 connect(stateTimer,SIGNAL(timeout()),this,SLOT(timer()));
387 connect(navSock,SIGNAL(readyRead()),this,SLOT(navDataReady()));
388 stateTimer->start(1000);
395 void DroneThread::timer()
397 // qDebug() << "thread Timer";
405 sendCmd(QString("AT*REF=%1,%2\r").arg(seq++).arg((1<<18) + (1<<20) + (1<<22) + (1<<24) +(1<<28)));
408 float_or_int_t _pitch,_roll,_yaw,_vv;
409 int r=(m_pitch!=0.0 || m_roll!=0.0)?1:0;
416 // qDebug() << QString("AT*PCMD=%1,0,%2,%3,%4,%5\r").arg(seq).arg(_roll.f,3,'F',2).arg(_pitch.f,3,'F',2).arg(_vv.f,3,'F',2).arg(_yaw.f,3,'F',2);
417 // qDebug() << QString("AT*PCMD=%1,0,%2,%3,%4,%5\r").arg(seq).arg(_roll.i,8,16).arg(_pitch.i,8,16).arg(_vv.i,8,16).arg(_yaw.i,8,16);
418 sendCmd(QString("AT*COMWDG=%1\r").arg(seq++));
419 sendCmd(QString("AT*PCMD=%1,%2,%3,%4,%5,%6\r").arg(seq++).arg(r).arg(_roll.i).arg(_pitch.i).arg(_vv.i).arg(_yaw.i));