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.
IHM/IHM.cpp@0:6ce9c65992e5, 2015-04-15 (annotated)
- Committer:
 - dylancachan
 - Date:
 - Wed Apr 15 06:23:18 2015 +0000
 - Revision:
 - 0:6ce9c65992e5
 
telemetre
Who changed what in which revision?
| User | Revision | Line number | New contents of line | 
|---|---|---|---|
| dylancachan | 0:6ce9c65992e5 | 1 | /* FILE: IHM.c */ | 
| dylancachan | 0:6ce9c65992e5 | 2 | /****************************************************************************************/ | 
| dylancachan | 0:6ce9c65992e5 | 3 | /* MODULE NAME: IHM 16x2 */ | 
| dylancachan | 0:6ce9c65992e5 | 4 | /* */ | 
| dylancachan | 0:6ce9c65992e5 | 5 | /* AUTHOR : Jacques-Olivier KLEIN */ | 
| dylancachan | 0:6ce9c65992e5 | 6 | /* Bruno LARNAUDIE */ | 
| dylancachan | 0:6ce9c65992e5 | 7 | /* */ | 
| dylancachan | 0:6ce9c65992e5 | 8 | /* EMAIL : jacques-olivier.klein@u-psud.fr */ | 
| dylancachan | 0:6ce9c65992e5 | 9 | /* bruno.larnaudie@u-psud.fr */ | 
| dylancachan | 0:6ce9c65992e5 | 10 | /* */ | 
| dylancachan | 0:6ce9c65992e5 | 11 | /* INSTITUTION: IUT de CACHAN - 9 av. de la div. Leclerc - 94230 CACHAN */ | 
| dylancachan | 0:6ce9c65992e5 | 12 | /* */ | 
| dylancachan | 0:6ce9c65992e5 | 13 | /* DATE : 12/07/2012 */ | 
| dylancachan | 0:6ce9c65992e5 | 14 | /* CPU : FREESCALE MC9S12XS128MAA */ | 
| dylancachan | 0:6ce9c65992e5 | 15 | /* BOARD : CACHAN Xboard + IHM16x2 */ | 
| dylancachan | 0:6ce9c65992e5 | 16 | /* OS : None */ | 
| dylancachan | 0:6ce9c65992e5 | 17 | /* */ | 
| dylancachan | 0:6ce9c65992e5 | 18 | /* DESCRIPTION: Fonctions d'accès au Lcd émulé passant par le bus CAN */ | 
| dylancachan | 0:6ce9c65992e5 | 19 | /****************************************************************************************/ | 
| dylancachan | 0:6ce9c65992e5 | 20 | |
| dylancachan | 0:6ce9c65992e5 | 21 | #include <stdarg.h> // Pour va_list ... dans IHM_printf | 
| dylancachan | 0:6ce9c65992e5 | 22 | #include <stdio.h> // Pour vprintf et setprintf | 
| dylancachan | 0:6ce9c65992e5 | 23 | #include "all_includes.h" | 
| dylancachan | 0:6ce9c65992e5 | 24 | |
| dylancachan | 0:6ce9c65992e5 | 25 | extern DigitalOut myled[4]; | 
| dylancachan | 0:6ce9c65992e5 | 26 | extern unsigned char Reception_CAN; | 
| dylancachan | 0:6ce9c65992e5 | 27 | CANMessage trame_Tx; | 
| dylancachan | 0:6ce9c65992e5 | 28 | extern CANMessage can_MsgRx[SIZE_FIFO]; | 
| dylancachan | 0:6ce9c65992e5 | 29 | extern CAN can; /*Configuration des ports du CAN : rd p30 td p29*/ | 
| dylancachan | 0:6ce9c65992e5 | 30 | |
| dylancachan | 0:6ce9c65992e5 | 31 | /****************************************************************************************/ | 
| dylancachan | 0:6ce9c65992e5 | 32 | /* Variables globales */ | 
| dylancachan | 0:6ce9c65992e5 | 33 | /****************************************************************************************/ | 
| dylancachan | 0:6ce9c65992e5 | 34 | UINT8 curseur=0; | 
| dylancachan | 0:6ce9c65992e5 | 35 | static char tableau_ecran[32]={32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32}; | 
| dylancachan | 0:6ce9c65992e5 | 36 | UINT8 IHM_is_running = 0; | 
| dylancachan | 0:6ce9c65992e5 | 37 | |
| dylancachan | 0:6ce9c65992e5 | 38 | /****************************************************************************************/ | 
| dylancachan | 0:6ce9c65992e5 | 39 | /* FUNCTION NAME: IHM_init */ | 
| dylancachan | 0:6ce9c65992e5 | 40 | /* DESCRIPTION : Initialise l'afficheur IHM */ | 
| dylancachan | 0:6ce9c65992e5 | 41 | /* RETURN : VOID */ | 
| dylancachan | 0:6ce9c65992e5 | 42 | /****************************************************************************************/ | 
| dylancachan | 0:6ce9c65992e5 | 43 | void IHM_init(void) | 
| dylancachan | 0:6ce9c65992e5 | 44 | { | 
| dylancachan | 0:6ce9c65992e5 | 45 | } | 
| dylancachan | 0:6ce9c65992e5 | 46 | |
| dylancachan | 0:6ce9c65992e5 | 47 | |
| dylancachan | 0:6ce9c65992e5 | 48 | /****************************************************************************************/ | 
| dylancachan | 0:6ce9c65992e5 | 49 | /* FUNCTION NAME: IHM_gotoxy */ | 
| dylancachan | 0:6ce9c65992e5 | 50 | /* DESCRIPTION : Modifie la position du curseur sur l'afficheur LCD de la carte IHM */ | 
| dylancachan | 0:6ce9c65992e5 | 51 | /* RETURN : VOID */ | 
| dylancachan | 0:6ce9c65992e5 | 52 | /* PARAMETER 1 : UINT8 x : indice de la ligne (0 à 1) */ | 
| dylancachan | 0:6ce9c65992e5 | 53 | /* PARAMETER 2 : UINT8 y : indice de la colonne (0 à 15) */ | 
| dylancachan | 0:6ce9c65992e5 | 54 | /****************************************************************************************/ | 
| dylancachan | 0:6ce9c65992e5 | 55 | void IHM_gotoxy (UINT8 x, UINT8 y) | 
| dylancachan | 0:6ce9c65992e5 | 56 | { | 
| dylancachan | 0:6ce9c65992e5 | 57 | curseur=(x*16+y)%32; | 
| dylancachan | 0:6ce9c65992e5 | 58 | } | 
| dylancachan | 0:6ce9c65992e5 | 59 | |
| dylancachan | 0:6ce9c65992e5 | 60 | |
| dylancachan | 0:6ce9c65992e5 | 61 | /****************************************************************************************/ | 
| dylancachan | 0:6ce9c65992e5 | 62 | /* FUNCTION NAME: IHM_sendchar */ | 
| dylancachan | 0:6ce9c65992e5 | 63 | /* DESCRIPTION : Envoie un caractere à afficher au controleur de l'afficheur LCD */ | 
| dylancachan | 0:6ce9c65992e5 | 64 | /* RETURN : VOID */ | 
| dylancachan | 0:6ce9c65992e5 | 65 | /* PARAMETER 1 : char data : caractère à afficher */ | 
| dylancachan | 0:6ce9c65992e5 | 66 | /****************************************************************************************/ | 
| dylancachan | 0:6ce9c65992e5 | 67 | void IHM_sendchar (char data) | 
| dylancachan | 0:6ce9c65992e5 | 68 | { | 
| dylancachan | 0:6ce9c65992e5 | 69 | tableau_ecran[curseur]=data; | 
| dylancachan | 0:6ce9c65992e5 | 70 | curseur=(curseur+1)%32; | 
| dylancachan | 0:6ce9c65992e5 | 71 | } | 
| dylancachan | 0:6ce9c65992e5 | 72 | |
| dylancachan | 0:6ce9c65992e5 | 73 | |
| dylancachan | 0:6ce9c65992e5 | 74 | /****************************************************************************************/ | 
| dylancachan | 0:6ce9c65992e5 | 75 | /* FUNCTION NAME: IHM_printf */ | 
| dylancachan | 0:6ce9c65992e5 | 76 | /* DESCRIPTION : Affichage formaté de type "printf" sur un afficheur LCD */ | 
| dylancachan | 0:6ce9c65992e5 | 77 | /* RETURN : VOID */ | 
| dylancachan | 0:6ce9c65992e5 | 78 | /* PARAMETER 1 : char* format : format d'affichage de printf */ | 
| dylancachan | 0:6ce9c65992e5 | 79 | /* PARAMETER 2 : ... : parametres à afficher */ | 
| dylancachan | 0:6ce9c65992e5 | 80 | /* Attention : le nouvel affichage doit recouvrir le précédent. */ | 
| dylancachan | 0:6ce9c65992e5 | 81 | /*********************** NOTE concernant la commande IHM_printf *************************/ | 
| dylancachan | 0:6ce9c65992e5 | 82 | /* Les appels melangés à printf, LCD_printf et IHM_printf peuvent donner des resutlats */ | 
| dylancachan | 0:6ce9c65992e5 | 83 | /* imprevisibles */ | 
| dylancachan | 0:6ce9c65992e5 | 84 | /* */ | 
| dylancachan | 0:6ce9c65992e5 | 85 | /* L'IHM doit etre initialise par la fonction IHM_init */ | 
| dylancachan | 0:6ce9c65992e5 | 86 | /****************************************************************************************/ | 
| dylancachan | 0:6ce9c65992e5 | 87 | void IHM_printf(const char* format, ...) | 
| dylancachan | 0:6ce9c65992e5 | 88 | { | 
| dylancachan | 0:6ce9c65992e5 | 89 | //oldcurseur=curseur; | 
| dylancachan | 0:6ce9c65992e5 | 90 | unsigned char i,j; | 
| dylancachan | 0:6ce9c65992e5 | 91 | va_list args; | 
| dylancachan | 0:6ce9c65992e5 | 92 | //sprintf( | 
| dylancachan | 0:6ce9c65992e5 | 93 | //set_printf(IHM_sendchar); /* Placement des datas dans le tableau */ | 
| dylancachan | 0:6ce9c65992e5 | 94 | //vputc(IHM_sendchar); | 
| dylancachan | 0:6ce9c65992e5 | 95 | va_start(args, format); | 
| dylancachan | 0:6ce9c65992e5 | 96 | vsprintf(tableau_ecran+curseur,format, args); | 
| dylancachan | 0:6ce9c65992e5 | 97 | va_end(args); | 
| dylancachan | 0:6ce9c65992e5 | 98 | // envoi sur le bus can du tableau complet de l'ecran | 
| dylancachan | 0:6ce9c65992e5 | 99 | for(j=0;j<4;j++) | 
| dylancachan | 0:6ce9c65992e5 | 100 | { | 
| dylancachan | 0:6ce9c65992e5 | 101 | trame_Tx.id=LCD_CHAR0+j; | 
| dylancachan | 0:6ce9c65992e5 | 102 | trame_Tx.type=CANData; | 
| dylancachan | 0:6ce9c65992e5 | 103 | trame_Tx.len=8; | 
| dylancachan | 0:6ce9c65992e5 | 104 | for(i=0;i<8;i++) | 
| dylancachan | 0:6ce9c65992e5 | 105 | trame_Tx.data[i]=tableau_ecran[i+j*8]; | 
| dylancachan | 0:6ce9c65992e5 | 106 | while(!can.write(trame_Tx)); | 
| dylancachan | 0:6ce9c65992e5 | 107 | } | 
| dylancachan | 0:6ce9c65992e5 | 108 | } | 
| dylancachan | 0:6ce9c65992e5 | 109 | /****************************************************************************************/ | 
| dylancachan | 0:6ce9c65992e5 | 110 | /* FUNCTION NAME: IHM_sendstring */ | 
| dylancachan | 0:6ce9c65992e5 | 111 | /* DESCRIPTION : Affiche une chaine sur l'IHM */ | 
| dylancachan | 0:6ce9c65992e5 | 112 | /* RETURN : VOID */ | 
| dylancachan | 0:6ce9c65992e5 | 113 | /* PARAMETER 1 : char* message : chaine de caractere a afficher */ | 
| dylancachan | 0:6ce9c65992e5 | 114 | /****************************************************************************************/ | 
| dylancachan | 0:6ce9c65992e5 | 115 | void IHM_sendstring (char* message) | 
| dylancachan | 0:6ce9c65992e5 | 116 | { | 
| dylancachan | 0:6ce9c65992e5 | 117 | unsigned char i,j; | 
| dylancachan | 0:6ce9c65992e5 | 118 | sprintf(tableau_ecran+curseur,message); | 
| dylancachan | 0:6ce9c65992e5 | 119 | |
| dylancachan | 0:6ce9c65992e5 | 120 | for(j=0;j<4;j++) | 
| dylancachan | 0:6ce9c65992e5 | 121 | { | 
| dylancachan | 0:6ce9c65992e5 | 122 | trame_Tx.id=LCD_CHAR0+j; | 
| dylancachan | 0:6ce9c65992e5 | 123 | trame_Tx.type=CANData; | 
| dylancachan | 0:6ce9c65992e5 | 124 | trame_Tx.len=8; | 
| dylancachan | 0:6ce9c65992e5 | 125 | for(i=0;i<8;i++) | 
| dylancachan | 0:6ce9c65992e5 | 126 | trame_Tx.data[i]=tableau_ecran[i+j*8]; | 
| dylancachan | 0:6ce9c65992e5 | 127 | while(!can.write(trame_Tx)); | 
| dylancachan | 0:6ce9c65992e5 | 128 | } | 
| dylancachan | 0:6ce9c65992e5 | 129 | } | 
| dylancachan | 0:6ce9c65992e5 | 130 | /****************************************************************************************/ | 
| dylancachan | 0:6ce9c65992e5 | 131 | /* FUNCTION NAME: IHM_clear */ | 
| dylancachan | 0:6ce9c65992e5 | 132 | /* DESCRIPTION : Efface le LCD */ | 
| dylancachan | 0:6ce9c65992e5 | 133 | /* RETURN : VOID */ | 
| dylancachan | 0:6ce9c65992e5 | 134 | /****************************************************************************************/ | 
| dylancachan | 0:6ce9c65992e5 | 135 | void IHM_clear(void) | 
| dylancachan | 0:6ce9c65992e5 | 136 | { | 
| dylancachan | 0:6ce9c65992e5 | 137 | UINT8 i; | 
| dylancachan | 0:6ce9c65992e5 | 138 | curseur=0; | 
| dylancachan | 0:6ce9c65992e5 | 139 | for(i=0;i<32;i++) | 
| dylancachan | 0:6ce9c65992e5 | 140 | tableau_ecran[i]=32; | 
| dylancachan | 0:6ce9c65992e5 | 141 | while(!can.write(CANMessage(LCD_CLEAR,CANStandard))); | 
| dylancachan | 0:6ce9c65992e5 | 142 | |
| dylancachan | 0:6ce9c65992e5 | 143 | } | 
| dylancachan | 0:6ce9c65992e5 | 144 | /****************************************************************************************/ | 
| dylancachan | 0:6ce9c65992e5 | 145 | /* FUNCTION NAME: BAR_set */ | 
| dylancachan | 0:6ce9c65992e5 | 146 | /* DESCRIPTION : commande les 10 LED du bargraph */ | 
| dylancachan | 0:6ce9c65992e5 | 147 | /* PARAMETER 1 : UINT16 valeur : ordre d'allumage, exprimé sur les 10 bits de droite. | 
| dylancachan | 0:6ce9c65992e5 | 148 | Le bit k doit valoir 0 pour allumer la LED k, 1 pour l'éteindre. | 
| dylancachan | 0:6ce9c65992e5 | 149 | Exemple : ~(1<<9) allume la LED 9, ~0x00F allume les 4 LED 0 à 3 */ | 
| dylancachan | 0:6ce9c65992e5 | 150 | /****************************************************************************************/ | 
| dylancachan | 0:6ce9c65992e5 | 151 | void BAR_set(UINT16 valeur) | 
| dylancachan | 0:6ce9c65992e5 | 152 | { | 
| dylancachan | 0:6ce9c65992e5 | 153 | trame_Tx.id=BAR_SET; | 
| dylancachan | 0:6ce9c65992e5 | 154 | trame_Tx.type=CANData; | 
| dylancachan | 0:6ce9c65992e5 | 155 | trame_Tx.len=2; | 
| dylancachan | 0:6ce9c65992e5 | 156 | trame_Tx.data[0]=valeur>>8; | 
| dylancachan | 0:6ce9c65992e5 | 157 | trame_Tx.data[1]=(UINT8)valeur; | 
| dylancachan | 0:6ce9c65992e5 | 158 | while(!can.write(trame_Tx)); | 
| dylancachan | 0:6ce9c65992e5 | 159 | } | 
| dylancachan | 0:6ce9c65992e5 | 160 | |
| dylancachan | 0:6ce9c65992e5 | 161 | |
| dylancachan | 0:6ce9c65992e5 | 162 | /****************************************************************************************/ | 
| dylancachan | 0:6ce9c65992e5 | 163 | /* FUNCTION NAME: JOG_read */ | 
| dylancachan | 0:6ce9c65992e5 | 164 | /* DESCRIPTION : indique la position (parmi les 8 possibles) et l'enfoncement du Jog. */ | 
| dylancachan | 0:6ce9c65992e5 | 165 | /* RETURN : un octet UINT8 qui indique la position (RIGHT, LEFT, UP, DOWN + 4 combinaisons) | 
| dylancachan | 0:6ce9c65992e5 | 166 | et l'enfoncement (PUSH) du Jog, exprimés sur 5 bits utiles.*/ | 
| dylancachan | 0:6ce9c65992e5 | 167 | |
| dylancachan | 0:6ce9c65992e5 | 168 | /* - Si le Jog est au repos : la fonction renvoie 0 (0x00). | 
| dylancachan | 0:6ce9c65992e5 | 169 | - si le Jog n'est pas au repos : 1 à 3 bits peuvent être mis à 1 dans l'octet renvoyé. | 
| dylancachan | 0:6ce9c65992e5 | 170 | Il est intéressant d'utiliser les masques définis en constantes. | 
| dylancachan | 0:6ce9c65992e5 | 171 | La signification des 8 bits de la valeur renvoyée est: | 
| dylancachan | 0:6ce9c65992e5 | 172 | 0 0 0 RIGHT UP PUSH LEFT DOWN | 
| dylancachan | 0:6ce9c65992e5 | 173 | Plusieurs bits peuvent être à 1 en même temps. Par exemple : RIGHT + UP + PUSH | 
| dylancachan | 0:6ce9c65992e5 | 174 | à 1 indiquent que le Jog est en position "Nord Est " (UP+RIGHT) et qu'il est enfoncé. | 
| dylancachan | 0:6ce9c65992e5 | 175 | Si le Jog est simultanément enfoncé et positionné à droite, la fonction renvoie | 
| dylancachan | 0:6ce9c65992e5 | 176 | (0001 0100) en binaire, soit 0x14. Exprimée avec les masques, la valeur renvoyée vaut | 
| dylancachan | 0:6ce9c65992e5 | 177 | JOG_MSK_RIGHT | JOG_MSK_PUSH (0x14). */ | 
| dylancachan | 0:6ce9c65992e5 | 178 | /**************************************************************************************************/ | 
| dylancachan | 0:6ce9c65992e5 | 179 | /**************************************************************************************************/ | 
| dylancachan | 0:6ce9c65992e5 | 180 | /* utiliser les Constantes symboliques de IHM.h pour interpréter la valeur renvoyée par le jog... */ | 
| dylancachan | 0:6ce9c65992e5 | 181 | /**************************************************************************************************/ | 
| dylancachan | 0:6ce9c65992e5 | 182 | |
| dylancachan | 0:6ce9c65992e5 | 183 | UINT8 JOG_read(void) | 
| dylancachan | 0:6ce9c65992e5 | 184 | { | 
| dylancachan | 0:6ce9c65992e5 | 185 | while(!can.write(CANMessage(JOG_REQ,CANStandard))); | 
| dylancachan | 0:6ce9c65992e5 | 186 | while(mise_a_jour_JOG==0) | 
| dylancachan | 0:6ce9c65992e5 | 187 | CAN_automate_reception(); | 
| dylancachan | 0:6ce9c65992e5 | 188 | mise_a_jour_JOG=0; | 
| dylancachan | 0:6ce9c65992e5 | 189 | return JOG_valeur; | 
| dylancachan | 0:6ce9c65992e5 | 190 | |
| dylancachan | 0:6ce9c65992e5 | 191 | } | 
| dylancachan | 0:6ce9c65992e5 | 192 | |
| dylancachan | 0:6ce9c65992e5 | 193 | |
| dylancachan | 0:6ce9c65992e5 | 194 | /***************************************************************************************************/ | 
| dylancachan | 0:6ce9c65992e5 | 195 | /* FUNCTION NAME: COD_read */ | 
| dylancachan | 0:6ce9c65992e5 | 196 | /* DESCRIPTION : indique la rotation effectuée par le codeur incrémental. */ | 
| dylancachan | 0:6ce9c65992e5 | 197 | /* RETURN : un octet UINT8 dont la valeur entre 0 et 255 indique la rotation du | 
| dylancachan | 0:6ce9c65992e5 | 198 | codeur incrémental depuis l'initialisation du codeur (cad de la carte IHM), | 
| dylancachan | 0:6ce9c65992e5 | 199 | exprimée en douzièmes de tours. Le codeur dispose en effet de 12 positions | 
| dylancachan | 0:6ce9c65992e5 | 200 | et la valeur retournée s'incrémente/se décrémente à chaque 12e de tour. | 
| dylancachan | 0:6ce9c65992e5 | 201 | Par exemple, si le codeur a été tourné de 2 tours et demi, la valeur | 
| dylancachan | 0:6ce9c65992e5 | 202 | retournée vaut 12+12+6 = 30 = 0x1E (le codeur a effectué 30 douzièmes de tour) */ | 
| dylancachan | 0:6ce9c65992e5 | 203 | /***************************************************************************************************/ | 
| dylancachan | 0:6ce9c65992e5 | 204 | |
| dylancachan | 0:6ce9c65992e5 | 205 | SINT8 COD_read(void) | 
| dylancachan | 0:6ce9c65992e5 | 206 | { | 
| dylancachan | 0:6ce9c65992e5 | 207 | while(!can.write(CANMessage(COD_REQ,CANStandard))); | 
| dylancachan | 0:6ce9c65992e5 | 208 | while(mise_a_jour_COD==0) | 
| dylancachan | 0:6ce9c65992e5 | 209 | CAN_automate_reception(); | 
| dylancachan | 0:6ce9c65992e5 | 210 | mise_a_jour_COD=0; | 
| dylancachan | 0:6ce9c65992e5 | 211 | return COD_valeur; | 
| dylancachan | 0:6ce9c65992e5 | 212 | |
| dylancachan | 0:6ce9c65992e5 | 213 | } | 
| dylancachan | 0:6ce9c65992e5 | 214 | |
| dylancachan | 0:6ce9c65992e5 | 215 | |
| dylancachan | 0:6ce9c65992e5 | 216 | |
| dylancachan | 0:6ce9c65992e5 | 217 | |
| dylancachan | 0:6ce9c65992e5 | 218 | |
| dylancachan | 0:6ce9c65992e5 | 219 | |
| dylancachan | 0:6ce9c65992e5 | 220 | |
| dylancachan | 0:6ce9c65992e5 | 221 | |
| dylancachan | 0:6ce9c65992e5 | 222 | |
| dylancachan | 0:6ce9c65992e5 | 223 | |
| dylancachan | 0:6ce9c65992e5 | 224 |