#include "RTDS_Startup_decl.h"
#include "bCentral.h"
/*
* FUNCTION FOR PROCESS pCentral:
* ------------------------------
*/
void pCentral(RTDS_GlobalProcessInfo *RTDS_currentContext)
{
int length;
char *pData;
tCardAndCode *pCardAndCode;
tListCardAndCode *pRecord, *pDataBase;
tListCardAndCode *pPreviousRecord, *pNewRecord;
int found;
/* *************************************************************** */
/* $(RTDS_HOME)/share/ccg/vxworks/bricks/RTDS_Proc_begin.c begins */
/* Copyright (C) 2002 PragmaDev */
int RTDS_sdlStatePrev = 0;
RTDS_MessageHeader *RTDS_readSaveQueue = NULL, *RTDS_writeSaveQueue = NULL;
RTDS_TimerState *RTDS_timer, *RTDS_prevTimer;
RTDS_QueueId RTDS_senderQueueId = NULL;
/* To synchronize processes at startup time */
RTDS_START_SYNCHRO_WAIT;
/* $(RTDS_HOME)/share/ccg/vxworks/bricks/RTDS_Proc_begin.c ends */
/* ************************************************************ */
/* Initial transition */
RTDS_PROCESS_CREATE("pLocal", pLocal, 150);
pDataBase = NULL;
RTDS_SDL_STATE_SET(idle);
/* Event loop */
for ( ; ; )
{
/* *************************************************************** */
/* $(RTDS_HOME)/share/ccg/vxworks/bricks/RTDS_Proc_middle.c begins */
/* Copyright (C) 2002 PragmaDev */
/* Check saved messages */
if ( RTDS_readSaveQueue != NULL )
{
RTDS_currentContext->currentMessage = RTDS_readSaveQueue;
RTDS_readSaveQueue = RTDS_readSaveQueue->next;
}
/* If no saved messages left, get message from process's message queue */
else
{
RTDS_currentContext->currentMessage = (RTDS_MessageHeader *)RTDS_MALLOC(sizeof(RTDS_MessageHeader));
RTDS_MSG_QUEUE_READ(RTDS_currentContext->currentMessage);
RTDS_currentContext->currentMessage->next = NULL;
}
/* Discard cancelled timers */
if ( RTDS_currentContext->currentMessage->timerUniqueId != 0 )
{
RTDS_senderQueueId = RTDS_currentContext->currentMessage->sender;
RTDS_prevTimer = NULL;
for ( RTDS_timer = RTDS_currentContext->timerList ; RTDS_timer != NULL; RTDS_timer = RTDS_timer->next )
{
/* If timer found and cancelled */
if ( RTDS_timer->timerUniqueId == RTDS_currentContext->currentMessage->timerUniqueId )
{
if ( RTDS_timer->state == RTDS_TIMER_CANCELLED )
{
/* Discard current message */
RTDS_FREE(RTDS_currentContext->currentMessage);
RTDS_currentContext->currentMessage = NULL;
}
/* Remove it from list of timers */
if ( RTDS_prevTimer == NULL )
{
RTDS_currentContext->timerList = RTDS_currentContext->timerList->next;
}
else
{
RTDS_prevTimer->next = RTDS_timer->next;
}
RTDS_FREE(RTDS_timer);
break;
}
RTDS_prevTimer = RTDS_timer;
}
}
/* Let's process the message ! */
if ( RTDS_currentContext->currentMessage != NULL )
{
#ifdef RTDS_SIMULATOR
RTDS_SIMULATOR_TRACE(RTDS_messageReceived, RTDS_currentContext->currentMessage, SELF);
/* Release the message unique id back to the pool */
RTDS_ReleaseMessageUniqueId(RTDS_currentContext->currentMessage->messageUniqueId);
#endif
RTDS_senderQueueId = RTDS_currentContext->currentMessage->sender;
RTDS_sdlStatePrev = RTDS_currentContext->sdlState;
/* $(RTDS_HOME)/share/ccg/vxworks/bricks/RTDS_Proc_middle.c ends */
/* ************************************************************* */
/* Double switch state / signal */
switch(RTDS_currentContext->sdlState)
{
case idle:
switch(RTDS_currentContext->currentMessage->messageNumber)
{
/* State idle - signal DeleteUser */
case DeleteUser:
length = RTDS_currentContext->currentMessage->dataLength;
pData = RTDS_currentContext->currentMessage->pData;
pCardAndCode = (tCardAndCode *)pData;
found =0;
pPreviousRecord = NULL;
for (pRecord=pDataBase;pRecord != NULL; pRecord = (tListCardAndCode *)pRecord->next)
{
if ((strncmp(pRecord->record->cardId, pCardAndCode->cardId,pRecord->record->cardLength) == 0) \
&& (strncmp(pRecord->record->codeId, pCardAndCode->codeId,pRecord->record->codeLength) == 0))
{
found = 1;
if (pPreviousRecord == NULL)
pDataBase = (tListCardAndCode *)pRecord->next;
else
pPreviousRecord->next = pRecord->next;
free(pRecord->record);
free(pRecord);
break;
}
pPreviousRecord = pRecord;
}
if ( (found) == (0) )
{
RTDS_MSG_QUEUE_SEND_TO_ID(Ko, 0, NULL, SENDER);
_label1:
RTDS_SDL_STATE_SET(idle);
} /* End of if ( (found) == (0) ) */
else if ( (found) == (1) )
{
RTDS_MSG_QUEUE_SEND_TO_ID(Ok, 0, NULL, SENDER);
goto _label1;
} /* End of if ( (found) == (1) ) */
break;
/* State idle - signal AddUser */
case AddUser:
length = RTDS_currentContext->currentMessage->dataLength;
pData = RTDS_currentContext->currentMessage->pData;
pNewRecord = malloc(sizeof(tListCardAndCode));
pNewRecord->record = (tCardAndCode *)pData;
pNewRecord->next = NULL;
if (pDataBase == NULL)
pDataBase = pNewRecord;
else
{
/* Get to the end of the list */
for (pRecord=pDataBase;pRecord->next != NULL; pRecord = (tListCardAndCode *)pRecord->next) ;
pRecord->next = (tCardAndCode *)pNewRecord;
}
RTDS_MSG_QUEUE_SEND_TO_ID(Ok, 0, NULL, SENDER);
RTDS_SDL_STATE_SET(idle);
break;
/* State idle - signal CardAndCode */
case CardAndCode:
length = RTDS_currentContext->currentMessage->dataLength;
pData = RTDS_currentContext->currentMessage->pData;
pCardAndCode = (tCardAndCode *)pData;
if ( ! ((strncmp(administratorCard, pCardAndCode->cardId, pCardAndCode->cardLength) == 0) && (strncmp( administratorCode, pCardAndCode->codeId, pCardAndCode->codeLength) == 0)) )
{
goto lCheckBase;
lCheckBase:
found =0;
for (pRecord=pDataBase;pRecord != NULL; pRecord = (tListCardAndCode *)pRecord->next)
{
if ((strncmp(pRecord->record->cardId, pCardAndCode->cardId,pRecord->record->cardLength) == 0) \
&& (strncmp(pRecord->record->codeId, pCardAndCode->codeId,pRecord->record->codeLength) == 0))
{
found = 1;
break;
}
}
if ( (found) == (1) )
{
RTDS_MSG_QUEUE_SEND_TO_ID(Employee, 0, NULL, SENDER);
_label2:
RTDS_SDL_STATE_SET(idle);
} /* End of if ( (found) == (1) ) */
else if ( (found) == (0) )
{
RTDS_MSG_QUEUE_SEND_TO_ID(Intruder, 0, NULL, SENDER);
goto _label2;
} /* End of if ( (found) == (0) ) */
} /* End of if ( ! ((strncmp(administratorCard, pCardAndCode->cardId, pCardAndCode->cardLength) == 0) && (strncmp( administratorCode, pCardAndCode->codeId, pCardAndCode->codeLength) == 0)) ) */
else if ( (strncmp(administratorCard, pCardAndCode->cardId, pCardAndCode->cardLength) == 0) && (strncmp( administratorCode, pCardAndCode->codeId, pCardAndCode->codeLength) == 0) )
{
RTDS_MSG_QUEUE_SEND_TO_ID(Administrator, 0, NULL, SENDER);
RTDS_SDL_STATE_SET(idle);
} /* End of if ( (strncmp(administratorCard, pCardAndCode->cardId, pCardAndCode->cardLength) == 0) && (strncmp( administratorCode, pCardAndCode->codeId, pCardAndCode->codeLength) == 0) ) */
break;
} /* End of switch(RTDS_currentContext->currentMessage->messageNumber) */
break;
} /* End of switch(RTDS_currentContext->sdlState) */
/* ************************************************************ */
/* $(RTDS_HOME)/share/ccg/vxworks/bricks/RTDS_Proc_end.c begins */
/* Copyright (C) 2002 PragmaDev */
/* If message was not saved */
if (RTDS_currentContext->currentMessage != NULL )
{
/* Free memory */
RTDS_FREE(RTDS_currentContext->currentMessage);
RTDS_currentContext->currentMessage = NULL;
/* If SDL state has changed and messages have been saved: reorganise the save queue */
if ( (RTDS_currentContext->sdlState != RTDS_sdlStatePrev) && (RTDS_writeSaveQueue != NULL) )
{
RTDS_MessageHeader *message;
/* Let's get to the end of the save queue */
for (message=RTDS_writeSaveQueue ; message->next != NULL ; message = message->next);
message->next = RTDS_readSaveQueue;
RTDS_readSaveQueue = RTDS_writeSaveQueue;
RTDS_writeSaveQueue = NULL;
}
} /* End of else if ( RTDS_currentContext->currentMessage != NULL ) */
/* Since a transition has been executed; the sdl state is considered different to execute continuous signals. */
RTDS_sdlStatePrev = 0;
} /* End of if ( RTDS_currentContext->currentMessage != NULL ) */
} /* End of for ( ; ; ) */
/* Resources clean up */
RTDS_PROCESS_KILL;
}
/* $(RTDS_HOME)/share/ccg/vxworks/bricks/RTDS_Proc_end.c ends */
/* ********************************************************** */