1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
|
while(1)
{
/* reception d'un caractere */
read(GLOBALE_PortCOM2,&c,1);
/* Traitement reception \r\n : on sort sur \r mais on doit supprimer \n */
if(MsgCmdeLCRModeTerminal.Cmde.Ptr == 0 && c == '\n')
continue;
/* Remise a 0 du pointeur reception pour vider le buffer */
if(MsgCmdeLCRModeTerminal.Cmde.Ptr < 4
&& (c == '-' || c == ENQ || c == STX || c == ETB))
MsgCmdeLCRModeTerminal.Cmde.Ptr = 0;
/* traitement du caractere recu */
if(c == CR)
{
MsgCmdeLCRModeTerminal.Cmde.Table[MsgCmdeLCRModeTerminal.Cmde.Ptr++] = NUL;
/* Si mode terminal interdit ou time out validite du mode Trm atteint */
if(GLOBALE_CfgSetu.Port2[COURANTE].Pr == 'O'
&& GLOBALE_Compteurs.TimeOutValiditeTrmPort[TEDI2] >= 60)
return(MODE_TERMINAL);
/* Je teste si j'ai deja quelque chose en attente dans la file d'emission du port */
msgctl(MsgCmdeLCRModeTerminal.IdMsgReponseLCR,IPC_STAT,&InfoFile);
if(InfoFile.msg_qnum > 0)
{
/* On vide la boite a message */
while(msgrcv(MsgCmdeLCRModeTerminal.IdMsgReponseLCR, (char *)&MsgReponseLCR, sizeof(MSG_REPONSE_LCR), getpid(), IPC_NOWAIT) >= 0);
}
/* Envoi du message commande LCR a la tache analyseur LCR */
MsgCmdeLCRModeTerminal.MsgType = getpid();
msgsnd(GLOBALE_IdMsgReceptionCmdeLCR, (char*)&MsgCmdeLCRModeTerminal, sizeof(MSG_COMMANDE_LCR), IPC_NOWAIT);
/* todo RAF : Débloquer au bout de 5 s */
Ret = msgrcv(MsgCmdeLCRModeTerminal.IdMsgReponseLCR, (char *)&MsgReponseLCR, sizeof(MSG_REPONSE_LCR), getpid(), 0);
if(Ret >= 0)
{
if(MsgReponseLCR.TypeReponseTEDI == R1)
{
/* Raz timer validite mode terminal */
GLOBALE_Compteurs.TimeOutValiditeTrmPort[TEDI2] = 0;
return(MODE_TERMINAL);
}
else if(MsgReponseLCR.TypeReponseTEDI == R2)
{
/* Raz timer validite mode terminal */
GLOBALE_Compteurs.TimeOutValiditeTrmPort[TEDI2] = 0;
return(MODE_TERMINAL);
}
else if(MsgReponseLCR.TypeReponseTEDI == R3)
{
/* Raz timer validite mode terminal */
GLOBALE_Compteurs.TimeOutValiditeTrmPort[TEDI2] = 0;
/* teste si la reponse est un point d'interrogation */
if(strcmp(MsgReponseLCR.Reponse,"?") == 0)
{
/* emission de la reponse LCR */
strcpy(Emission,MsgReponseLCR.Reponse);
write(GLOBALE_PortCOM2,Emission,strlen(Emission));
}
else
{
/* il faut y ajouter un point d'interrogation */
strcpy(Emission,MsgReponseLCR.Reponse);
strcat(Emission,"?");
write(GLOBALE_PortCOM2,Emission,strlen(Emission));
}
return(MODE_TERMINAL);
}
else if(MsgReponseLCR.TypeReponseTEDI == R4)
{
/* emission de la reponse LCR */
strcpy(Emission,"!");
write(GLOBALE_PortCOM2,Emission,strlen(Emission));
return(MODE_TERMINAL);
}
else if(MsgReponseLCR.TypeReponseTEDI == R5)
{
/* emission de la reponse LCR */
strcpy(Emission,MsgReponseLCR.Reponse);
strcat(Emission,"!");
write(GLOBALE_PortCOM2,Emission,strlen(Emission));
/* Activaton du TRM seulement sur emission d'une reponse*/
SYSTEM_ActivationTRM(MsgCmdeLCRModeTerminal.Origine);
return(MODE_TERMINAL);
}
else
{
/* Raz timer validite mode terminal */
GLOBALE_Compteurs.TimeOutValiditeTrmPort[TEDI2] = 0;
return(MODE_TERMINAL);
}
}
}
else
{
if(MsgCmdeLCRModeTerminal.Cmde.Ptr < TAILLE_MAX_CMD_LCR)
{
/* test de changement de mode */
if(c == '-' && MsgCmdeLCRModeTerminal.Cmde.Ptr == 0)
return(MODE_TEST);
if(c == ENQ)
return(MODE_BASE_ENQ);
if(c == STX)
return(MODE_BASE_STX);
/* test du backspace */
if (c == 0x08)
{
if(MsgCmdeLCRModeTerminal.Cmde.Ptr != 0)
MsgCmdeLCRModeTerminal.Cmde.Ptr--;
}
else
MsgCmdeLCRModeTerminal.Cmde.Table[MsgCmdeLCRModeTerminal.Cmde.Ptr++] = c;
}
else
return(MODE_TERMINAL);
}
} |
Partager