blob: 7724e48c335b178e93df6acf2228d925bddc06c4 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2017-2018 fortiss GmbH
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Jose Cabral - initial API and implementation and/or initial documentation
*******************************************************************************/
#include "forte_instance.h"
#include "fortenew.h"
#include "forte_architecture.h"
#include <stdio.h>
#include <string>
#include "../../stdfblib/ita/RMT_DEV.h"
#include "../utils/mainparam_utils.h"
unsigned int forte_default_port = 61499;
/*!\brief Check if the correct endianess has been configured.
*
* If the right endianess is not set this function will end FORTE.
*/
bool checkEndianess();
void createDev(const char *pa_acMGRID, TForteInstance* pa_resultDevice);
void forteGlobalInitialize(void){
CForteArchitecture::initialize();
}
void forteGlobalDeinitialize(void){
CForteArchitecture::deinitialize();
}
int forteStartInstance(unsigned int pa_port, TForteInstance* pa_resultDevice){
if (65535 < pa_port){
return FORTE_WRONG_PARAMETERS;
}
if (0 == pa_port){
pa_port = forte_default_port;
}
char flag[] = "-c";
char address[16] = "localhost:";
char port[6];
sprintf(port, "%u", pa_port);
strcat(address, port);
char* arguments[] = {flag, address};
return forteStartInstanceGeneric(2, arguments, pa_resultDevice);
}
int forteStartInstanceGeneric(int argc, char *arg[], TForteInstance* pa_resultDevice){
if(!CForteArchitecture::isInitialized()){
return FORTE_ARCHITECTURE_NOT_READY;
}
if(0 == pa_resultDevice){
return FORTE_WRONG_PARAMETERS;
}
if (0 != *pa_resultDevice){
return FORTE_DEVICE_ALREADY_STARTED;
}
if (!checkEndianess()){
return FORTE_WRONG_ENDIANESS;
}
const char *pIpPort = parseCommandLineArguments(argc, arg);
if((0 != strlen(pIpPort)) && (NULL != strchr(pIpPort, ':'))){
createDev(pIpPort, pa_resultDevice);
}
else{ //! If needed call listHelp() to list the help for FORTE
return FORTE_WRONG_PARAMETERS;
}
return FORTE_OK;
}
void forteStopInstance(int pa_nSig, TForteInstance pa_resultDevice){
if(!CForteArchitecture::isInitialized()){
return;
}
(void) pa_nSig;
RMT_DEV *poDev = static_cast<RMT_DEV*>(pa_resultDevice);
if(0 != poDev){
poDev->changeFBExecutionState(cg_nMGM_CMD_Kill);
poDev->MGR.joinResourceThread();
DEVLOG_INFO("FORTE finished\n");
delete poDev;
}
}
/*!\brief Creates the Device-Object
* \param pa_acMGRID A string containing IP and Port like [IP]:[Port]
* \param The result
*/
void createDev(const char *pa_acMGRID, TForteInstance* pa_resultDevice){
RMT_DEV *poDev = new RMT_DEV;
poDev->setMGR_ID(pa_acMGRID);
poDev->startDevice();
*pa_resultDevice = poDev;
DEVLOG_INFO("FORTE is up and running\n");
}
bool checkEndianess(){
int i = 1;
char *p = (char *) &i;
if(p[0] == 1){
//we are on a little endian platform
#ifdef FORTE_BIG_ENDIAN
DEVLOG_ERROR("Wrong endianess configured! You are on a little endian platform and have configured big endian!\n");
return false;
#endif
}
else{
//we are on a big endian platform
#ifdef FORTE_LITTLE_ENDIAN
DEVLOG_ERROR("Wrong endianess configured! You are on a big endian platform and have configured little endian!\n");
return false;
#endif
}
return true;
}