Click here to Skip to main content
15,894,460 members
Articles / Programming Languages / Objective C

Running State Machine Based Win32/WinCE Programs

Rate me:
Please Sign up or sign in to vote.
4.37/5 (9 votes)
17 May 20065 min read 70.9K   1.3K   35  
This article describes how to run state machine application framework based Win32/WinCE programs using the window message hooking technology. (Open source project)
/*
FILE: Player.c/cpp
NOTE: The State Machine Wizard will add mapping macros between /*{{ and /*}}. Do NOT modify manually.
*/

#include "stdafx.h"

#include "sme.h"
#include "Player.h"
#include "PlayerEventId.h"
#include "SampleEVCDlg.h"
#include "SrvAgent.h"

SME_BEGIN_STATE_DEF(Player,Player)
	/*{{SME_STATE_DEF(Player,Player)*/
	SME_STATE_ENTRY_FUNC(PlayerEntry)
	SME_STATE_EXIT_FUNC(PlayerExit)
	/*}}SME_STATE_DEF*/
SME_END_STATE_DEF

SME_BEGIN_STATE_DEF(Player,PowerDown)
	/*{{SME_STATE_DEF(Player,PowerDown)*/
	SME_STATE_ENTRY_FUNC(PowerDownEntry)
	SME_STATE_EXIT_FUNC(PowerDownExit)
	SME_ON_EVENT(EXT_EVENT_ID_POWER,OnPowerDownEXT_EVENT_ID_POWER,PowerUp)
	/*}}SME_STATE_DEF*/
SME_END_STATE_DEF

SME_BEGIN_STATE_DEF(Player,PowerUp)
	/*{{SME_STATE_DEF(Player,PowerUp)*/
	SME_STATE_ENTRY_FUNC(PowerUpEntry)
	SME_STATE_EXIT_FUNC(PowerUpExit)
	SME_ON_EVENT(EXT_EVENT_ID_POWER,OnPowerUpEXT_EVENT_ID_POWER,PowerDown)
	/*}}SME_STATE_DEF*/
SME_END_STATE_DEF

SME_BEGIN_STATE_DEF(Player,Playing)
	/*{{SME_STATE_DEF(Player,Playing)*/
	SME_STATE_ENTRY_FUNC(PlayingEntry)
	SME_STATE_EXIT_FUNC(PlayingExit)
	SME_ON_EVENT(EXT_EVENT_ID_PAUSE_RESUME,OnPlayingEXT_EVENT_ID_PAUSE_RESUME,Pause)
	/*}}SME_STATE_DEF*/
SME_END_STATE_DEF

SME_BEGIN_STATE_DEF(Player,Pause)
	/*{{SME_STATE_DEF(Player,Pause)*/
	SME_STATE_ENTRY_FUNC(PauseEntry)
	SME_STATE_EXIT_FUNC(PauseExit)
	SME_ON_EVENT(EXT_EVENT_ID_PAUSE_RESUME,OnPauseEXT_EVENT_ID_PAUSE_RESUME,Playing)
	/*}}SME_STATE_DEF*/
SME_END_STATE_DEF

/*{{SME_STATE_STATETREE_SEPARATOR}}*/

SME_BEGIN_STATE_TREE_DEF(Player)
	/*{{SME_STATE_TREE_DEF(Player)*/
	SME_STATE(Player,Player,SME_INVALID_STATE,PowerDown)
	SME_STATE(Player,PowerDown,0,-1)
	SME_STATE(Player,PowerUp,0,Playing)
	SME_STATE(Player,Playing,PowerUp,-1)
	SME_STATE(Player,Pause,PowerUp,-1)
	/*}}SME_STATE_TREE_DEF*/
SME_END_STATE_TREE_DEF

/*{{SME_DEC_IMP_SEPARATOR}}*/

SME_APPLICATION_DEF(Player, "Player")

TCHAR * sStateMapping[] = 
{
	_T("Player"),
	_T("PowerDown"),
	_T("PowerUp"),
	_T("Playing"),
	_T("Pause"),
};

extern HWND g_hwndMain;

extern SME_THREAD_CONTEXT_T g_AppChildThreadContext;


int PlayerEntry(struct SME_APP_T *pApp, struct SME_EVENT_T *pEvent)
{
	if (g_hwndMain)
		::PostMessage(g_hwndMain, WM_STATE_UPDATE, pApp->nAppState,0);

	return 0;
}

int PlayerExit(struct SME_APP_T *pApp, struct SME_EVENT_T *pEvent)
{
	if (g_hwndMain)
		::PostMessage(g_hwndMain, WM_STATE_UPDATE, pApp->nAppState,0); 

	return 0;
}


int PowerDownEntry(struct SME_APP_T *pApp, struct SME_EVENT_T *pEvent)
{
	if (g_hwndMain)
		::PostMessage(g_hwndMain, WM_STATE_UPDATE, pApp->nAppState,0); 
	return 0;
}


int PowerDownExit(struct SME_APP_T *pApp, struct SME_EVENT_T *pEvent)
{
	if (g_hwndMain)
		::PostMessage(g_hwndMain,WM_STATE_UPDATE, pApp->nAppState,0); 
	return 0;
}


int PowerUpEntry(struct SME_APP_T *pApp, struct SME_EVENT_T *pEvent)
{
	if (g_hwndMain)
		::PostMessage(g_hwndMain,WM_STATE_UPDATE, pApp->nAppState,0); 
	return 0;
}


int PowerUpExit(struct SME_APP_T *pApp, struct SME_EVENT_T *pEvent)
{
	if (g_hwndMain)
		::PostMessage(g_hwndMain,WM_STATE_UPDATE, pApp->nAppState,0); 
	return 0;
}


int PlayingEntry(struct SME_APP_T *pApp, struct SME_EVENT_T *pEvent)
{
	if (g_hwndMain)
		::PostMessage(g_hwndMain,WM_STATE_UPDATE, pApp->nAppState,0); 
	// Post an event to another thread.
	// Start playing

	MfcSendExtIntEventToWnd(EVENT_PLAY_START, 0, 0, NULL, g_hwndMain);

	//SmePostExtThreadEvent(EVENT_PLAY_START, NULL, 0, NULL, &g_AppChildThreadContext);
	return 0;
}


int PlayingExit(struct SME_APP_T *pApp, struct SME_EVENT_T *pEvent)
{
	if (g_hwndMain)
		::PostMessage(g_hwndMain,WM_STATE_UPDATE, pApp->nAppState,0); 
	// Post an event to another thread
	// Stop playing
	//SmePostExtThreadEvent(EVENT_PLAY_STOP, NULL, 0, NULL, &g_AppChildThreadContext);
	MfcSendExtIntEventToWnd(EVENT_PLAY_STOP, 0, 0, NULL, g_hwndMain);
	return 0;
}


int PauseEntry(struct SME_APP_T *pApp, struct SME_EVENT_T *pEvent)
{
	if (g_hwndMain)
		::PostMessage(g_hwndMain,WM_STATE_UPDATE, pApp->nAppState,0); 
	return 0;
}


int PauseExit(struct SME_APP_T *pApp, struct SME_EVENT_T *pEvent)
{
	if (g_hwndMain)
		::PostMessage(g_hwndMain,WM_STATE_UPDATE, pApp->nAppState,0); 
	return 0;
}


int OnPowerDownEXT_EVENT_ID_POWER(struct SME_APP_T *pApp, struct SME_EVENT_T *pEvent)
{
	if (g_hwndMain)
		::PostMessage(g_hwndMain,WM_STATE_UPDATE, pApp->nAppState,0); 
	return 0;
}


int OnPlayingEXT_EVENT_ID_PAUSE_RESUME(struct SME_APP_T *pApp, struct SME_EVENT_T *pEvent)
{
	if (g_hwndMain)
		::PostMessage(g_hwndMain,WM_STATE_UPDATE, pApp->nAppState,0); 
	return 0;
}


int OnPauseEXT_EVENT_ID_PAUSE_RESUME(struct SME_APP_T *pApp, struct SME_EVENT_T *pEvent)
{
	if (g_hwndMain)
		::PostMessage(g_hwndMain,WM_STATE_UPDATE, pApp->nAppState,0); 
	return 0;
}


int OnPowerUpEXT_EVENT_ID_POWER(struct SME_APP_T *pApp, struct SME_EVENT_T *pEvent)
{
	if (g_hwndMain)
		::PostMessage(g_hwndMain,WM_STATE_UPDATE, pApp->nAppState,0); 
	return 0;
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.


Written By
Web Developer
China China
Jerome. (Free to speak, free to use.)

Comments and Discussions