コード例 #1
0
 /*!
  * \brief VideoService::reconnect stops the timer and flushes the socket.
  * The connectToDrone() method will be called after 500ms.
  */
 void VideoService::reconnect()
 {
     if(timer->isActive())
         timer->stop();
     capture->release();
     delete capture;
     QThread::msleep(500);
     capture = new cv::VideoCapture();
     connectToDrone();
 }
コード例 #2
0
 /*!
  * \brief VideoService::provision is called when the object thread is started.
  * The service will call connectToDrone() and starts the lostTimer.
  */
 void VideoService::provision()
 {
     connectToDrone();
     lostTimer->start();
 }
コード例 #3
0
ファイル: main.c プロジェクト: AMDG2/DroneWifi
/** \fn void main(void)
	\ingroup Rabbit
	\brief Fonction principal : gestion du pilotage du drone en fonctions des entrées/sorties
	\author Baudouin Feildel
	\author Thibaut Marty
**/
void main(void)
{
	etat_commandes ec;
	ardrone droneV;
	ardrone* drone = &droneV;
	char cptPassErr = 0;
	wifi_status status;
	int initOk;
	
	/// Initialise les ports de la carte et les entrées/sorties
	brdInit(); // fonction de base de Rabbit
	BRDInit(); // fonction pour les bits utilisés
	init_etat_commandes(&ec);
	lireCommandes(&ec);

	/// Crée la structure du drone
	newARDrone(drone);
	
	/// Initialise la connexion (tant que toutes les étapes ne sont pas réussies) :
	do
	{
		printf("tentative d'initialisation\n");
		initOk = 0;
		
		/// .... Initialise le driver TCP
		if(sock_init())
			printf("erreur de sock_init()\n");
		else
			initOk++;
	
		/// .... Initialise la socket de connexion avec le drone
		if(!connectToDrone(drone))
			printf("erreur connectToDrone()\n");
		else
			initOk++;
		
		/// .... Se connecte au réseau WiFi
		connexion(&ec);
		
		/// .... Initialise le drone
		if(!initDrone(drone, &ec))
			printf("erreur initDrone()\n");
		else
			initOk++;
	} while(initOk < 3);
	printf("tentative d'initialisation reussie\n");
	
	/// Vérifie que l'on n'est pas déjà en position 'vol', sinon indique à l'utilisateur de changer le switch en faisant clignoter la LED erreur
	do
	{
		costate
		{
			lireCommandes(&ec);
			yield;
		}
		costate // Fait clignoter la LED d'erreur
		{
			ec.led_erreur = ec.led_erreur ? 0 : 1;
			ecrireCommandes(&ec);
			waitfor(DelayMs(300));
		}
	} while(ec.switch_land == 0);
	
	ec.led_erreur = 0;
	ecrireCommandes(&ec);

	
	/// Boucle principale (déroulement) :
	for(;;)
	{
		/// .... Tâche de gestion des entrées/sorties et de l'envoi de commandes au drone
		costate
		{
			tcp_tick(NULL);
			
			
			// Lit les entrées
			lireCommandes(&ec);

			/// ........ Si le bouton d'arrêt d'urgence est actif :
			if(!ec.bp_arret_urgence)
			{
				/// ............ Envoie la commande d'arrêt d'urgence
				aru(drone);
				drone->fly = false;
				/// ............ Attend le relâchement du bouton en faisant clignoter la LED debug
				do
				{
					costate
					{
						lireCommandes(&ec);
						yield;
					}
					costate // Fait clignoter la LED de debug
					{
						ec.led_debug = ec.led_debug ? 0 : 1;
						ecrireCommandes(&ec);
						waitfor(DelayMs(100));
					}
					yield; // Pour la tâche de vérification de la connexion WiFi
				} while(!ec.bp_arret_urgence);
				ec.led_debug = 0;
				ecrireCommandes(&ec);
				
				/// ............ Renvoie la commande (pour sortir du mode d'arrêt d'urgence)
				aru(drone);
			}
			/// ........ Sinon (traitement de tous les cas position du switch / vol en cours) :
			else
			{
				// pour plus tard :
				// if(ec.bp_video)	{ }
				
				/// ............ Si le bouton trim est actif et que l'on n'est pas en cours de vol, réinitialise le drone
				if(!ec.bp_trim && !drone->fly)
					initDrone(drone, &ec);
				
				/// ............ Si le switch est en position haute et que l'on ne vole pas
				if(ec.switch_land == 0 && !drone->fly)
				{
					/// ................ Fait décoler le drone. S'il y a une erreur : attend que l'utilisateur repasse le switch en position basse en faisant clignoter la LED erreur
					if(!(initDrone(drone, &ec) && takeoff(drone)))
					{
						do
						{
							costate
							{
								lireCommandes(&ec);
								yield;
							}
							costate // Fait clignoter la LED d'erreur
							{
								ec.led_erreur = ec.led_erreur ? 0 : 1;
								ecrireCommandes(&ec);
								waitfor(DelayMs(100));
							}
						} while(ec.switch_land == 0);
					}
				}
				/// ............ Si le switch est en position basse et que l'on vole
				else if(ec.switch_land == 1 && drone->fly)
				{
					/// ................ Fait atterrir le drone. S'il y a une erreur : attend que l'utilisateur passe le switch en position haute
					if(!land(drone))
					{
						do
						{
							costate
							{
								lireCommandes(&ec);
								yield;
							}
							costate // Fait clignoter la LED d'erreur
							{
								ec.led_erreur = ec.led_erreur ? 0 : 1;
								ecrireCommandes(&ec);
								waitfor(DelayMs(300));
							}
						} while(ec.switch_land == 1);
					}
				}
				/// ............ Les autres cas sont normaux et ne nécessitent pas de traitement particulier


				/// ............ Si on est en vol :
				if(drone->fly)
				{
					/// ................ Traite la valeur des joysticks et la stock dans la structure ardrone
					
					     setGoUpDown(drone, (float)(ec.joystick_2x - 2048) / 2048);
					setTurnLeftRight(drone, (float)(ec.joystick_2y - 2048) / 2048);
					setTiltFrontBack(drone, (float)(ec.joystick_1x - 2048) / 2048);
					setTiltLeftRight(drone, (float)(ec.joystick_1y - 2048) / 2048);

					/// ................ Envoie la commande avec les valeurs : s'il y a une erreur on incrémente un compteur d'erreurs. Au delà de dix erreurs de suite on tente de faire atterir le drone. S'il n'y a pas d'erreurs, on attend 30ms avant le prochain envoi
					if(!(volCommand(drone, drone->tiltLeftRight, drone->tiltFrontBack, drone->goUpDown, drone->turnLeftRight)))
					{
						if(cptPassErr > 10)
							land(drone);
						else
							cptPassErr++;
					}
					else
					{
						cptPassErr = 0; // Remise à zéro du compteur d'erreur en cas de réussite
						waitfor(DelayMs(30)); // prochain envoi de commande dans 30 ms
					}
				}
				else
					yield;
			}