Main

Référence : Langage Arduino : [ Mini | Standard | Etendue | Maxi ] Librairies : [ Vue d'ensemble | Synthèse ] Infos : [ Comparaison | Changements ]
LibrairieMI0283QT2Afficheur | LibrairieMI0283QTTouchpad

uint8_t setCalibration(CAL_POINT *lcd, CAL_POINT *touchpad)


Description

Cette fonction calcule les données de calibration du touchpad en faisant correspondre les valeurs X,Y du lcd et les valeurs X,Y du touchpad obtenues à l'aide des points de calibration par les fonctions getXraw() et getYraw(). Renvoie 0 en cas d'erreur.

Syntaxe

touchpad.setCalibration(lcd_points, touchpad_points);

Paramètres

  • touchpad : un objet touchpad ADS7846
  • lcd_points : Coordonnées des points de calibration de l'afficheur.
  • touchpad_points : Coordonnées des points de calibration issues du touchpad (ADS7846)

A noter : CAL_POINT est un type interne à la librairie correspondant à une structure de 2 long

Exemple


//---- fonction de calibration du touchpad
void touchpad_calibration(void) {

  int i; // variable locale utilisée par la fonction

  // crée un tableau des 3 points de calibration pour le LCD
  // le type CAL_POINT est une structure de 2 long x et y
  // les valeurs CAL_POINT_X1, CAL_POINT_Y1, etc... sont préfinies cf ADS7846.h
  CAL_POINT lcd_points[3] = {{CAL_POINT_X1,CAL_POINT_Y1},
                             {CAL_POINT_X2,CAL_POINT_Y2},
                            {CAL_POINT_X3,CAL_POINT_Y3}};

 // crée un tableau de 3 points de calibration pour le touchpad
 CAL_POINT touchpad_points[3], *p;

  // si des données de calibration existent déjà, sort de la fonction de calibration
  // ceci évite de calibrer à chaque fois, mais uniquement au premier lancement programme
/*  if(touchpad.readCalibration(TOUCHPAD_EEPROMADDR)) {
    return;
  }
*/


  // répète tant que pas prise en compte de 3 appuis - 1 appui pour chaque point de calibration
  i = 0;
  do {

    //affiche le point de calibration pour la valeur de i (affiche 3 cercles)
    lcd.drawCircle(lcd_points[i].x, lcd_points[i].y, 1, RGB(0,0,255)); // mini cercle bleu au point de calibration courant
    lcd.drawCircle(lcd_points[i].x, lcd_points[i].y, 4, RGB(0,255,0)); // petit cercle vert centré sur point calibration courant
    lcd.drawCircle(lcd_points[i].x, lcd_points[i].y, 8, RGB(255,0,0));// cercle rouge centré sur point calibration courant

    touchpad.service(); // lance la fonction de service du touchpad
    // acquisition des coordonnées x,y et pressure si appui - modif des variables public

    if(touchpad.getPressure() > 5) { // si la pression sur le touchpad supérieure à 5 = si un appui a eu lieu
      touchpad_points[i].x = touchpad.getXraw(); // mémorise la valeur X renvoyée par le touchpad non calibré
      touchpad_points[i].y = touchpad.getYraw(); // mémorise la valeur Y renvoyée par le touchpad non calibré
      i++; // incrémente i seulement si un appui a eu lieu.. l'appel de service se fait en boucle si pas appui
      lcd.clear(RGB(255,255,255)); // efface l'écran en blanc entre chaque point de calibration
    } // fin if getPressure() > 5

  }while(i<3); // répète lecture touchpad tant que pas 3 appuis - 1 pour chaque point de calibration

  //calcule la calibration du touchpad en faisant correspondre les valeurs X,Y du lcd
  // et les valeurs X,Y du touchpad obtenues à l'aide des points de calibration
  touchpad.setCalibration(lcd_points, touchpad_points);

  // enregistre en eeprom la matrice des valeurs de calibration du touchpad
  // la calibration est mémorisée meme après mise hors tension de la carte Arduino
  touchpad.writeCalibration(TOUCHPAD_EEPROMADDR);

} //------------------- fin fonction calibration touchpad -------------

 

Source de la fonction


uint8_t ADS7846::setCalibration(CAL_POINT *lcd, CAL_POINT *tp)

{

  tp_matrix.div = ((tp[0].x - tp[2].x) * (tp[1].y - tp[2].y)) -

                  ((tp[1].x - tp[2].x) * (tp[0].y - tp[2].y));



  if(tp_matrix.div == 0)

  {

    return 0;

  }



  tp_matrix.a = ((lcd[0].x - lcd[2].x) * (tp[1].y - tp[2].y)) -

                ((lcd[1].x - lcd[2].x) * (tp[0].y - tp[2].y));



  tp_matrix.b = ((tp[0].x - tp[2].x) * (lcd[1].x - lcd[2].x)) -

                ((lcd[0].x - lcd[2].x) * (tp[1].x - tp[2].x));



  tp_matrix.c = (tp[2].x * lcd[1].x - tp[1].x * lcd[2].x) * tp[0].y +

                (tp[0].x * lcd[2].x - tp[2].x * lcd[0].x) * tp[1].y +

                (tp[1].x * lcd[0].x - tp[0].x * lcd[1].x) * tp[2].y;



  tp_matrix.d = ((lcd[0].y - lcd[2].y) * (tp[1].y - tp[2].y)) -

                ((lcd[1].y - lcd[2].y) * (tp[0].y - tp[2].y));



  tp_matrix.e = ((tp[0].x - tp[2].x) * (lcd[1].y - lcd[2].y)) -

                ((lcd[0].y - lcd[2].y) * (tp[1].x - tp[2].x));



  tp_matrix.f = (tp[2].x * lcd[1].y - tp[1].x * lcd[2].y) * tp[0].y +

                (tp[0].x * lcd[2].y - tp[2].x * lcd[0].y) * tp[1].y +

                (tp[1].x * lcd[0].y - tp[0].x * lcd[1].y) * tp[2].y;



  return 1;

}
 

Pour mémoire, voici la définition du type CAL_POINT :


typedef struct

{

        long x;

        long y;

} CAL_POINT;
 

Commentaires utilisateurs

Aucun commentaire


Page d'accueil de la référence Arduino en français

Corrections, suggestions et nouvelle documentation peuvent être postées sur le Forum Arduino ou à l'adresse suivante : support_at_mon-club-elec_point_fr

Le texte original de la référence Arduino est sous licence Creative Commons Attribution-ShareAlike 3.0 . Les exemples de code dans la référence sont dans le domaine public.

La présente traduction française commentée a été réalisée par Xavier HINAULT (2010-2012) (www.mon-club-elec.fr) et est sous licence Creative Commons Attribution-ShareAlike 3.0.

Cette page est une création originale de X. HINAULT