#include "RTDS_Startup_decl.h"
#include "bLocal.h"
/*
* FUNCTION FOR PROCESS pLocal:
* ----------------------------
*/
void pLocal(RTDS_GlobalProcessInfo *RTDS_currentContext)
{
char *pCardId,*pCodeId,*pKey;
int lengthCardId, lengthCodeId, lenMsg,lengthKey;
tCardAndCode *pCardAndCode;
short mode;
/* *************************************************************** */
/* $(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 */
Display(msgEnterCard, RTDS_currentContext);
mode=NORMAL;
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 displaying:
switch(RTDS_currentContext->currentMessage->messageNumber)
{
/* State displaying - signal tDisplay */
case tDisplay:
mode = NORMAL;
Display( msgEnterCard, RTDS_currentContext);
RTDS_SDL_STATE_SET(idle);
break;
} /* End of switch(RTDS_currentContext->currentMessage->messageNumber) */
break;
case doorOpen:
switch(RTDS_currentContext->currentMessage->messageNumber)
{
/* State doorOpen - signal tDoor */
case tDoor:
RTDS_MSG_QUEUE_SEND_TO_ENV(close, 0, NULL);
Display( msgEnterCard, RTDS_currentContext);
mode=NORMAL;
RTDS_SDL_STATE_SET(idle);
break;
} /* End of switch(RTDS_currentContext->currentMessage->messageNumber) */
break;
case adminMode:
switch(RTDS_currentContext->currentMessage->messageNumber)
{
/* State adminMode - signal key */
case key:
lengthKey = RTDS_currentContext->currentMessage->dataLength;
pKey = RTDS_currentContext->currentMessage->pData;
if ( (*pKey) == (DELETE_USER_KEY) )
{
mode = DELETE_USER;
Display(msgEnterCardToDelete, RTDS_currentContext);
RTDS_SDL_STATE_SET(idle);
} /* End of if ( (*pKey) == (DELETE_USER_KEY) ) */
else if ( (*pKey) == (ADD_USER_KEY) )
{
mode = ADD_USER;
Display(msgEnterNewCard, RTDS_currentContext);
RTDS_SDL_STATE_SET(idle);
} /* End of if ( (*pKey) == (ADD_USER_KEY) ) */
else
{
mode = NORMAL;
goto lOpen;
lOpen:
_label1:
Display(msgDoorOpen, RTDS_currentContext);
RTDS_MSG_QUEUE_SEND_TO_ENV(open, 0, NULL);
RTDS_SET_TIMER(tDoor, 1000);
RTDS_SDL_STATE_SET(doorOpen);
} /* End of */
break;
} /* End of switch(RTDS_currentContext->currentMessage->messageNumber) */
break;
case idle:
switch(RTDS_currentContext->currentMessage->messageNumber)
{
/* State idle - signal card */
case card:
lengthCardId = RTDS_currentContext->currentMessage->dataLength;
pCardId = RTDS_currentContext->currentMessage->pData;
Display(msgEnterCode, RTDS_currentContext);
RTDS_SET_TIMER(tCode, 1000);
pCodeId = malloc(CODE_SIZE);
lengthCodeId = 0;
RTDS_SDL_STATE_SET(waitCode);
break;
} /* End of switch(RTDS_currentContext->currentMessage->messageNumber) */
break;
case waitCentral:
switch(RTDS_currentContext->currentMessage->messageNumber)
{
/* State waitCentral - signal Ok */
case Ok:
Display(msgOk, RTDS_currentContext);
_label2:
RTDS_SET_TIMER(tDisplay, 300);
RTDS_SDL_STATE_SET(displaying);
break;
/* State waitCentral - signal Employee */
case Employee:
goto _label1;
break;
/* State waitCentral - signal Intruder */
case Intruder:
Display( msgInvalidCardOrCode, RTDS_currentContext);
RTDS_SET_TIMER(tDisplay, 300);
RTDS_SDL_STATE_SET(displaying);
break;
/* State waitCentral - signal Ko */
case Ko:
Display(msgKo, RTDS_currentContext);
goto _label2;
break;
/* State waitCentral - signal Administrator */
case Administrator:
Display(msgAdmin, RTDS_currentContext);
RTDS_SDL_STATE_SET(adminMode);
break;
} /* End of switch(RTDS_currentContext->currentMessage->messageNumber) */
break;
case waitCode:
switch(RTDS_currentContext->currentMessage->messageNumber)
{
/* State waitCode - signal tCode */
case tCode:
Display(msgEnterCard, RTDS_currentContext);
RTDS_SDL_STATE_SET(idle);
break;
/* State waitCode - signal key */
case key:
lengthKey = RTDS_currentContext->currentMessage->dataLength;
pKey = RTDS_currentContext->currentMessage->pData;
*(pCodeId+lengthCodeId) = *pKey;
lengthCodeId++;
free(pKey);
if ( (lengthCodeId) == CODE_SIZE )
{
RTDS_RESET_TIMER(tCode);
Display(msgPleaseWait, RTDS_currentContext);
lenMsg = sizeof(tCardAndCode);
pCardAndCode = (tCardAndCode *) malloc(lenMsg);
pCardAndCode->cardLength = lengthCardId;
pCardAndCode->cardId = pCardId;
pCardAndCode->codeLength = lengthCodeId;
pCardAndCode->codeId = pCodeId;
if ( (mode) == (ADD_USER) )
{
RTDS_MSG_QUEUE_SEND_TO_NAME(AddUser, lenMsg, pCardAndCode, "pCentral");
RTDS_SDL_STATE_SET(waitCentral);
} /* End of if ( (mode) == (ADD_USER) ) */
else if ( (mode) == (NORMAL) )
{
RTDS_MSG_QUEUE_SEND_TO_NAME(CardAndCode, lenMsg, pCardAndCode, "pCentral");
RTDS_SDL_STATE_SET(waitCentral);
} /* End of if ( (mode) == (NORMAL) ) */
else if ( (mode) == (DELETE_USER) )
{
RTDS_MSG_QUEUE_SEND_TO_NAME(DeleteUser, lenMsg, pCardAndCode, "pCentral");
RTDS_SDL_STATE_SET(waitCentral);
} /* End of if ( (mode) == (DELETE_USER) ) */
} /* End of if ( (lengthCodeId) == CODE_SIZE ) */
else
{
DisplayStar(lengthCodeId, RTDS_currentContext);
RTDS_SDL_STATE_SET(waitCode);
} /* End of */
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 */
/* ********************************************************** */