diff --git a/src/arch/threadbase.h b/src/arch/threadbase.h index cf8a730b..3831beac 100644 --- a/src/arch/threadbase.h +++ b/src/arch/threadbase.h @@ -50,8 +50,13 @@ namespace forte { */ void start(); - /*! \brief Stops the execution of the thread + * + * This function immediately stops the execution of the thread (setting alive to false). + */ + void stop(); + + /*! \brief Stops the execution of the thread and waits for its end * * This function immediately stops the execution of the thread (setting alive to false) and waits till * this is finished. diff --git a/src/arch/threadbase.tpp b/src/arch/threadbase.tpp index df2162c5..51a2a302 100644 --- a/src/arch/threadbase.tpp +++ b/src/arch/threadbase.tpp @@ -42,14 +42,20 @@ void CThreadBase::start(){ } } +template +void CThreadBase::stop() { + if(nullHandle != mThreadHandle){ + setAlive(false); + mThreadHandle = nullHandle; //indicate that thread is in shutdownmode + } +} + template void CThreadBase::end() { CCriticalRegion criticalRegion(mThreadMutex); if(nullHandle != mThreadHandle){ - setAlive(false); + stop(); join(); - ThreadDeletePolicy::deleteThread(mThreadHandle); - mThreadHandle = nullHandle; } } @@ -65,10 +71,12 @@ template ::runThread(CThreadBase *paThread) { // if pointer is ok if (nullptr != paThread) { + TThreadHandle threadHandle = paThread->mThreadHandle; paThread->setAlive(true); paThread->run(); paThread->setAlive(false); paThread->mJoinSem.inc(); + ThreadDeletePolicy::deleteThread(threadHandle); } else { DEVLOG_ERROR("pThread pointer is 0!"); } diff --git a/src/arch/utils/mainparam_utils.cpp b/src/arch/utils/mainparam_utils.cpp index 71618463..2f5db977 100644 --- a/src/arch/utils/mainparam_utils.cpp +++ b/src/arch/utils/mainparam_utils.cpp @@ -16,6 +16,10 @@ #include #include +#ifdef FORTE_TRACE_CTF +#include +#endif + /*!\brief Lists the help for FORTE * */ diff --git a/src/arch/zephyr/forte_Init.h b/src/arch/zephyr/forte_Init.h index a783ac38..f26c6059 100644 --- a/src/arch/zephyr/forte_Init.h +++ b/src/arch/zephyr/forte_Init.h @@ -63,13 +63,13 @@ extern "C" { * @param paSignal Signal value to terminate instance * @param paInstance Instance to terminate */ - FORTE_SHARED_PREFIX void FORTE_SHARED_CALL forteStopInstance(int paSignal, TForteInstance* paResultInstance); + FORTE_SHARED_PREFIX void FORTE_SHARED_CALL forteStopInstance(int paSignal, TForteInstance paInstance); /** * \brief Terminates a Forte instance * @param paInstance Instance to terminate */ - FORTE_SHARED_PREFIX void FORTE_SHARED_CALL forteJoinInstance(TForteInstance* paResultInstance); + FORTE_SHARED_PREFIX void FORTE_SHARED_CALL forteJoinInstance(TForteInstance paInstance); /** * \brief Initializes the architecture. Prepare all resources needed by the Forte's instances. Must be called once before the first Forte instance is started diff --git a/src/core/basicfb.cpp b/src/core/basicfb.cpp index 3d7cd4db..8a95dfef 100644 --- a/src/core/basicfb.cpp +++ b/src/core/basicfb.cpp @@ -212,7 +212,7 @@ void CBasicFB::traceInstanceData() { barectf_default_trace_instanceData(getResource()->getTracePlatformContext().getContext(), getFBTypeName() ?: "null", - getInstanceName() ?: "null", + getFullQualifiedApplicationInstanceName('.').c_str() ?: "null", static_cast(inputs.size()), inputs_c_str.data(), static_cast(outputs.size()), outputs_c_str.data(), static_cast(internals.size()), internals_c_str.data(), diff --git a/src/core/datatypes/forte_any_string.h b/src/core/datatypes/forte_any_string.h index 83a5a2ef..485f83b4 100644 --- a/src/core/datatypes/forte_any_string.h +++ b/src/core/datatypes/forte_any_string.h @@ -87,7 +87,7 @@ class CIEC_ANY_STRING : public CIEC_ANY_CHARS { * * @return number of bytes that this string has allocated for use */ - TForteUInt16 getCapacity() const { + virtual TForteUInt16 getCapacity() const { return (nullptr != getGenData()) ? (*((TForteUInt16 *)(getGenData() + 2))) : static_cast(0); } diff --git a/src/core/datatypes/forte_string.h b/src/core/datatypes/forte_string.h index 6b884bd4..e29be138 100644 --- a/src/core/datatypes/forte_string.h +++ b/src/core/datatypes/forte_string.h @@ -182,6 +182,10 @@ class CIEC_STRING : public CIEC_ANY_STRING { return scmMaxStringLen; } + TForteUInt16 getCapacity() const override { + return static_cast(mValue.capacity()); + } + void reserve(const TForteUInt16 paRequestedSize) override; void assign(const char *paData, const TForteUInt16 paLen) override; diff --git a/src/core/ecet.cpp b/src/core/ecet.cpp index cba80ee1..38d4a834 100644 --- a/src/core/ecet.cpp +++ b/src/core/ecet.cpp @@ -98,7 +98,7 @@ void CEventChainExecutionThread::changeExecutionState(EMGMCommandType paCommand) clear(); [[fallthrough]]; case EMGMCommandType::Stop: - setAlive(false); //end thread in both cases + stop(); break; default: break; diff --git a/src/core/fbcontainer.h b/src/core/fbcontainer.h index 7b94e759..55946a50 100644 --- a/src/core/fbcontainer.h +++ b/src/core/fbcontainer.h @@ -21,6 +21,7 @@ class CFunctionBlock; class CDevice; +class CResource; namespace forte { namespace core { diff --git a/src/core/funcbloc.cpp b/src/core/funcbloc.cpp index f92298ba..40d7f274 100644 --- a/src/core/funcbloc.cpp +++ b/src/core/funcbloc.cpp @@ -367,7 +367,7 @@ void CFunctionBlock::readData(size_t paDINum, CIEC_ANY& paValue, const CDataConn paValue.toString(valueString.data(), valueString.capacity()); barectf_default_trace_inputData(this->getResource()->getTracePlatformContext().getContext(), getFBTypeName() ?: "null", - getInstanceName() ?: "null", + getFullQualifiedApplicationInstanceName('.').c_str() ?: "null", static_cast(paDINum), valueString.c_str()); } } @@ -393,7 +393,7 @@ void CFunctionBlock::writeData(size_t paDONum, CIEC_ANY& paValue, CDataConnectio paValue.toString(valueString.data(), valueString.capacity()); barectf_default_trace_outputData(this->getResource()->getTracePlatformContext().getContext(), getFBTypeName() ?: "null", - getInstanceName() ?: "null", + getFullQualifiedApplicationInstanceName('.').c_str() ?: "null", static_cast(paDONum), valueString.c_str()); } } @@ -696,7 +696,7 @@ void CFunctionBlock::traceInputEvent(TEventID paEIID){ if(barectf_is_tracing_enabled(getResource()->getTracePlatformContext().getContext())) { barectf_default_trace_receiveInputEvent(this->getResource()->getTracePlatformContext().getContext(), getFBTypeName() ?: "null", - getInstanceName() ?: "null", + getFullQualifiedApplicationInstanceName('.').c_str() ?: "null", static_cast(paEIID)); traceInstanceData(); } @@ -706,7 +706,7 @@ void CFunctionBlock::traceOutputEvent(TEventID paEOID){ if(barectf_is_tracing_enabled(getResource()->getTracePlatformContext().getContext())) { barectf_default_trace_sendOutputEvent(this->getResource()->getTracePlatformContext().getContext(), getFBTypeName() ?: "null", - getInstanceName() ?: "null", + getFullQualifiedApplicationInstanceName('.').c_str() ?: "null", static_cast(paEOID)); } } diff --git a/src/core/funcbloc.h b/src/core/funcbloc.h index 5923d1f5..5d96d26a 100644 --- a/src/core/funcbloc.h +++ b/src/core/funcbloc.h @@ -157,7 +157,7 @@ class CFunctionBlock { /*!\brief Returns the type name of this FB instance */ - const char * getFBTypeName(){ + const char * getFBTypeName() const { return CStringDictionary::getInstance().get(getFBTypeId()); } diff --git a/src/core/mgmcmdstruct.h b/src/core/mgmcmdstruct.h index 266857e0..de776cde 100644 --- a/src/core/mgmcmdstruct.h +++ b/src/core/mgmcmdstruct.h @@ -14,8 +14,9 @@ #define MGMCMDSTRUCT_H_ #include "mgmcmd.h" -#include "datatypes/forte_string.h" #include "utils/fixedcapvector.h" +#include "stringdict.h" +#include namespace forte { namespace core { @@ -70,7 +71,7 @@ namespace forte { /*!\brief Additional params needed by a MGM command (e.g., to return results of query commands) */ - CIEC_STRING mAdditionalParams; + std::string mAdditionalParams; /*\brief pointer to the ID to generate the correct response */ char *mID; diff --git a/src/core/monitoring.cpp b/src/core/monitoring.cpp index 5a08a6c5..bafb57f5 100644 --- a/src/core/monitoring.cpp +++ b/src/core/monitoring.cpp @@ -506,7 +506,7 @@ void CMonitoringHandler::appendEventWatch(std::string &paResponse, SEventWatchEn paResponse += "\"/>\n"s; } -void CMonitoringHandler::createFullFBName(CIEC_STRING &paFullName, forte::core::TNameIdentifier &paNameList){ +void CMonitoringHandler::createFullFBName(std::string &paFullName, forte::core::TNameIdentifier &paNameList){ for(forte::core::TNameIdentifier::CIterator runner(paNameList.begin()); runner != paNameList.end(); ++runner){ paFullName.append(CStringDictionary::getInstance().get(*runner)); if(!runner.isLastEntry()){ diff --git a/src/core/monitoring.h b/src/core/monitoring.h index 96808fd0..cf48c656 100644 --- a/src/core/monitoring.h +++ b/src/core/monitoring.h @@ -76,7 +76,7 @@ namespace forte { typedef CSinglyLinkedList TEventWatchList; struct SFBMonitoringEntry{ - CIEC_STRING mFullFBName; + std::string mFullFBName; CFunctionBlock *mFB; TDataWatchList mWatchedDataPoints; TEventWatchList mWatchedEventPoints; @@ -106,7 +106,7 @@ namespace forte { static void appendPortTag(std::string &paResponse, CStringDictionary::TStringId paPortId); void appendEventWatch(std::string &paResponse, SEventWatchEntry &paEventWatchEntry); - static void createFullFBName(CIEC_STRING &paFullName, forte::core::TNameIdentifier &paNameList); + static void createFullFBName(std::string &paFullName, forte::core::TNameIdentifier &paNameList); static size_t getExtraSizeForEscapedChars(const CIEC_ANY& paDataValue); diff --git a/src/core/resource.cpp b/src/core/resource.cpp index 19c6bcdc..48fcf58b 100644 --- a/src/core/resource.cpp +++ b/src/core/resource.cpp @@ -95,14 +95,14 @@ EMGMResponse CResource::executeMGMCommand(forte::core::SManagementCMD &paCommand break; case EMGMCommandType::CreateFBType: #ifdef FORTE_DYNAMIC_TYPE_LOAD - retVal = createFBTypeFromLua(paCommand.mFirstParam.front(), paCommand.mAdditionalParams.c_str()); + retVal = createFBTypeFromLua(paCommand.mFirstParam.front(), paCommand.mAdditionalParams); #else retVal = EMGMResponse::UnsupportedCmd; #endif break; case EMGMCommandType::CreateAdapterType: #ifdef FORTE_DYNAMIC_TYPE_LOAD - retVal = createAdapterTypeFromLua(paCommand.mFirstParam.front(), paCommand.mAdditionalParams.c_str()); + retVal = createAdapterTypeFromLua(paCommand.mFirstParam.front(), paCommand.mAdditionalParams); #else retVal = EMGMResponse::UnsupportedCmd; #endif @@ -164,18 +164,20 @@ EMGMResponse CResource::executeMGMCommand(forte::core::SManagementCMD &paCommand EMGMResponse CResource::changeFBExecutionState(EMGMCommandType paCommand){ EMGMResponse retVal = CFunctionBlock::changeFBExecutionState(paCommand); - if(EMGMResponse::Ready == retVal){ + if(retVal == EMGMResponse::Ready){ retVal = changeContainedFBsExecutionState(paCommand); - if(EMGMResponse::Ready == retVal){ - if(EMGMCommandType::Start == paCommand && nullptr != mInterfaceSpec) { //on start, sample inputs + if(retVal == EMGMResponse::Ready){ + if(paCommand == EMGMCommandType::Start && mInterfaceSpec != nullptr) { //on start, sample inputs for(TPortId i = 0; i < mInterfaceSpec->mNumDIs; ++i) { CDataConnection *conn = *getDIConUnchecked(i); - if(nullptr != conn) { + if(conn != nullptr) { conn->readData(*getDI(i)); } } + }else if(paCommand == EMGMCommandType::Reset){ + setInitialValues(); } - if(nullptr != mResourceEventExecution){ + if(mResourceEventExecution != nullptr){ // if we have a mResourceEventExecution handle it mResourceEventExecution->changeExecutionState(paCommand); } @@ -237,7 +239,7 @@ EMGMResponse CResource::deleteConnection(forte::core::TNameIdentifier &paSrcName return retVal; } -EMGMResponse CResource::writeValue(forte::core::TNameIdentifier &paNameList, const CIEC_STRING & paValue, bool paForce){ +EMGMResponse CResource::writeValue(forte::core::TNameIdentifier &paNameList, const std::string & paValue, bool paForce){ EMGMResponse retVal = EMGMResponse::NoSuchObject; CStringDictionary::TStringId portName = paNameList.back(); @@ -258,7 +260,7 @@ EMGMResponse CResource::writeValue(forte::core::TNameIdentifier &paNameList, con CIEC_ANY *const var = fb->getVar(&portName, 1); if(var != nullptr){ // 0 is not supported in the fromString method - if((paValue.length() > 0) && (paValue.length() == var->fromString(paValue.getStorage().c_str()))){ + if((paValue.length() > 0) && (static_cast(paValue.length()) == var->fromString(paValue.c_str()))){ //if we cannot parse the full value the value is not valid if(paForce){ var->setForced(true); @@ -267,6 +269,8 @@ EMGMResponse CResource::writeValue(forte::core::TNameIdentifier &paNameList, con //if we have got a connection it was a DO mirror the forced value there con->writeData(*var); } + }else{ + mInitialValues.emplace_back(*var, paValue); } retVal = EMGMResponse::Ready; }else{ @@ -277,49 +281,55 @@ EMGMResponse CResource::writeValue(forte::core::TNameIdentifier &paNameList, con return retVal; } -EMGMResponse CResource::readValue(forte::core::TNameIdentifier &paNameList, CIEC_STRING & paValue){ +void CResource::setInitialValues() { + CFunctionBlock::setInitialValues(); + for(auto it : mInitialValues){ + it.getIECVariable().fromString(it.getInitString().c_str()); + } +} + +EMGMResponse CResource::readValue(forte::core::TNameIdentifier &paNameList, std::string & paValue){ EMGMResponse retVal = EMGMResponse::NoSuchObject; CIEC_ANY *const var = getVariable(paNameList); - if(nullptr != var){ + if(var != nullptr){ + char *buffer = nullptr; int nUsedChars = -1; switch (var->getDataTypeID()){ case CIEC_ANY::e_WSTRING: { const size_t bufferSize = var->getToStringBufferSize() + forte::core::util::getExtraSizeForXMLEscapedChars(static_cast(*var).getValue()); - char *buffer = new char[bufferSize](); + buffer = new char[bufferSize](); nUsedChars = static_cast(*var).toUTF8(buffer, bufferSize, false); if(bufferSize != var->getToStringBufferSize() && 0 < nUsedChars) { //avoid re-running on strings which were already proven not to have any special character nUsedChars += static_cast(forte::core::util::transformNonEscapedToEscapedXMLText(buffer)); } - if(-1 < nUsedChars && static_cast(nUsedChars) < CIEC_STRING::scmMaxStringLen){ - paValue.assign(buffer, static_cast(nUsedChars)); + if(0 < nUsedChars){ + paValue += buffer; } - delete[] (buffer); break; } case CIEC_ANY::e_STRING: { const size_t bufferSize = var->getToStringBufferSize() + forte::core::util::getExtraSizeForXMLEscapedChars(static_cast(*var).getStorage().c_str()); - char *buffer = new char[bufferSize](); + buffer = new char[bufferSize](); nUsedChars = static_cast(*var).toUTF8(buffer, bufferSize, false); if(bufferSize != var->getToStringBufferSize() && 0 < nUsedChars) { //avoid re-running on strings which were already proven not to have any special character nUsedChars += static_cast(forte::core::util::transformNonEscapedToEscapedXMLText(buffer)); } - if(-1 < nUsedChars && static_cast(nUsedChars) < CIEC_STRING::scmMaxStringLen){ - paValue.assign(buffer, static_cast(nUsedChars)); + if(0 < nUsedChars){ + paValue += buffer; } - delete[] (buffer); break; } default: const size_t bufferSize = var->getToStringBufferSize(); - char *buffer = new char[bufferSize](); + buffer = new char[bufferSize](); nUsedChars = var->toString(buffer, sizeof(buffer)); - if(-1 < nUsedChars && static_cast(nUsedChars) < CIEC_STRING::scmMaxStringLen){ - paValue.assign(buffer, static_cast(nUsedChars)); + if(0 < nUsedChars){ + paValue += buffer; } - delete[] (buffer); break; } + delete[] (buffer); if(-1 != nUsedChars){ retVal = EMGMResponse::Ready; } @@ -332,39 +342,28 @@ EMGMResponse CResource::readValue(forte::core::TNameIdentifier &paNameList, CIEC #ifdef FORTE_SUPPORT_QUERY_CMD -EMGMResponse CResource::queryAllFBTypes(CIEC_STRING & paValue){ - EMGMResponse retVal = EMGMResponse::UnsupportedType; - - CTypeLib::CTypeEntry *fbTypeRunner = CTypeLib::getFBLibStart(); - if(fbTypeRunner != nullptr){ - retVal = EMGMResponse::Ready; - for(; fbTypeRunner != nullptr; fbTypeRunner = fbTypeRunner->mNext){ - paValue.append(CStringDictionary::getInstance().get(fbTypeRunner->getTypeNameId())); - if(fbTypeRunner->mNext != nullptr){ - paValue.append(", "); - } - } - } - return retVal; +EMGMResponse CResource::queryAllFBTypes(std::string & paValue){ + appedTypeNameList(paValue, CTypeLib::getFBLibStart()); + return EMGMResponse::Ready; } -EMGMResponse CResource::queryAllAdapterTypes(CIEC_STRING & paValue){ - EMGMResponse retVal = EMGMResponse::UnsupportedType; +EMGMResponse CResource::queryAllAdapterTypes(std::string & paValue){ + appedTypeNameList(paValue, CTypeLib::getAdapterLibStart()); + return EMGMResponse::Ready; +} - CTypeLib::CTypeEntry *adapterTypeRunner = CTypeLib::getAdapterLibStart(); - if(adapterTypeRunner != nullptr){ - retVal = EMGMResponse::Ready; - for(; adapterTypeRunner != nullptr; adapterTypeRunner = adapterTypeRunner->mNext){ - paValue.append(CStringDictionary::getInstance().get(adapterTypeRunner->getTypeNameId())); - if(adapterTypeRunner->mNext != nullptr){ - paValue.append(", "); +void CResource::appedTypeNameList(std::string & paValue, CTypeLib::CTypeEntry *paTypeListStart) { + if(paTypeListStart != nullptr) { + for(; paTypeListStart != nullptr; paTypeListStart = paTypeListStart->mNext) { + paValue += paTypeListStart->getTypeName(); + if(paTypeListStart->mNext != nullptr) { + paValue += ", "; } } } - return retVal; } -EMGMResponse CResource::queryFBs(CIEC_STRING & paValue){ +EMGMResponse CResource::queryFBs(std::string & paValue){ for(TFunctionBlockList::iterator itRunner = getFBList().begin(); itRunner != getFBList().end(); ++itRunner){ if(itRunner != getFBList().begin()){ @@ -377,7 +376,7 @@ EMGMResponse CResource::queryFBs(CIEC_STRING & paValue){ } -EMGMResponse CResource::querySubapps(CIEC_STRING & paValue, CFBContainer& container, const std::string prefix){ +EMGMResponse CResource::querySubapps(std::string & paValue, CFBContainer& container, const std::string prefix){ for(TFBContainerList::iterator itRunner(container.getSubContainerList().begin()); itRunner != container.getSubContainerList().end(); ++itRunner){ CFBContainer* subapp = (static_cast(*itRunner)); @@ -405,7 +404,7 @@ EMGMResponse CResource::querySubapps(CIEC_STRING & paValue, CFBContainer& contai return EMGMResponse::Ready; } -EMGMResponse CResource::queryConnections(CIEC_STRING & paReqResult, CFBContainer& container){ +EMGMResponse CResource::queryConnections(std::string & paReqResult, CFBContainer& container){ EMGMResponse retVal = EMGMResponse::UnsupportedType; for(TFunctionBlockList::iterator itRunner2 = container.getFBList().begin(); itRunner2 != container.getFBList().end(); ++itRunner2){ @@ -422,7 +421,7 @@ EMGMResponse CResource::queryConnections(CIEC_STRING & paReqResult, CFBContainer return retVal; } -void CResource::createEOConnectionResponse(const CFunctionBlock& paFb, CIEC_STRING& paReqResult){ +void CResource::createEOConnectionResponse(const CFunctionBlock& paFb, std::string& paReqResult){ const SFBInterfaceSpec * const spec = paFb.getFBInterfaceSpec(); if(spec->mNumEOs > 0){ for(size_t i = 0; spec->mEONames[i] != spec->mEONames[spec->mNumEOs]; i++){ @@ -437,7 +436,7 @@ void CResource::createEOConnectionResponse(const CFunctionBlock& paFb, CIEC_STRI } } -void CResource::createDOConnectionResponse(const CFunctionBlock& paFb, CIEC_STRING& paReqResult){ +void CResource::createDOConnectionResponse(const CFunctionBlock& paFb, std::string& paReqResult){ const SFBInterfaceSpec * const spec = paFb.getFBInterfaceSpec(); if(spec->mNumDOs > 0){ for(size_t i = 0; spec->mDONames[i] != spec->mDONames[spec->mNumDOs]; i++){ @@ -452,7 +451,7 @@ void CResource::createDOConnectionResponse(const CFunctionBlock& paFb, CIEC_STRI } } -void CResource::createAOConnectionResponse(const CFunctionBlock& paFb, CIEC_STRING& paReqResult){ +void CResource::createAOConnectionResponse(const CFunctionBlock& paFb, std::string& paReqResult){ const SFBInterfaceSpec * const spec = paFb.getFBInterfaceSpec(); if(spec->mNumAdapters > 0){ for(size_t i = 0; i < spec->mNumAdapters; i++){ @@ -473,16 +472,16 @@ void CResource::createAOConnectionResponse(const CFunctionBlock& paFb, CIEC_STRI } } -void CResource::createFBResponseMessage(const CFunctionBlock& paFb, const char* fullName, CIEC_STRING& paValue){ +void CResource::createFBResponseMessage(const CFunctionBlock& paFb, const char* fullName, std::string& paValue){ paValue.append(""); } void CResource::createConnectionResponseMessage(const CStringDictionary::TStringId srcId, const CStringDictionary::TStringId dstId, - const CFunctionBlock& paDstFb, const CFunctionBlock& paSrcFb, CIEC_STRING& paReqResult) const { + const CFunctionBlock& paDstFb, const CFunctionBlock& paSrcFb, std::string& paReqResult) const { paReqResult.append(""s); } -EMGMResponse CResource::createFBTypeResponseMessage(const CStringDictionary::TStringId paValue, CIEC_STRING & paReqResult){ +EMGMResponse CResource::createFBTypeResponseMessage(const CStringDictionary::TStringId paValue, std::string & paReqResult){ EMGMResponse retVal = EMGMResponse::UnsupportedType; CTypeLib::CFBTypeEntry* fbType = static_cast(CTypeLib::findType(paValue, CTypeLib::getFBLibStart())); if(nullptr != fbType){ @@ -527,7 +526,7 @@ EMGMResponse CResource::createFBTypeResponseMessage(const CStringDictionary::TSt return retVal; } -EMGMResponse CResource::createAdapterTypeResponseMessage(const CStringDictionary::TStringId paValue, CIEC_STRING & paReqResult){ +EMGMResponse CResource::createAdapterTypeResponseMessage(const CStringDictionary::TStringId paValue, std::string & paReqResult){ EMGMResponse retVal = EMGMResponse::UnsupportedType; CTypeLib::CAdapterTypeEntry* adapterType = static_cast(CTypeLib::findType(paValue, CTypeLib::getAdapterLibStart())); if(nullptr != adapterType){ @@ -536,7 +535,7 @@ EMGMResponse CResource::createAdapterTypeResponseMessage(const CStringDictionary return retVal; } -EMGMResponse CResource::createXTypeResponseMessage(const CTypeLib::CSpecTypeEntry* paTypeEntry, const CStringDictionary::TStringId paValue, EMGMResponse retVal, CIEC_STRING& paReqResult){ +EMGMResponse CResource::createXTypeResponseMessage(const CTypeLib::CSpecTypeEntry* paTypeEntry, const CStringDictionary::TStringId paValue, EMGMResponse retVal, std::string& paReqResult){ const SFBInterfaceSpec* paInterfaceSpec = paTypeEntry->getInterfaceSpec(); if(nullptr != paInterfaceSpec){ paReqResult.append("Name=\""); @@ -551,7 +550,7 @@ EMGMResponse CResource::createXTypeResponseMessage(const CTypeLib::CSpecTypeEnt return retVal; } -void CResource::createEventInterfaceResponseMessage(const SFBInterfaceSpec* paInterfaceSpec, CIEC_STRING& paReqResult){ +void CResource::createEventInterfaceResponseMessage(const SFBInterfaceSpec* paInterfaceSpec, std::string& paReqResult){ if(paInterfaceSpec->mNumEIs > 0){ paReqResult.append("\n "); createInterfaceResponseMessages(paReqResult, "Event", paInterfaceSpec->mEINames, nullptr, paInterfaceSpec->mNumEIs, paInterfaceSpec->mEIWith, paInterfaceSpec->mEIWithIndexes, paInterfaceSpec->mDINames); @@ -564,7 +563,7 @@ void CResource::createEventInterfaceResponseMessage(const SFBInterfaceSpec* paIn } } -void CResource::createDataInterfaceResponseMessage(const SFBInterfaceSpec* paInterfaceSpec, CIEC_STRING& paReqResult){ +void CResource::createDataInterfaceResponseMessage(const SFBInterfaceSpec* paInterfaceSpec, std::string& paReqResult){ if(paInterfaceSpec->mNumDIs > 0){ paReqResult.append("\n "); createInterfaceResponseMessages(paReqResult, "VarDeclaration", paInterfaceSpec->mDINames, paInterfaceSpec->mDIDataTypeNames, paInterfaceSpec->mNumDIs); @@ -577,20 +576,20 @@ void CResource::createDataInterfaceResponseMessage(const SFBInterfaceSpec* paInt } } -void CResource::createAdapterInterfaceResponseMessage(const SFBInterfaceSpec* paInterfaceSpec, CIEC_STRING& paReqResult){ +void CResource::createAdapterInterfaceResponseMessage(const SFBInterfaceSpec* paInterfaceSpec, std::string& paReqResult){ if(paInterfaceSpec->mNumAdapters > 0){ - CIEC_STRING sockets; - CIEC_STRING plugs; + std::string sockets; + std::string plugs; for(TPortId i = 0; i < paInterfaceSpec->mNumAdapters; i++){ if(paInterfaceSpec->mAdapterInstanceDefinition[i].mIsPlug){ const char *adapterName = CStringDictionary::getInstance().get(paInterfaceSpec->mAdapterInstanceDefinition[i].mAdapterNameID); const char *adapterTypeName = CStringDictionary::getInstance().get(paInterfaceSpec->mAdapterInstanceDefinition[i].mAdapterTypeNameID); - createInterfaceResponseMessage(plugs, "AdapterDeclaration", CIEC_STRING(adapterName, strlen(adapterName)), CIEC_STRING(adapterTypeName, strlen(adapterTypeName))); + createInterfaceResponseMessage(plugs, "AdapterDeclaration", adapterName, adapterTypeName); } else{ const char *adapterName = CStringDictionary::getInstance().get(paInterfaceSpec->mAdapterInstanceDefinition[i].mAdapterNameID); const char *adapterTypeName = CStringDictionary::getInstance().get(paInterfaceSpec->mAdapterInstanceDefinition[i].mAdapterTypeNameID); - createInterfaceResponseMessage(sockets, "AdapterDeclaration", CIEC_STRING(adapterName, strlen(adapterName)), CIEC_STRING(adapterTypeName, strlen(adapterTypeName))); + createInterfaceResponseMessage(sockets, "AdapterDeclaration", adapterName, adapterTypeName); } } if(!plugs.empty()){ @@ -606,24 +605,24 @@ void CResource::createAdapterInterfaceResponseMessage(const SFBInterfaceSpec* pa } } -void CResource::createInterfaceResponseMessages(CIEC_STRING &paReqResult, const char *paCommand, +void CResource::createInterfaceResponseMessages(std::string &paReqResult, const char *paCommand, const CStringDictionary::TStringId* paNameList, const CStringDictionary::TStringId* paTypeList, const TEventID paNumberOfElements, const TDataIOID* paEWith, const TForteInt16* paEWithIndexes, const CStringDictionary::TStringId* paDNameList){ for(TEventID nIndex = 0; nIndex < paNumberOfElements; nIndex++){ if(nullptr != paTypeList){ const char *name = CStringDictionary::getInstance().get(paNameList[nIndex]); const char *type = CStringDictionary::getInstance().get(paTypeList[nIndex]); - createInterfaceResponseMessage(paReqResult, paCommand, CIEC_STRING(name, strlen(name)), CIEC_STRING(type, strlen(type))); + createInterfaceResponseMessage(paReqResult, paCommand, name, type); } else{ const char *name = CStringDictionary::getInstance().get(paNameList[nIndex]); constexpr char event[] = "Event"; - createInterfaceResponseMessage(paReqResult, paCommand, CIEC_STRING(name, strlen(name)), CIEC_STRING(event, std::char_traits::length(event)), paEWith, paEWithIndexes, nIndex, paDNameList); + createInterfaceResponseMessage(paReqResult, paCommand, name, event, paEWith, paEWithIndexes, nIndex, paDNameList); } } } -void CResource::createInterfaceResponseMessage(CIEC_STRING& paReqResult, const char* paCommand, const CIEC_STRING& paName, const CIEC_STRING& paType, +void CResource::createInterfaceResponseMessage(std::string& paReqResult, const char* paCommand, const std::string& paName, const std::string& paType, const TDataIOID* paEWith, const TForteInt16* paEWithIndexes, const TEventID paIndex, const CStringDictionary::TStringId* paENameList) const { paReqResult.append("<"); paReqResult.append(paCommand); diff --git a/src/core/resource.h b/src/core/resource.h index ecaae3aa..6cb897e7 100644 --- a/src/core/resource.h +++ b/src/core/resource.h @@ -15,6 +15,8 @@ #ifndef _RESOURCE_H_ #define _RESOURCE_H_ +#include + #include "fbcontainer.h" #include "funcbloc.h" #include "forte_sync.h" @@ -101,7 +103,7 @@ class CResource : public CFunctionBlock, public forte::core::CFBContainer{ * @param paValue the value to be writen * @return response of the command execution as defined in IEC 61499 */ - virtual EMGMResponse writeValue(forte::core::TNameIdentifier &paNameList, const CIEC_STRING & paValue, bool paForce = false); + virtual EMGMResponse writeValue(forte::core::TNameIdentifier &paNameList, const std::string & paValue, bool paForce = false); #ifdef FORTE_SUPPORT_MONITORING forte::core::CMonitoringHandler &getMonitoringHandler(){ @@ -148,6 +150,29 @@ class CResource : public CFunctionBlock, public forte::core::CFBContainer{ return nullptr; } + class CInitialValue { + private: + CIEC_ANY& mIECVariable; + const std::string mInitString; + + public: + CInitialValue(CIEC_ANY& paVariable, std::string paInitString) : mIECVariable(paVariable), mInitString(std::move(paInitString)) {} + + [[nodiscard]] + const std::string& getInitString() const{ + return mInitString; + } + + CIEC_ANY& getIECVariable() { + return mIECVariable; + } + + }; + + std::vector mInitialValues; + + void setInitialValues() override; + /*! Wrapper for simplifying connection creation in resources * */ @@ -193,48 +218,50 @@ class CResource : public CFunctionBlock, public forte::core::CFBContainer{ * @param paValue the destination for the value to be read * @return response of the command execution as defined in IEC 61499 */ - EMGMResponse readValue(forte::core::TNameIdentifier &paNameList, CIEC_STRING & paValue); + EMGMResponse readValue(forte::core::TNameIdentifier &paNameList, std::string & paValue); #ifdef FORTE_SUPPORT_QUERY_CMD /*!\brief Read the existing fb types. * * @return response of the command execution as defined in IEC 61499 */ - static EMGMResponse queryAllFBTypes(CIEC_STRING& paValue); + static EMGMResponse queryAllFBTypes(std::string& paValue); /*!\brief Read the existing adapter types. * * @return response of the command execution as defined in IEC 61499 */ - static EMGMResponse queryAllAdapterTypes(CIEC_STRING& paValue); + static EMGMResponse queryAllAdapterTypes(std::string& paValue); + + static void appedTypeNameList(std::string & paValue, CTypeLib::CTypeEntry *paTypeListStart); /*!\brief Retrieve the list of FB instances * * @param paValue the result of the query * @return response of the command execution as defined in IEC 61499 */ - EMGMResponse queryFBs(CIEC_STRING& paValue); - void createFBResponseMessage(const CFunctionBlock& paFb, const char* fullName, CIEC_STRING& paValue); + EMGMResponse queryFBs(std::string& paValue); + void createFBResponseMessage(const CFunctionBlock& paFb, const char* fullName, std::string& paValue); - EMGMResponse querySubapps(CIEC_STRING& paValue, CFBContainer& container, std::string prefix); + EMGMResponse querySubapps(std::string& paValue, CFBContainer& container, std::string prefix); - EMGMResponse queryConnections(CIEC_STRING &paValue, CFBContainer& container); - void createEOConnectionResponse(const CFunctionBlock& paFb, CIEC_STRING& paReqResult); - void createDOConnectionResponse(const CFunctionBlock& paFb, CIEC_STRING& paReqResult); - void createAOConnectionResponse(const CFunctionBlock& paFb, CIEC_STRING& paReqResult); + EMGMResponse queryConnections(std::string &paValue, CFBContainer& container); + void createEOConnectionResponse(const CFunctionBlock& paFb, std::string& paReqResult); + void createDOConnectionResponse(const CFunctionBlock& paFb, std::string& paReqResult); + void createAOConnectionResponse(const CFunctionBlock& paFb, std::string& paReqResult); void createConnectionResponseMessage(const CStringDictionary::TStringId srcId, const CStringDictionary::TStringId dstId, const CFunctionBlock& paDstFb, - const CFunctionBlock& paFb, CIEC_STRING& paValue) const; - - EMGMResponse createFBTypeResponseMessage(const CStringDictionary::TStringId paValue, CIEC_STRING & paReqResult); - EMGMResponse createAdapterTypeResponseMessage(const CStringDictionary::TStringId paValue, CIEC_STRING & paReqResult); - EMGMResponse createXTypeResponseMessage(const CTypeLib::CSpecTypeEntry* paInterfaceSpec, const CStringDictionary::TStringId paValue, EMGMResponse retVal, CIEC_STRING& paReqResult); - void createEventInterfaceResponseMessage(const SFBInterfaceSpec* paInterfaceSpec, CIEC_STRING& paReqResult); - void createDataInterfaceResponseMessage(const SFBInterfaceSpec* paInterfaceSpec, CIEC_STRING& paReqResult); - void createAdapterInterfaceResponseMessage(const SFBInterfaceSpec* paInterfaceSpec, CIEC_STRING& paReqResult); - void createInterfaceResponseMessages(CIEC_STRING& paReqResult, const char *paCommand, const CStringDictionary::TStringId* paNameList, + const CFunctionBlock& paFb, std::string& paValue) const; + + EMGMResponse createFBTypeResponseMessage(const CStringDictionary::TStringId paValue, std::string & paReqResult); + EMGMResponse createAdapterTypeResponseMessage(const CStringDictionary::TStringId paValue, std::string & paReqResult); + EMGMResponse createXTypeResponseMessage(const CTypeLib::CSpecTypeEntry* paInterfaceSpec, const CStringDictionary::TStringId paValue, EMGMResponse retVal, std::string& paReqResult); + void createEventInterfaceResponseMessage(const SFBInterfaceSpec* paInterfaceSpec, std::string& paReqResult); + void createDataInterfaceResponseMessage(const SFBInterfaceSpec* paInterfaceSpec, std::string& paReqResult); + void createAdapterInterfaceResponseMessage(const SFBInterfaceSpec* paInterfaceSpec, std::string& paReqResult); + void createInterfaceResponseMessages(std::string& paReqResult, const char *paCommand, const CStringDictionary::TStringId* paNameList, const CStringDictionary::TStringId* paTypeList, const TEventID paNumberOfElements = 0, const TDataIOID* paEWith = nullptr, const TForteInt16* paEWithIndexes = nullptr, const CStringDictionary::TStringId* paDNameList = nullptr); - void createInterfaceResponseMessage(CIEC_STRING& paReqResult, const char* paCommand, const CIEC_STRING& paName, const CIEC_STRING& paType, + void createInterfaceResponseMessage(std::string& paReqResult, const char* paCommand, const std::string& paName, const std::string& paType, const TDataIOID* paEWith = nullptr, const TForteInt16* paEWithIndexes = nullptr, const TEventID paIndex = 0, const CStringDictionary::TStringId* paENameList = nullptr) const; diff --git a/src/core/typelib.h b/src/core/typelib.h index da6de3a3..02fc2d00 100644 --- a/src/core/typelib.h +++ b/src/core/typelib.h @@ -145,6 +145,8 @@ class CTypeLib{ virtual ~CTypeEntry(); CStringDictionary::TStringId getTypeNameId() const { return mTypeNameId; }; + + const char * getTypeName() const { return CStringDictionary::getInstance().get(getTypeNameId()); }; }; class CSpecTypeEntry : public CTypeEntry { diff --git a/src/modules/convert/GEN_STRUCT_DEMUX_fbt.cpp b/src/modules/convert/GEN_STRUCT_DEMUX_fbt.cpp index fc8bbead..b61def54 100644 --- a/src/modules/convert/GEN_STRUCT_DEMUX_fbt.cpp +++ b/src/modules/convert/GEN_STRUCT_DEMUX_fbt.cpp @@ -32,8 +32,8 @@ const CStringDictionary::TStringId GEN_STRUCT_DEMUX::scmDataInputNames[] = { g_n void GEN_STRUCT_DEMUX::executeEvent(TEventID paEIID, CEventChainExecutionThread *const paECET) { if(scmEventREQID == paEIID) { - for (size_t i = 0; i < st_IN().getStructSize(); i++){ - getDO(static_cast(i))->setValue(*st_IN().getMember(i)); + for (TPortId i = 0; i < st_IN().getStructSize(); i++){ + getDO(i)->setValue(*st_IN().getMember(i)); } sendOutputEvent(scmEventCNFID, paECET); } @@ -61,6 +61,25 @@ void GEN_STRUCT_DEMUX::writeOutputData(TEventID) { } } +bool GEN_STRUCT_DEMUX::initialize() { + if(CGenFunctionBlock::initialize()) { + copyStructValuesToOutputs(); + return true; + } + return false; +} + +void GEN_STRUCT_DEMUX::setInitialValues() { + CFunctionBlock::setInitialValues(); + copyStructValuesToOutputs(); +} + +void GEN_STRUCT_DEMUX::copyStructValuesToOutputs() { + for (TPortId i = 0; i < st_IN().getStructSize(); i++) { + getDO(i)->setValue(st_IN().getMember(i)->unwrap()); + } +} + bool GEN_STRUCT_DEMUX::createInterfaceSpec(const char *paConfigString, SFBInterfaceSpec &paInterfaceSpec) { bool retval = false; CStringDictionary::TStringId structTypeNameId = GEN_STRUCT_MUX::getStructNameId(paConfigString); diff --git a/src/modules/convert/GEN_STRUCT_DEMUX_fbt.h b/src/modules/convert/GEN_STRUCT_DEMUX_fbt.h index 1ebb402e..754aeed0 100644 --- a/src/modules/convert/GEN_STRUCT_DEMUX_fbt.h +++ b/src/modules/convert/GEN_STRUCT_DEMUX_fbt.h @@ -41,6 +41,10 @@ class GEN_STRUCT_DEMUX : public CGenFunctionBlock { return *static_cast(getDI(0)); } + bool initialize() override; + void setInitialValues() override; + void copyStructValuesToOutputs(); + public: GEN_STRUCT_DEMUX(const GEN_STRUCT_DEMUX &paOther) = delete; diff --git a/src/modules/convert/GEN_STRUCT_MUX_fbt.cpp b/src/modules/convert/GEN_STRUCT_MUX_fbt.cpp index e0c376af..3b589f2e 100644 --- a/src/modules/convert/GEN_STRUCT_MUX_fbt.cpp +++ b/src/modules/convert/GEN_STRUCT_MUX_fbt.cpp @@ -29,8 +29,8 @@ const CStringDictionary::TStringId GEN_STRUCT_MUX::scmDataOutputNames[] = { g_nS void GEN_STRUCT_MUX::executeEvent(TEventID paEIID, CEventChainExecutionThread *const paECET) { if(scmEventREQID == paEIID) { - for (size_t i = 0; i < st_OUT().getStructSize(); i++){ - st_OUT().getMember(i)->setValue(*getDI(static_cast(i))); + for (TPortId i = 0; i < st_OUT().getStructSize(); i++){ + st_OUT().getMember(i)->setValue(*getDI(i)); } sendOutputEvent(scmEventCNFID, paECET); } @@ -40,6 +40,25 @@ GEN_STRUCT_MUX::GEN_STRUCT_MUX(const CStringDictionary::TStringId paInstanceName CGenFunctionBlock(paContainer, paInstanceNameId){ } +void GEN_STRUCT_MUX::setInitialValues() { + CFunctionBlock::setInitialValues(); + copyStructValuesToInputs(); +} + +bool GEN_STRUCT_MUX::initialize() { + if (CGenFunctionBlock::initialize()) { + copyStructValuesToInputs(); + return true; + } + return false; +} + +void GEN_STRUCT_MUX::copyStructValuesToInputs() { + for (TPortId i = 0; i < st_OUT().getStructSize(); i++) { + getDI(i)->setValue(st_OUT().getMember(i)->unwrap()); + } +} + GEN_STRUCT_MUX::~GEN_STRUCT_MUX(){ if(nullptr!= mInterfaceSpec){ delete[](mInterfaceSpec->mDINames); diff --git a/src/modules/convert/GEN_STRUCT_MUX_fbt.h b/src/modules/convert/GEN_STRUCT_MUX_fbt.h index db38e9cd..59b2acde 100644 --- a/src/modules/convert/GEN_STRUCT_MUX_fbt.h +++ b/src/modules/convert/GEN_STRUCT_MUX_fbt.h @@ -41,6 +41,10 @@ class GEN_STRUCT_MUX : public CGenFunctionBlock { return *static_cast(getDO(0)); } + bool initialize() override; + void setInitialValues() override; + void copyStructValuesToInputs(); + public: GEN_STRUCT_MUX(const GEN_STRUCT_MUX &paOther) = delete; diff --git a/src/modules/reconfiguration/ST_SET_PARM_fbt.cpp b/src/modules/reconfiguration/ST_SET_PARM_fbt.cpp index a1a6b758..ac192f7c 100644 --- a/src/modules/reconfiguration/ST_SET_PARM_fbt.cpp +++ b/src/modules/reconfiguration/ST_SET_PARM_fbt.cpp @@ -84,7 +84,7 @@ void FORTE_ST_SET_PARM::executeRQST() { theCommand.mDestination = CStringDictionary::getInstance().getId(var_DST.getValue()); theCommand.mFirstParam.pushBack(CStringDictionary::getInstance().getId(var_ELEM_NAME.getValue())); theCommand.mFirstParam.pushBack(CStringDictionary::getInstance().getId(var_ELEM_DATA_IN.getValue())); - theCommand.mAdditionalParams = func_WSTRING_TO_STRING(var_PARM_VAL); + theCommand.mAdditionalParams = func_WSTRING_TO_STRING(var_PARM_VAL).getStorage(); theCommand.mCMD = EMGMCommandType::Write; EMGMResponse resp = getDevice()->executeMGMCommand(theCommand); diff --git a/src/stdfblib/ita/DEV_MGR.cpp b/src/stdfblib/ita/DEV_MGR.cpp index 7e1fdd04..2abe5576 100644 --- a/src/stdfblib/ita/DEV_MGR.cpp +++ b/src/stdfblib/ita/DEV_MGR.cpp @@ -176,7 +176,7 @@ bool DEV_MGR::parseXType(char *paRequestPartLeft, forte::core::SManagementCMD &p char* endOfRequest = strchr(paRequestPartLeft, '<'); *endOfRequest = '\0'; forte::core::util::transformEscapedXMLToNonEscapedText(paRequestPartLeft); - paCommand.mAdditionalParams = CIEC_STRING(paRequestPartLeft); + paCommand.mAdditionalParams = paRequestPartLeft; retVal = true; } } @@ -267,11 +267,10 @@ bool DEV_MGR::parseWriteConnectionData(char *paRequestPartLeft, forte::core::SMa return false; } *endOfSource = '\0'; - paCommand.mAdditionalParams = CIEC_STRING(paRequestPartLeft, strlen(paRequestPartLeft)); - char *addParams = new char[paCommand.mAdditionalParams.getStorage().length() + 1](); - strcpy(addParams, paCommand.mAdditionalParams.getStorage().c_str()); + char *addParams = new char[strlen(paRequestPartLeft) + 1](); + strcpy(addParams, paRequestPartLeft); forte::core::util::transformEscapedXMLToNonEscapedText(addParams); - paCommand.mAdditionalParams.assign(addParams, static_cast(strlen(addParams))); + paCommand.mAdditionalParams = addParams; delete[](addParams); *endOfSource = '"'; // restore the string paRequestPartLeft = strchr(endOfSource + 1, '\"'); @@ -382,13 +381,13 @@ void DEV_MGR::parseWriteData(char *paRequestPartLeft, forte::core::SManagementCM paCommand.mCMD = EMGMCommandType::MonitoringClearForce; } } else if ((2 == paCommand.mAdditionalParams.length()) && - (('$' == paCommand.mAdditionalParams.getStorage()[0]) && - (('e' == paCommand.mAdditionalParams.getStorage()[1]) ||('E' == paCommand.mAdditionalParams.getStorage()[1]) ))){ + (('$' == paCommand.mAdditionalParams[0]) && + (('e' == paCommand.mAdditionalParams[1]) ||('E' == paCommand.mAdditionalParams[1]) ))){ paCommand.mCMD = EMGMCommandType::MonitoringTriggerEvent; }else if ((3 == paCommand.mAdditionalParams.length()) && - (('$' == paCommand.mAdditionalParams.getStorage()[0]) && - (('e' == paCommand.mAdditionalParams.getStorage()[1]) ||('E' == paCommand.mAdditionalParams.getStorage()[1]) ) && - (('r' == paCommand.mAdditionalParams.getStorage()[2]) ||('R' == paCommand.mAdditionalParams.getStorage()[2]) ) )){ + (('$' == paCommand.mAdditionalParams[0]) && + (('e' == paCommand.mAdditionalParams[1]) ||('E' == paCommand.mAdditionalParams[1]) ) && + (('r' == paCommand.mAdditionalParams[2]) ||('R' == paCommand.mAdditionalParams[2]) ) )){ paCommand.mCMD = EMGMCommandType::MonitoringResetEventCount; }else #endif // FORTE_SUPPORT_MONITORING @@ -607,7 +606,7 @@ EMGMResponse DEV_MGR::parseAndExecuteMGMCommand(const char *const paDest, char * mCommand.mDestination = (strlen(paDest) != 0) ? CStringDictionary::getInstance().insert(paDest) : CStringDictionary::scmInvalidStringId; mCommand.mFirstParam.clear(); mCommand.mSecondParam.clear(); - if ( 255 <= mCommand.mAdditionalParams.getCapacity()) { + if ( 255 <= mCommand.mAdditionalParams.capacity()) { mCommand.mAdditionalParams.reserve(255); } mCommand.mID=nullptr; diff --git a/src/stdfblib/ita/OPCUA_MGR.cpp b/src/stdfblib/ita/OPCUA_MGR.cpp index b3b15a54..05bfa451 100644 --- a/src/stdfblib/ita/OPCUA_MGR.cpp +++ b/src/stdfblib/ita/OPCUA_MGR.cpp @@ -1280,7 +1280,7 @@ void OPCUA_MGR::setMGMCommand(EMGMCommandType paCMD, CStringDictionary::TStringI mCommand.mSecondParam.pushBack(CStringDictionary::getInstance().insert(paSecondParam)); } if (paAdditionalParams != nullptr) { - mCommand.mAdditionalParams = CIEC_STRING(paAdditionalParams); + mCommand.mAdditionalParams = paAdditionalParams; } } @@ -1301,7 +1301,7 @@ void OPCUA_MGR::setMGMCommand(EMGMCommandType paCMD, CStringDictionary::TStringI } } if (paAdditionalParams != nullptr) { - mCommand.mAdditionalParams = CIEC_STRING(paAdditionalParams); + mCommand.mAdditionalParams = paAdditionalParams; } } @@ -1322,4 +1322,4 @@ void OPCUA_MGR::parseDestinationName(const std::string& paDestination, std::vect index = dst.find_first_of("."); } paFbName.push_back(dst.substr(0, index)); -} \ No newline at end of file +}