|
Publicité ' | ||||||||||||||||||||||||
|
|
#21 | |
![]() ![]() Chercheur d'emploi Inscription : septembre 2007 Messages : 4 614 ![]() |
Félicitations ! Et merci d'avoir joint le code à chaque fois.
Sache toutefois que c'est de la bidouille qui s'ajoute et de la bidouille et que cela risquera de te mener tôt ou tard dans une impasse. Citation:
Ensuite, dans les deux cas, il faudra provoquer la libération de la touche. Pour cela, il faut que tu voies déjà si ton logiciel détecte les relachements de touche à son niveau, et de quelle manière. En principe, tu dois avoir une table dans laquelle tu mets les points d'entrée de toutes les routines que tu as écrites et que tu m'as présentées ici. Cette table est exploitée par une procédure qui les appelle et qui, en principe, doit ou non conserver l'état de chaque touche (en mettant un flag à 1 ou à 0). Selon les cas, il faudra soit apprendre à utiliser la routine déjà en place pour intégrer ton code à l'existant (et surtout éviter d'interférer avec), soit mettre en place ta propre procédure si ce cas n'avait pas été prévu jusqu'ici. |
|
|
|
00
|
|
|
#22 |
|
Invité de passage
![]() Benjamin Responsable des études Inscription : novembre 2012 Messages : 26 ![]() |
Salut à toi !
Merci pour tes recherches (ou ton génie ! Ensuite je pense pas être prêt ou assez expérimenté en Assembleur pour me lancer dans quelquechose d'énorme comme ca (tout reprendre....) En tout cas je vais voir, avec ta première solution si je peux m'en sortir ! Et oui c'est le firmware (donc le clavier) qui gère la répétition (possibilité aussi de la désactivé, mais je dois la garder) ensuite pour les états de relachement je ne sais pas trop, enfin je sais qu'ils sont géré pour les touches de fonctions, mais je ne crois pas qu'ils le soient pour les touches "classiques". Enfin je vais regarder et je reviens surement vers toi ^^ En tout cas, je tiens vraiment à te remercier pour toutes tes explications et ton aide. Je mets résolu? |
|
|
00
|
|
|
#23 | ||
![]() ![]() Chercheur d'emploi Inscription : septembre 2007 Messages : 4 614 ![]() |
Hello
Ça, c'est vraiment TRÈS exagéré ! Citation:
Citation:
Bon courage. |
||
|
|
00
|
|
|
#24 |
|
Invité de passage
![]() Benjamin Responsable des études Inscription : novembre 2012 Messages : 26 ![]() |
Salut Obsidian !!
j'avais plus internet depuis la dernière fois ! je profite de l'avoir pour te demander un coup de main (encore tu te rappelles mon dernier problème? avec les lignes que j'ai fais, lorsque je fait "Fn"+"F3" (pour sortir ":" par exemple) ben, si je lache "Fn" avant "F3" les ":" sortent en répétition meme je la lache F3 ! et ca je vois pas comment le gerer? Merci de ton aide ex: Fn+F3 -> ::::::::::: je lache Fn en restant appuyer sur F3 -> :::::::: et je lache F3 -> :::::::::::::: jusqu'a ce que je rappuies sur F3. (ensuite si je refait Fn+F3 ca ne marche plus !) Aide moi stp, je suis perdu et c'est urgent Merci ! |
|
|
00
|
|
|
#25 | ||
![]() ![]() Chercheur d'emploi Inscription : septembre 2007 Messages : 4 614 ![]() |
C"est du déboguage et il faudrait que l'on audite le code en entier pour pouvoir te dire avec certitude d'où ça vient. La dernière fois, on a dit qu'il fallait déjà vérifier si c'était bien ton clavier qui envoyait des scan codes à répétition où si c'était le système d'exploitation qui les simulait tant qu'il n'avait pas reçu le code de relachement de la touche. Tu m'avais alors indiqué que c'était bien ton clavier qui les émettait et que, donc, le problème venait de ton code.
À mon avis, ta routine doit estimer qu'une seule touche doit pouvoir être enfoncée à un moment donné, hors touches spéciales, lesquelles touches spéciales sont représentées par leur propre bit, défini dans les equates que tu nous as présentées : Dans cette table, la touche FN n'apparaît pas. J'imagine alors qu'après les avoir passées en revue, la routine doit considérer que ce qui reste est forcément une touche ordinaire. Par ailleurs, « ksc_putkey » ne doit pas être faite pour être appelée deux fois consécutivement sans faire un tour de boucle d'abord. Elle doit probablement être faite pour ne garder trace que de la première ou dernière touche enfoncée. Comme, en plus, tu envoies des scan codes qui ne correspondent pas réellement à ceux émis par tes touches, la routine ne doit plus avoir aucun moyen de détecter automatiquement la libération de la touche. |
||
|
|
00
|
|
|
#26 |
|
Invité de passage
![]() Benjamin Responsable des études Inscription : novembre 2012 Messages : 26 ![]() |
merci !
comment dois je faire alors pour envoyer altgr, puis 0 par exemple? sans utiliser deux fois ksc_putkey? dois je creer un bit pour ma touche fn? (si oui lequel et comment?) j'ai l'impression de devoir tout recommencer (mais le j'ai pas le temps!) |
|
|
00
|
|
|
#27 |
![]() ![]() Chercheur d'emploi Inscription : septembre 2007 Messages : 4 614 ![]() |
Comme je te le dis, il te faut les spécifications de « ksc_putkey » pour savoir réellement comment elle marche et comment on doit l'utiliser. Essaie de poster le code ici s'il n'est pas trop long et s'il n'est pas trop « privé ». Je ne pense pas que le firmware d'un clavier soit d'une importance stratégique.
Autrement, on ne peut pas faire autre chose que des suppositions. Ton code n'est pas public et on ne peut pas chercher sur Google comment il fonctionne. |
|
|
00
|
|
|
#28 |
|
Invité de passage
![]() Benjamin Responsable des études Inscription : novembre 2012 Messages : 26 ![]() |
salut et merci.
desolé de rep que maintenant, je t'envois par mp. Merci ! |
|
|
00
|
|
|
#29 | ||
|
Invité de passage
![]() Benjamin Responsable des études Inscription : novembre 2012 Messages : 26 ![]() |
salut !
Bon je pense avoir trouvé, j'ai du changer de boucle, sinon je n'en sortais plus ! et je l'ai amélioré un peu (je crois Code :
mais j'ai du mal pour les combinaisons. Dans l'exemple, il envoies bien shift appuyé+deux points, mais il ne relache pas shift ! Tu aurais une idée? comment je pourrais faire? En manipulant les bits? j'ai essayé sans grand succès J'ai l'impression d'être tout proche peux-tu m'aider? Merci par avance ! |
||
|
|
00
|
|
|
#30 | |
![]() ![]() Chercheur d'emploi Inscription : septembre 2007 Messages : 4 614 ![]() |
Regarde la fonction que tu m'as envoyée :
Citation:
Il se trouve que, malheureusement, « ksc_modifier » est commune aux clavier PS/2 et USB et ne se trouve donc pas dans le code que j'ai reçu. En plus, si je me fie aux equates plus haut, la touche Fn ne doit pas encore en faire partie. Quoi qu'il en soit, cette routine doit probablement conserver trace des modificateurs enfoncés. Comme tu émets artificiellement LEFT_SHIFT, la routine en tient compte mais ne détecte jamais sa libération puisque la touche, en réalité, n'a jamais été enfoncée. Tu peux essayer de t'en sortir en générant immédiatement les événements de libération de F3 puis de Fn en réglant le bit ksc_down_up mais ça reste de la bidouille : on ne peut toujours pas garantir ce qui va se passer si la touche est « enfoncée » et « relachée » avant que ton programme ait eu le temps de faire un tour de boucle. Surtout qu'après examen du reste de ta routine, il y a du vrai partiel dans ce que l'on a supposé jusqu'ici. En particulier, elle compte le nombre de touches enfoncées à un moment donné entre 0 et 255 maximum (largement suffisant puisque supérieur aux nombres de touches physiques) mais entretient un buffer d'une dizaine d'entrées pour conserver la trace des scan codes effectivement enfoncés. Même si tu es tenu par une deadline, je suis obligé de te dire que, pour le moment, tu fuis en avant. C'est compréhensible mais tu vas avoir de plus en plus de bugs bizarres provoqués par les palliatifs que tu auras mis en place. Si tu en as la possibilité, je te conseille de livrer un programme fonctionnel à la date convenue et de réserver du temps derrière pour le mettre définitivement au propre. |
|
|
|
00
|
|
|
#31 | ||
|
Invité de passage
![]() Benjamin Responsable des études Inscription : novembre 2012 Messages : 26 ![]() |
Je te remercie pour ton temps de recherche ! Penses-tu qu'avec le dernier code que j'ai poster je peux men sortir? Le probleme c'est que je ne vois pas comment simuler la touche relâcher ! Étant donné que je dois sortir de la fonction pour aller interroger usbkey_putkey et quensuite je dois retourner dans la principale (ce que je fais avec jmp .tx_down_key )
Je peux me faire en modifiant le bit de left shift ? Mais comment je n'y arrive pas. Ou en passant ksc_down_up à o? Voici donc ksc_modifier : Code :
Je comprend de plus en plus que c'est de la bidouille mais je dois len sortir avec ça pour l'instant. Merci de ton aide |
||
|
|
00
|
|
|
#32 |
![]() ![]() Chercheur d'emploi Inscription : septembre 2007 Messages : 4 614 ![]() |
Ça se fait effectivement en repassant ksc_down_up à zéro, mais n'oublie pas de remettre ce bit dans l'état où tu l'as trouvé avant la fin de la séquence, sinon ça risque de perturber le reste de la boucle.
À part cela, la routine que tu me présentes confirme bien ce que l'on pensait : il y a un octet en mémoire, nommé « ksc_mod0 » qui code chaque modifier sur un bit (et qui permet par conséquent de savoir en un coup d'œil si au moins l'un d'entre eux est enfoncé), et un symbole NUM_MODIFIERS qui permet de savoir combien on en a défini en l'état actuel des choses. On voit également que toi ou ton prédécesseur s'est rendu compte qu'il n'y a que huit bits dans un octet et que c'était donc difficile d'en ajouter de nouveaux. Il y a une tentative pour mettre en place « ksc_mod1 » à côté, mais ça demande de modifier la routine entière pour qu'elle le reconnaisse. Pas très difficile mais un peu long. Du coup, « toi ou ton prédécesseur » a décidé que, finalement, la touche « Application » ne serait pas considérée comme un modifier. C'est bon comme cela tant que l'on en reste à cette version du logiciel mais si c'est bien ton prédécesseur qui a fait cela, alors tu comprends qu'il faut faire de l'archéologie, non seulement en ré-auditant tout ce qui a été écrit jusqu'ici mais en essayant de comprendre les choix du programmeur. Tu risques donc de te mettre toi-même dans cette situation si tu laisses traîner des palliatifs trop longtemps. |
|
|
00
|
|
|
#33 |
|
Invité de passage
![]() Benjamin Responsable des études Inscription : novembre 2012 Messages : 26 ![]() |
mmh... je comprend et je te remercie,
j'ai cependant tout essayé (passer a 0, passer a 1) rien n'y fait. Je n'arrive pas a forcer les bits. Par exemple si je passe LEFTSHIFT_BIT a 1, il devrait en resortir un SHIFT appuyé non? et il me suffirait de le repasser a 0 non? Parce que je n'ai pas reussi a modifier ksc_down_up pour controler l'état de shift. JE te remercie encore une fois pour ton temps. |
|
|
00
|
|
|
#34 | ||
![]() ![]() Chercheur d'emploi Inscription : septembre 2007 Messages : 4 614 ![]() |
Citation:
C'est plus clair avec un tableau :
Citation:
et à la restaurer ensuite par l'instruction symétrique de celle-ci. On pourrait penser que ce serait plus simple d'aller modifier directement le bit Shift en question dans ksc_mod0 mais ce n'est pas le cas : il faudrait de toutes façons restaurer son état et l'appui sur un modificateur se traduit par un événement qu'il faut de toutes façons envoyer à l'hôte… selon les cas ! Parce qu'on dirait que l'USB n'est pas géré exactement de la même façon que le reste par ton clavier. |
||
|
|
00
|
|
|
#35 | ||
|
Invité de passage
![]() Benjamin Responsable des études Inscription : novembre 2012 Messages : 26 ![]() |
je te remercie c'est plus clair, mais j'ai un peu du mal a comprendre, pourquoi on pourrait pas modifier le bit.
mais donc si je veux mettre ksc_down_up a 0 je dois juste faire un truc du genre Code :
merci encore ! |
||
|
|
00
|
|
|
#36 | ||||
![]() ![]() Chercheur d'emploi Inscription : septembre 2007 Messages : 4 614 ![]() |
Citation:
Tu peux modifier le bit mais il faudra le sauvegarder et le restaurer avant de sortir, ce qui peut s'avérer plus compliqué que simuler un appui en envoyant son scan code. De plus, d'autres procédures sont mises en œuvre lorsque tu appelles la routine normalement, comme le fait de mettre un flag dans un état particulier pour demander l'envoi d'un rapport USB. En plus, la même routine copie la valeur de ksc_mod0 une fois modifiée dans usb_last_mod, probablement pour faire la différence des deux dans une boucle quelconque plus tard et voir s'il est nécessaire de provoquer ou non un envoi de données. Fais des tests et tu verras. [quote]mais donc si je veux mettre ksc_down_up a 0 je dois juste faire un truc du genre Code :
— PUSH sert à empiler une valeur sur la pile (donc à la sauvegarder) ; — POP sert à dépiler une valeur et à la mettre dans le registre. Citation:
|
||||
|
|
00
|
|
|
#37 | ||
|
Invité de passage
![]() Benjamin Responsable des études Inscription : novembre 2012 Messages : 26 ![]() |
Merci !
Donc plutot comme ca : Code :
enfin je te remercie je vais devoir faire des tests, parce que je dois le finir aujourd'hui... |
||
|
|
00
|
|
|
#38 |
![]() ![]() Chercheur d'emploi Inscription : septembre 2007 Messages : 4 614 ![]() |
Il faut :
En principe (je dis bien « en principe ») ta routine devrait être capable de retomber sur ses pieds et de gérer correctement le moment où tu vas réellement relacher ces touches. Par contre, ça pourrait causer des problèmes dans le cas d'autres combinaisons, si d'autres touches sont enfoncées en même temps, dont la touche Shift ! Mais en principe ce cas ne devrait pas arriver. |
|
|
00
|
|
|
#39 | ||||
|
Invité de passage
![]() Benjamin Responsable des études Inscription : novembre 2012 Messages : 26 ![]() |
mais le problème aussi, c'est que si je sors pas de la boucle il n'envoie pas le code de la touche relachée !
Code :
Code :
donc j'ai un peu de mal a comprendre comment faire et je cherche une solution qui fonctionne dans un premier temps, parce qu'après je me pencherais vraiment sur le problème |
||||
|
|
00
|
|
|
#40 |
![]() ![]() Chercheur d'emploi Inscription : septembre 2007 Messages : 4 614 ![]() |
C'était à prévoir, malheureusement.
Tu commences à toucher du doigt le fond du problème : faire des palliatifs temporaires fonctionne jusqu'à un certain point, au delà duquel ce n'est plus possible. Le travail qu'on a reporté jusque là se rappelle à nous. Il faudrait que l'on voie encore le reste du code avec tout la boucle principale, etc. pour être sûrs, mais ça commence à être un peu long, d'autant que j'ai mes propres obligations à côté. Apparemment, ton programme tient la trace des touches enfoncées ou non à un moment t, en allouant un bit par modifier, un buffer pour les scan codes des six premières (ou dernières) touches ordinaires enfoncées, et un registre pour faire le compte total des touches réellement enfoncées même si l'on en a pas forcément la trace. Il semble également que ton programme dépose une consigne dans « usb_tx_required », probablement examinée à chaque nouveau tour de boucle et provoque l'envoi demandé. Jette un œil au début de ta boucle principale à l'endroit où cette variable est traitée. Il y a probablement un appel CALL à la routine chargée de cette transmission. Si tu trouves, insère un seul appel juste après la ligne 5 (l'autre envoi se fera normalement en quittant ta procédure). Il y a une chance sur deux pour que ça plante mais dans l'état actuel des choses, c'est le mieux que je puisse te proposer. Ça reste très sale, on est bien d'accord. |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com