blob: cb7603f9222a53b2025464f47f2db4aab3285b9b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016 - 2017 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:
* Ben Schneider
* - initial implementation and documentation
*******************************************************************************/
#include "ServiceCallManager.h"
#include "ROSManager.h"
#include <extevhandlerhelper.h>
#include "TRIGGER_SERVICE_CLIENT.h"
#ifdef FORTE_ENABLE_GENERATED_SOURCE_CPP
#include "TRIGGER_SERVICE_CLIENT_gen.cpp"
#endif
DEFINE_FIRMWARE_FB(FORTE_TRIGGER_SERVICE_CLIENT, g_nStringIdTRIGGER_SERVICE_CLIENT)
const CStringDictionary::TStringId FORTE_TRIGGER_SERVICE_CLIENT::scm_anDataInputNames[] = { g_nStringIdQI, g_nStringIdNAMESPACE, g_nStringIdSRVNAME };
const CStringDictionary::TStringId FORTE_TRIGGER_SERVICE_CLIENT::scm_anDataInputTypeIds[] = { g_nStringIdBOOL, g_nStringIdSTRING, g_nStringIdSTRING };
const CStringDictionary::TStringId FORTE_TRIGGER_SERVICE_CLIENT::scm_anDataOutputNames[] = { g_nStringIdQO, g_nStringIdSTATUS, g_nStringIdSUCCESS, g_nStringIdMESSAGE };
const CStringDictionary::TStringId FORTE_TRIGGER_SERVICE_CLIENT::scm_anDataOutputTypeIds[] = { g_nStringIdBOOL, g_nStringIdSTRING, g_nStringIdBOOL, g_nStringIdSTRING };
const TForteInt16 FORTE_TRIGGER_SERVICE_CLIENT::scm_anEIWithIndexes[] = { 0, 4 };
const TDataIOID FORTE_TRIGGER_SERVICE_CLIENT::scm_anEIWith[] = { 0, 1, 2, 255, 0, 255 };
const CStringDictionary::TStringId FORTE_TRIGGER_SERVICE_CLIENT::scm_anEventInputNames[] = { g_nStringIdINIT, g_nStringIdREQ };
const TDataIOID FORTE_TRIGGER_SERVICE_CLIENT::scm_anEOWith[] = { 0, 1, 255, 0, 1, 2, 3, 255 };
const TForteInt16 FORTE_TRIGGER_SERVICE_CLIENT::scm_anEOWithIndexes[] = { 0, 3, -1 };
const CStringDictionary::TStringId FORTE_TRIGGER_SERVICE_CLIENT::scm_anEventOutputNames[] = { g_nStringIdINITO, g_nStringIdCNF };
const SFBInterfaceSpec FORTE_TRIGGER_SERVICE_CLIENT::scm_stFBInterfaceSpec = { 2, scm_anEventInputNames, scm_anEIWith, scm_anEIWithIndexes, 2, scm_anEventOutputNames, scm_anEOWith, scm_anEOWithIndexes, 3, scm_anDataInputNames, scm_anDataInputTypeIds, 4, scm_anDataOutputNames, scm_anDataOutputTypeIds, 0, 0 };
void FORTE_TRIGGER_SERVICE_CLIENT::executeEvent(int pa_nEIID){
switch (pa_nEIID){
case scm_nEventINITID:
//initiate
if(!m_Initiated && QI()){
setEventChainExecutor(m_poInvokingExecEnv);
m_RosNamespace = getExtEvHandler<CROSManager>(*this).ciecStringToStdString(NAMESPACE());
m_RosMsgName = getExtEvHandler<CROSManager>(*this).ciecStringToStdString(SRVNAME());
m_nh = new ros::NodeHandle(m_RosNamespace);
m_triggerClient = m_nh->serviceClient < std_srvs::Trigger > (m_RosMsgName);
STATUS() = "Client waits for server";
getExtEvHandler<CServiceCallManager>(*this).queueConnectWait(this);
}
//terminate
else if(m_Initiated && !QI()){
m_nh->shutdown();
STATUS() = "Client terminated";
QO() = false;
m_Initiated = false;
sendOutputEvent(scm_nEventINITOID);
}
//silently ignore other cases
else{
STATUS() = "Unknown init command sequence";
sendOutputEvent(scm_nEventINITOID);
}
break;
case scm_nEventREQID:
//call service
if(m_Initiated && QI()){
STATUS() = "Request sent";
//add to queue
getExtEvHandler<CServiceCallManager>(*this).queueServiceCall(this);
}
//uninitialized or REQ-
else{
STATUS() = "Sending request not possible";
QO() = false;
sendOutputEvent(scm_nEventCNFID);
}
break;
case cg_nExternalEventID:
//waitForExistence returned
if(!m_Initiated){
m_Initiated = true;
STATUS() = "Client connected to server";
QO() = true;
sendOutputEvent(scm_nEventINITOID);
}
//call returned
else{
sendOutputEvent(scm_nEventCNFID);
}
break;
}
}
void FORTE_TRIGGER_SERVICE_CLIENT::callService(){
bool srv_success = m_triggerClient.call(m_srv);
SUCCESS() = m_srv.response.success;
MESSAGE() = getExtEvHandler<CROSManager>(*this).stdStringToCiecString(m_srv.response.message);
if(srv_success){
QO() = true;
STATUS() = "Response received";
}
else{
QO() = false;
STATUS() = "Receiving response failed";
SUCCESS() = false;
MESSAGE() = "failed";
}
getExtEvHandler<CServiceCallManager>(*this).startChain(this);
}
void FORTE_TRIGGER_SERVICE_CLIENT::waitForServer(){
if (!m_triggerClient.waitForExistence()){
DEVLOG_ERROR("[FORTE_TRIGGER_SERVICE_CLIENT] connection failed. Server not existing. \n");
}
else {
getExtEvHandler<CServiceCallManager>(*this).startChain(this);
}
}