Emuler un écran TFT sous linux pour dev d'applications embarquées - Codes et scripts - Linux et OS Alternatifs
Marsh Posté le 18-04-2012 à 18:35:53
J'ai trouvé ça, ça me parait pas mal comme point de départ : http://chl.be/glmf/kafka.fr.free.f [...] inter.html
Marsh Posté le 19-04-2012 à 15:45:21
Bon je me suis démerdé comme j'ai pu
main.cpp :
|
Je crée une image qui représente mon écran TFT, et par un timer je raffraichis le contenu de mon QLabel avec cette image toutes les 50ms (20Hz)
Et depuis l'autre thread, qui sera mon application utilisant l'écran (et qui sera ensuite embarquée dans ma carte électronique), je mets à jour l'écran (l'image) comme je veux pixel par pixel.
Ca me met ce warning de temps en temps en console mais pas grave ! QPixmap: It is not safe to use pixmaps outside the GUI thread
Ma couche d'abstraction se fera donc non pas sur une zone mémoire représentant mon framebuffer mais sur 2 fonctions setPixelColor(x, y, color) et getPixelColor(x, y).
Dans ma carte électronique ces 2 fonctions écriront/liront dans le frame buffer, et sur le PC ça écrira/lira dans l'image...
Allez je mets en résolu !
Marsh Posté le 19-04-2012 à 16:15:45
Oui ça marche, c'est tout crados mais pour ce que c'est supposé faire c'est parfait :-)
Marsh Posté le 19-04-2012 à 17:50:11
ouais j'y connais rien en qt, si t'as mieux je prends !!
Marsh Posté le 19-04-2012 à 18:39:10
nlc a écrit : ouais j'y connais rien en qt, si t'as mieux je prends !! |
Pour éviter le warning, je pense qu'utiliser qthread permettrait d'éviter le warning. Mais comme tu le dis, tu t'en fout pas mal
Marsh Posté le 19-04-2012 à 18:53:52
Bah d'habitude j'aime bien les trucs propres, mais là c'est vrai que c'est juste pour quand je développe mon code embarqué sur le PC, donc bon, je crois en effet que je vais pas me casser la tête
Marsh Posté le 19-04-2012 à 19:07:34
Ah si j'ai oublié un truc
Maintenant va falloir que je récupère des évènements de clic souris avec l'emplacement X/Y pour faire une couche d'abstraction de simulation de l'écran tactile
Marsh Posté le 19-04-2012 à 19:27:02
nlc a écrit : Ah si j'ai oublié un truc |
Qt fait ca très bien (note, j'ai pas beaucoup beaucoup bossé sur qt) : je sais plus trop, faut récupérer les évènements de la souris dans la zone de ton écran. Il te faut un widget qui puisse le récupérer (quel type est ton "écran" virtuel ?)
Ceci dit, si un modo passe, ce serait bien d'envoyer le topic dans prog.
Marsh Posté le 19-04-2012 à 20:57:13
je pense que tu peux creer ta propre classe derivant du widget "Qlabel" pour surcharger les events de type QMouseEvent
ca devrait etre assez leger a faire ... a priori
Marsh Posté le 28-04-2012 à 00:05:49
Bon j'ai réussi à me démerder pour simuler l'écran tactile mais c'est tout pourri ça marche mal, après le lancement de l'appli ça finit par planter au bout d'un moment avec :
Citation : [nlc@localhost calculateurVElibMicrochip]$ ./Debug/calculateurVEframebuffer |
Y aurait-il moyen de déplacer ce fil dans programmation/c++ ? En éditant le message je ne peux que changer la sous catégorie
Et en fait je suis pas vraiment au bon endroit vu que malgré que je tourne sous linux le programme c'est du C/C++/QT donc pas lié à la catégorie OS alternatif
Marsh Posté le 28-04-2012 à 00:16:03
j'ai oublié de poster mon code dégueu ! Pour rappel, je veux simuler un écran TFT tactile, avec une interface API très simple avec un programme écrit en C (qui sera ensuite embarqué dans un microcontrôleur). Au niveau de l'api il y a 3 choses à faire avec le code C++ :
- changer la couleur d'un pixel dont je fournis les coordonnées : void _PutPixel(short x, short y, short color )
- récupérer la couleur d'un pixel dont je fournis les coordonnées : short _GetPixel(short x, short y )
- récupérer les coordonnées X/Y de la souris et l'état des bouton de la souris (pour l'instant je suis en variables globales)
Voici le code pourri de mon main.cpp :
Code :
|
Marsh Posté le 28-04-2012 à 18:42:36
Bon j'ai trouvé la solution !! C'est tout con, ne pas utiliser QT !!
J'utilise directement la Xlib qui permet d'utiliser Xwindow directement depuis du C.
C'est même plus simple mon écran virtuel c'est juste une zone mémoire (framebuffer), et toutes les 50ms je recopie l'intégralité de l'image à l'écran avec des XDrawPoint()
Et pour récupérer les évenements souris ça va être très simple aussi, tout ce la devrait marcher ce soir !
Marsh Posté le 29-04-2012 à 01:32:43
Bon c'est bon tout marche nickel, sans QT
Et là c'est bien propre pas de message d'erreur, et tout est directement en C
Pour les curieux, mon tft.c :
Code :
|
Gros avantage, pas de thread, le main() de mon programme appelle normalement _tftInit() exactement comme il le fait quand le programme tourne dans ma carte électronique, et ça met en route l'écran TFT virtuel. Ensuite tout passe par _tfpPixelSet() et _tfpPixelGet() pour afficher sur l'écran. Il faut juste appeler _tft10msInt() toutes les 10ms pour le rafraîchissement "de l'écran"
J'ai pu faire tourner la démo des primitives de la librairie graphique Microchip ça fonctionne bien : http://www.youtube.com/watch?v=-dZJYgEEJrY
Pour la partie emulation de la dalle tactile j'ai mis ça dans touchpanel.c, et ça marche nickel aussi, le programme pense qu'il tourne dans la carte électronique et n'y voit que du feu
Code :
|
Marsh Posté le 18-04-2012 à 18:18:27
Bonjour à tous,
J'ai une carte microcontrôleur qui pilote en direct un écran tactile TFT couleur 480x272 pixels en 16 bits RGB 565. J'ai une RAM qui me sert de frame buffer, l'ecran fait 480x272 pixel, donc la zone framebuffer fait 261120 octets. Quand j'ai écris dans cette zone mémoire, ça affiche à l'écran.
Comme mon projet soft derrière est assez lourd, et que je code en C de façon portable en séparant les couches et en faisant une partie HAL (hardware abstraction layer), je peux développer mon code sur PC et le compiler pour la cible quand il est terminé.
Et du coup je voudrais émuler mon écran TFT sur ma machine linux. En gros j'ai juste besoin d'ouvrir une fenêtre de 480x272 pixel et qui représente un framebuffer virtuel 480x272 à partir d'une zone mémoire constituée d'un tableau de 130560 unsigned short. Quand j'écris dans cette zone mémoire (1 index de tableau = 1 pixel), ça doit s'afficher en conséquence dans la fenêtre.
Je pense que c'est pas sorcier à faire mais je suis un développeur embarqué, la prog gtk/qt ou autre j'y connais rien et ça me donne des boutons !!
Quelqu'un saurait-il quel environnement ou quelle technologie utiliser pour faire ça
Message édité par nlc le 27-04-2012 à 23:58:45