version qui corrige tous les beugs

Dependents:   Projet_client_serveur EX5 ex10 ex11 ... more

Committer:
slowness
Date:
Tue Nov 08 07:22:34 2016 +0000
Revision:
4:a9e51ac904e2
Parent:
2:ba3449b7e070
Version sans bug

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