/******************************************************************* * \file dlna_app.c * * \brief This file provides dlna app modul implement . \n * * \note Copyright (c) 2010 Sunplus Technology Co., Ltd. \n * All rights reserved. * * \author hong.zhang@sunmedia.com.cn * ** Date Author Modification ** 2012/12/18 hong.zhang create *********************************************************************/ #define WFD_GUI_OBJECT_TABLE_DEFINE_HERE #include #include #include #include //#include #include "app_event.h" #include "app_infra/main_app.h" //#include "app_guiobj_share.h" #include "app_private_data.h" #include "app_infra/gobj_datastruct.h" #include "app_infra/sysapp_if.h" #include "app_infra/app_msg_filter.h" //#include "app_infra/gobj_if.h" //#include "app_infra/cbk_event.h" //#include "app_infra/sysapp_infra.h" //#include "app_infra/gobj_post_event.h" //#include "app_infra/ss_daemon.h" #include "sysapp_table.h" #include "wfd_app.h" #include "wfd_gobj_tbl.h" #include "wfd_app_gui_data.h" /*middleware related*/ #include "wfd/wfd_if.h" #include "wfd/wfd_core.h" /*UI related*/ #include "gui_engine.h" //#include "common_guiobj_dialog.h" //#include "COM_UI_strid.h" //#include "COM_UI_bitmap_config.h" //#include "COM_UI_region_config.h" //#include "COM_UI_palette_config.h" //#include "COM_UI_IDM_Popup_Dialog.h" //#include "app_show_logo.h" //#include "vpp_mixer_sel.h" #define WFD_DIAG_MENU_X 364 #define WFD_DIAG_MENU_Y 233 typedef enum { WFD_MENU_TIMEOUT_3S = 3, /*!< 3s timeout */ WFD_MENU_TIMEOUT_5S = 5, /*!< 5s timeout */ WFD_MENU_TIMEOUT_10S = 10, /*!< 10s timeout */ WFD_MENU_TIMEOUT_CLEAR = 255, /*!< CLEAR */ WFD_MENU_TIMEOUT_INFINITE = 65535, /*!< infinite timeout, means showing always */ WFD_MENU_TIMEOUT_NULL , } MenuTimeOut_e; typedef enum { WFD_DIAG_NONE = 0, WFD_DIAG_EXIT, WFD_DIAG_NETWORKERROR, WFD_DIAG_ANIMATION, WFD_DIAG_CONFIRM, WFD_DIAG_MAX , } WFDDIAG_TYPE_e; typedef struct WFD_UIData_t_ { RegionHandle_t hMenuReg; WinControl_t *pMenuWin; //DiagMenuData_t stDiagMenuResources; UINT32 dTimerCnt; WFDDIAG_TYPE_e eDiagType; } WFD_UIData_t; typedef struct WFDAppPrivateData_t_ { WFD_UIData_t stUIData; WFDAppGUIData_t stAPAppShareData; } WFDAppPrivateData_t; extern INT32 _MainApp_IsWFDSysAppRunning(void); /*********************Begin:UI related*************************/ /* static void _WFDDiag_SetTimeout(WFD_UIData_t *pstUIData, MenuTimeOut_e eTimeout) { switch (eTimeout) { case WFD_MENU_TIMEOUT_3S: pstUIData->dTimerCnt = 30; break; case WFD_MENU_TIMEOUT_5S: pstUIData->dTimerCnt = 50; break; case WFD_MENU_TIMEOUT_10S: pstUIData->dTimerCnt = 100; break; default: pstUIData->dTimerCnt = WFD_MENU_TIMEOUT_INFINITE; break; } } */ static INT32 _WFDDiag_Create(WFDAppPrivateData_t *pPrivData) { //UINT32 dRegIdx = 0; //INT32 sdRet = GUI_SUCCESS; WFD_UIData_t* pstUIData = NULL; wfd_app_trace(); if(!pPrivData) { wfd_app_printf("[%s] Input parameter error,pls check! [L:%d].\n", __FUNCTION__,__LINE__); return WFD_RET_FAIL; } pstUIData = &pPrivData->stUIData; pstUIData->eDiagType = WFD_DIAG_NONE; /* Get the region index and create the region */ /* sdRet = GEL_GetRegionIndex(&COM_UI_IDM_Popup_Dialog_window, &dRegIdx); if (sdRet != GUI_SUCCESS) { wfd_app_printf("%s Get region index error![Error code:%d].\n", __FUNCTION__,sdRet); return WFD_RET_FAIL; } sdRet = GEL_CreateRegion(COM_UI_region_info, dRegIdx, &(pstUIData->hMenuReg)); if (sdRet != GUI_SUCCESS) { wfd_app_printf("%s Create error![Error code:%d].\n", __FUNCTION__,sdRet); return WFD_RET_FAIL; } pstUIData->stDiagMenuResources.stDiagWarning = GL_MemAlloc(sizeof(WarnigMenuData_t)); if (!pstUIData->stDiagMenuResources.stDiagWarning) { wfd_app_printf("%s[L:%d] malloc error.\n", __FUNCTION__,__LINE__); return WFD_RET_FAIL; } pstUIData->stDiagMenuResources.stDiagAnimation = GL_MemAlloc(sizeof(AnimationMenuData_t)); if (!pstUIData->stDiagMenuResources.stDiagAnimation) { wfd_app_printf("%s[L:%d] malloc error.\n", __FUNCTION__,__LINE__); return WFD_RET_FAIL; } pstUIData->stDiagMenuResources.stDiagConfirm= GL_MemAlloc(sizeof(ConfirmMenuData_t)); if (!pstUIData->stDiagMenuResources.stDiagConfirm) { wfd_app_printf("%s[L:%d] malloc error.\n", __FUNCTION__,__LINE__); return WFD_RET_FAIL; } */ return WFD_RET_SUCCESS; } static INT32 _WFDDiag_Destory(WFDAppPrivateData_t *pPrivData) { INT32 sdRet = GUI_SUCCESS; WFD_UIData_t* pstUIData = NULL; wfd_app_trace(); if(!pPrivData) { wfd_app_printf("[%s] Input parameter error,pls check! [L:%d].\n", __FUNCTION__,__LINE__); return WFD_RET_FAIL; } pstUIData = &pPrivData->stUIData; //Diag_DestroyMenu(); if(pstUIData->hMenuReg) { sdRet = GEL_CloseRegion(pstUIData->hMenuReg); if (sdRet != GUI_SUCCESS) { wfd_app_printf("%s Close region error![Error code:%d].\n", __FUNCTION__,sdRet); return WFD_RET_FAIL; } } pstUIData->eDiagType = WFD_DIAG_NONE; /* if(pstUIData->stDiagMenuResources.stDiagWarning) { GL_MemFree(pstUIData->stDiagMenuResources.stDiagWarning); } if(pstUIData->stDiagMenuResources.stDiagAnimation) { GL_MemFree(pstUIData->stDiagMenuResources.stDiagAnimation); } if(pstUIData->stDiagMenuResources.stDiagConfirm) { GL_MemFree(pstUIData->stDiagMenuResources.stDiagConfirm); } */ return WFD_RET_SUCCESS; } /* static INT32 _WFDDiag_Confirm_OnClick(WFDAppPrivateData_t * pPrivData) { INT32 sdRet = GUI_OBJECT_POST_EVENT; wfd_app_trace(); switch (Diag_GetFocusConfirmButton()) { case CONFIRM_BUTTON_YES: wfd_app_printf("Confirm UI click Yes ,exit wfd!\n"); MAINAPP_SendGlobalEvent(UI_EVENT_SETUP,0); break; case CONFIRM_BUTTON_NO: wfd_app_printf("Confirm UI click No,Destory diag !\n"); _WFDDiag_Destory(pPrivData); break; default: wfd_app_error("%s diag module internal error.\n", __FUNCTION__); break; } return sdRet; } */ static INT32 _WFDDiag_Confirm_OnEvent(WFDAppPrivateData_t * pPrivData,UINT32 dEventID, UINT32 dParam) { UINT32 sdRet = GUI_OBJECT_NO_POST_ACTION; /* UINT32 sdUIRet = DIAG_MENU_SUCCESS; DiagMenuEvent_e dDiagEventMsg = DIAGMENU_EVENT_MAX; wfd_app_trace(); _WFDDiag_SetTimeout(&pPrivData->stUIData,WFD_MENU_TIMEOUT_5S); switch (dEventID) { case UI_EVENT_LEFT: dDiagEventMsg = DIAGMENU_EVENT_LEFT; break; case UI_EVENT_RIGHT: dDiagEventMsg = DIAGMENU_EVENT_RIGHT ; break; case UI_EVENT_ENTER: sdRet = _WFDDiag_Confirm_OnClick(pPrivData); break; default: wfd_app_printf("unknown ui event id : %d\n", dEventID); break; } //deal with diag confirm menu event if(dDiagEventMsg != DIAGMENU_EVENT_MAX) { sdUIRet = Diag_Confirm_UI_OnEvent(dDiagEventMsg); if(sdUIRet != DIAG_MENU_SUCCESS) { wfd_app_error("%s [L:%d]diag module internal error[Err code:%d].\n", __FUNCTION__,__LINE__,sdUIRet); } } */ return sdRet; } static INT32 _WFDDiag_Show_Confirm(WFDAppPrivateData_t *pPrivData) { //INT32 sdRet = GUI_SUCCESS; WFD_UIData_t* pstUIData = NULL; //ConfirmMenuData_t *pstConfirm; wfd_app_trace(); if(!pPrivData) { wfd_app_printf("[%s] Input parameter error,pls check! [L:%d].\n", __FUNCTION__,__LINE__); return WFD_RET_FAIL; } _WFDDiag_Create(pPrivData); pstUIData = &pPrivData->stUIData; if(!pstUIData->hMenuReg) { wfd_app_printf("%s[L:%d] Region haven't create!.\n", __FUNCTION__,__LINE__); return WFD_RET_FAIL; } /* pstConfirm = pstUIData->stDiagMenuResources.stDiagConfirm; if (!pstConfirm) { wfd_app_printf("%s[L:%d] stDiagConfirm structure haven't init!.\n", __FUNCTION__,__LINE__); return WFD_RET_FAIL; } if(pstUIData->eDiagType) { Diag_DestroyMenu(); } pstConfirm->ConfirmCaptionStrId = COM_UI_IDS_Warning; pstConfirm->ConfirmMsgStrId = COM_UI_IDS_String_Exit; pstConfirm->pConfirmBtnStrId[CONFIRM_BUTTON_YES] = COM_UI_IDS_Yes; pstConfirm->pConfirmBtnStrId[CONFIRM_BUTTON_NO] = COM_UI_IDS_No; if(Diag_CreateMenu(pstUIData->hMenuReg,(void*)pstConfirm,DIAG_MENU_CONFIRM,WFD_DIAG_MENU_X,WFD_DIAG_MENU_Y) == DIAG_MENU_SUCCESS) { _WFDDiag_SetTimeout(pstUIData,WFD_MENU_TIMEOUT_5S); sdRet = GEL_EnableRegion(pstUIData->hMenuReg, NULL); if (sdRet != GUI_SUCCESS) { wfd_app_printf("%s Enable region error![Error code:%d].\n", __FUNCTION__,sdRet); return WFD_RET_FAIL; } pstUIData->eDiagType = WFD_DIAG_CONFIRM; return WFD_RET_SUCCESS; } else*/ { return WFD_RET_FAIL; } } static INT32 _WFDDiag_Show_Warning(WFDAppPrivateData_t *pPrivData,WFDDIAG_TYPE_e eDiagType) { //INT32 sdRet = GUI_SUCCESS; WFD_UIData_t* pstUIData = NULL; //WarnigMenuData_t *pstWarning = NULL; wfd_app_trace(); if(!pPrivData) { wfd_app_printf("[%s] Input parameter error,pls check! [L:%d].\n", __FUNCTION__,__LINE__); return WFD_RET_FAIL; } _WFDDiag_Create(pPrivData); pstUIData = &pPrivData->stUIData; if(!pstUIData->hMenuReg) { wfd_app_printf("%s[L:%d] Region haven't create!.\n", __FUNCTION__,__LINE__); return WFD_RET_FAIL; } /* pstWarning = pstUIData->stDiagMenuResources.stDiagWarning; if (!pstWarning) { wfd_app_printf("%s[L:%d] stDiagWarning structure haven't init!.\n", __FUNCTION__,__LINE__); return WFD_RET_FAIL; } if(pstUIData->eDiagType) { Diag_DestroyMenu(); } switch(eDiagType) { case WFD_DIAG_NETWORKERROR: pstWarning->WarningCaptionStrId = STRING_ID_INVALID; pstWarning->WarningAffirmStrId = STRING_ID_INVALID; pstWarning->swWarningIconId = COM_UI_IDB_warningbmp; pstWarning->WarningMsgStrId = COM_UI_IDS_Network_Error; _WFDDiag_SetTimeout(pstUIData,WFD_MENU_TIMEOUT_3S); break; default: break; } if(Diag_CreateMenu(pstUIData->hMenuReg,(void*)pstWarning,DIAG_MENU_WARNING,WFD_DIAG_MENU_X,WFD_DIAG_MENU_Y) == DIAG_MENU_SUCCESS) { sdRet = GEL_EnableRegion(pstUIData->hMenuReg, NULL); if (sdRet != GUI_SUCCESS) { wfd_app_printf("%s Enable region error![Error code:%d].\n", __FUNCTION__,sdRet); return WFD_RET_FAIL; } pstUIData->eDiagType = eDiagType; return WFD_RET_SUCCESS; } else*/ { return WFD_RET_FAIL; } } static INT32 _WFDDiag_Show_Animation(WFDAppPrivateData_t *pPrivData) { //INT32 sdRet = GUI_SUCCESS; WFD_UIData_t* pstUIData = NULL; //AnimationMenuData_t *pstAnim = NULL; wfd_app_trace(); if(!pPrivData) { wfd_app_printf("[%s] Input parameter error,pls check! [L:%d].\n", __FUNCTION__,__LINE__); return WFD_RET_FAIL; } _WFDDiag_Create(pPrivData); pstUIData = &pPrivData->stUIData; if(!pstUIData->hMenuReg) { wfd_app_printf("%s[L:%d] Region haven't create!.\n", __FUNCTION__,__LINE__); return WFD_RET_FAIL; } /* pstAnim = pstUIData->stDiagMenuResources.stDiagAnimation; if (!pstAnim) { wfd_app_printf("%s[L:%d] stDiagWarning structure haven't init!.\n", __FUNCTION__,__LINE__); return WFD_RET_FAIL; } if(pstUIData->eDiagType) { Diag_DestroyMenu(); } pstAnim->AnimationCaptionStrId = COM_UI_IDS_Connecting; if(Diag_CreateMenu(pstUIData->hMenuReg,(void*)pstAnim,DIAG_MENU_ANIMATION,WFD_DIAG_MENU_X,WFD_DIAG_MENU_Y) == DIAG_MENU_SUCCESS) { _WFDDiag_SetTimeout(pstUIData,WFD_MENU_TIMEOUT_INFINITE); sdRet = GEL_EnableRegion(pstUIData->hMenuReg, NULL); if (sdRet != GUI_SUCCESS) { wfd_app_printf("%s Enable region error![Error code:%d].\n", __FUNCTION__,sdRet); return WFD_RET_FAIL; } pstUIData->eDiagType = WFD_DIAG_ANIMATION; return WFD_RET_SUCCESS; } else*/ { return WFD_RET_FAIL; } } /*********************End:UI related**************************/ INT32 WFD_App_CallbackFunc(WFD_CallbackType_e eCallbackType, UINT32 dParam) { UINT32 dMsgType = CBK_EVENT_MAX; wfd_app_printf("~~~~~~~~eCallbackType is [%d] ~~~~~dParam is [%d]\n", eCallbackType, dParam); switch (eCallbackType) { case WFD_CBK_SOURCE_KNOCK: { int sdRet = SYSTEM_APP_SUCCESFUL; sdRet = _MainApp_IsWFDSysAppRunning(); printf("_MainApp_IsWFDSysAppRunning sdRet[%d]",sdRet); if(sdRet == 0) { return SYSTEM_APP_ONRUN_FAILED; } else if(sdRet == 1) { MAINAPP_SendGlobalEvent(CBK_EVENT_WFD_SOURCE_KNOCK,dParam); return SYSTEM_APP_SUCCESFUL; } else if(sdRet == 2) { dMsgType = CBK_EVENT_WFD_SOURCE_KNOCK; } } break; case WFD_CBK_LINK_SUCCESS: dMsgType = CBK_EVENT_WFD_LINK_SUCCESS; break; case WFD_CBK_LINK_SUCCESS_NO_VIDEO: dMsgType = CBK_EVENT_WFD_LINK_SUCCESS_NO_VIDEO; break; case WFD_CBK_LINK_DISCONNECTED: dMsgType = CBK_EVENT_WFD_LINK_DISCONNECTED; break; case WFD_CBK_SOURCE_SOURCE_TEARDOWN: dMsgType = CBK_EVENT_WFD_SOURCE_TEARDOWN; break; default: break; } if (dMsgType) { //compile issue } //SYSAPP_IF_SendGlobalEvent(&stWFDAppInst, dMsgType, dParam); return SYSTEM_APP_SUCCESFUL; } INT32 WFD_App_OnCreate(void **ppPrivateData) { INT32 sdRet = WFD_RET_SUCCESS; WFDAppPrivateData_t *pPrivData = (WFDAppPrivateData_t *) GL_MemAlloc(sizeof(WFDAppPrivateData_t)); wfd_app_trace(); if (!pPrivData) { wfd_app_printf(" line : %d malloc memory error.\n", __LINE__); return WFD_RET_FAIL; } memset(pPrivData, 0x00, sizeof(WFDAppPrivateData_t)); //Assign pointer back to system application instance. *ppPrivateData = (void *)pPrivData; stWFDAppInst.bAppState = SYSTEM_IDLE; //WFD_Init_AP_CBKFunc((WFD_CBK_Func) WFD_App_CallbackFunc); return sdRet; } INT32 WFD_App_OnDestroy(void **ppPrivateData) { wfd_app_trace(); return WFD_RET_SUCCESS; } INT32 WFD_App_OnRun(void *pPrivateData, UINT32 dParam) { WFDAppPrivateData_t *pPrivData = (WFDAppPrivateData_t *) pPrivateData; wfd_app_trace(); if (!pPrivData) { wfd_app_printf(" line : %d Input parameter error!\n", __LINE__); return WFD_RET_FAIL; } /*Close screensaver here*/ //SSMON_IF_Stop(); _WFDDiag_Show_Animation(pPrivData); return WFD_RET_SUCCESS; } INT32 WFD_App_OnTerminate(void *pPrivateData, UINT32 dParam) { WFDAppPrivateData_t *pPrivData = (WFDAppPrivateData_t *) pPrivateData; wfd_app_trace(); if (!pPrivData) { wfd_app_printf(" line : %d Input parameter error!\n", __LINE__); return WFD_RET_FAIL; } //app_DisableSrcPlane(MID_OSD_LAYER); if(pPrivData->stUIData.eDiagType != WFD_DIAG_NONE) { _WFDDiag_Destory(pPrivData); } //destroy all guiobj if (SYSAPP_GOBJ_GUIObjectExist(stWFDAppInst.dSystemApplicationIndex, WFD_AUDIO_PLAYBACK)) { SYSAPP_GOBJ_DestroyGUIObject(stWFDAppInst.dSystemApplicationIndex, WFD_AUDIO_PLAYBACK); } //app_EnableSrcPlane(MID_OSD_LAYER); //WFD_MW_IF_Final(); /*Open screensaver here*/ //SSMON_IF_Start(); //APP_Show_Logo(LOGO_UI, LOGO_ONLY_BACKGRUND); return WFD_RET_SUCCESS; } INT32 WFD_App_OnTimerUpdate(void *pPrivateData) { WFDAppPrivateData_t *pPrivData = (WFDAppPrivateData_t *) pPrivateData; WFD_UIData_t* pstUIData = NULL; //wfd_app_trace(); if (!pPrivData) { wfd_app_printf(" line : %d Input parameter error!\n", __LINE__); return WFD_RET_FAIL; } pstUIData = &pPrivData->stUIData; if(pstUIData->eDiagType) { switch (pstUIData->dTimerCnt) { case WFD_MENU_TIMEOUT_CLEAR: break; default: pstUIData->dTimerCnt--; break; } if(!pstUIData->dTimerCnt) { if(pstUIData->eDiagType != WFD_DIAG_ANIMATION) { if(pstUIData->eDiagType == WFD_DIAG_NETWORKERROR) { //MAINAPP_SendGlobalEvent(UI_EVENT_SETUP,0); } _WFDDiag_Destory(pPrivData); } } } return WFD_RET_SUCCESS; } static void _WFDApp_OnReturn(WFDAppPrivateData_t * pPrivData) { _WFDDiag_Show_Confirm(pPrivData); } static void _WFDApp_OnCBKLinkSuccess(WFDAppPrivateData_t * pPrivData) { _WFDDiag_Destory(pPrivData); } static void _WFDApp_OnCBKLinkSuccessNoVideo(WFDAppPrivateData_t * pPrivData) { wfd_app_trace(); _WFDDiag_Destory(pPrivData); if (SYSTEM_APP_SUCCESS != SYSAPP_GOBJ_CreateGUIObject_WithPara( stWFDAppInst.dSystemApplicationIndex, WFD_AUDIO_PLAYBACK/*here may be audio/video/photo*/, (UINT32) &pPrivData->stAPAppShareData)) { wfd_app_error("%s Create audio playback guiobj error!\n", __FUNCTION__); } } static void _WFDApp_OnCBKLinkDisconnected(WFDAppPrivateData_t * pPrivData) { wfd_app_trace(); if(pPrivData->stUIData.eDiagType != WFD_DIAG_NETWORKERROR) { _WFDDiag_Show_Warning(pPrivData,WFD_DIAG_NETWORKERROR); } } static INT32 _WFDApp_OnPrivateEvent(WFDAppPrivateData_t * pPrivData, UINT32 dMessage, UINT32 dParam) { INT32 sdRet = WFD_RET_SUCCESS; wfd_app_trace(); if(pPrivData->stUIData.eDiagType == WFD_DIAG_CONFIRM) { _WFDDiag_Confirm_OnEvent(pPrivData,dMessage, dParam); return sdRet; } switch (dMessage) { case UI_EVENT_RETURN: _WFDApp_OnReturn(pPrivData); break; case CBK_EVENT_WFD_LINK_SUCCESS: _WFDApp_OnCBKLinkSuccess(pPrivData); break; case CBK_EVENT_WFD_LINK_SUCCESS_NO_VIDEO: _WFDApp_OnCBKLinkSuccessNoVideo(pPrivData); break; case CBK_EVENT_WFD_LINK_DISCONNECTED: _WFDApp_OnCBKLinkDisconnected(pPrivData); break; case CBK_EVENT_WFD_SOURCE_TEARDOWN: //MAINAPP_SendGlobalEvent(UI_EVENT_SETUP,0); break; default: /*unsupport ui event*/ if(dMessage < UI_EVENT_NULL) { wfd_app_printf("Unknown message received.\n"); //ShareGobj_IF_ShowHintMsg(HINT_MSG_INVALIDATE_KEY, HINT_MSG_TIMEOUT, MSG_PARAM_NULL); } break; } return sdRet; } static INT32 _WFDApp_OnPrivateFeedBackEvent(WFDAppPrivateData_t * pPrivData, UINT32 dMessage, UINT32 dParam) { INT32 sdRet = WFD_RET_SUCCESS; wfd_app_trace(); switch (dMessage) { default: wfd_app_printf("Unknown feedback message received.\n"); break; } return sdRet; } INT32 WFD_App_OnEvent(void *pPrivateData, UINT32 dMessage, UINT32 dParam) { WFDAppPrivateData_t *pPrivData = (WFDAppPrivateData_t *) pPrivateData; INT32 sdRet = WFD_RET_SUCCESS; wfd_app_trace(); if (!pPrivData) { wfd_app_printf(" line : %d Input parameter error!\n", __LINE__); return WFD_RET_FAIL; } switch (dMessage & GUIOBJ_MESSAGE_TYPE_MASK) { case SYSAPP_GLOBAL_EVENT_TYPE: sdRet = _WFDApp_OnPrivateEvent(pPrivData, (dMessage & GUIOBJ_MESSAGE_MASK), dParam); break; case GUIOBJ_FEEDBACK_EVENT_TYPE: sdRet = _WFDApp_OnPrivateFeedBackEvent(pPrivData, (dMessage & GUIOBJ_MESSAGE_MASK), dParam); break; default: wfd_app_printf(" Unknown message type received.\n"); break; } if (sdRet) { //compile issue } return WFD_RET_SUCCESS; } SysAppInstDef stWFDAppInst = { 0, //SYS_APP_WFD, WFD_App_OnCreate, WFD_App_OnDestroy, WFD_App_OnRun, WFD_App_OnTerminate, WFD_App_OnTimerUpdate, WFD_App_OnEvent, SYSTEM_IDLE, //system state. GUI_Obj_WFD_List, //GUI object table WFD_GUIOBJ_MAX, //GUI object table size NULL, //System Application Infrastructure (should not be modified) NULL //System Application private data (created in OnInitialize function) };