You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
173 lines
2.4 KiB
173 lines
2.4 KiB
/*
|
|
|
|
TerminalManager source file. We will be using this class
|
|
|
|
as an example for Object Oriented Programming in C.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
#include "TerminalManager.h"
|
|
|
|
#include "Msg.h"
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
|
|
Terminal *TerminalManager_FindTerminal(TerminalManager *pMgr, int terminalId)
|
|
|
|
{
|
|
|
|
if (terminalId < MAX_TERMINALS)
|
|
|
|
{
|
|
|
|
return (&(pMgr->terminals[terminalId]));
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void TerminalManager_Construct(TerminalManager *pMgr)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
/*
|
|
|
|
C will not call construction functions, so loop through all call the
|
|
|
|
construction functions for all terminals.
|
|
|
|
*/
|
|
|
|
for (i=0; i < MAX_TERMINALS; i++)
|
|
|
|
{
|
|
|
|
Terminal_Construct(&(pMgr->terminals[i]));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void TerminalManager_Destroy(TerminalManager *pMgr)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
/*
|
|
|
|
C will not call destruction functions, so loop through all call the
|
|
|
|
destruction functions for all terminals.
|
|
|
|
*/
|
|
|
|
for (i=0; i < MAX_TERMINALS; i++)
|
|
|
|
{
|
|
|
|
Terminal_Destroy(&(pMgr->terminals[i]));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void TerminalManager_HandleMessage(TerminalManager *pMgr, Msg* pMsg)
|
|
|
|
{
|
|
|
|
int status, status1;
|
|
|
|
|
|
|
|
int terminalId = pMsg->terminalId;
|
|
|
|
|
|
|
|
Terminal *pTerm = TerminalManager_FindTerminal(pMgr, terminalId);
|
|
|
|
Terminal *pOtherTerm = NULL;
|
|
|
|
|
|
|
|
/*
|
|
|
|
Switch on the message type and invoke the Terminal's message handlers for
|
|
|
|
the terminal specified in the message. Here the terminal manager takes
|
|
|
|
care of indexing into the terminal structure and it passes the pointer
|
|
|
|
to the terminal handler functions. Due to this design, implementation
|
|
|
|
of the terminal handler functions just focus on handling the specified
|
|
|
|
terminal.
|
|
|
|
*/
|
|
|
|
if (pTerm != NULL)
|
|
|
|
{
|
|
|
|
switch (pMsg->msgType)
|
|
|
|
{
|
|
|
|
case CREATE_TERMINAL:
|
|
|
|
Terminal_Activate(pTerm, (const TerminalCreateMsg *)pMsg);
|
|
|
|
break;
|
|
|
|
case DELETE_TERMINAL:
|
|
|
|
Terminal_Deactivate(pTerm, (const TerminalDeleteMsg *) pMsg);
|
|
|
|
break;
|
|
|
|
case RUN_DIAGNOSTICS:
|
|
|
|
status = Terminal_HandleRunDiagnostics(pTerm, (const RunDiagnosticsMsg *) pMsg);
|
|
|
|
break;
|
|
|
|
case PERFORM_SWITCHOVER:
|
|
|
|
pOtherTerm = TerminalManager_FindTerminal(pMgr, pMsg->otherTerminalId);
|
|
|
|
status = Terminal_HandleOutOfService(pTerm);
|
|
|
|
status1 = Terminal_HandleInService(pOtherTerm);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
free(pMsg);
|
|
|
|
}
|