IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Discussion :

Interface graphique de lecture de puces RFID

  1. #1
    Membre à l'essai
    Inscrit en
    Septembre 2005
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 18
    Points : 11
    Points
    11
    Par défaut Interface graphique de lecture de puces RFID
    Bonjour à tous,

    Je travaille actuellement sur un projet qui permettrai de lancer la lecture d'un album de musique (pour commencer) à la suite de la lecture d'un tag RFID.

    De façon à le rendre le plus souple possible, je me suis tourné vers le C++ et la bibliothèque Qt 5.1.0 pour l'interface utilisateur, ainsi que AppleScript pour controler iTunes qui sera le premier lecteur média (d'autres plus tard si possible). J'ai quelques notions de C++ mais je me considère débutant. Néanmoins, cela ne devrait pas poser trop de problèmes dans un premier temps.

    On considèrera qu'il existe déjà une base de données mettant en relation des numéros de tag RFID avec des identifiants d'albums (ou de morceaux) dans iTunes.

    La logique d'action est la suivante :
    - Lecture du tag RFID
    - Recherche de l'album correspondant à l'identifiant RFID
    - Exécution de la commande AppleScript qui lance l'album correspondant sur iTunes

    Que pensez-vous du choix des différents éléments pour ce projet (C++, Qt, AppleScript) ?

    Je développe sous Mac OS X Snow Leopard (10.6.8) avec Xcode 4.2 (par défaut), est-ce également un bon choix ? Existe-t-il une solution plus optimale ?
    Sachant que j'ai déjà quelques soucis pour y linker Qt (il ne trouve tout simplement pas les librairies lors de la compilation, apparemment une histoire de PATH). Je ne vois pas où configurer le chemin vers Qt (néanmoins cela fonctionne très bien dans Qt Creator).

    Je compte y aller par petits bouts, j'ai déjà trifouillé l'AppleScript (récupérer la liste des albums, lancer un morceau, etc.), également l'exécution du script via C++, et je pense ajouter les fonctionnalités au fur et à mesure de mon apprentissage.

    Vos avis et recommandations me seraient très précieux

  2. #2
    Membre à l'essai
    Inscrit en
    Septembre 2005
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    J'ai un petit soucis avec mon parser XML.

    J'utilise QtXML sur cet extrait de la librairie iTunes (qui n'utilise pas vraiment XML de façon standard comme vous le remarquerez), ce qui me permet de pouvoir trouver la liste des albums iTunes toutes plateformes confondues sans passer par AppleScript.
    J'ai modifié le nom de certains tags pour pouvoir les repérer dans la sortie.

    La logique est la suivante : j'analyse tous les tags et leurs enfants (et leurs enfants, etc) jusqu'à trouver un <key> qui contient Album, auquel cas j'affiche le contenu du tag suivant qui contient le nom de l'album en question.

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    #include <iostream>
    #include <QtCore>
    #include <QFile>
    #include <QtXml>
     
    using namespace std;
     
    void parse(QDomNode n) {
     
    	while(!n.isNull()) {
     
    		// If the node has children
    		if(n.hasChildNodes() && !n.isNull()) {
     
    			// We get the children
    			QDomNodeList nChildren = n.childNodes();
     
    			// We print the current tag name
    			std::cout << "[~] Current tag : <" << qPrintable(n.toElement().tagName()) << ">" << std::endl;
     
    			// And for each sub-tag of the current tag
    			for(int i = 0; i < nChildren.count(); i++) {
     
    				// We get the children node
    				QDomNode nChild = nChildren.at(i);
    				// And the tag value (we're looking for *Album* here)
    				QString tagValue = nChild.toElement().text();
     
    				// If the tag isn't null and contain *Album*
    				if(!nChild.isNull() && tagValue == "Album") {
    					// The album name is in the next tag
    					QDomElement albumNode = nChild.nextSiblingElement();
    					std::cout << "[-] Album found -> " << qPrintable(albumNode.text()) << std::endl;
    				}
     
    				// And we parse the children node
    				parse(nChild);
    			}
    		}
     
    		n = n.nextSibling();
    	}
    }
     
    int main() {
     
    	QDomDocument doc("Lib");
    	QFile file("/Users/wizardman/QtRFIDMusic/Lib.min.xml");
    	if(!file.open(QIODevice::ReadOnly))
    		return 1;
    	if(!doc.setContent(&file)) {
    		file.close();
    		return 1;
    	}
    	file.close();
     
    	// Root element
    	QDomElement docElem = doc.documentElement();
     
    	// <plist> -> <dict>
    	QDomNode n = docElem.firstChild().firstChild();
     
    	cout << endl << "Album list" << endl;
    	cout << "------------------------------------" << endl;
     
     
    	parse(n);
     
    	return 0;
    }
    Et voici ma sortie...
    En commentant la ligne qui indique le tag analysé, je souhaiterai que le programme ne me sorte que les deux albums listés dans le XML.

    Je n'arrive pas à comprendre pourquoi il tourne en boucle, j'ai l'impression de faire tous les tests nécessaires pour ne séléctionner que ce que je cherche.
    Des idées ?

  3. #3
    Membre à l'essai
    Inscrit en
    Septembre 2005
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Après quelques recherches et de l'aide sur Stackoverflow, voici le code fonctionnel qui une liste de tous les albums iTunes en lisant le XML :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    #include <iostream>
    #include <QtCore>
    #include <QFile>
    #include <QtXml>
    #include <QtDebug>
    #include <QVector>
     
    using namespace std;
     
    int main() {
     
    	QDomDocument doc("Lib");
    	QFile file("/Users/wizardman/QtRFIDMusic/Lib.xml");
    	if(!file.open(QIODevice::ReadOnly))
    		return 1;
    	if(!doc.setContent(&file)) {
    		file.close();
    		return 1;
    	}
    	file.close();
     
    	// Root element
    	QDomElement docElem = doc.documentElement();
     
    	// <plist> -> <dict>
    	QDomNode n = docElem.firstChild().firstChildElement("dict");
     
    	cout << endl << "Album list" << endl;
    	cout << "------------------------------------" << endl;
     
    	QVector<QString> albums;
     
    	QDomNodeList list = n.childNodes();
    	int count = list.count();
     
    	for(int i = 0; i < count; ++i) {
     
    		QDomElement node = list.at(i).toElement();
     
    		if(node.tagName().startsWith("dict")) {
     
    			node = node.firstChildElement();
     
    			while(!node.isNull()) {
     
    				QString t = node.text();
     
    				if(node.text() == "Album" && node.tagName() == "key") {
     
    					node = node.nextSiblingElement();
     
    					if(!node.isNull() && node.tagName() == "string") {
     
    						QString album = node.text();
     
    						if(albums.indexOf(album) == -1)
    							albums.append(album);
    					}
    				}
     
    				node = node.nextSiblingElement();
    			}
    		}
    	}
     
    	qDebug() << albums;
     
    	return 0;
    }

Discussions similaires

  1. Lecture ficher .ini interface graphique
    Par zamborta dans le forum Interfaces Graphiques en Java
    Réponses: 6
    Dernier message: 26/04/2013, 10h34
  2. Lecture d'un fichier wave à partir d'une interface graphique
    Par abdousoft dans le forum Interfaces Graphiques
    Réponses: 6
    Dernier message: 18/07/2011, 00h20
  3. lecture des données saisie sur interface graphique
    Par tulipe04 dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 24/03/2011, 09h17
  4. [Kylix] Interface graphique pour lognes de commande linux
    Par lecharcutierdelinux dans le forum EDI
    Réponses: 6
    Dernier message: 29/08/2003, 10h20
  5. plugin interface graphique
    Par jocelyn dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 13/08/2003, 09h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo