1
0
This repository has been archived on 2024-09-17. You can view files and clone it, but cannot push or open issues or pull requests.
tor-heredero-tokenring/debuglayer.c

331 lines
13 KiB
C
Raw Permalink Normal View History

2024-04-10 17:17:57 +00:00
#include "armebs3.h" /* peripherals definitions */
#include "mezza_lcd\mezza_lcd.h" /* LCD Mezza library */
#include <tx_api.h> /* threadX def. header file */
#include <stdlib.h> /* std lib definitions file */
#include <stdio.h> /* standard IO functions */
#include <tokenring.h> /* tokenring constants */
/*--------------------------------------------------------------------------*/
/* EXTERNAL DEFINED GLOBAL VARIABLES */
/*--------------------------------------------------------------------------*/
extern UINT8 gDebugSend;
extern UINT8 gDebugAddress;
extern UINT8 gDebugSapi;
extern UINT8 gDebugSendCrcError;
extern UINT8 gDebugReceiveCrcError;
extern UINT8 gInBuffer[300];
extern UINT8 MYADDRESS;
extern TX_QUEUE gDebug_Q;
extern TX_EVENT_FLAGS_GROUP gEvents_E;
/****************************************************************************/
/* Name : CheckRetCodeDebug */
/*--------------------------------------------------------------------------*/
/* Inputs : retCode, lineNumber, mode */
/*--------------------------------------------------------------------------*/
/* Function : - displays the error when an error happends */
/****************************************************************************/
void CheckRetCodeDebug(UINT32 retCode,UINT32 lineNumber,UINT8 mode)
{
if(retCode != 0) /* when error occurs */
{
Debug("In Debugger line : ",lineNumber); /* display line number */
Debug("Error : ",retCode); /* with error number */
if (mode == HALT) /* when mode is HALT */
{
while(1){} /* stays here forever */
}
}
}
/****************************************************************************/
/* TaskName : DebugManager */
/*--------------------------------------------------------------------------*/
/* Function : - simulate a station with the tokenring interface */
/****************************************************************************/
void DebugManager(void)
{
HEADER msg;
UINT8 *ptr;
UINT8 *tokenPtr;
INT32 retCode;
UINT8 msgStr[]="Test Message from Debug !";
UINT8 srcControl;
UINT8 dstControl;
UINT8 size;
UINT8 checksum;
UINT8 i;
UINT8 lastDebugAddress;
UINT8 statusByte;
gDebugSend = 0;
gDebugAddress = 6;
gDebugSapi = 1;
gDebugSendCrcError = 0;
gDebugReceiveCrcError = 0;
lastDebugAddress = gDebugAddress;
/*------------------------------------------------------------------------*/
while(1) /* forever loop */
{
/*----------------------------------------------------------------------*/
/* TX_CALL >>>>>>>>>>>>>>>>> QUEUE READ */
/*----------------------------------------------------------------------*/
retCode = tx_queue_receive(
&gDebug_Q,
&msg,
TX_WAIT_FOREVER);
CheckRetCodeDebug(retCode,__LINE__,CONTINUE);
ptr = msg.data.ptr;
/*----------------------------------------------------------------------*/
/* TOKEN RECEIVED */
/*----------------------------------------------------------------------*/
if(*(ptr+1) == TOKEN)
{
ptr[gDebugAddress+2] = (1 << gDebugSapi); /* update dbg SAPI */
if(lastDebugAddress != gDebugAddress) /* if address changed */
{
ptr[lastDebugAddress+2] &= ~(1 << gDebugSapi); /* update last */
lastDebugAddress = gDebugAddress; /* set new<->last */
}
/*--------------------------------------------------------------------*/
/* WAIT TO SEND MSG */
/*--------------------------------------------------------------------*/
if(gDebugSend == 1)
{
gDebugSend = 0; /* stop send nxt time */
tokenPtr = ptr;
srcControl = (gDebugAddress << 3) + gDebugSapi;
dstControl = (MYADDRESS << 3) + gDebugSapi;
size = strlen(msgStr);
*gInBuffer = 0x02;
/*------------------------------------------------------------------*/
/* MSG CREATION */
/*------------------------------------------------------------------*/
*(gInBuffer+1) = srcControl;
*(gInBuffer+2) = dstControl;
*(gInBuffer+3) = size;
strcpy(gInBuffer+4,msgStr);
*(gInBuffer+3+size) = 0x0D;
checksum = 0;
for(i=0;i<size+3;i++)
checksum += *(gInBuffer+i+1);
*(gInBuffer+size+4) = checksum << 2;
*(gInBuffer+size+5) = 0x03;
/*------------------------------------------------------------------*/
if(gDebugSendCrcError == 1)
{
*(gInBuffer+size+4) += 4; /* simulate error CS */
}
/*------------------------------------------------------------------*/
/* TX_CALL >>>>>>>>>>>>>>> EVENT SET */
/*------------------------------------------------------------------*/
retCode = tx_event_flags_set(
&gEvents_E,
RS232_FR_EVENT,
TX_OR);
CheckRetCodeDebug(retCode,__LINE__,CONTINUE);
}
/*--------------------------------------------------------------------*/
/* NO MSG TO SEND */
/*--------------------------------------------------------------------*/
else /* token back */
{
for(i=0;i<19;i++)
{
gInBuffer[i] = *(ptr+i);
}
retCode = tx_byte_release((void*)ptr);
CheckRetCodeDebug(retCode,__LINE__,CONTINUE);
/*------------------------------------------------------------------*/
/* TX_CALL >>>>>>>>>>>>>>> EVENT SET */
/*------------------------------------------------------------------*/
retCode = tx_event_flags_set(
&gEvents_E,
RS232_FR_EVENT,
TX_OR);
CheckRetCodeDebug(retCode,__LINE__,CONTINUE);
}
}
/*----------------------------------------------------------------------*/
/* DATABACK RECEIVED */
/*----------------------------------------------------------------------*/
else if (*(ptr+1)>>3 == gDebugAddress)
{
statusByte = *(ptr+*(ptr+3)+4);
statusByte &= 0x03;
/*--------------------------------------------------------------------*/
switch(statusByte)
{
/*------------------------------------------------------------------*/
/* RD = 1, ACK = 1 */
/*------------------------------------------------------------------*/
case 0x03: /* RD = 1, ACK = 1 */
/*----------------------------------------------------------------*/
/* TX_CALL >>>>>>>>>>>>> MEMORY RELEASE */
/*----------------------------------------------------------------*/
retCode = tx_byte_release((void*)ptr);
for(i=0;i<19;i++)
{
gInBuffer[i] = *(tokenPtr+i);
}
/*----------------------------------------------------------------*/
/* TX_CALL >>>>>>>>>>>>> MEMORY RELEASE */
/*----------------------------------------------------------------*/
retCode = tx_byte_release((void*)tokenPtr);
CheckRetCodeDebug(retCode,__LINE__,CONTINUE);
/*----------------------------------------------------------------*/
/* TX_CALL >>>>>>>>>>>>> EVENT SET */
/*----------------------------------------------------------------*/
retCode = tx_event_flags_set(
&gEvents_E,
RS232_FR_EVENT,
TX_OR);
CheckRetCodeDebug(retCode,__LINE__,CONTINUE);
break;
/*------------------------------------------------------------------*/
/* RD = 1, ACK = 0 */
/*------------------------------------------------------------------*/
case 0x02: /* RD = 1, ACK = 0 */
/*----------------------------------------------------------------*/
/* TX_CALL >>>>>>>>>>>>> MEMORY RELEASE */
/*----------------------------------------------------------------*/
retCode = tx_byte_release((void*)ptr);
srcControl = (gDebugAddress << 3) + gDebugSapi;
dstControl = (MYADDRESS << 3) + CHAT_SAPI;
size = strlen(msgStr);
*gInBuffer = 0x02;
*(gInBuffer+1) = srcControl;
*(gInBuffer+2) = dstControl;
*(gInBuffer+3) = size;
strcpy(gInBuffer+4,msgStr);
*(gInBuffer+3+size) = 0x0D;
checksum = 0;
for(i=0;i<size+3;i++)
checksum += *(gInBuffer+i+1);
*(gInBuffer+size+4) = checksum << 2;
*(gInBuffer+size+5) = 0x03;
/*----------------------------------------------------------------*/
if(gDebugSendCrcError == 1)
{
*(gInBuffer+size+4) += 4; /* simulate error CS */
}
/*----------------------------------------------------------------*/
/* TX_CALL >>>>>>>>>>>>> EVENT SET */
/*----------------------------------------------------------------*/
retCode = tx_event_flags_set(
&gEvents_E,
RS232_FR_EVENT,
TX_OR);
CheckRetCodeDebug(retCode,__LINE__,CONTINUE);
Debug("DBL>> MESSAGE ACK ERROR -> SEND MESSAGE AGAIN ",0);
break;
/*------------------------------------------------------------------*/
/* RD = 0, ACK = x */
/*------------------------------------------------------------------*/
case 0x01: /* RD = 0, ACK = 1 */
case 0x00: /* RD = 0, ACK = 0 */
/*----------------------------------------------------------------*/
/* TX_CALL >>>>>>>>>>>>> MEMORY RELEASE */
/*----------------------------------------------------------------*/
retCode = tx_byte_release((void*)ptr);
for(i=0;i<19;i++)
{
gInBuffer[i] = *(tokenPtr+i);
}
/*----------------------------------------------------------------*/
/* TX_CALL >>>>>>>>>>>>> MEMORY RELEASE */
/*----------------------------------------------------------------*/
retCode = tx_byte_release((void*)tokenPtr);
CheckRetCodeDebug(retCode,__LINE__,CONTINUE);
/*----------------------------------------------------------------*/
/* TX_CALL >>>>>>>>>>>>> EVENT SET */
/*----------------------------------------------------------------*/
retCode = tx_event_flags_set(
&gEvents_E,
RS232_FR_EVENT,
TX_OR);
CheckRetCodeDebug(retCode,__LINE__,CONTINUE);
Debug("DBL>> MESSAGE NOT READ -> SEND BACK TOKEN ",0);
break;
}
}
/*----------------------------------------------------------------------*/
/* MESSAGE RECEIVED */
/*----------------------------------------------------------------------*/
else if (*(ptr+2)>>3 == gDebugAddress)
{
statusByte = *(ptr+*(ptr+3)+4);
/*--------------------------------------------------------------------*/
if((gDebugReceiveCrcError == 1) && /* pseudo error */
((*(ptr+2) && 0x03) == gDebugSapi))
{
*(ptr+*(ptr+3)+4) |= 0x02; /* set RD bit */
*(ptr+*(ptr+3)+4) &= 0xFE; /* clear ACK bit */
Debug("DBL>> PSEUDO ACK ERROR ",0);
}
/*--------------------------------------------------------------------*/
else if((*(ptr+2) && 0x03) == gDebugSapi) /* control is OK */
{
checksum = 0;
for(i=0;i<*(ptr+3)+3;i++) /* calculate checksum */
checksum += *(ptr+i+1);
checksum = checksum << 2;
if(checksum == (statusByte & 0xFC))
{
*(ptr+*(ptr+3)+4) = statusByte | 0x03; /* RD = 1, ACK = 1 */
Debug("DBL>> ACK OK ",0);
}
else
{
*(ptr+*(ptr+3)+4) = statusByte | 0x02; /* RD = 1, ACK = 0 */
Debug("DBL>> ACK ERROR ",0);
}
}
/*--------------------------------------------------------------------*/
else /* bad SAPI */
{
Debug("DBL>> BAD SAPI ",0);
}
for(i=0;i<*(ptr+3)+6;i++)
{
gInBuffer[i] = *(ptr+i);
}
/*--------------------------------------------------------------------*/
/* TX_CALL >>>>>>>>>>>>>>> MEMORY RELEASE */
/*--------------------------------------------------------------------*/
retCode = tx_byte_release((void*)ptr);
/*--------------------------------------------------------------------*/
/* TX_CALL >>>>>>>>>>>>>>> EVENT SET */
/*--------------------------------------------------------------------*/
retCode = tx_event_flags_set(
&gEvents_E,
RS232_FR_EVENT,
TX_OR);
CheckRetCodeDebug(retCode,__LINE__,CONTINUE);
}
/*----------------------------------------------------------------------*/
/* ANOTHER FRAME */
/*----------------------------------------------------------------------*/
else
{
for(i=0;i<*(ptr+3)+6;i++) /* copy frame */
{
gInBuffer[i] = *(ptr+i);
}
/*--------------------------------------------------------------------*/
/* TX_CALL >>>>>>>>>>>>>>> MEMORY RELEASE */
/*--------------------------------------------------------------------*/
retCode = tx_byte_release((void*)ptr);
/*--------------------------------------------------------------------*/
/* TX_CALL >>>>>>>>>>>>>>> EVENT SET */
/*--------------------------------------------------------------------*/
retCode = tx_event_flags_set(
&gEvents_E,
RS232_FR_EVENT,
TX_OR);
CheckRetCodeDebug(retCode,__LINE__,CONTINUE);
}
}
}