Ma première bibliothèque - Gestion du tactile

Étant absent sur le forum depuis un petit moment, je me sens obligé de publier ce que j'ai fait qui fait partie d'un projet que je tient à laisser secret tant que je ne l'ai pas fini.

Donc pendant ce temps, en plus de travailler sur ce projet, j'ai créé ma première bibliothèque.

Elle m'a donné du fil à retordre car j'ai évité de me baser beaucoup trop sur d'autres bibilothèques afin de réfléchir moi-même sur son fonctionnement, ce qui pourra aboutir à une bibilothèque pas assez optimisé.

J'ai VRAIMENT beaucoup de mal avec Github alors je vais tout simplement la publier ici :

Tactile.zip (2,8 Ko)

Elle est compacte car, si elle est utilisée, elle l'est plusieurs fois alors la moindre petite optimisation ou bug pourrait déplaire, donc j'ai tenu à la rendre plus légère.

J'ai aussi fait en sorte qu'elle soit compatible avec d'autre types de tactile pour plus tard avec les mises à jour.

J'espère qu'en tant que première bibliothèque Arduino / C++ elle vous plaît.

merci du partage

il y a au moins un bug à regarder de près :

vous devriez mémoriser la taille du tableauAppui_ptr dans une variable de votre instance. Sinon quand vous faites
sizeof(tableauAppui_ptr) / sizeof(tableauAppui_ptr[0])
pour calculer le nombre d'éléments vous aurez un résultat qui ne correspond pas à ce que vous attendez, sauf pour la valeur par défaut qui est 2.

en effet tableauAppui_ptr est un pointeur donc sizeof(tableauAppui_ptr) c'est la taille occupée par un pointeur (2 ou 4 octets suivant si vous êtes sur un Arduino 8bits ou 32bits) et pas la taille du tableau

➜ dans la fonction modifTailleTabAppuis() il faut donc enregistrer son paramètre et c'est cela que vous utiliserez partout où vous aviez le calcul avec sizeof.


sinon quelques petites remarques qui se veulent constructives


On préfèrera ce qu'on appelle un "initializer list" pour le constructeur. (cf Initialization Lists in C++ - Cprogramming.com))

le constructeur devient alors:

tactileResistif4Broches::tactileResistif4Broches(byte A, byte B, byte C, byte D) :
X1(A), X2(B), Y1(C), Y2(D) {
  modifTailleTabAppuis(0);
}

la fonction modifTailleTabAppuis() ne conserve pas les valeurs qui étaient dans le tableau s'il existait déjà. Je ne sais pas si c'est important ou pas.

Pour conserver le contenu et éviter le test pour faire free, vous pourriez utiliser realloc() au lieu de calloc() ce qui a pour effet d'optimiser la gestion du tas.

Et quand vous faites une comparaison, le résultat est une valeur de vérité donc pas la peine d'écrire

  return (tableauAppui_ptr == NULL ? false : true);

il suffit de faire

  return tableauAppui_ptr == nullptr ;

(et on préfère nullptr en C++)


la variable indicateur_nbr_tableauAppui n'a pas besoin d'être une variable d'instance. elle pourrait être juste une variable locale de la fonction actualiser()


la variable d'instance moyenne n'est jamais modifiée, autant en faire une constexpr qui serait static (variable de classe)


quand vous faites

digitalWrite(X1, LOW);		  //Désactivation de la résistance PULL-UP

Sur UNO ou MEGA effectivement quand vous passez une pin qui est en INPUT sur HIGH ou LOW, ça active ou désactive le pullup interne. Mais ce n'est pas garanti sur tous les µC et comme je vois dans le code un #ifdef __arm__ ça veut dire que vous voulez gérer autre chose que les AVR sans doute... sur ESP32 par exemple il y a la fonction esp_err_t gpio_pullup_dis(gpio_num_t gpio_num) pour désactiver un pullup (mais je crois que passer la pin en INPUT enlève le pullup aussi si je me souviens bien)


ce code

      //Vérification si l'on appuie au bon endroit :
      if ((Xmin != Xmax) and (Ymin != Ymax))
      {
        if ((Xmin < Xmax ? X < Xmin or X > Xmax : X > Xmin or X < Xmax)) tableauAppui_ptr[indicateur_nbr_tableauAppui] = false;
        if ((Ymin < Ymax ? Y < Ymin or Y > Ymax : Y > Ymin or Y < Ymax)) tableauAppui_ptr[indicateur_nbr_tableauAppui] = false;
      }

ne semble pas pertinent puisque vous n'affectez jamais les 4 variables Xmin, Xmax, Ymin et Ymax.


à quoi sert tactilePresse, il n'y a pas de fonction pour le lire ? c'est une variable public, on pourrait y accéder directement, mais ce n'est pas une très bonne pratique en Programmation objet

la boucle for

  tactilePresse = true;
  for (byte _i = 0; _i < moyenne; _i++)  tactilePresse = (tabAppuis[_i] == false ? false : tactilePresse);

semble retourner false dès qu'un tabAppuis est false. vous pourriez faire un break donc dès que vous avez rencontré un false, pas la peine de faire toute la boucle (même si pour le moment moyenne c'est 1 donc la boucle ne boucle pas vraiment)


j'ai lu en diagonale donc il doit y avoir d'autres trucs à clarifier

On teste plusieurs fois si le tactile est pressé donc si on perd un groupe de données, on réenregistre tout il me semble. Et au pire, avoir 1 fois une mauvais valeur, et qu'on sait quand on l'a, et qui se produit que quand on interragit avec la fonction, ce n'est pas du tout important.

Et si il suffit de changer une seule fonction c'est facile !
Mais c'est bon à prendre en compte !


La plupart des options sont facultatives. Elles permettent d'améliorer le post-traitement ou de faciliter le traitement des données.
C'est pourquoi je n'ai pas utilisé plus que ça l'"initializer list".


C'est vrai. Mais pourquoi retourner l'état du tactile (pressé/pas pressé) et pas les coordonnées ?

Au pire comme j'ai vu dans la librairie Adafruit TouchScreen en renvoie un objet mais cette technique n'est pas très compréhensible.

Mais je vais faire des fonctions pour obtenir les valeurs, puisque que c'est une sorte de norme.


ENCORE UN PROBLEME DE COMPABILITE ? :worried:
Je ne sais pas trop comment le résoudre car s'il faut voir pour tous les µc c'est assez embêtant.

Merci encore pour ce retour, c'est parfait !

pas vraiment
passer à HIGH une pin qui est en INPUT pour activer son pullup est un hack. quand on veut mettre une pin en pullup, on utilise INPUT_PULLUP par exemple et pas le hack.

c'était plus une question sur l'usage que vous comptez en faire. votre idée donc était de lire les variables directement ?

l'idée donc c'est que l'utilisateur affecte ces variables "à la main" en les adressant directement ?

OK c'était juste une question, en fait.

je n'ai pas lu en détail, comme il semble que vous pouvez manipuler les variables d'instances à la main depuis l'extérieur de la classe, c'est difficile de savoir ce qui est fixe et ce qui ne l'est pas.

Oui.
donc tactile.Xmin = 45;
ou tactile.parametrer(Xmin,45);
ou encore tactile.parametrerXmin(45);

Vous importe tant ?
Après je comprends que ce soit une norme donc aucun problème !

ça ne me trouble pas beaucoup car il n'ya pas vraiment d'effets de bord dans votre cas

L'avantage de passer par une fonction c'est que vous pouvez rajouter des garde-fous (test de cohérence) ou faire le traitement qui s'impose (comme par exemple ce que vous avez pour modifTailleTabAppuis() ➜ il faut faire le realloc ou le free/calloc et mémoriser la nouvelle taille.)

en rajoutant la fonction, vous vous laissez le choix de faire ce qu'il faut au sein de "la boîte noire" qu'est votre classe, l'utilisateur de la bibliothèque n'a pas à se soucier de comment ça fonctionne.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.