blob: 2233f78332d16c747431e98596163680b0b905d7 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012 ACIN
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Alois Zoitl - initial API and implementation and/or initial documentation
*******************************************************************************/
#include <vxWorks.h>
#include <sysLib.h>
#include <inetLib.h>
#include <BeTypes.h>
#include <mtypes.h>
#include "fortemodule.h"
#include <fortenew.h>
#include "BE_RMT_DEV.h"
#include <forteinit.h>
#define MIO_VERS_LEN 24
#define FORTE_DELAY 25 // Access cycle time in ms
#define FORTE_C_PARMS "OwnParms" // Group in mconfig.ini
#define FORTE_C_DELAY "DelayTime" // Keyword in mconfig.ini
MLOCAL CHAR FORTE_Version[MIO_VERS_LEN] =
#include "forte.ver"
;
extern UINT32 FORTE_MemPart;
//--- Function definitions
MLOCAL VOID ExcHandler(SINT32 Signal);
MLOCAL VOID PanicHandler(UINT32 PanicMode);
//--- Forward declaration
class CFORTEModule;
//--- globals
CFORTEModule* g_poMainModule;
//--- SW-Module memory partition, needed for new operator
UINT32 FORTE_MemPart = 0;
/*--------------------------------------------------------------------------
* Desc: This function is the entry point to the module.
* After module loading this function will be called as part
* of the module handler.
* This function has to initialize the interfaces to the
* environment (SMI, SVI) so that they are ready to operate.
*
*
* InP: pConf Parameter for configuration (data from MCONFIG.INI).
* InP: pLoad Parameter from module loading.
* OutP:
*
* Ret: >0 Task-Id, module initialized correctly.
* <0 Error during initialization.
*-------------------------------------------------------------------------*/
extern "C" SINT32 forte_Init(MOD_CONF *pConf, MOD_LOAD *pLoad){
//--- store memory partition, needed for new operator
FORTE_MemPart = pConf->MemPart;
//--- Create new application class.
g_poMainModule = new CFORTEModule();
//--- Close application if an error is occurred.
if(g_poMainModule == NULL
)
return ERROR;
//--- Initialize software module.
SINT32 TaskId = g_poMainModule->Init(pConf, pLoad, CFORTEModule::MINVERS, CFORTEModule::MAXVERS, 10000, FORTE_Version, "FORTE", (VOIDFUNCPTR) PanicHandler, (VOIDFUNCPTR) ExcHandler);
//--- Close application if an error is occurred.
if(TaskId == ERROR)
SAFE_DELETE(g_poMainModule);
return TaskId;
}
/*--------------------------------------------------------------------------
* Desc: Handler for CPU exception signal if not in debug mode.
*
* InP: Signal Signal number (M_SIGEXCEPT)
* OutP:
*
* Ret:
*-------------------------------------------------------------------------*/
MLOCAL VOID ExcHandler(SINT32 Signal){
DEVLOG_INFO("%s: Signal %d received by task %x.", g_poMainModule->GetAppName(), Signal, taskIdSelf());
//--- Deinit application task and resources.
g_poMainModule->AppExcHandler(Signal);
}
/*--------------------------------------------------------------------------
* Desc: Handler for panic situation.
*
* InP: PanicMode Type of panic situation (SYS_APPPANIC, ...)
* OutP:
*
* Ret:
*-------------------------------------------------------------------------*/
MLOCAL VOID PanicHandler(UINT32 PanicMode){
// Bring critical parts to a predefined state. For example save
// data to NV-RAM or close open files.
//
// ATTENTION: Leave this function as fast as possible in order to
// give all other modules also the chance to work off
// there panic handler!
g_poMainModule->AppPanicHandler(PanicMode);
}
/*--------------------------------------------------------------------------
* Desc: Constructor of application class.
*
* InP:
* OutP:
*
* Ret:
*-------------------------------------------------------------------------*/
CFORTEModule::CFORTEModule() :
m_poDev(NULL){
forteInit::initForte();
}
/*--------------------------------------------------------------------------
* Desc: Destructor of application class.
*
* InP:
* OutP:
*
* Ret:
*-------------------------------------------------------------------------*/
CFORTEModule::~CFORTEModule(){
if(GetDebugLevel() & APP_DBG_INFO1)
DEVLOG_INFO("FORTE_mod: Destruct done.");
}
/*--------------------------------------------------------------------------
* Desc: This virtual function will be called as a part of the
forte_Init function after loading of the software module.
*
* InP:
* OutP:
*
* Ret: 0 Everything is Ok
* <0 Error occurred
*-------------------------------------------------------------------------*/
SINT32 CFORTEModule::AppEarlyInit(VOID){
return (0);
}
/*--------------------------------------------------------------------------
* Desc: This virtual function will be called after loading of the
* software module.
*
* InP:
* OutP:
*
* Ret: 0 Everything is Ok
* <0 Error occurred
*-------------------------------------------------------------------------*/
SINT32 CFORTEModule::AppInit(VOID){
m_unFORTEstartOK = 1;
//--- Add global variables for values that have to be exported via SVI.
if(GetSVIHandler().AddGlobVar("FORTEstart", SVI_F_INOUT | SVI_F_UINT32, 4, &(m_unFORTEstartOK), 0, 0) != OK){
DEVLOG_ERROR("FORTE_mod::APPINIT: Can't add SVI variable 'FORTEstart'!");
}
DEVLOG_INFO("appInit of forte\n");
if(0 == m_poDev){
m_poDev = new BE_RMT_DEV(*this);
DEVLOG_INFO("appInit after new BE_RMT_DEV");
}
//--- Read configuration file
CfgRead();
return (0);
}
/*--------------------------------------------------------------------------
* Desc: This virtual function will be called bevor the application will
* be removed.
*
* InP:
* OutP:
*
* Ret: 0 Everything ok
* <0 Error occurred
*-------------------------------------------------------------------------*/
SINT32 CFORTEModule::AppDeInit(VOID){
//--- Delete walking light class
SAFE_DELETE(m_poDev);
return (0);
}
/*--------------------------------------------------------------------------
* Desc: This virtual function will be called bevor the application will
* be removed.
*
* InP:
* OutP:
*
* Ret: 0 Everything ok
* <0 Error occurred
*-------------------------------------------------------------------------*/
SINT32 CFORTEModule::AppLateDeInit(VOID){
return (0);
}
/*--------------------------------------------------------------------------
* Desc: This virtual function will be called when the 'End of Init'
* signal will be sent by the system.
*
* InP:
* OutP:
*
* Ret: 0 Everything ok
* <0 Error occurred
*-------------------------------------------------------------------------*/
SINT32 CFORTEModule::AppEOI(VOID){
if(0 != m_poDev){
m_poDev->startDevice();
DEVLOG_INFO("m_poDev started\n");
}
else{
DEVLOG_ERROR("no m_poDev preset\n");
}
return (0);
}
/*--------------------------------------------------------------------------
* Desc: This is a dummy method which will be called when the signal
* 'stop' is received from the system.
*
* InP:
* OutP:
* Throws:
* Ret: OK Everything ok
* ERROR An error occurred
*-------------------------------------------------------------------------*/
SINT32 CFORTEModule::AppStop(VOID){
if(0 != m_poDev){
m_poDev->changeFBExecutionState(cg_nMGM_CMD_Stop);
}
return OK;
}
/*--------------------------------------------------------------------------
* Desc: This is a dummy method which will be called when the signal
* 'run' is received from the system.
*
* InP:
* OutP:
* Throws:
* Ret: OK Everything ok
* ERROR An error occurred
*-------------------------------------------------------------------------*/
SINT32 CFORTEModule::AppRun(VOID){
return OK;
}
/*--------------------------------------------------------------------------
* Desc: This virtual function will be called if a panic situation
* appears in the system.
*
* InP:
* OutP:
*
* Ret: 0 Everything ok
* <0 Error occurred
*-------------------------------------------------------------------------*/
VOID CFORTEModule::AppPanicHandler(UINT32 PanicMode){
sys_Printf("%s AppPanicHandler", GetAppName());
}
/*--------------------------------------------------------------------------
* Desc: This method handles the RPC call 'RpcNewCfg'.
*
* InP: pMsg Message data from RPC call.
* OutP:
* Throws:
* Ret:
*-------------------------------------------------------------------------*/
VOID CFORTEModule::RpcNewCfg(SMI_MSG *pMsg){
SMI_NEWCFG_R Reply;
if(GetModState() == RES_S_STOP || GetModState() == RES_S_RUN){
//--- Read configuration file
CfgRead();
Reply.RetCode = SMI_E_OK;
}
else
Reply.RetCode = SMI_E_FAILED;
smi_FreeData(pMsg);
smi_SendCReply(GetSmiID(), pMsg, SMI_E_OK, &Reply, sizeof(Reply));
}
/*---------------------------------------------------------------------------
* Desc: This function reads the configuration from the given
* configuration file.
*
* InP:
* OutP:
* Ret:
*--------------------------------------------------------------------------*/
VOID CFORTEModule::CfgRead(VOID){
//--- Get the delay time for my application.
pf_GetInt(GetAppName(), FORTE_C_PARMS, FORTE_C_DELAY, FORTE_DELAY, (SINT32 *) &m_unFORTEstartOK, GetCfgLine(), GetProfileName());
}