Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: Projet_client_serveur EX5 ex10 ex11 ... more
IHM.cpp@4:a9e51ac904e2, 2016-11-08 (annotated)
- 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?
| User | Revision | Line number | New 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 |