1 #include "dronecontrol.h"
4 DroneControl::DroneControl():QObject()
6 qDebug() << "DroneControl::DroneControl";
8 // ctlSock=new QTcpSocket();
9 // ctlSock->bind(QHostAddress::Any,5559);
10 // navSock=new QUdpSocket();
11 // navSock->bind(QHostAddress::Any,5554)
12 //connect(navSocket,SIGNAL(readyRead()),SLOT(navDataReady()));
13 droneHost.setAddress("192.168.1.1");
14 droneThread=new DroneThread(this,droneHost);
15 connect(droneThread->navData(),SIGNAL(navDataUpdated()),this,SLOT(navDataUpdated()));
16 connect(droneThread->navData(),SIGNAL(stateUpdated()),this,SLOT(statusUpdated()));
17 droneSettings=new QSettings("katix.org","ardrone");
24 void DroneControl::navDataUpdated()
26 emit navDataChanged();
29 void DroneControl::statusUpdated()
35 void DroneControl::setPitch(float val_)
38 // qDebug() << "setPitch=" << val_;
39 droneThread->setDroneControl(m_pitch,m_roll,m_yaw,m_vv);
41 float DroneControl::pitch() {return m_pitch;};
43 void DroneControl::setRoll(float val_)
46 // qDebug() << "setRoll=" << val_;
47 droneThread->setDroneControl(m_pitch,m_roll,m_yaw,m_vv);
49 float DroneControl::roll() {return m_roll;};
50 void DroneControl::setYaw(float val_) {
52 // qDebug() << "setYaw=" << val_;
53 droneThread->setDroneControl(m_pitch,m_roll,m_yaw,m_vv);
55 float DroneControl::yaw() {return m_yaw;};
56 void DroneControl::setVVelocity(float val_) {
58 // qDebug() << "setVv=" << val_;
59 droneThread->setDroneControl(m_pitch,m_roll,m_yaw,m_vv);
61 float DroneControl::vVelocity() {return m_vv;};
62 void DroneControl::setAltitude(float val_) {
65 float DroneControl::altitude() {return m_altitude;};
66 void DroneControl::setEnabled(int val_) { m_enabled=val_;};
67 int DroneControl::enabled() {return m_enabled;};
68 void DroneControl::setFly(bool val_)
71 qDebug() << "setFly=" << val_;
72 droneThread->setFly(m_fly);
74 bool DroneControl::fly() {return m_fly;};
75 void DroneControl::setEmergency(bool val_)
78 qDebug() << "setEmergency=" << val_;
79 droneThread->setEmergency(m_emergency);
81 bool DroneControl::emergency() {return m_emergency;};
84 // Getters to drone actual valyes sent by drone
85 float DroneControl::droneAltitude()
87 return droneThread->navData()->altitude;
89 float DroneControl::dronePitch()
91 return droneThread->navData()->pitch;
93 float DroneControl::droneRoll()
95 return droneThread->navData()->roll;
97 float DroneControl::droneYaw()
99 return droneThread->navData()->yaw;
101 float DroneControl::droneVBat()
103 return droneThread->navData()->vbat;
105 QString DroneControl::decodedStatus()
107 return droneThread->navData()->decodedState;
109 int DroneControl::pwm_motor1()
111 return droneThread->navData()->pwm_motor1;
113 int DroneControl::pwm_motor2()
115 return droneThread->navData()->pwm_motor2;
117 int DroneControl::pwm_motor3()
119 return droneThread->navData()->pwm_motor3;
121 int DroneControl::pwm_motor4()
123 return droneThread->navData()->pwm_motor4;
130 QString DroneControl::confDroneIp()
132 qDebug() << "confDroneIp:" << droneSettings->value("droneIp","192.168.1.1").toString();
133 return droneSettings->value("droneIp","192.168.1.1").toString();
135 void DroneControl::setConfDroneIp(QString ip)
137 qDebug() << "setConfDroneIp:" << ip;
138 droneSettings->setValue("droneIp",ip);
139 emit configChanged();
141 bool DroneControl::confShowDebug()
143 return droneSettings->value("showDebug",true).toBool();
145 void DroneControl::setConfShowDebug(bool val)
147 droneSettings->setValue("showDebug",val);
148 emit configChanged();
150 bool DroneControl::confShowHorizon()
152 return droneSettings->value("showHorizon",true).toBool();
154 void DroneControl::setConfShowHorizon(bool val)
156 droneSettings->setValue("showHorizon",val);
157 emit configChanged();
159 bool DroneControl::confShowGauges()
161 return droneSettings->value("showGuges",true).toBool();
163 void DroneControl::setConfShowGauges(bool val)
165 droneSettings->setValue("showGauges",val);
166 emit configChanged();
168 bool DroneControl::confUseAccel()
170 return droneSettings->value("useAccel",false).toBool();
172 void DroneControl::setConfUseAccel(bool val)
174 droneSettings->setValue("useAccel",val);
175 emit configChanged();
177 bool DroneControl::confUseJoyStick()
179 return droneSettings->value("useJouStick",false).toBool();
181 void DroneControl::setConfUseJoyStick(bool val)
183 droneSettings->setValue("useJoyStick",val);
184 emit configChanged();
187 bool DroneControl::confFullScreen()
189 return droneSettings->value("fullScreen",true).toBool();
191 void DroneControl::setConfFullScreen(bool val)
193 droneSettings->setValue("fullScreen",val);
194 emit configChanged();
197 float DroneControl::confForwardGain()
199 return droneSettings->value("forwardGain",1.0).toFloat();
201 void DroneControl::setConfForwardGain(float val)
203 droneSettings->setValue("forwardGain",val);
204 emit configChanged();
208 float DroneControl::confBackwardGain()
210 return droneSettings->value("backwardGain",1.0).toFloat();
212 void DroneControl::setConfBackwardGain(float val)
214 droneSettings->setValue("backwardGain",val);
215 emit configChanged();
218 float DroneControl::confLeftGain()
220 return droneSettings->value("leftGain",1.0).toFloat();
222 void DroneControl::setConfLeftGain(float val)
224 droneSettings->setValue("leftGain",val);
225 emit configChanged();
227 float DroneControl::confRightGain()
229 return droneSettings->value("rightGain",1.0).toFloat();
231 void DroneControl::setConfRightGain(float val)
233 droneSettings->setValue("rightGain",val);
234 emit configChanged();
237 /*=================================================
239 DroneThread class starts here
241 ==================================================*/
244 void DroneThread::setFly(bool fly)
249 stateTimer->setInterval(50); // More frequent updates
250 sendCmd(QString("AT*FTRIM=%1\r").arg(seq++));
255 stateTimer->setInterval(200); // Less frequent updates
260 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)));
263 void DroneThread::setEmergency(bool emg)
266 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)));
267 // if(m_emergency==1)
270 void DroneThread::setDroneControl(float pitch,float roll,float yaw,float vv)
276 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);
279 void DroneThread::setDroneGain(float fgain,float bgain,float lgain,float rgain)
287 void DroneThread::sendCmd(QString cmd)
291 if(cmd.contains("%")) seqCmd=cmd.arg(seq++);
292 dgram=seqCmd.toLatin1();
293 cmdSock->writeDatagram(dgram.data(),dgram.size(),droneHost,5556);
294 seqCmd.chop(1); // Remove training cr
295 qDebug() << "DroneThread::sendCmd= " << seqCmd << "to " << droneHost ;
298 void DroneThread::navDataReady()
304 while(navSock->hasPendingDatagrams()) l=navSock->readDatagram(buf,sizeof(buf),&host,&port);
305 // qDebug() << "DroneThread::navDataReady state=" << state <<" l=" << l << "read=" << buf << "from" << host ;
306 nd.parseRawNavData((char *)&buf,l);
307 if(nd.state& (ARDRONE_COM_WATCHDOG_MASK ))
308 sendCmd(QString("AT*COMWDG=%1\r").arg(seq++));
311 sendCmd("AT*CONFIG=%1,\"general:navdata_demo\",\"FALSE\"\r");
315 sendCmd("AT*CTRL=0\r");
323 void DroneThread::sendNav(QString cmd)
326 dgram=cmd.toLatin1();
327 qDebug() << "DroneThread::sendNav= " << cmd+"\n" << "to " << droneHost ;
328 navSock->writeDatagram(dgram.data(),dgram.size(),droneHost,5554);
332 DroneThread::DroneThread(DroneControl *parentp,QHostAddress host)
334 qDebug() << "DroneThread::DroneThread";
336 state=notInitialized;
338 navSock=new QUdpSocket();
339 navSock->bind(QHostAddress::Any,5554);
340 cmdSock=new QUdpSocket();
341 cmdSock->bind(QHostAddress::Any,5556);
357 void DroneThread::run()
359 qDebug() << "DroneThread::DroneThread";
360 stateTimer=new QTimer(this);
361 connect(stateTimer,SIGNAL(timeout()),this,SLOT(timer()));
362 connect(navSock,SIGNAL(readyRead()),this,SLOT(navDataReady()));
363 stateTimer->start(1000);
370 void DroneThread::timer()
372 // qDebug() << "thread Timer";
380 sendCmd(QString("AT*REF=%1,%2\r").arg(seq++).arg((1<<18) + (1<<20) + (1<<22) + (1<<24) +(1<<28)));
383 float_or_int_t _pitch,_roll,_yaw,_vv;
384 int r=(m_pitch!=0.0 || m_roll!=0.0)?1:0;
391 // 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);
392 // 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);
393 sendCmd(QString("AT*COMWDG=%1\r").arg(seq++));
394 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));