version qui corrige tous les beugs
Dependents: Projet_client_serveur EX5 ex10 ex11 ... more
Diff: IHM.cpp
- Revision:
- 0:cd0f9e8c609b
- Child:
- 1:663cbe5baac4
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/IHM.cpp Sat Oct 01 12:23:41 2016 +0000 @@ -0,0 +1,283 @@ +#include "IHM.h" +#include "all_includes.h" +#include <stdarg.h> // Pour va_list ... dans IHM_printf +#include <stdio.h> // Pour vprintf et setprintf +#define CAN_REMOTE CANType(2) +// + + +IHM::IHM(PinName CANRx, PinName CANTx): can(CANRx,CANTx) +{ + can.frequency(1000000); /*Baud rate : kbits/s */ + can.attach(this,&IHM::can_ISR_Reader); /* Fonction d'interruption CAN*/ +} +void IHM::LCD_printf(const char* format, ...) +{ + va_list arg; + va_start(arg,format); + IHM_vprintf(format,arg); + va_end(arg); +} +unsigned char JOG_valeur,mise_a_jour_JOG=0,mise_a_jour_COD=0; +void IHM::can_ISR_Reader(void) +{ + if (can.read(can_MsgRx[FIFO_ecriture])) { + // FIFO gestion + FIFO_ecriture=(FIFO_ecriture+1)%SIZE_FIFO; + // myled[0] = !myled[0]; + // ledC= !ledC; + } +} +void IHM::CAN_automate_reception(void) +{ + static signed char FIFO_lecture=0,FIFO_occupation=0,FIFO_max_occupation=0; + FIFO_occupation=FIFO_ecriture-FIFO_lecture; + if(FIFO_occupation<0) + FIFO_occupation=FIFO_occupation+SIZE_FIFO; + if(FIFO_max_occupation<FIFO_occupation) + FIFO_max_occupation=FIFO_occupation; + if(FIFO_occupation>SIZE_FIFO) + while(!can.write(CANMessage(LCD_OVERFLOW,CANStandard))); + if(FIFO_occupation!=0) { + switch(can_MsgRx[FIFO_lecture].id) { + case JOG_DATA: + JOG_valeur=can_MsgRx[FIFO_lecture].data[0]; + mise_a_jour_JOG=1; + break; + case COD_DATA: + COD_valeur=can_MsgRx[FIFO_lecture].data[0]; + mise_a_jour_COD=1; + break; + default: + break; + } + FIFO_lecture=(FIFO_lecture+1)%SIZE_FIFO; + } +} +/* FILE: IHM.c */ +/****************************************************************************************/ +/* MODULE NAME: IHM 16x2 */ +/* */ +/* AUTHOR : Jacques-Olivier KLEIN */ +/* Bruno LARNAUDIE */ +/* */ +/* EMAIL : jacques-olivier.klein@u-psud.fr */ +/* bruno.larnaudie@u-psud.fr */ +/* */ +/* INSTITUTION: IUT de CACHAN - 9 av. de la div. Leclerc - 94230 CACHAN */ +/* */ +/* DATE : 12/07/2012 */ +/* CPU : FREESCALE MC9S12XS128MAA */ +/* BOARD : CACHAN Xboard + IHM16x2 */ +/* OS : None */ +/* */ +/* DESCRIPTION: Fonctions d'accès au Lcd émulé passant par le bus CAN */ +/****************************************************************************************/ + + +/****************************************************************************************/ +/* FUNCTION NAME: IHM_init */ +/* DESCRIPTION : Initialise l'afficheur IHM */ +/* RETURN : VOID */ +/****************************************************************************************/ + + + +/****************************************************************************************/ +/* FUNCTION NAME: IHM_gotoxy */ +/* DESCRIPTION : Modifie la position du curseur sur l'afficheur LCD de la carte IHM */ +/* RETURN : VOID */ +/* PARAMETER 1 : UINT8 x : indice de la ligne (0 à 1) */ +/* PARAMETER 2 : UINT8 y : indice de la colonne (0 à 15) */ +/****************************************************************************************/ +void IHM::LCD_gotoxy (UINT8 x, UINT8 y) +{ + curseur=(x*16+y)%32; +} + + +/****************************************************************************************/ +/* FUNCTION NAME: IHM_sendchar */ +/* DESCRIPTION : Envoie un caractere à afficher au controleur de l'afficheur LCD */ +/* RETURN : VOID */ +/* PARAMETER 1 : char data : caractère à afficher */ +/****************************************************************************************/ +void IHM::IHM_sendchar (char data) +{ + tableau_ecran[curseur]=data; + curseur=(curseur+1)%32; +} + + +/****************************************************************************************/ +/* FUNCTION NAME: IHM_printf */ +/* DESCRIPTION : Affichage formaté de type "printf" sur un afficheur LCD */ +/* RETURN : VOID */ +/* PARAMETER 1 : char* format : format d'affichage de printf */ +/* PARAMETER 2 : ... : parametres à afficher */ +/* Attention : le nouvel affichage doit recouvrir le précédent. */ +/*********************** NOTE concernant la commande IHM_printf *************************/ +/* Les appels melangés à printf, LCD_printf et IHM_printf peuvent donner des resutlats */ +/* imprevisibles */ +/* */ +/* L'IHM doit etre initialise par la fonction IHM_init */ +/****************************************************************************************/ +void IHM::IHM_printf(const char* format, ...) +{ + //oldcurseur=curseur; + unsigned char i,j; + va_list args; + //sprintf( + //set_printf(IHM_sendchar); /* Placement des datas dans le tableau */ + //vputc(IHM_sendchar); + va_start(args, format); + vsprintf(tableau_ecran+curseur,format, args); + va_end(args); + // envoi sur le bus can du tableau complet de l'ecran + for(j=0; j<4; j++) { + trame_Tx.id=LCD_CHAR0+j; + trame_Tx.type=CANData; + trame_Tx.len=8; + for(i=0; i<8; i++) + trame_Tx.data[i]=tableau_ecran[i+j*8]; + while(!can.write(trame_Tx)); + wait_us(150); + } +} + +//******** +void IHM::IHM_vprintf(const char* format, va_list args) +{ + //oldcurseur=curseur; + unsigned char i,j; + ////va_list args; + //sprintf( + //set_printf(IHM_sendchar); /* Placement des datas dans le tableau */ + //vputc(IHM_sendchar); + ////va_start(args, format); + vsprintf(tableau_ecran+curseur,format, args); + ////va_end(args); + // envoi sur le bus can du tableau complet de l'ecran + for(j=0; j<4; j++) { + trame_Tx.id=LCD_CHAR0+j; + trame_Tx.type=CANData; + trame_Tx.len=8; + for(i=0; i<8; i++) + trame_Tx.data[i]=tableau_ecran[i+j*8]; + while(!can.write(trame_Tx)); + wait_us(150); + } +} +/****************************************************************************************/ +/* FUNCTION NAME: IHM_sendstring */ +/* DESCRIPTION : Affiche une chaine sur l'IHM */ +/* RETURN : VOID */ +/* PARAMETER 1 : char* message : chaine de caractere a afficher */ +/****************************************************************************************/ +void IHM::IHM_sendstring (char* message) +{ + unsigned char i,j; + sprintf(tableau_ecran+curseur,message); + + for(j=0; j<4; j++) { + trame_Tx.id=LCD_CHAR0+j; + trame_Tx.type=CANData; + trame_Tx.len=8; + for(i=0; i<8; i++) + trame_Tx.data[i]=tableau_ecran[i+j*8]; + while(!can.write(trame_Tx)); + wait_us(150); + } +} +/****************************************************************************************/ +/* FUNCTION NAME: IHM_clear */ +/* DESCRIPTION : Efface le LCD */ +/* RETURN : VOID */ +/****************************************************************************************/ +void IHM::LCD_clear(void) +{ + UINT8 i; + curseur=0; + for(i=0; i<32; i++) + tableau_ecran[i]=32; + while(!can.write(CANMessage(LCD_CLEAR,CANStandard))); + wait_us(150); +} +/****************************************************************************************/ +/* FUNCTION NAME: BAR_set */ +/* DESCRIPTION : commande les 10 LED du bargraph */ +/* PARAMETER 1 : UINT16 valeur : ordre d'allumage, exprimé sur les 10 bits de droite. + Le bit k doit valoir 0 pour allumer la LED k, 1 pour l'éteindre. + Exemple : ~(1<<9) allume la LED 9, ~0x00F allume les 4 LED 0 à 3 */ +/****************************************************************************************/ +void IHM::BAR_set(UINT16 valeur) +{ + trame_Tx.id=BAR_SET; + trame_Tx.type=CANData; + trame_Tx.len=2; + trame_Tx.data[0]=valeur>>8; + trame_Tx.data[1]=(UINT8)valeur; + while(!can.write(trame_Tx)); +} + + +/****************************************************************************************/ +/* FUNCTION NAME: JOG_read */ +/* DESCRIPTION : indique la position (parmi les 8 possibles) et l'enfoncement du Jog. */ +/* RETURN : un octet UINT8 qui indique la position (RIGHT, LEFT, UP, DOWN + 4 combinaisons) + et l'enfoncement (PUSH) du Jog, exprimés sur 5 bits utiles.*/ + +/* - Si le Jog est au repos : la fonction renvoie 0 (0x00). + - si le Jog n'est pas au repos : 1 à 3 bits peuvent être mis à 1 dans l'octet renvoyé. + Il est intéressant d'utiliser les masques définis en constantes. + La signification des 8 bits de la valeur renvoyée est: + 0 0 0 RIGHT UP PUSH LEFT DOWN + Plusieurs bits peuvent être à 1 en même temps. Par exemple : RIGHT + UP + PUSH + à 1 indiquent que le Jog est en position "Nord Est " (UP+RIGHT) et qu'il est enfoncé. + Si le Jog est simultanément enfoncé et positionné à droite, la fonction renvoie + (0001 0100) en binaire, soit 0x14. Exprimée avec les masques, la valeur renvoyée vaut + JOG_MSK_RIGHT | JOG_MSK_PUSH (0x14). */ +/**************************************************************************************************/ +/**************************************************************************************************/ +/* utiliser les Constantes symboliques de IHM.h pour interpréter la valeur renvoyée par le jog... */ +/**************************************************************************************************/ + +UINT8 IHM::JOG_read(void) +{ + trame_Tx.id=JOG_REQ; + trame_Tx.type=CAN_REMOTE; + while(!can.write(trame_Tx)); + + while(mise_a_jour_JOG==0) + CAN_automate_reception(); + mise_a_jour_JOG=0; + return JOG_valeur; + +} + + +/***************************************************************************************************/ +/* FUNCTION NAME: COD_read */ +/* DESCRIPTION : indique la rotation effectuée par le codeur incrémental. */ +/* RETURN : un octet UINT8 dont la valeur entre 0 et 255 indique la rotation du + codeur incrémental depuis l'initialisation du codeur (cad de la carte IHM), + exprimée en douzièmes de tours. Le codeur dispose en effet de 12 positions + et la valeur retournée s'incrémente/se décrémente à chaque 12e de tour. + Par exemple, si le codeur a été tourné de 2 tours et demi, la valeur + retournée vaut 12+12+6 = 30 = 0x1E (le codeur a effectué 30 douzièmes de tour) */ +/***************************************************************************************************/ + +UINT8 IHM::COD_read(void) +{ + trame_Tx.id=COD_REQ; + trame_Tx.type=CAN_REMOTE; + while(!can.write(trame_Tx)); + +// while(!can.write(CANMessage(COD_REQ,CANStandard))); + while(mise_a_jour_COD==0) + CAN_automate_reception(); + mise_a_jour_COD=0; + return COD_valeur; + +} +