 Nous faisons un nouveau hands-on, un drôle, nous allons définir une mousse. C'est à dire que notre STM32 sera comme une mousse. Pour cela, nous allons pousser le bouton bleu, et puis la mousse de votre PC va bouger. Pour cet exemple, nous allons commencer de scratch, parce que cela sera straightforward. Il n'y a pas de modifiations majeures, donc je n'ai pas préparé le projet. Nous allons le faire ensemble encore. Nous allons renforcer, vous vous souvenez, l'oscillateur iPassMode. Nous allons activer l'OTG, l'USB. Puis nous allons sélectionner la classe. Puis nous devons sélectionner le cloc. Ensuite, nous avons fait cela, nous pouvons générer un nouveau projet. Puis nous allons sélectionner le produit F446Z. C'est juste F446Z. Puis nous avons eu le lien avec notre nucléaire. Nous allons juste sélectionner. Ok, donc maintenant, nous revenons sur le pinout. Je veux faire un peu de full speed, mais nous ne choisons pas l'OTG. Nous allons juste dire que c'est un dévice. C'est un dévice de mou. Alors, nous avons eu le pinout, plus ou plus, plus ou plus. Nous pensons au cloc, c'est très important. Nous allons dire, ok, nous avons eu un pinout de mou, nous sommes en source de bypass, la source est générée par le autre STM32 Deepug. Nous sommes en lien. Ok, pas si mal. Maintenant, nous allons sélectionner la classe. Avant, nous avons fait un VCP, virtual compote. Cette fois, je veux faire un HLD, humaine interface. Par défaut, avec Cubamix, quand vous avez fait ça, tout est configuré pour avoir un mou. C'est pourquoi nous le faisons de scratch, parce que c'est assez facile. Nous allons voir après, ce qu'est le humaine interface. Il y a un peu d'interruptions, mais nous allons avoir un descriptor sur l'information qui se passe. Pour un mou, typiquement, c'est la position. Si un bouton est cliqué, et qu'est-ce qu'est le statut de la roue, est-ce qu'il se passe, il se passe ou quelque chose comme ça. Nous le verrons juste après. Alors, je pense que je prépare tout. Ok, nous allons ajouter le bouton. C'est quelque chose original, parce que je veux que, quand j'attends mon bouton, mon mou ne s'arrête pas, parce que je vais être en trouble juste pour faire la présentation. Donc, nous allons juste configurer un bouton pour under le bouton bleu. Ce bouton est un PC-11. C'est assez compliqué. Vous pouvez juste aller là pour être bien, et juste presser PC-11. Quand vous faites des choses comme ça, vous devez aller sur le bouton bleu. Je vais juste trouver PC-11. Et puis, je peux juste cliquer, et je peux configurer ce bouton comme juste un input de GPIO. Dans ce cas, dans mon code, je peux lire le GPIO pour obtenir le statut du bouton bleu. Pour savoir ce que c'est ce bouton, je vais choisir le PC-13. Je vais juste aller dans la documentation sur le nucléaire. Tout est là. Je vais vous présenter cette documentation. C'est clairement fait. C'est la même chose que si vous voulez mettre des lèvres sur le bouton bleu. Il y a des spécifiques GPIOs, vous devez en mettre un, et vous devez avoir le bouton bleu qui sera pour le bouton bleu. Donc, c'est ok pour tout le monde. Donc, pour le bouton bleu, c'est ok. Et nous avons nos oscillateurs externaux. Donc, nous allons passer à la configuration de clup. On dit que c'est mauvais, c'est vrai. On pense au fait que c'est 8 MHz. Donc, nous devons changer le bouton bleu. On dit que nous voulons utiliser le bouton bleu. Nous voulons avoir une vitesse de 1, 6, 8 MHz. On va le faire, je veux dire. Il peut le faire par lui-même. Donc, vous devez avoir... Ok, vous voulez changer le bouton bleu ? Oui, on va essayer de le faire. Et finalement, on va pouvoir le trouver. Donc, je pense que nous sommes prêts à générer. Donc, comme précédemment, la configuration, on peut voir, tout est là-bas défauts. Je veux dire que le produit ID avec ce numéro, il sera détecté à la main. Donc, il n'y a rien à modifier. Mais si vous faites votre propre, je dirais, l'application de l'application HD, qui n'est pas un mot, mais c'est quelque chose de plus étrange, votre propriétaire. Juste changer cet ID. Réquestez l'allocation d'être déclarée officiellement à l'autonomie et à l'autorité. Et puis, vous pouvez mettre le chauffeur associé à cet application. Donc, nous ne modifions rien. Et maintenant, nous faisons le projet de la configuration. Ok. Et ici. Nous allons juste mettre le nom. Ok. Nous allons découer le device HD, par exemple. C'est très original. Le projet de la location, je suis toujours dans le même endroit. Cette fois, le minimum app est suffisant. C'est juste une information que je vous donne. Vous n'avez pas de modifier ces paramètres. 200, c'est ok. Donc, je pense que tout est prêt. Donc, dégénérez le code. On va tester. Je vais juste ouvrir le projet. Ok, je n'oublie juste quelque chose. Je vais vous montrer. C'est ouvert plus haut. Je n'oublie pas de changer les défauts environnements à l'atollique de ma génération. Je suis désolé. Ok. Donc, dans le projet, des positions, ici, je veux faire un vrai studio. Et ça sera mieux. Je suis désolé. Si vous utilisez l'atollique, maintenant, vous savez comment générer l'atollique. Ok. Générisation et les routes prévues de la génération, pas de problème, parce que c'était une erreur. Je l'ai généré de nouveau et j'ai ouvert le projet. Ok. Ce n'était pas en train de travailler sur mon côté. C'était un loge satisfait. Ok. Donc, je vais loucher l'atollique et je vais importer le projet. Je vais revenir avec mon atollique. Ok. Donc, c'est le projet prévu. Je vais le relâcher. Et je ne vais pas relâcher le contenu de l'atollique. Si je fais ça, je vais juste le retirer de l'atollique. Ce n'est pas le point que j'arrête ce que j'ai fait avec vous avant. C'était toujours là. Je peux encore l'importer, trouver ma modification. Je vais juste retirer tout, je dirais, la génération dynamique. Je peux aussi justifier le projet. C'est isolé, mais c'est up to you. Je préfère que tout soit nettoyé sur mon côté. Donc, je vais le retirer sans l'arrêter. Et maintenant, je vais importer mon nouveau projet. Donc, de l'existence. Ok. D'ici, des compétences ONC, dans l'USB Training, et sur le Mellano, le device HID et la fin. Avec God, je dirais notre nouveau structeur. Nous changeons la classe. Donc, maintenant, les structures peuvent être un petit peu différentes. Let's have a look just by QZT. Le corps, c'est toujours le même. Vous vous souvenez de ce que j'ai dit? Ce qui est dans le corps est indépendant, je dirais, ou principalement indépendant de la classe. Donc, vous avez toujours les mêmes structures. Mais, let's look at the class. Ici, juste un HID. Un nouveau file avec un nouveau nom. Et parfois, par exemple, pour MasterAge, vous avez 3 files. C'est vraiment dépendant de la classe que vous utilisez. Et le reste est le même. Ici, vous avez un autre device, Conf, et il n'y a pas d'interfaces cette fois. Nous verrons après. Donc, nous avons notre code. Maintenant, j'ai besoin de partager avec vous le format de l'information de l'HID qui sera pool. Je vous l'ai déjà dit ce matin, mais qu'est-ce que le type de transfert pour un device HID ? Ce n'était pas interdit, pour sûr. Donc, nous pouvons, par exemple, dans la description de cette classe, et nous devons trouver que l'on-point est interdit. Encore une fois, juste pour vous donner les clous de la travelling à l'intérieur. Ici, nous avons la configuration de l'on-point de l'on-point de l'on-point de l'on-point de l'on-point de l'on-point de l'on-point de l'on-point de l'on-point interdit. Ok ? Juste pour vous donner comment nous nous voyons de la travelling. Maintenant, qu'est-ce que le format des choses qui ont été mis sur la nette sur la nette, sur le bus USB par la mousse ? Ceci est la description de l'on-point. Ok ? Donc, ceci est le format qui est expédit. Il est juste 4 bits. La première, la status de l'on-point duchanging le casque dans le set. C'est-à-dire que la modification sort du dernier port. the same for the eG Sec and then the wheel. Donc, ce que nous allons puger le data nous allons juste créer un array 4 bytes et nous allons modifier le casque en X. Donc, comme soon as the host pulls the value, you will receive this array with a new value on the X-R-C's sur votre PC. Ceci est décrivé quelque part dans le code. C'était le report des descripteurs. Je vais vous montrer où c'est. Mais ce n'est pas, je dirais, readable comme c'est. Mais il existe et on modifiera pour un autre hands-on après. Donc, OK. Je viens de revenir sur le code. Ce n'est pas dans les descripteurs. Il devrait être dans l'HID, je pense. Oui. Les descripteurs reportent la mouse. Regardez. Wow. OK. Vous ne pouvez pas le voir. Mais, croyez-moi, ceci est décrivé le fait que vous utilisez 4 bytes. Ou les bytes sont organisés. Qu'est-ce qu'il y a possible? Pour lire ou pour générer, vous avez des outils valibles. Dans le site usb.org, je vous montre au début de ce matin. Vous vous souvenez? Cette organisation va vous donner la standard. Il y a des outils d'HID, des outils descripteurs qui vous permettent de créer ça. Vous pouvez trouver des documentations. Même sur la nette, il y a des gars qui sont comme ça. Il explique très clairement comment ça fonctionne. OK. C'est généré sur l'art-code dans notre libraire pour la case de la mouse. Et vous verrez après qu'on fait un hands-on avec un keyboard. Et c'est plus documenté. Nous avons des commandes qui vous permettent d'understand ce que c'est un texte. Mais juste que les reports HID, c'est-à-dire le format de l'information, c'est juste décrivé dans une structure. C'est organisé avec 4 bytes. Et chaque value de bytes est de 255 à minus de 255 sur ce genre de choses. Toutes ces choses sont définies par cette valeur. Mais revenez à notre exemple. Donc maintenant, nous savons qu'on doit faire des reports. Je vais dire des codes. Donc nous allons faire ça en main. Qu'est-ce que nous pouvons faire? Comment pouvons nous faire des reports sur des valeurs? Nous allons vérifier dans cette fonction ce qu'est un variable. OK. OK. Je l'aime. Les descripteurs de report, bien sûr. Ici, vous avez des reports HID. Ce qui ressemble à un bon candidat pour quelque chose de notre PC. Qu'est-ce que vous pensez? C'est comme ceci. Donc, ce que nous allons faire dans notre main, c'est qu'on déclare notre array de 4 bytes. OK. Donc, encore entre les tags, par exemple, un variable privé. On déclare. 8 int, buffer. Et le size est 4 bytes. OK. Donc, on déclare. Et ne l'oubliez pas, toujours entre les n'aider et les tags. Si vous régénérez avec Kubemix, ce n'est pas un cache. Et puis, dans le main, le loop, que nous faisons là-bas, ce que nous allons faire, nous allons tester si quelqu'un a pressé le bouton. Et quand quelqu'un a pressé le bouton, nous allons envoyer nos reports. Quand je dis, nous envoyons nos reports. Vous voyez, quand nous appelons envoyer, ce sera envoyé sur le réseau. Maintenant, toujours envoyer, c'est tiré par le host. C'est à dire que nous poussons la valeur valable pour le host sur le host, chaque milliseconde. Requestez. Et on va trouver. Ce n'est pas chaque milliseconde. C'est dépendant de la configuration de point de point. Mais, n'oubliez pas ces détails. Donc, ici, quand nous poussons le bouton, nous envoyons l'information valable pour une requête qui vient de l'host. C'est OK. Si pas, je pourrai revenir sur ce mécanisme. Pas de problème. Non. Donc, juste après le début, on a souvent essayé de le mettre ici, parce que nous pensions que c'était le début, mais on l'a envoyé juste après. Donc, ici, nous allons tester notre niveau GPIO. Pour cela, nous avons des fonctions HL. Donc, haut niveau. C'est toujours le même texte, HL. Puis, à quel point vous voulez, je dirais, avoir un API. Et vous pouvez presser Control Space ici. Et vous proposez toutes les fonctions qui sont valables pour celui-ci. C'est juste une app, si vous ne savez pas ce que je dois faire. Donc, ce que je veux faire, je veux lire la pince. Je veux lire le GPIO, qui est lié à mon bouton bleu, et juste lire le statut. Donc, je fais une pince. Puis, je me souviens que c'est juste le GPIO C. Donc, c'est un groupe de GPIO. Et puis, juste le pince GPIO pince16. Donc, juste lire ceci, je vais avoir le statut de mon bouton. Et si mon bouton est sur, je dois lire le value GPIO pince. OK. Donc, ici, maintenant, je sais que quelqu'un a pressé le bouton. Donc, je vais juste envoyer un report. Qu'est-ce que c'est ce que je veux dire? Oui. Donc, ici pour le report, comme nous l'avons vu ici, et non dans l'HID, nous avons un peu d'USB-HID sans report, ce qui est vraiment un bon candidat. OK. Donc, nous avons besoin d'appointeurs sur les strictures de l'application. Le report, qui est notre buffer que nous déclarons, et le length, qui est avant, parce que c'est juste ce que nous voulons envoyer. Donc, nous allons payer et passer. Donc, nous allons envoyer le report. Et puis, sur le device. Donc, il devrait être déclaré à quelqu'un, pour sûr. Donc, nous allons aller au top, parce que j'ai été defini, probablement, dans l'USB-HID. Nous allons déclencher les sous-sidus. OK. C'était juste sur le device. Je suis désolé, je dois changer à ceci. Et nous pouvons trouver les strictures de l'application. Donc, ce sera ceci. Fast. Donc, il devrait être adressé, pour sûr. Et puis, je lui donnerai ma buffer. Et le nombre de ces buffers. Nous allons mettre un délai short. Parce que si nous justons tout, ce sera un nightmare, juste un délai de 100 millimètres. Et je vais dire que c'est ça. Donc, je vais juste vérifier si je n'ai pas misé quelque chose. Oh, je probablement avoir, pour sûr. J'espère que je n'ai pas de problème, parce que je n'ai pas bien créé le code avant pour IRR. Je me sentais ça. Est-ce que c'est compilé sur votre côté? Oui, c'est bien. Donc, s'il vous plait, déclenchez-le sur votre délai. Et puis, juste essayez de placer-le sur votre PC. Je fais une erreur. Je génére, pour l'1, pour IRR. Je génére, pour Atolic, sur la même location. T'essayez de compléter. Peut-être que si c'est le cas, vous êtes heureux. Mais sur mon côté, je pense que vous aurez exactement la même chose. Donc, ce que je vais faire, je vais retourner sur mon project CubeMX. Je vais juste le sauver comme un nouveau projet. Je vais sauver le projet ARZ. Et je vais le coller avec le devise 2. Donc je ne change pas de chose. Et je l'ai juste généré. OK. Et ensuite, on va juste faire des passées de copies entre les bouts. Et ça devrait travailler. C'est un peu fermé. Et puis, ici, ce que vous pouvez faire, c'est juste ici, de filer l'importage. Importer le projet du devise. C'est le deuxième projet que vous avez généré. Fini. OK. Donc, avant de modifier, je vais vérifier que maintenant, ce boulon. Donc, ça a commencé mieux, pour sûr. OK. Donc, maintenant, on a continué à ouvrir le file avec notre modification, la main.c. Donc, je vais juste ouvrir le deuxième projet. Et je vais juste copier les codes que j'ai installés avant. OK. Je vais juste déclarer mon buffer sur le top, comme avant, sur le deuxième. OK. Donc, je vais ouvrir le plus haut. Je vais juste sauver. Et maintenant, je vais juste compiler mon nouveau boulon. Donc, le boulon est OK. OK. Je dois ajouter et inclure que j'ai mis. Je suis désolé pour cela. Comme nous avons utilisé une certaine fonction qui est définie dans un autre file. C'était le report USB HD. Nous devons ajouter aussi dans le main.c. Donc, OK. Sur le top de votre main, oubliez-le. Donc, ici, dans le main.c, nous devons inclure. Include usbd underscore hid.h. C'est de cette façon que nous pouvons comprendre l'accès. Donc, ici, c'est boulon terminé. OK. Donc, maintenant, je vais connecter mon boulon. C'est sûr. Et maintenant, let's download our code. Donc, je vais juste retirer ce code, ce qui n'est pas bon. OK. Et maintenant, je vais juste debug. Donc, ici, je vais debugger. Je vais juste le downloader. Et maintenant, je vais connecter, je vais dire, mon boulon.c. À mon PC. Donc, si j'ai poussé le bouton bleu, rien ne s'occupe. C'est mal. OK. Oh, non, ce n'est pas le... Je n'ai pas plugé mon câble, désolé. Non, je n'ai pas oublié d'écrire dans le buffer. OK. Merci, Louis-Boucher. Je suis vraiment désolé. Je suis un petit peu froid. OK. Donc, je vais revenir sur le code. Parce que nous avons préparé le report, mais nous avons mis 0 là-bas. Donc, il n'y a pas de modification de la position de notre couche. Donc, ici, nous allons juste dire à le buffer, par exemple. OK. On va check it before doing something. Let's just... I will stop debugging. Here, just in the main, we can just say, OK. Buffer 1, call 10. By doing this, it will move, oh, 100, this may be better. It will just move the mouse from this position each time it will pull the data. OK. To be proper, we should initialize all the other to 0, but OK by default, it should be OK. So compile, debug, and then add a call. And if I plug it somewhere in my PC, OK. Now, if I put my mouse in front of this, there, you can see if I push a button, my mouse just moves without any action from my parts. I mean, I just push a button and...