Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5

Server souris et librairie client , dispmanx
#1

Bonjour, j'ai commencé a developper un librairie et un serveur pour fournir une gestion des evenements souris depuis la console du rpi, sans X11

le serveur utilise un systeme de SLOTS.
il est capable d'afficher un curseur couleur , bitmap, en utilisant les fonctions dispmanx (videocore) : 32x32 , ARGB8888 format avec alpha.
la librairie client fournit des fonctions rapides d'acces a ce serveur,(fonctions) a travers un segment memoire partagée ( key 0x1919) de 4096bytes.
extrait des fonctions du header :
int32_t EHS_MSC_getSLOT(int32_t myID,int32_t init_x,int32_t init_y,int32_t init_buttons);
int32_t EHS_MSC_releaseSLOT(int32_t myslot,int32_t myID);
int32_t EHS_MSC_getMouse(int32_t slot,int32_t* mx,int32_t* my,uint8_t* mbuts,int32_t* mwh); //
int32_t EHS_MSC_setLIMITS(int32_t slot,int32_t l,int32_t r,int32_t t,int32_t b); // sets l/right/top/bottom values for focus rectangle detection feature
int32_t EHS_MSC_checkFOCUS(int32_t slot); // checks if rectangle set has focus (mouse over it)
int32_t EHS_MSC_getINFOS(mserver_info_T* info); // gets server configuration info
int32_t EHS_MSC_setSIZE(uint32_t cursor_size); // change cursor size
int32_t EHS_MSC_setRATE(uint32_t rate,uint32_t sleep); // set rate and sleep
int32_t EHS_MSC_setTYPE(uint32_t mtype); // set cursor type
int32_t EHS_MSC_setMODE(uint32_t mode); // set server mode flags
//
le detail des fonctions est dans : http://data.eihis.com/ehsdpx_mclient/index.txt (en cours de finalisation )

------
le serveur accepte plusieurs params de config, notamment la quantité d'evenements traites par paquets ( pumping ) , et le delay (sleep) pour pouvoir laisser du temps CPU a d'autres applications.

plusieurs app peuvent simultanément ouvrir un slot sur le serveur, qui gère indépendament les coordonnées, pour chaque app : x,y, boutons, et rot-wheel
il fournit aussi une detection de focus automatique , utilisant les coordonnées d'un rectangle defini par l'application appelante.

j'ai commencé a documenter le tout. si ca interesse quelqu'un, j'aimerais avoir des retours , notamment si les scripts d'install se déroulent sans accroc,
et si l'exemple d'application fourni compile aussi sans probleme.

pour l'installation du serveur executable (pour model B+ , B2:pas testé ) , et de la librairie coté application cliente, les details sur cette page de mon site :
http://blog.eihis.com/raspberry-pi-dispm...e-service/


l'exemple d'application est par la ( il fait office de demo de plusieurs des fonctions existantes )
http://data.eihis.com/ehsdpx_mclient/example/main.c
http://data.eihis.com/ehsdpx_mclient/example/makefile

en attendant des retours ,
a bientot
Répondre
#2

Bonjour à toi,

Je suis impressionné par ton job et pour être honnête j'ai pas tout compris. Deux questions :
  • donne nous quelques idées d'application pratique
  • envisages-tu d'étendre ta lib à d'autres dispositifs de pointages?

Cool
Répondre
#3

bonjour Gambit,
je comprends bien ta remarque. j'ai tendance a faire des raccourcis en explications, quand le sujet est clair dans ma tete ( mais pas pour le 'lecteur' ) Smile .

L'idée est la suivante :
au boot, ou sorti de X , il n'y a pas de pointeur souris pour la console , en mode texte.
en lancant le serveur souris, un pointeur couleur graphique de ton choix, de 32 x 32 pixels par defaut,apparait . (magique). il utilise l'interface dispmanx : c'est un rendu hardware, donc rapide, géré par le gpu du raspi.

Le 'serveur' permet d'avoir un gestionnaire de pointeur (souris) global + local, pour n'importe quelle application qui serait executée en mode console (et meme sous X dailleur, mais X a deja un pointeur ).
Plusieurs applications peuvent avoir acces a ce serveur simultanément.

Imaginons un ecran de 1366 x768 au total.

imaginons une app 'A' , qui s'execute sous console, graphique , mais en mode fenétré ( ex: elle est en haut a droite de l'ecran, et ne fait que 200 x 200 pixels )

l'application peut avoir besoin d'un pointeur, mais elle a besoin aussi de savoir si le pointeur est 'dans sa fenetre' avant d'un utiliser les données pour les actions (x,y, boutons , wheel etc) puisque l'ecran utilisateur, lui, est bien plus grand que l'espace ecran de l'application ( 200 x200 pixels ).
C'est ce qui se passe sous le bureau X, quand on passe le pointeur sur tout le bureau, survolant telle ou telle application ouverte.

-> en utilisant le serveur de souris, l'application a acces a ces données : elle peut récuper la taille totale réelle de l'ecran de l'utilisateur, et savoir OU est actuellement le pointeur 'global' , ce qui lui permet de savoir si oui ou non, elle a 'le FOCUS' .

une autre application 'B' peut, de meme, se connecter au serveur en meme temps,et y déclarer sa position et taille de 'fenetre' (et donc, detecter de meme le focus ou non de cette souris dans SA zone precise )

Le besoin de créer cette lib est parti de plusieurs application en cours de developpement, qui se présentent sous forme de 'widgets' , pouvant etre executés depuis la console (ou pas) , pour superviser et gerer le fameux 'chantilly' dont j'ai parlé coté matériel du forum.

une capture d'écran, pour te donner une idée :
En arrière plan, les textes console sont visibles : elle reste utilisable.
En premier plan ( 3 cadrans + mini fenetre texte) sont affichés en superposition. le curseur du serveur est en bleu , entre les cadrans et la 'mini fenetre '
[Image: WP_000693.jpg]

la librairie souris... reste dédiée au pointeur souris.
Mais une librairie pour tactile multipoints (capacitif) est déja fonctionelle , je l'utilise régulièrement.

en espérant t'avoir un peu plus éclairé ..
@bientot

PS : ci joint un lien vers une video youtube d'un widget, en version 3d (2013, l'idée n'est pas nouvelle).
https://www.youtube.com/watch?v=Gpg2-iplhos
Répondre
#4

Merci à toi Smile, vous faites vraiment un job remarquable!

Cool
Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)