/******************************************************************************* | |
* 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; | |
} |