version qui corrige tous les beugs

Dependents:   Projet_client_serveur EX5 ex10 ex11 ... more

Committer:
gr66
Date:
Sat Nov 05 17:19:59 2016 +0000
Revision:
1:663cbe5baac4
Parent:
0:cd0f9e8c609b
Child:
2:ba3449b7e070
V00

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
gr66 0:cd0f9e8c609b 9 IHM::IHM(PinName CANRx, PinName CANTx): can(CANRx,CANTx)
gr66 0:cd0f9e8c609b 10 {
gr66 0:cd0f9e8c609b 11 can.frequency(1000000); /*Baud rate : kbits/s */
gr66 0:cd0f9e8c609b 12 can.attach(this,&IHM::can_ISR_Reader); /* Fonction d'interruption CAN*/
gr66 0:cd0f9e8c609b 13 }
gr66 0:cd0f9e8c609b 14 void IHM::LCD_printf(const char* format, ...)
gr66 0:cd0f9e8c609b 15 {
gr66 0:cd0f9e8c609b 16 va_list arg;
gr66 0:cd0f9e8c609b 17 va_start(arg,format);
gr66 0:cd0f9e8c609b 18 IHM_vprintf(format,arg);
gr66 0:cd0f9e8c609b 19 va_end(arg);
gr66 0:cd0f9e8c609b 20 }
gr66 0:cd0f9e8c609b 21 unsigned char JOG_valeur,mise_a_jour_JOG=0,mise_a_jour_COD=0;
gr66 0:cd0f9e8c609b 22 void IHM::can_ISR_Reader(void)
gr66 0:cd0f9e8c609b 23 {
gr66 0:cd0f9e8c609b 24 if (can.read(can_MsgRx[FIFO_ecriture])) {
gr66 0:cd0f9e8c609b 25 // FIFO gestion
gr66 0:cd0f9e8c609b 26 FIFO_ecriture=(FIFO_ecriture+1)%SIZE_FIFO;
gr66 0:cd0f9e8c609b 27 // myled[0] = !myled[0];
gr66 0:cd0f9e8c609b 28 // ledC= !ledC;
gr66 0:cd0f9e8c609b 29 }
gr66 0:cd0f9e8c609b 30 }
gr66 0:cd0f9e8c609b 31 void IHM::CAN_automate_reception(void)
gr66 0:cd0f9e8c609b 32 {
gr66 0:cd0f9e8c609b 33 static signed char FIFO_lecture=0,FIFO_occupation=0,FIFO_max_occupation=0;
gr66 0:cd0f9e8c609b 34 FIFO_occupation=FIFO_ecriture-FIFO_lecture;
gr66 0:cd0f9e8c609b 35 if(FIFO_occupation<0)
gr66 0:cd0f9e8c609b 36 FIFO_occupation=FIFO_occupation+SIZE_FIFO;
gr66 0:cd0f9e8c609b 37 if(FIFO_max_occupation<FIFO_occupation)
gr66 0:cd0f9e8c609b 38 FIFO_max_occupation=FIFO_occupation;
gr66 0:cd0f9e8c609b 39 if(FIFO_occupation>SIZE_FIFO)
gr66 0:cd0f9e8c609b 40 while(!can.write(CANMessage(LCD_OVERFLOW,CANStandard)));
gr66 0:cd0f9e8c609b 41 if(FIFO_occupation!=0) {
gr66 0:cd0f9e8c609b 42 switch(can_MsgRx[FIFO_lecture].id) {
gr66 0:cd0f9e8c609b 43 case JOG_DATA:
gr66 0:cd0f9e8c609b 44 JOG_valeur=can_MsgRx[FIFO_lecture].data[0];
gr66 0:cd0f9e8c609b 45 mise_a_jour_JOG=1;
gr66 0:cd0f9e8c609b 46 break;
gr66 0:cd0f9e8c609b 47 case COD_DATA:
gr66 0:cd0f9e8c609b 48 COD_valeur=can_MsgRx[FIFO_lecture].data[0];
gr66 0:cd0f9e8c609b 49 mise_a_jour_COD=1;
gr66 0:cd0f9e8c609b 50 break;
gr66 0:cd0f9e8c609b 51 default:
gr66 0:cd0f9e8c609b 52 break;
gr66 0:cd0f9e8c609b 53 }
gr66 0:cd0f9e8c609b 54 FIFO_lecture=(FIFO_lecture+1)%SIZE_FIFO;
gr66 0:cd0f9e8c609b 55 }
gr66 0:cd0f9e8c609b 56 }
gr66 0:cd0f9e8c609b 57 /* FILE: IHM.c */
gr66 0:cd0f9e8c609b 58 /****************************************************************************************/
gr66 0:cd0f9e8c609b 59 /* MODULE NAME: IHM 16x2 */
gr66 0:cd0f9e8c609b 60 /* */
gr66 0:cd0f9e8c609b 61 /* AUTHOR : Jacques-Olivier KLEIN */
gr66 0:cd0f9e8c609b 62 /* Bruno LARNAUDIE */
gr66 0:cd0f9e8c609b 63 /* */
gr66 0:cd0f9e8c609b 64 /* EMAIL : jacques-olivier.klein@u-psud.fr */
gr66 0:cd0f9e8c609b 65 /* bruno.larnaudie@u-psud.fr */
gr66 0:cd0f9e8c609b 66 /* */
gr66 0:cd0f9e8c609b 67 /* INSTITUTION: IUT de CACHAN - 9 av. de la div. Leclerc - 94230 CACHAN */
gr66 0:cd0f9e8c609b 68 /* */
gr66 0:cd0f9e8c609b 69 /* DATE : 12/07/2012 */
gr66 0:cd0f9e8c609b 70 /* CPU : FREESCALE MC9S12XS128MAA */
gr66 0:cd0f9e8c609b 71 /* BOARD : CACHAN Xboard + IHM16x2 */
gr66 0:cd0f9e8c609b 72 /* OS : None */
gr66 0:cd0f9e8c609b 73 /* */
gr66 0:cd0f9e8c609b 74 /* DESCRIPTION: Fonctions d'accès au Lcd émulé passant par le bus CAN */
gr66 0:cd0f9e8c609b 75 /****************************************************************************************/
gr66 0:cd0f9e8c609b 76
gr66 0:cd0f9e8c609b 77
gr66 0:cd0f9e8c609b 78 /****************************************************************************************/
gr66 0:cd0f9e8c609b 79 /* FUNCTION NAME: IHM_init */
gr66 0:cd0f9e8c609b 80 /* DESCRIPTION : Initialise l'afficheur IHM */
gr66 0:cd0f9e8c609b 81 /* RETURN : VOID */
gr66 0:cd0f9e8c609b 82 /****************************************************************************************/
gr66 0:cd0f9e8c609b 83
gr66 0:cd0f9e8c609b 84
gr66 0:cd0f9e8c609b 85
gr66 0:cd0f9e8c609b 86 /****************************************************************************************/
gr66 0:cd0f9e8c609b 87 /* FUNCTION NAME: IHM_gotoxy */
gr66 0:cd0f9e8c609b 88 /* DESCRIPTION : Modifie la position du curseur sur l'afficheur LCD de la carte IHM */
gr66 0:cd0f9e8c609b 89 /* RETURN : VOID */
gr66 0:cd0f9e8c609b 90 /* PARAMETER 1 : UINT8 x : indice de la ligne (0 à 1) */
gr66 0:cd0f9e8c609b 91 /* PARAMETER 2 : UINT8 y : indice de la colonne (0 à 15) */
gr66 0:cd0f9e8c609b 92 /****************************************************************************************/
gr66 1:663cbe5baac4 93 void IHM::LCD_gotoxy (UINT8 y, UINT8 x)
gr66 0:cd0f9e8c609b 94 {
gr66 1:663cbe5baac4 95 curseur=(y*16+x)%32;
gr66 0:cd0f9e8c609b 96 }
gr66 0:cd0f9e8c609b 97
gr66 0:cd0f9e8c609b 98
gr66 0:cd0f9e8c609b 99 /****************************************************************************************/
gr66 0:cd0f9e8c609b 100 /* FUNCTION NAME: IHM_sendchar */
gr66 0:cd0f9e8c609b 101 /* DESCRIPTION : Envoie un caractere à afficher au controleur de l'afficheur LCD */
gr66 0:cd0f9e8c609b 102 /* RETURN : VOID */
gr66 0:cd0f9e8c609b 103 /* PARAMETER 1 : char data : caractère à afficher */
gr66 0:cd0f9e8c609b 104 /****************************************************************************************/
gr66 0:cd0f9e8c609b 105 void IHM::IHM_sendchar (char data)
gr66 0:cd0f9e8c609b 106 {
gr66 0:cd0f9e8c609b 107 tableau_ecran[curseur]=data;
gr66 0:cd0f9e8c609b 108 curseur=(curseur+1)%32;
gr66 0:cd0f9e8c609b 109 }
gr66 0:cd0f9e8c609b 110
gr66 0:cd0f9e8c609b 111
gr66 0:cd0f9e8c609b 112 /****************************************************************************************/
gr66 0:cd0f9e8c609b 113 /* FUNCTION NAME: IHM_printf */
gr66 0:cd0f9e8c609b 114 /* DESCRIPTION : Affichage formaté de type "printf" sur un afficheur LCD */
gr66 0:cd0f9e8c609b 115 /* RETURN : VOID */
gr66 0:cd0f9e8c609b 116 /* PARAMETER 1 : char* format : format d'affichage de printf */
gr66 0:cd0f9e8c609b 117 /* PARAMETER 2 : ... : parametres à afficher */
gr66 0:cd0f9e8c609b 118 /* Attention : le nouvel affichage doit recouvrir le précédent. */
gr66 0:cd0f9e8c609b 119 /*********************** NOTE concernant la commande IHM_printf *************************/
gr66 0:cd0f9e8c609b 120 /* Les appels melangés à printf, LCD_printf et IHM_printf peuvent donner des resutlats */
gr66 0:cd0f9e8c609b 121 /* imprevisibles */
gr66 0:cd0f9e8c609b 122 /* */
gr66 0:cd0f9e8c609b 123 /* L'IHM doit etre initialise par la fonction IHM_init */
gr66 0:cd0f9e8c609b 124 /****************************************************************************************/
gr66 0:cd0f9e8c609b 125 void IHM::IHM_printf(const char* format, ...)
gr66 0:cd0f9e8c609b 126 {
gr66 0:cd0f9e8c609b 127 //oldcurseur=curseur;
gr66 0:cd0f9e8c609b 128 unsigned char i,j;
gr66 0:cd0f9e8c609b 129 va_list args;
gr66 0:cd0f9e8c609b 130 //sprintf(
gr66 0:cd0f9e8c609b 131 //set_printf(IHM_sendchar); /* Placement des datas dans le tableau */
gr66 0:cd0f9e8c609b 132 //vputc(IHM_sendchar);
gr66 0:cd0f9e8c609b 133 va_start(args, format);
gr66 0:cd0f9e8c609b 134 vsprintf(tableau_ecran+curseur,format, args);
gr66 0:cd0f9e8c609b 135 va_end(args);
gr66 0:cd0f9e8c609b 136 // envoi sur le bus can du tableau complet de l'ecran
gr66 0:cd0f9e8c609b 137 for(j=0; j<4; j++) {
gr66 0:cd0f9e8c609b 138 trame_Tx.id=LCD_CHAR0+j;
gr66 0:cd0f9e8c609b 139 trame_Tx.type=CANData;
gr66 0:cd0f9e8c609b 140 trame_Tx.len=8;
gr66 0:cd0f9e8c609b 141 for(i=0; i<8; i++)
gr66 0:cd0f9e8c609b 142 trame_Tx.data[i]=tableau_ecran[i+j*8];
gr66 0:cd0f9e8c609b 143 while(!can.write(trame_Tx));
gr66 0:cd0f9e8c609b 144 wait_us(150);
gr66 0:cd0f9e8c609b 145 }
gr66 0:cd0f9e8c609b 146 }
gr66 0:cd0f9e8c609b 147
gr66 0:cd0f9e8c609b 148 //********
gr66 0:cd0f9e8c609b 149 void IHM::IHM_vprintf(const char* format, va_list args)
gr66 0:cd0f9e8c609b 150 {
gr66 0:cd0f9e8c609b 151 //oldcurseur=curseur;
gr66 0:cd0f9e8c609b 152 unsigned char i,j;
gr66 0:cd0f9e8c609b 153 ////va_list args;
gr66 0:cd0f9e8c609b 154 //sprintf(
gr66 0:cd0f9e8c609b 155 //set_printf(IHM_sendchar); /* Placement des datas dans le tableau */
gr66 0:cd0f9e8c609b 156 //vputc(IHM_sendchar);
gr66 0:cd0f9e8c609b 157 ////va_start(args, format);
gr66 0:cd0f9e8c609b 158 vsprintf(tableau_ecran+curseur,format, args);
gr66 0:cd0f9e8c609b 159 ////va_end(args);
gr66 0:cd0f9e8c609b 160 // envoi sur le bus can du tableau complet de l'ecran
gr66 0:cd0f9e8c609b 161 for(j=0; j<4; j++) {
gr66 0:cd0f9e8c609b 162 trame_Tx.id=LCD_CHAR0+j;
gr66 0:cd0f9e8c609b 163 trame_Tx.type=CANData;
gr66 0:cd0f9e8c609b 164 trame_Tx.len=8;
gr66 0:cd0f9e8c609b 165 for(i=0; i<8; i++)
gr66 0:cd0f9e8c609b 166 trame_Tx.data[i]=tableau_ecran[i+j*8];
gr66 0:cd0f9e8c609b 167 while(!can.write(trame_Tx));
gr66 0:cd0f9e8c609b 168 wait_us(150);
gr66 0:cd0f9e8c609b 169 }
gr66 0:cd0f9e8c609b 170 }
gr66 0:cd0f9e8c609b 171 /****************************************************************************************/
gr66 0:cd0f9e8c609b 172 /* FUNCTION NAME: IHM_sendstring */
gr66 0:cd0f9e8c609b 173 /* DESCRIPTION : Affiche une chaine sur l'IHM */
gr66 0:cd0f9e8c609b 174 /* RETURN : VOID */
gr66 0:cd0f9e8c609b 175 /* PARAMETER 1 : char* message : chaine de caractere a afficher */
gr66 0:cd0f9e8c609b 176 /****************************************************************************************/
gr66 0:cd0f9e8c609b 177 void IHM::IHM_sendstring (char* message)
gr66 0:cd0f9e8c609b 178 {
gr66 0:cd0f9e8c609b 179 unsigned char i,j;
gr66 0:cd0f9e8c609b 180 sprintf(tableau_ecran+curseur,message);
gr66 0:cd0f9e8c609b 181
gr66 0:cd0f9e8c609b 182 for(j=0; j<4; j++) {
gr66 0:cd0f9e8c609b 183 trame_Tx.id=LCD_CHAR0+j;
gr66 0:cd0f9e8c609b 184 trame_Tx.type=CANData;
gr66 0:cd0f9e8c609b 185 trame_Tx.len=8;
gr66 0:cd0f9e8c609b 186 for(i=0; i<8; i++)
gr66 0:cd0f9e8c609b 187 trame_Tx.data[i]=tableau_ecran[i+j*8];
gr66 0:cd0f9e8c609b 188 while(!can.write(trame_Tx));
gr66 0:cd0f9e8c609b 189 wait_us(150);
gr66 0:cd0f9e8c609b 190 }
gr66 0:cd0f9e8c609b 191 }
gr66 0:cd0f9e8c609b 192 /****************************************************************************************/
gr66 0:cd0f9e8c609b 193 /* FUNCTION NAME: IHM_clear */
gr66 0:cd0f9e8c609b 194 /* DESCRIPTION : Efface le LCD */
gr66 0:cd0f9e8c609b 195 /* RETURN : VOID */
gr66 0:cd0f9e8c609b 196 /****************************************************************************************/
gr66 0:cd0f9e8c609b 197 void IHM::LCD_clear(void)
gr66 0:cd0f9e8c609b 198 {
gr66 0:cd0f9e8c609b 199 UINT8 i;
gr66 0:cd0f9e8c609b 200 curseur=0;
gr66 0:cd0f9e8c609b 201 for(i=0; i<32; i++)
gr66 0:cd0f9e8c609b 202 tableau_ecran[i]=32;
gr66 0:cd0f9e8c609b 203 while(!can.write(CANMessage(LCD_CLEAR,CANStandard)));
gr66 0:cd0f9e8c609b 204 wait_us(150);
gr66 0:cd0f9e8c609b 205 }
gr66 0:cd0f9e8c609b 206 /****************************************************************************************/
gr66 0:cd0f9e8c609b 207 /* FUNCTION NAME: BAR_set */
gr66 0:cd0f9e8c609b 208 /* DESCRIPTION : commande les 10 LED du bargraph */
gr66 0:cd0f9e8c609b 209 /* PARAMETER 1 : UINT16 valeur : ordre d'allumage, exprimé sur les 10 bits de droite.
gr66 0:cd0f9e8c609b 210 Le bit k doit valoir 0 pour allumer la LED k, 1 pour l'éteindre.
gr66 0:cd0f9e8c609b 211 Exemple : ~(1<<9) allume la LED 9, ~0x00F allume les 4 LED 0 à 3 */
gr66 0:cd0f9e8c609b 212 /****************************************************************************************/
gr66 0:cd0f9e8c609b 213 void IHM::BAR_set(UINT16 valeur)
gr66 0:cd0f9e8c609b 214 {
gr66 0:cd0f9e8c609b 215 trame_Tx.id=BAR_SET;
gr66 0:cd0f9e8c609b 216 trame_Tx.type=CANData;
gr66 0:cd0f9e8c609b 217 trame_Tx.len=2;
gr66 0:cd0f9e8c609b 218 trame_Tx.data[0]=valeur>>8;
gr66 0:cd0f9e8c609b 219 trame_Tx.data[1]=(UINT8)valeur;
gr66 0:cd0f9e8c609b 220 while(!can.write(trame_Tx));
gr66 0:cd0f9e8c609b 221 }
gr66 0:cd0f9e8c609b 222
gr66 0:cd0f9e8c609b 223
gr66 0:cd0f9e8c609b 224 /****************************************************************************************/
gr66 0:cd0f9e8c609b 225 /* FUNCTION NAME: JOG_read */
gr66 0:cd0f9e8c609b 226 /* DESCRIPTION : indique la position (parmi les 8 possibles) et l'enfoncement du Jog. */
gr66 0:cd0f9e8c609b 227 /* RETURN : un octet UINT8 qui indique la position (RIGHT, LEFT, UP, DOWN + 4 combinaisons)
gr66 0:cd0f9e8c609b 228 et l'enfoncement (PUSH) du Jog, exprimés sur 5 bits utiles.*/
gr66 0:cd0f9e8c609b 229
gr66 0:cd0f9e8c609b 230 /* - Si le Jog est au repos : la fonction renvoie 0 (0x00).
gr66 0:cd0f9e8c609b 231 - si le Jog n'est pas au repos : 1 à 3 bits peuvent être mis à 1 dans l'octet renvoyé.
gr66 0:cd0f9e8c609b 232 Il est intéressant d'utiliser les masques définis en constantes.
gr66 0:cd0f9e8c609b 233 La signification des 8 bits de la valeur renvoyée est:
gr66 0:cd0f9e8c609b 234 0 0 0 RIGHT UP PUSH LEFT DOWN
gr66 0:cd0f9e8c609b 235 Plusieurs bits peuvent être à 1 en même temps. Par exemple : RIGHT + UP + PUSH
gr66 0:cd0f9e8c609b 236 à 1 indiquent que le Jog est en position "Nord Est " (UP+RIGHT) et qu'il est enfoncé.
gr66 0:cd0f9e8c609b 237 Si le Jog est simultanément enfoncé et positionné à droite, la fonction renvoie
gr66 0:cd0f9e8c609b 238 (0001 0100) en binaire, soit 0x14. Exprimée avec les masques, la valeur renvoyée vaut
gr66 0:cd0f9e8c609b 239 JOG_MSK_RIGHT | JOG_MSK_PUSH (0x14). */
gr66 0:cd0f9e8c609b 240 /**************************************************************************************************/
gr66 0:cd0f9e8c609b 241 /**************************************************************************************************/
gr66 0:cd0f9e8c609b 242 /* utiliser les Constantes symboliques de IHM.h pour interpréter la valeur renvoyée par le jog... */
gr66 0:cd0f9e8c609b 243 /**************************************************************************************************/
gr66 0:cd0f9e8c609b 244
gr66 0:cd0f9e8c609b 245 UINT8 IHM::JOG_read(void)
gr66 0:cd0f9e8c609b 246 {
gr66 0:cd0f9e8c609b 247 trame_Tx.id=JOG_REQ;
gr66 0:cd0f9e8c609b 248 trame_Tx.type=CAN_REMOTE;
gr66 0:cd0f9e8c609b 249 while(!can.write(trame_Tx));
gr66 0:cd0f9e8c609b 250
gr66 0:cd0f9e8c609b 251 while(mise_a_jour_JOG==0)
gr66 0:cd0f9e8c609b 252 CAN_automate_reception();
gr66 0:cd0f9e8c609b 253 mise_a_jour_JOG=0;
gr66 0:cd0f9e8c609b 254 return JOG_valeur;
gr66 0:cd0f9e8c609b 255
gr66 0:cd0f9e8c609b 256 }
gr66 0:cd0f9e8c609b 257
gr66 0:cd0f9e8c609b 258
gr66 0:cd0f9e8c609b 259 /***************************************************************************************************/
gr66 0:cd0f9e8c609b 260 /* FUNCTION NAME: COD_read */
gr66 0:cd0f9e8c609b 261 /* DESCRIPTION : indique la rotation effectuée par le codeur incrémental. */
gr66 0:cd0f9e8c609b 262 /* RETURN : un octet UINT8 dont la valeur entre 0 et 255 indique la rotation du
gr66 0:cd0f9e8c609b 263 codeur incrémental depuis l'initialisation du codeur (cad de la carte IHM),
gr66 0:cd0f9e8c609b 264 exprimée en douzièmes de tours. Le codeur dispose en effet de 12 positions
gr66 0:cd0f9e8c609b 265 et la valeur retournée s'incrémente/se décrémente à chaque 12e de tour.
gr66 0:cd0f9e8c609b 266 Par exemple, si le codeur a été tourné de 2 tours et demi, la valeur
gr66 0:cd0f9e8c609b 267 retournée vaut 12+12+6 = 30 = 0x1E (le codeur a effectué 30 douzièmes de tour) */
gr66 0:cd0f9e8c609b 268 /***************************************************************************************************/
gr66 0:cd0f9e8c609b 269
gr66 0:cd0f9e8c609b 270 UINT8 IHM::COD_read(void)
gr66 0:cd0f9e8c609b 271 {
gr66 0:cd0f9e8c609b 272 trame_Tx.id=COD_REQ;
gr66 0:cd0f9e8c609b 273 trame_Tx.type=CAN_REMOTE;
gr66 0:cd0f9e8c609b 274 while(!can.write(trame_Tx));
gr66 0:cd0f9e8c609b 275
gr66 0:cd0f9e8c609b 276 // while(!can.write(CANMessage(COD_REQ,CANStandard)));
gr66 0:cd0f9e8c609b 277 while(mise_a_jour_COD==0)
gr66 0:cd0f9e8c609b 278 CAN_automate_reception();
gr66 0:cd0f9e8c609b 279 mise_a_jour_COD=0;
gr66 0:cd0f9e8c609b 280 return COD_valeur;
gr66 0:cd0f9e8c609b 281
gr66 0:cd0f9e8c609b 282 }
gr66 0:cd0f9e8c609b 283