version qui corrige tous les beugs

Dependents:   Projet_client_serveur EX5 ex10 ex11 ... more

Committer:
slowness
Date:
Tue Nov 08 02:05:57 2016 +0000
Revision:
2:ba3449b7e070
Parent:
1:663cbe5baac4
Child:
4:a9e51ac904e2
corrige tous les probl?mes du LCD

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gr66 0:cd0f9e8c609b 1 #include "IHM.h"
gr66 0:cd0f9e8c609b 2 #include "all_includes.h"
gr66 0:cd0f9e8c609b 3 #include <stdarg.h> // Pour va_list ... dans IHM_printf
gr66 0:cd0f9e8c609b 4 #include <stdio.h> // Pour vprintf et setprintf
gr66 0:cd0f9e8c609b 5 #define CAN_REMOTE CANType(2)
gr66 0:cd0f9e8c609b 6 //
gr66 0:cd0f9e8c609b 7
gr66 0:cd0f9e8c609b 8 IHM::IHM(PinName CANRx, PinName CANTx): can(CANRx,CANTx)
gr66 0:cd0f9e8c609b 9 {
gr66 0:cd0f9e8c609b 10 can.frequency(1000000); /*Baud rate : kbits/s */
gr66 0:cd0f9e8c609b 11 can.attach(this,&IHM::can_ISR_Reader); /* Fonction d'interruption CAN*/
gr66 0:cd0f9e8c609b 12 }
gr66 0:cd0f9e8c609b 13 void IHM::LCD_printf(const char* format, ...)
gr66 0:cd0f9e8c609b 14 {
slowness 2:ba3449b7e070 15 unsigned char i,j;
gr66 0:cd0f9e8c609b 16 va_list arg;
gr66 0:cd0f9e8c609b 17 va_start(arg,format);
slowness 2:ba3449b7e070 18 vsprintf(tableau_ecran+curseur,format,arg);
slowness 2:ba3449b7e070 19 // IHM_vprintf(format,arg);
gr66 0:cd0f9e8c609b 20 va_end(arg);
slowness 2:ba3449b7e070 21 for(i=0; i<32;i++)
slowness 2:ba3449b7e070 22 {
slowness 2:ba3449b7e070 23 if(tableau_ecran[i]==0)
slowness 2:ba3449b7e070 24 tableau_ecran[i]=20;
slowness 2:ba3449b7e070 25 }
slowness 2:ba3449b7e070 26 for(j=0; j<4; j++) {
slowness 2:ba3449b7e070 27 trame_Tx.id=LCD_CHAR0+j;
slowness 2:ba3449b7e070 28 trame_Tx.type=CANData;
slowness 2:ba3449b7e070 29 trame_Tx.len=8;
slowness 2:ba3449b7e070 30 for(i=0; i<8; i++)
slowness 2:ba3449b7e070 31 trame_Tx.data[i]=tableau_ecran[i+j*8];
slowness 2:ba3449b7e070 32 while(!can.write(trame_Tx));
slowness 2:ba3449b7e070 33 wait_us(150);
slowness 2:ba3449b7e070 34 }
gr66 0:cd0f9e8c609b 35 }
gr66 0:cd0f9e8c609b 36 unsigned char JOG_valeur,mise_a_jour_JOG=0,mise_a_jour_COD=0;
gr66 0:cd0f9e8c609b 37 void IHM::can_ISR_Reader(void)
gr66 0:cd0f9e8c609b 38 {
gr66 0:cd0f9e8c609b 39 if (can.read(can_MsgRx[FIFO_ecriture])) {
gr66 0:cd0f9e8c609b 40 // FIFO gestion
gr66 0:cd0f9e8c609b 41 FIFO_ecriture=(FIFO_ecriture+1)%SIZE_FIFO;
gr66 0:cd0f9e8c609b 42 // myled[0] = !myled[0];
gr66 0:cd0f9e8c609b 43 // ledC= !ledC;
gr66 0:cd0f9e8c609b 44 }
gr66 0:cd0f9e8c609b 45 }
gr66 0:cd0f9e8c609b 46 void IHM::CAN_automate_reception(void)
gr66 0:cd0f9e8c609b 47 {
gr66 0:cd0f9e8c609b 48 static signed char FIFO_lecture=0,FIFO_occupation=0,FIFO_max_occupation=0;
gr66 0:cd0f9e8c609b 49 FIFO_occupation=FIFO_ecriture-FIFO_lecture;
gr66 0:cd0f9e8c609b 50 if(FIFO_occupation<0)
gr66 0:cd0f9e8c609b 51 FIFO_occupation=FIFO_occupation+SIZE_FIFO;
gr66 0:cd0f9e8c609b 52 if(FIFO_max_occupation<FIFO_occupation)
gr66 0:cd0f9e8c609b 53 FIFO_max_occupation=FIFO_occupation;
gr66 0:cd0f9e8c609b 54 if(FIFO_occupation>SIZE_FIFO)
gr66 0:cd0f9e8c609b 55 while(!can.write(CANMessage(LCD_OVERFLOW,CANStandard)));
gr66 0:cd0f9e8c609b 56 if(FIFO_occupation!=0) {
gr66 0:cd0f9e8c609b 57 switch(can_MsgRx[FIFO_lecture].id) {
gr66 0:cd0f9e8c609b 58 case JOG_DATA:
gr66 0:cd0f9e8c609b 59 JOG_valeur=can_MsgRx[FIFO_lecture].data[0];
gr66 0:cd0f9e8c609b 60 mise_a_jour_JOG=1;
gr66 0:cd0f9e8c609b 61 break;
gr66 0:cd0f9e8c609b 62 case COD_DATA:
gr66 0:cd0f9e8c609b 63 COD_valeur=can_MsgRx[FIFO_lecture].data[0];
gr66 0:cd0f9e8c609b 64 mise_a_jour_COD=1;
gr66 0:cd0f9e8c609b 65 break;
gr66 0:cd0f9e8c609b 66 default:
gr66 0:cd0f9e8c609b 67 break;
gr66 0:cd0f9e8c609b 68 }
gr66 0:cd0f9e8c609b 69 FIFO_lecture=(FIFO_lecture+1)%SIZE_FIFO;
gr66 0:cd0f9e8c609b 70 }
gr66 0:cd0f9e8c609b 71 }
gr66 0:cd0f9e8c609b 72 /* FILE: IHM.c */
gr66 0:cd0f9e8c609b 73 /****************************************************************************************/
gr66 0:cd0f9e8c609b 74 /* MODULE NAME: IHM 16x2 */
gr66 0:cd0f9e8c609b 75 /* */
gr66 0:cd0f9e8c609b 76 /* AUTHOR : Jacques-Olivier KLEIN */
gr66 0:cd0f9e8c609b 77 /* Bruno LARNAUDIE */
gr66 0:cd0f9e8c609b 78 /* */
gr66 0:cd0f9e8c609b 79 /* EMAIL : jacques-olivier.klein@u-psud.fr */
gr66 0:cd0f9e8c609b 80 /* bruno.larnaudie@u-psud.fr */
gr66 0:cd0f9e8c609b 81 /* */
gr66 0:cd0f9e8c609b 82 /* INSTITUTION: IUT de CACHAN - 9 av. de la div. Leclerc - 94230 CACHAN */
gr66 0:cd0f9e8c609b 83 /* */
gr66 0:cd0f9e8c609b 84 /* DATE : 12/07/2012 */
gr66 0:cd0f9e8c609b 85 /* CPU : FREESCALE MC9S12XS128MAA */
gr66 0:cd0f9e8c609b 86 /* BOARD : CACHAN Xboard + IHM16x2 */
gr66 0:cd0f9e8c609b 87 /* OS : None */
gr66 0:cd0f9e8c609b 88 /* */
gr66 0:cd0f9e8c609b 89 /* DESCRIPTION: Fonctions d'accès au Lcd émulé passant par le bus CAN */
gr66 0:cd0f9e8c609b 90 /****************************************************************************************/
gr66 0:cd0f9e8c609b 91
gr66 0:cd0f9e8c609b 92
gr66 0:cd0f9e8c609b 93 /****************************************************************************************/
gr66 0:cd0f9e8c609b 94 /* FUNCTION NAME: IHM_init */
gr66 0:cd0f9e8c609b 95 /* DESCRIPTION : Initialise l'afficheur IHM */
gr66 0:cd0f9e8c609b 96 /* RETURN : VOID */
gr66 0:cd0f9e8c609b 97 /****************************************************************************************/
gr66 0:cd0f9e8c609b 98
gr66 0:cd0f9e8c609b 99
gr66 0:cd0f9e8c609b 100
gr66 0:cd0f9e8c609b 101 /****************************************************************************************/
gr66 0:cd0f9e8c609b 102 /* FUNCTION NAME: IHM_gotoxy */
gr66 0:cd0f9e8c609b 103 /* DESCRIPTION : Modifie la position du curseur sur l'afficheur LCD de la carte IHM */
gr66 0:cd0f9e8c609b 104 /* RETURN : VOID */
gr66 0:cd0f9e8c609b 105 /* PARAMETER 1 : UINT8 x : indice de la ligne (0 à 1) */
gr66 0:cd0f9e8c609b 106 /* PARAMETER 2 : UINT8 y : indice de la colonne (0 à 15) */
gr66 0:cd0f9e8c609b 107 /****************************************************************************************/
gr66 1:663cbe5baac4 108 void IHM::LCD_gotoxy (UINT8 y, UINT8 x)
gr66 0:cd0f9e8c609b 109 {
gr66 1:663cbe5baac4 110 curseur=(y*16+x)%32;
gr66 0:cd0f9e8c609b 111 }
gr66 0:cd0f9e8c609b 112
gr66 0:cd0f9e8c609b 113
gr66 0:cd0f9e8c609b 114
gr66 0:cd0f9e8c609b 115 /****************************************************************************************/
gr66 0:cd0f9e8c609b 116 /* FUNCTION NAME: IHM_clear */
gr66 0:cd0f9e8c609b 117 /* DESCRIPTION : Efface le LCD */
gr66 0:cd0f9e8c609b 118 /* RETURN : VOID */
gr66 0:cd0f9e8c609b 119 /****************************************************************************************/
gr66 0:cd0f9e8c609b 120 void IHM::LCD_clear(void)
gr66 0:cd0f9e8c609b 121 {
gr66 0:cd0f9e8c609b 122 UINT8 i;
gr66 0:cd0f9e8c609b 123 curseur=0;
gr66 0:cd0f9e8c609b 124 for(i=0; i<32; i++)
gr66 0:cd0f9e8c609b 125 tableau_ecran[i]=32;
gr66 0:cd0f9e8c609b 126 while(!can.write(CANMessage(LCD_CLEAR,CANStandard)));
gr66 0:cd0f9e8c609b 127 wait_us(150);
gr66 0:cd0f9e8c609b 128 }
gr66 0:cd0f9e8c609b 129 /****************************************************************************************/
gr66 0:cd0f9e8c609b 130 /* FUNCTION NAME: BAR_set */
gr66 0:cd0f9e8c609b 131 /* DESCRIPTION : commande les 10 LED du bargraph */
gr66 0:cd0f9e8c609b 132 /* PARAMETER 1 : UINT16 valeur : ordre d'allumage, exprimé sur les 10 bits de droite.
gr66 0:cd0f9e8c609b 133 Le bit k doit valoir 0 pour allumer la LED k, 1 pour l'éteindre.
gr66 0:cd0f9e8c609b 134 Exemple : ~(1<<9) allume la LED 9, ~0x00F allume les 4 LED 0 à 3 */
gr66 0:cd0f9e8c609b 135 /****************************************************************************************/
gr66 0:cd0f9e8c609b 136 void IHM::BAR_set(UINT16 valeur)
gr66 0:cd0f9e8c609b 137 {
gr66 0:cd0f9e8c609b 138 trame_Tx.id=BAR_SET;
gr66 0:cd0f9e8c609b 139 trame_Tx.type=CANData;
gr66 0:cd0f9e8c609b 140 trame_Tx.len=2;
gr66 0:cd0f9e8c609b 141 trame_Tx.data[0]=valeur>>8;
gr66 0:cd0f9e8c609b 142 trame_Tx.data[1]=(UINT8)valeur;
gr66 0:cd0f9e8c609b 143 while(!can.write(trame_Tx));
gr66 0:cd0f9e8c609b 144 }
gr66 0:cd0f9e8c609b 145
gr66 0:cd0f9e8c609b 146
gr66 0:cd0f9e8c609b 147 /****************************************************************************************/
gr66 0:cd0f9e8c609b 148 /* FUNCTION NAME: JOG_read */
gr66 0:cd0f9e8c609b 149 /* DESCRIPTION : indique la position (parmi les 8 possibles) et l'enfoncement du Jog. */
gr66 0:cd0f9e8c609b 150 /* RETURN : un octet UINT8 qui indique la position (RIGHT, LEFT, UP, DOWN + 4 combinaisons)
gr66 0:cd0f9e8c609b 151 et l'enfoncement (PUSH) du Jog, exprimés sur 5 bits utiles.*/
gr66 0:cd0f9e8c609b 152
gr66 0:cd0f9e8c609b 153 /* - Si le Jog est au repos : la fonction renvoie 0 (0x00).
gr66 0:cd0f9e8c609b 154 - si le Jog n'est pas au repos : 1 à 3 bits peuvent être mis à 1 dans l'octet renvoyé.
gr66 0:cd0f9e8c609b 155 Il est intéressant d'utiliser les masques définis en constantes.
gr66 0:cd0f9e8c609b 156 La signification des 8 bits de la valeur renvoyée est:
gr66 0:cd0f9e8c609b 157 0 0 0 RIGHT UP PUSH LEFT DOWN
gr66 0:cd0f9e8c609b 158 Plusieurs bits peuvent être à 1 en même temps. Par exemple : RIGHT + UP + PUSH
gr66 0:cd0f9e8c609b 159 à 1 indiquent que le Jog est en position "Nord Est " (UP+RIGHT) et qu'il est enfoncé.
gr66 0:cd0f9e8c609b 160 Si le Jog est simultanément enfoncé et positionné à droite, la fonction renvoie
gr66 0:cd0f9e8c609b 161 (0001 0100) en binaire, soit 0x14. Exprimée avec les masques, la valeur renvoyée vaut
gr66 0:cd0f9e8c609b 162 JOG_MSK_RIGHT | JOG_MSK_PUSH (0x14). */
gr66 0:cd0f9e8c609b 163 /**************************************************************************************************/
gr66 0:cd0f9e8c609b 164 /**************************************************************************************************/
gr66 0:cd0f9e8c609b 165 /* utiliser les Constantes symboliques de IHM.h pour interpréter la valeur renvoyée par le jog... */
gr66 0:cd0f9e8c609b 166 /**************************************************************************************************/
gr66 0:cd0f9e8c609b 167
gr66 0:cd0f9e8c609b 168 UINT8 IHM::JOG_read(void)
gr66 0:cd0f9e8c609b 169 {
gr66 0:cd0f9e8c609b 170 trame_Tx.id=JOG_REQ;
gr66 0:cd0f9e8c609b 171 trame_Tx.type=CAN_REMOTE;
gr66 0:cd0f9e8c609b 172 while(!can.write(trame_Tx));
gr66 0:cd0f9e8c609b 173
gr66 0:cd0f9e8c609b 174 while(mise_a_jour_JOG==0)
gr66 0:cd0f9e8c609b 175 CAN_automate_reception();
gr66 0:cd0f9e8c609b 176 mise_a_jour_JOG=0;
gr66 0:cd0f9e8c609b 177 return JOG_valeur;
gr66 0:cd0f9e8c609b 178
gr66 0:cd0f9e8c609b 179 }
gr66 0:cd0f9e8c609b 180
gr66 0:cd0f9e8c609b 181
gr66 0:cd0f9e8c609b 182 /***************************************************************************************************/
gr66 0:cd0f9e8c609b 183 /* FUNCTION NAME: COD_read */
gr66 0:cd0f9e8c609b 184 /* DESCRIPTION : indique la rotation effectuée par le codeur incrémental. */
gr66 0:cd0f9e8c609b 185 /* RETURN : un octet UINT8 dont la valeur entre 0 et 255 indique la rotation du
gr66 0:cd0f9e8c609b 186 codeur incrémental depuis l'initialisation du codeur (cad de la carte IHM),
gr66 0:cd0f9e8c609b 187 exprimée en douzièmes de tours. Le codeur dispose en effet de 12 positions
gr66 0:cd0f9e8c609b 188 et la valeur retournée s'incrémente/se décrémente à chaque 12e de tour.
gr66 0:cd0f9e8c609b 189 Par exemple, si le codeur a été tourné de 2 tours et demi, la valeur
gr66 0:cd0f9e8c609b 190 retournée vaut 12+12+6 = 30 = 0x1E (le codeur a effectué 30 douzièmes de tour) */
gr66 0:cd0f9e8c609b 191 /***************************************************************************************************/
gr66 0:cd0f9e8c609b 192
gr66 0:cd0f9e8c609b 193 UINT8 IHM::COD_read(void)
gr66 0:cd0f9e8c609b 194 {
gr66 0:cd0f9e8c609b 195 trame_Tx.id=COD_REQ;
gr66 0:cd0f9e8c609b 196 trame_Tx.type=CAN_REMOTE;
gr66 0:cd0f9e8c609b 197 while(!can.write(trame_Tx));
gr66 0:cd0f9e8c609b 198
gr66 0:cd0f9e8c609b 199 // while(!can.write(CANMessage(COD_REQ,CANStandard)));
gr66 0:cd0f9e8c609b 200 while(mise_a_jour_COD==0)
gr66 0:cd0f9e8c609b 201 CAN_automate_reception();
gr66 0:cd0f9e8c609b 202 mise_a_jour_COD=0;
gr66 0:cd0f9e8c609b 203 return COD_valeur;
gr66 0:cd0f9e8c609b 204
gr66 0:cd0f9e8c609b 205 }
gr66 0:cd0f9e8c609b 206