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 *===================================================================*/
25 NavData::NavData(QObject *parent) :
28 vx=0;vy=0;vz=0;pwm_motor1=0;pwm_motor2=0;pwm_motor3=0;pwm_motor4=0;
29 vbat=0.0;pitch=0.0;roll=0.0;yaw=0.0;altitude=0.0;
32 void NavData::parseRawNavData(char *buf,unsigned int len)
36 _navdata_t *nd=(_navdata_t *)buf;
37 state=nd->ardrone_state;
40 decodedState=decodeState(state,0);
44 qDebug("parseRawNavData hdr=%8x state=%08x seq=%06d opt[0].tag=%d size=%d",
45 nd->header,nd->ardrone_state,nd->sequence,nd->options[0].tag,nd->options[0].size);
47 qDebug() << decodedState;
49 while((((unsigned int)op-(unsigned int)buf)<len) && (op->size>0))
52 op=(navdata_option_t *)((unsigned int)op+op->size);
56 void NavData::parseOption(navdata_option_t *op)
58 // qDebug("parseOption tag=%d size=%d",op->tag,op->size);
60 case NAVDATA_DEMO_TAG:
62 _navdata_demo_t *ndemo=(_navdata_demo_t*)op;
63 vbat=ndemo->vbat_flying_percentage;
64 pitch=ndemo->theta/1000.0;
65 roll=ndemo->phi/1000.0;
66 yaw=ndemo->psi/1000.0;
67 altitude=ndemo->altitude;
71 emit navDataUpdated();
72 // qDebug("pitch=%2.1f roll=%2.1f yaw=%2.1f alt=%2.1f v(%2.1f,%2.1f,%2.1f bat=%2.1f",pitch,roll,yaw,altitude,vx,vy,vz,vbat);
75 case NAVDATA_TIME_TAG:
77 _navdata_time_t *ntdime=(_navdata_time_t*)op;
80 case NAVDATA_RAW_MEASURES_TAG:
82 _navdata_raw_measures_t *nraw=(_navdata_raw_measures_t*)op;
85 case NAVDATA_PHYS_MEASURES_TAG:
87 _navdata_phys_measures_t *nphys=(_navdata_phys_measures_t*)op;
90 case NAVDATA_GYROS_OFFSETS_TAG:
92 case NAVDATA_EULER_ANGLES_TAG:
94 case NAVDATA_REFERENCES_TAG:
96 case NAVDATA_TRIMS_TAG: // 7
98 _navdata_trims_t *ntrim=( _navdata_trims_t*)op;
101 case NAVDATA_RC_REFERENCES_TAG: //8
103 case NAVDATA_PWM_TAG:
105 _navdata_pwm_t *npwm=( _navdata_pwm_t*)op;
106 current_motor1=npwm->current_motor1;
107 pwm_motor1=npwm->motor1;
108 current_motor2=npwm->current_motor2;
109 pwm_motor2=npwm->motor2;
110 current_motor3=npwm->current_motor3;
111 pwm_motor3=npwm->motor3;
112 current_motor4=npwm->current_motor4;
113 pwm_motor4=npwm->motor4;
114 emit navDataUpdated();
115 // qDebug("pwm1=%3d I1=%4f pwm2=%3d I2=%4f pwm3=%3d I3=%4f pwm4=%3d I4=%4f",
116 // pwm_motor1,current_motor1,pwm_motor2,current_motor2,pwm_motor3,current_motor3,pwm_motor4,current_motor4);
119 case NAVDATA_ALTITUDE_TAG: //10
121 case NAVDATA_VISION_RAW_TAG:
123 case NAVDATA_VISION_OF_TAG: //12
125 case NAVDATA_VISION_TAG:
127 case NAVDATA_VISION_PERF_TAG:
129 case NAVDATA_TRACKERS_SEND_TAG:
131 case NAVDATA_VISION_DETECT_TAG: //16
133 _navdata_vision_detect_t *nvisd=(_navdata_vision_detect_t*)op;
134 // qDebug("nb_detected=%d type=%d xc=%d yc=%d width=%d height=%d dist=%d",nvisd->nb_detected,nvisd->type[0],nvisd->xc[0],nvisd->yc[0],
135 // nvisd->width[0],nvisd->height[0],nvisd->dist[0]);
136 for(int i=0;i++;i<4) {
137 tags[i].type=nvisd->type[i];
138 tags[i].xc=nvisd->xc[i];
139 tags[i].yc=nvisd->yc[i];
140 tags[i].height=nvisd->height[i];
141 tags[i].width=nvisd->width[i];
142 tags[i].dist=nvisd->dist[i];
146 case NAVDATA_WATCHDOG_TAG:
148 case NAVDATA_ADC_DATA_FRAME_TAG:
150 case NAVDATA_CKS_TAG: //65535
155 QString NavData::decodeState(unsigned int state,int level)
159 s+=(state & ARDRONE_FLY_MASK)==0 ? "landed ":"flying ";
160 if(level>1) s+=(state & ARDRONE_VIDEO_MASK)==0 ?"video disable ":"video ena ";
161 if(level>1)s+=(state & ARDRONE_VISION_MASK)==0 ? "vision disable ":"vision ena ";
162 if(level>1)s+=(state & ARDRONE_CONTROL_MASK)==0 ? "euler angles ":"angular speed ";
163 if(level>1)s+=(state & ARDRONE_ALTITUDE_MASK)==0 ? "alt ctrl inact ":"alt ctrl act ";
164 //s+=(state & ARDRONE_USER_FEEDBACK_START)==0 ? /*!< USER feedback : Start button state */
165 s+=(state & ARDRONE_COMMAND_MASK)==0 ? "CMD NAK ":"CMD ACK ";
166 // s+=(state & ARDRONE_FW_FILE_MASK)==0 ? /* Firmware file is good;
167 // s+=(state & ARDRONE_FW_VER_MASK )==0 ? /* Firmware update is newer;
168 // ARDRONE_FW_UPD_MASK = 1 << 9, /* Firmware update is ongoing (1;
169 s+=(state & ARDRONE_NAVDATA_DEMO_MASK )==0 ? "All navdata ":"navdata demo ";
170 s+=(state & ARDRONE_NAVDATA_BOOTSTRAP)==0 ? "":"Navdata bootstrap ";
171 // s+=(state & ARDRONE_MOTORS_MASK)==0 ? /*!< Motors status : (0) Ok, (1) Motors problem */
172 s+=(state & ARDRONE_COM_LOST_MASK)? "Com Lost ":"Com ok ";
173 if(level>1)s+=(state & ARDRONE_VBAT_LOW) ? "VBat low ":"Vbat Ok ";
174 if(level>1)s+=(state & ARDRONE_USER_EL) ? "User EL ":"";
175 s+=(state & ARDRONE_TIMER_ELAPSED) ? "Timer elapsed ":"";
176 s+=(state & ARDRONE_ANGLES_OUT_OF_RANGE) ? "Angles out of range ":"";
177 s+=(state & ARDRONE_ULTRASOUND_MASK) ? "Ultrasonic sensor deaf ":"";
178 s+=(state & ARDRONE_CUTOUT_MASK) ? "Cutout system detection detected":"";
179 // s+=(state & ARDRONE_PIC_VERSION_MASK)==0 ? /*!< PIC Version number OK : (0) a bad version number, (1) version number is OK */
180 // s+=(state & ARDRONE_ATCODEC_THREAD_ON)==0 ? /*!< ATCodec thread ON : (0) thread OFF (1) thread ON */
181 if(level>2)s+=(state & ARDRONE_NAVDATA_THREAD_ON)==0 ? "Navdata thread OFF ":"Navdata thread ON ";
182 if(level>2)s+=(state & ARDRONE_VIDEO_THREAD_ON )==0 ? "Video thread OFF ":"Video thread ON ";
183 // s+=+(state & ARDRONE_ACQ_THREAD_ON)==0 ? "Acquisition thread OFF ":"Acquisition thread ON ";
184 s+=(state & ARDRONE_CTRL_WATCHDOG_MASK) ? "CTRL watchdog ":"";
185 s+=(state & ARDRONE_ADC_WATCHDOG_MASK) ? "ADC Watchdog ":"";
186 s+=(state & ARDRONE_COM_WATCHDOG_MASK) ? "Comm Watchdog ":"";
187 s+=(state & ARDRONE_EMERGENCY_MASK)? "Emg landing":"";