Files
FC1/CryNetwork/StateMachine.h
romkazvo 34d6c5d489 123
2023-08-07 19:29:24 +08:00

146 lines
3.2 KiB
C++

//////////////////////////////////////////////////////////////////////
//
// Crytek Network source code
//
// File: statemachine.h
// Description: state machine toolkit
//
// History:
// -July 25,2001:Created by Alberto Demichelis
//
//////////////////////////////////////////////////////////////////////
#ifndef _STATE_MACHINE_H_
#define _STATE_MACHINE_H_
#include <stdio.h>
#define ANY_SIGNAL_NOT_HANDLED 0xFFFFFFFF
#define ANY_SIGNAL_HANDLED 0x00000000
#define STATUS_BASE 0xFFFF0000
#define STATUS_IDLE STATUS_BASE
#define SIGNAL_BASE 0x00000000
#define TIMER_BASE 0x0000FFFF
#ifndef PS2
#define DEBUG_STRING(sss) ::OutputDebugString(sss);
#else
#define DEBUG_STRING(sss) cout << sss;
#endif
#define BEGIN_STATUS_MAP() void _ProcessSignal(unsigned int dwIncomingSignal,ULONG_PTR dwParam) \
{ \
if(HandleANY(dwIncomingSignal,dwParam)==ANY_SIGNAL_NOT_HANDLED) \
switch(m_dwStatus) \
{
#define STATUS_ENTRY( _signal , _handler ) case _signal : \
_handler(dwIncomingSignal,dwParam); \
break;
#define END_STATUS_MAP() default : \
::OutputDebugString("singal not handled\n"); \
break; \
}; \
} \
#define BEGIN_SIGNAL_HANDLER(signal) switch(signal){ \
#define IF_SIGNAL(signal) case signal:{
#define ENDIF_SIGNAL() } \
break; \
#define END_SIGNAL_HANDLER() default: \
_Trace("Signal not handled\n"); \
break; \
};
#define ANY_SIGNAL_EXCEPT(status){if(m_dwStatus==status){return ANY_SIGNAL_NOT_HANDLED;}}
#define BEGIN_ANY_SIGNAL_HANDLER(signal) switch(signal){
#define END_ANY_SIGNAL_HANDLER() default: \
DEBUG_STRING("ANY Signal not handled\n"); \
return ANY_SIGNAL_NOT_HANDLED; \
break; \
}; \
return ANY_SIGNAL_HANDLED;
class CStateMachine
{
protected:
virtual void _ProcessSignal(unsigned int dwIncomingSignal,ULONG_PTR dwParam)=0;
void SetTimer(unsigned int dwName,unsigned int dwElapsed)
{
m_dwTimerName=dwName;
m_dwTimerElapsed=dwElapsed;
m_dwTimerStart=::GetTickCount();
}
void ResetTimer()
{
m_dwTimerStart=0;
m_dwTimerElapsed=0;
m_dwTimerName=0;
}
void SetStatus(unsigned int dwStatus)
{
_TraceStatus(m_dwStatus);
_Trace(">>");
_TraceStatus(dwStatus);
_Trace("\n");
m_dwStatus=dwStatus;
}
virtual unsigned int HandleANY(unsigned int dwIncomingSignal,DWORD_PTR dwParam)
{
return ANY_SIGNAL_NOT_HANDLED;
}
virtual void OnSignal(unsigned int dwOutgoingSignal,DWORD_PTR dwParam)
{
NET_TRACE("WARNING default OnSignal called\n");
}
virtual void _Trace(char *s){};
virtual void _TraceStatus(unsigned int dwStatus){};
public:
CStateMachine()
{
m_dwStatus=0;
Reset();
}
virtual void Reset()
{
SetStatus(STATUS_IDLE);
ResetTimer();
}
BOOL Update(unsigned int dwIncomingSignal=0,DWORD_PTR dwParam=0)
{
if(m_dwTimerName)
if((::GetTickCount()-m_dwTimerStart)>=m_dwTimerElapsed)
{
unsigned int dwTimerName=m_dwTimerName;
ResetTimer();
_ProcessSignal(dwTimerName,0);
}
if(dwIncomingSignal)
{
_ProcessSignal(dwIncomingSignal,dwParam); // this pointer might be destroyed after this call
}
return TRUE;
}
unsigned int GetCurrentStatus(){return m_dwStatus;}
unsigned int m_dwStatus;
//
unsigned int m_dwTimerStart;
unsigned int m_dwTimerElapsed;
unsigned int m_dwTimerName;
};
#endif //_STATE_MACHINE_H_