diff --git a/clients/opal/.project b/clients/opal/.project new file mode 100644 index 000000000..ee036a7d6 --- /dev/null +++ b/clients/opal/.project @@ -0,0 +1,12 @@ + + + s2ss_tests + + + + + + + com.opalrt.rtlab.ui.rtlabnature + + diff --git a/clients/opal/.settings/com.opalrt.rtlab.ui.application.prefs b/clients/opal/.settings/com.opalrt.rtlab.ui.application.prefs new file mode 100644 index 000000000..b62a22d66 --- /dev/null +++ b/clients/opal/.settings/com.opalrt.rtlab.ui.application.prefs @@ -0,0 +1,3 @@ +#Mon Jul 14 20:43:18 CEST 2014 +eclipse.preferences.version=1 +rtprojectfile=s2ss_tests.llp diff --git a/clients/opal/help/help.html b/clients/opal/help/help.html new file mode 100644 index 000000000..3e45c792a --- /dev/null +++ b/clients/opal/help/help.html @@ -0,0 +1,12 @@ + + +Demo Help: empty project +

Empty project

+ +

Create a new empty project

+ +

+Use this template to generate an empty project. This is the default template used when you do not choose any template. +

+ + \ No newline at end of file diff --git a/clients/opal/models/send_receive/AsyncIP.mk b/clients/opal/models/send_receive/AsyncIP.mk new file mode 100644 index 000000000..5af739955 --- /dev/null +++ b/clients/opal/models/send_receive/AsyncIP.mk @@ -0,0 +1,75 @@ +# Specify program name +PROGRAM = AsyncIP + +# Specify default values if we are not compiling from RT-LAB +TARGET_OPALRT_ROOT = /usr/opalrt + +# QNX v6.x +ifeq "$(SYSNAME)" "nto" + CC = gcc + LD = $(CC) + TARGET_LIB = -lsocket +endif + +# RedHawk Linux +ifeq "$(shell uname)" "Linux" + RTLAB_INTEL_COMPILER ?= 1 + + # Intel Compiler support + ifeq ($(RTLAB_INTEL_COMPILER),1) + CC = opicc + LD = opicpc + # Gnu Compiler support + else + CC = gcc + LD = g++ + INTEL_LIBS = -limf -lirc + endif + + # RedHat or RedHawk + LINUX_FLAVOR = $(shell uname -r | grep RedHawk) + ifneq "$(LINUX_FLAVOR) " " " ### Linux (RedHat) + RH_FLAGS = -D_GNU_SOURCE -D__redhawk__ + RH_LIBS = -lccur_rt + else + RH_FLAGS = -D_GNU_SOURCE + endif + + TARGET_LIB = -lpthread -lm -ldl -lutil -lrt $(RH_LIBS) $(INTEL_LIBS) +endif + +# Support for debugging symbols +ifeq ($(DEBUG),1) + CC_DEBUG_OPTS=-g -D_DEBUG + LD_DEBUG_OPTS=-g +else + CC_DEBUG_OPTS=-O + LD_DEBUG_OPTS= +endif + +INCLUDES = -I. +LIBPATH = -L. +CC_OPTS = +LD_OPTS = +OBJS = ${PROGRAM}.o Sched.o Interface.o Socket.o + +ADDLIB = -lOpalCore -lOpalUtils +LIBS = -lOpalAsyncApiCore $(ADDLIB) $(TARGET_LIB) + +CFLAGS = -c $(CC_OPTS) $(CC_DEBUG_OPTS) $(RH_FLAGS) $(INCLUDES) +LDFLAGS = $(LD_OPTS) $(LD_DEBUG_OPTS) $(LIBPATH) + +all: $(PROGRAM) + +install: + \mkdir -p $(TARGET_OPALRT_ROOT)/local + \chmod 755 $(TARGET_OPALRT_ROOT)/local + \cp -f $(PROGRAM) $(TARGET_OPALRT_ROOT)/local + +clean: + \rm -f $(OBJS) $(PROGRAM) + +$(PROGRAM): $(OBJS) + $(LD) $(LDFLAGS) -o $@ $(OBJS) $(LIBS) + chmod 777 $@ + @echo "### Created executable: $(PROGRAM)" diff --git a/clients/opal/models/send_receive/include/Config.h b/clients/opal/models/send_receive/include/Config.h new file mode 100644 index 000000000..dc5d2af80 --- /dev/null +++ b/clients/opal/models/send_receive/include/Config.h @@ -0,0 +1,14 @@ +/** Compiled-in settings + * + * @author Steffen Vogel + * @copyright 2014, Institute for Automation of Complex Power Systems, EONERC + * @file + */ + +#ifndef _CONFIG_H_ +#define _CONFIG_H_ + +#define PROGNAME "AsyncIP" +#define VERSION "0.1" + +#endif /* _CONFIG_H_ */ \ No newline at end of file diff --git a/clients/opal/models/send_receive/include/Interface.h b/clients/opal/models/send_receive/include/Interface.h new file mode 100644 index 000000000..6ed00a284 --- /dev/null +++ b/clients/opal/models/send_receive/include/Interface.h @@ -0,0 +1,13 @@ +/** OPAL Interface setup + * + * @author Steffen Vogel + * @copyright 2014, Institute for Automation of Complex Power Systems, EONERC + * @file + */ + +#ifndef _INTERFACE_H_ +#define _INTERFACE_H_ + +int if_setup(const char *op, const char *iface, const char *addr); + +#endif /* _INTERFACE_H_ */ diff --git a/clients/opal/models/send_receive/include/MsgFormat.h b/clients/opal/models/send_receive/include/MsgFormat.h new file mode 100644 index 000000000..4e081eb05 --- /dev/null +++ b/clients/opal/models/send_receive/include/MsgFormat.h @@ -0,0 +1,51 @@ +/** Message format + * + * @author Steffen Vogel + * @copyright 2014, Institute for Automation of Complex Power Systems, EONERC + * @file + */ + +#ifndef _MSG_FORMAT_H_ +#define _MSG_FORMAT_H_ + +#include + +/** Maximum number of dword values in a message */ +#define MSG_VALUES 16 +/** The current version number for the message format */ +#define MSG_VERSION 0 + +/** @todo Implement more message types */ +#define MSG_TYPE_DATA 0 +#define MSG_TYPE_START 1 +#define MSG_TYPE_STOP 2 + +/** Initialize a message */ +#define MSG_INIT(i) { \ + .version = MSG_VERSION, \ + .type = MSG_TYPE_DATA, \ + .length = i, \ + .sequence = 0 \ +} + +/** This message format is used by all clients + * + * @diafile msg_format.dia + **/ +struct msg +{ + /** The version specifies the format of the remaining message */ + unsigned version : 4; + /** Data or control message */ + unsigned type : 2; + /** These bits are reserved for future extensions */ + unsigned __padding : 2; + /** Number of valid dword values in msg::data[] */ + uint8_t length; + /** The sequence number gets incremented by one for consecutive messages */ + uint16_t sequence; + /** The message payload */ + float data[MSG_VALUES]; +} __attribute__((packed)); + +#endif /* _MSG_FORMAT_H_ */ diff --git a/clients/opal/models/send_receive/include/Sched.h b/clients/opal/models/send_receive/include/Sched.h new file mode 100644 index 000000000..a089febea --- /dev/null +++ b/clients/opal/models/send_receive/include/Sched.h @@ -0,0 +1,17 @@ +/** Configure Scheduler + * + * @author Steffen Vogel + * @author Mathieu DubĂ©-Dallaire + * @copyright 2014, Institute for Automation of Complex Power Systems, EONERC + * @copyright 2003, OPAL-RT Technologies inc + * @file + */ + +#ifndef _SCHED_H_ +#define _SCHED_H_ + +#define EOK 0 + +int AssignProcToCpu0(void); + +#endif /* _SCHED_H_ */ diff --git a/clients/opal/models/send_receive/include/Socket.h b/clients/opal/models/send_receive/include/Socket.h new file mode 100644 index 000000000..e45256821 --- /dev/null +++ b/clients/opal/models/send_receive/include/Socket.h @@ -0,0 +1,33 @@ +/** Helper functions for socket + * + * Code example of an asynchronous program. This program is started + * by the asynchronous controller and demonstrates how to send and + * receive data to and from the asynchronous icons and a UDP or TCP + * port. + * + * @author Steffen Vogel + * @author Mathieu Dubé-Dallaire + * @copyright 2014, Institute for Automation of Complex Power Systems, EONERC + * @copyright 2003, OPAL-RT Technologies inc + * @file + */ + +#ifndef _SOCKET_H_ +#define _SOCKET_H_ + +#define RT +#include "OpalGenAsyncParamCtrl.h" + +#define UDP_PROTOCOL 1 +#define TCP_PROTOCOL 2 +#define EOK 0 + +int InitSocket(Opal_GenAsyncParam_Ctrl IconCtrlStruct); + +int SendPacket(char* DataSend, int datalength); + +int RecvPacket(char* DataRecv, int datalength, double timeout); + +int CloseSocket(Opal_GenAsyncParam_Ctrl IconCtrlStruct); + +#endif /* _SOCKET_H_ */ diff --git a/clients/opal/models/send_receive/send_receive.llm b/clients/opal/models/send_receive/send_receive.llm new file mode 100644 index 000000000..a4c7a4035 --- /dev/null +++ b/clients/opal/models/send_receive/send_receive.llm @@ -0,0 +1,107 @@ +[EnvVars] +ABORT_COMPILE_WHEN_NO_BITSTREAM=0 +ACTION_AFTER_N_OVERRUNS=10 +ACTION_ON_OVERRUNS=0 +AcquisitionMemory=0,2500,24,100 +ActiveGroups=7/0/24/25/26/27/28/29/ +CACHEABLE_DMA_MEMORY_ACCESS=ON +COMM_RT=UDP/IP +ClockPeriodMode=Free-Clock +ClockPeriodTime=10 +DEBUG=0 +DETECT_OVERRUNS=ON +ENABLE_WATCHDOG=ON +EXT_CC_OPTS= +EXT_LD_OPTS= +EXT_LIB= +EXT_LIBPATH= +MODEL_PAUSE_TIME=0.000000 +MODEL_STOP_TIME=0.000000 +MONITORING=ON +MONITORING_BLOCK=OFF +MONITORING_DISPLAY=NEVER +MSG_PRECISION_FACTOR=0 +MaxDynamicSignals=2/0/100/24/100/ +NB_STEP_WITHOUT_OVERRUNS=10 +OPAL_DEBUG=OFF +OP_MATLABR2011B=1 +OS_COMPILE_RELEASE=2.6.29.6-opalrt-5 +PRINT_LOG_LEVEL=ALWAYS +RESET_IO_MISSING=ON +SYSNAME=linux +USER_INCS= +USER_SRCS= +WATCHDOG_TIMEOUT=5000 +[EnvVars_REDHAWK_DYN_1] +INTERNAL_IGN_SOURCE_FILE=sfun_gen_async_ctrl.c sfun_recv_async.c sfun_send_async.c +INTERNAL_LIBRARY2=-lOpalAsyncApiR2011b +INTERNAL_LIBRARY3=-lOpalAsyncApiCore +[ExtraPutFilesComp] +AsyncIP.mk=Ascii +include\Config.h=Ascii +include\Interface.h=Ascii +include\MsgFormat.h=Ascii +include\Sched.h=Ascii +include\Socket.h=Ascii +src\AsyncIP.c=Ascii +src\Interface.c=Ascii +src\Sched.c=Ascii +src\Socket.c=Ascii +[ExtraPutFilesComp_1_RT_LAB] +C:\OPAL-RT\RT-LAB\v10.5.9.356\common\lib\redhawk\libOpalAsyncApiCore.a=Binary +[General] +ATT_CHECKSUM1=3292912416 +ATT_CHECKSUM2=2957866115 +ATT_CHECKSUM3=2922744635 +ATT_CHECKSUM4=170288900 +ATT_CREATED_BY=jwu +ATT_CREATED_ON=Thu Apr 15 08:21:54 1999 +ATT_ENABLE_PTA=OFF +ATT_HANDLE_CONSOLE=ON +ATT_LAST_SAVED_BY=ACS +ATT_LAST_SAVED_ON=Mon Jul 14 21:00:08 2014 +ATT_REVISION=1.435 +AutoRetrieveFiles=ON +AutoRetrieveRtlab=ON +CompilerVersion=AUTOMATIC +DESCRIPTION= +DinamoFlag=OFF +FILENAME=D:\msv\svo\opal\s2ss_tests\models\send_receive\send_receive.mdl +FORCE_RECOMPILE=0 +IMPORTED_GLOBAL_VARIABLES=1 +LastCompileRtlabVersion=v10.5.9.356 +LastMatlabUsed=21 +LastMatlabUsedName=v7.13 +MATLAB_USED_IN_MODEL=21 +Name=send_receive +PRINT_CYCLE=OFF +PostBuildCmd= +PreBuildCmd= +QNX_LAST_COMPILE_VERSION= +RH64_LAST_COMPILE_VERSION= +RH_LAST_COMPILE_VERSION=2.6.29.6-opalrt-5 +ReportFileId= +RetrieveBuildTree=ON +RetrieveRootDir= +SimulationMode=2 +TLC=Automatic +TMF=Automatic +TRANSFERFILE_AT_LOAD=OFF +TargetCompileCmd=/usr/bin/make -f /usr/opalrt/common/bin/opalmodelmk +TargetPlatform=REDHAWK +TimeFactor=1.000000000000000 +TimeStep=0.000050000000000 +sc_consoleTimeStep=-1.000000000000000 +sm_modelTimeStep=0.000049999998737 +sm_send_receiveTimeStep=0.000049999998737 +[NodeMapping] +sm_model=ACS_OPAL_RT +sm_model_CORE_ASSIGNATION=1 +sm_model_CPU=-1 +sm_model_DEBUG=OFF +sm_model_XHP_ENABLE=FALSE +sm_send_receive=ACS_OPAL_RT +sm_send_receive_CORE_ASSIGNATION=1 +sm_send_receive_CPU=-1 +sm_send_receive_DEBUG=OFF +sm_send_receive_XHP_ENABLE=FALSE diff --git a/clients/opal/models/send_receive/send_receive.mdl b/clients/opal/models/send_receive/send_receive.mdl new file mode 100644 index 000000000..7451d0b8c --- /dev/null +++ b/clients/opal/models/send_receive/send_receive.mdl @@ -0,0 +1,1472 @@ +# $Revision: 1.1 $ +Model { + Name "send_receive" + Version 7.8 + MdlSubVersion 0 + GraphicalInterface { + NumRootInports 0 + NumRootOutports 0 + ParameterArgumentNames "" + ComputedModelVersion "1.435" + NumModelReferences 0 + NumTestPointedSignals 0 + } + SavedCharacterEncoding "windows-1252" + SaveDefaultBlockParams on + ScopeRefreshTime 0.035000 + OverrideScopeRefreshTime on + DisableAllScopes off + DataTypeOverride "UseLocalSettings" + DataTypeOverrideAppliesTo "AllNumericTypes" + MinMaxOverflowLogging "UseLocalSettings" + MinMaxOverflowArchiveMode "Overwrite" + FPTRunName "Run 1" + MaxMDLFileLineLength 120 + Created "Thu Apr 15 08:21:54 1999" + Creator "jwu" + UpdateHistory "UpdateHistoryNever" + ModifiedByFormat "%" + LastModifiedBy "ACS" + ModifiedDateFormat "%" + LastModifiedDate "Mon Jul 14 21:00:08 2014" + RTWModifiedTimeStamp 327272401 + ModelVersionFormat "1.%" + ConfigurationManager "none" + SampleTimeColors off + SampleTimeAnnotations off + LibraryLinkDisplay "none" + WideLines off + ShowLineDimensions on + ShowPortDataTypes off + ShowDesignRanges off + ShowLoopsOnError on + IgnoreBidirectionalLines off + ShowStorageClass off + ShowTestPointIcons on + ShowSignalResolutionIcons on + ShowViewerIcons on + SortedOrder off + ExecutionContextIcon off + ShowLinearizationAnnotations on + BlockNameDataTip off + BlockParametersDataTip on + BlockDescriptionStringDataTip off + ToolBar on + StatusBar on + BrowserShowLibraryLinks off + BrowserLookUnderMasks off + SimulationMode "normal" + LinearizationMsg "none" + Profile off + ParamWorkspaceSource "MATLABWorkspace" + AccelSystemTargetFile "accel.tlc" + AccelTemplateMakefile "accel_default_tmf" + AccelMakeCommand "make_rtw" + TryForcingSFcnDF off + RecordCoverage off + CovPath "/" + CovSaveName "covdata" + CovMetricSettings "dw" + CovNameIncrementing off + CovHtmlReporting on + CovForceBlockReductionOff on + covSaveCumulativeToWorkspaceVar on + CovSaveSingleToWorkspaceVar on + CovCumulativeVarName "covCumulativeData" + CovCumulativeReport off + CovReportOnPause on + CovModelRefEnable "Off" + CovExternalEMLEnable off + ExtModeBatchMode off + ExtModeEnableFloating on + ExtModeTrigType "manual" + ExtModeTrigMode "oneshot" + ExtModeTrigPort "1" + ExtModeTrigElement "any" + ExtModeTrigDuration 1000 + ExtModeTrigDurationFloating "auto" + ExtModeTrigHoldOff 0 + ExtModeTrigDelay 0 + ExtModeTrigDirection "rising" + ExtModeTrigLevel 0 + ExtModeArchiveMode "off" + ExtModeAutoIncOneShot off + ExtModeIncDirWhenArm off + ExtModeAddSuffixToVar off + ExtModeWriteAllDataToWs off + ExtModeArmWhenConnect off + ExtModeSkipDownloadWhenConnect off + ExtModeLogAll on + ExtModeAutoUpdateStatusClock on + BufferReuse off + ShowModelReferenceBlockVersion off + ShowModelReferenceBlockIO off + Array { + Type "Handle" + Dimension 1 + Simulink.ConfigSet { + $ObjectID 1 + Version "1.11.1" + Array { + Type "Handle" + Dimension 8 + Simulink.SolverCC { + $ObjectID 2 + Version "1.11.1" + StartTime "0.0" + StopTime "inf" + AbsTol "1e-6" + FixedStep "0.00005" + InitialStep "auto" + MaxNumMinSteps "-1" + MaxOrder 5 + ZcThreshold "auto" + ConsecutiveZCsStepRelTol "10*128*eps" + MaxConsecutiveZCs "1000" + ExtrapolationOrder 4 + NumberNewtonIterations 1 + MaxStep "0.01" + MinStep "auto" + MaxConsecutiveMinStep "1" + RelTol "1e-3" + SolverMode "SingleTasking" + ConcurrentTasks off + Solver "ode4" + SolverName "ode4" + SolverJacobianMethodControl "auto" + ShapePreserveControl "DisableAll" + ZeroCrossControl "UseLocalSettings" + ZeroCrossAlgorithm "Nonadaptive" + AlgebraicLoopSolver "TrustRegion" + SolverResetMethod "Fast" + PositivePriorityOrder off + AutoInsertRateTranBlk off + SampleTimeConstraint "Unconstrained" + InsertRTBMode "Whenever possible" + } + Simulink.DataIOCC { + $ObjectID 3 + Version "1.11.1" + Decimation "1" + ExternalInput "[]" + FinalStateName "xFinal" + InitialState "[]" + LimitDataPoints off + MaxDataPoints "1000" + LoadExternalInput off + LoadInitialState off + SaveFinalState off + SaveCompleteFinalSimState off + SaveFormat "Array" + SignalLoggingSaveFormat "ModelDataLogs" + SaveOutput off + SaveState off + SignalLogging on + DSMLogging on + InspectSignalLogs off + SaveTime off + ReturnWorkspaceOutputs off + StateSaveName "xout" + TimeSaveName "tout" + OutputSaveName "yout" + SignalLoggingName "sigsOut" + DSMLoggingName "dsmout" + OutputOption "RefineOutputTimes" + OutputTimes "[]" + ReturnWorkspaceOutputsName "out" + Refine "1" + } + Simulink.OptimizationCC { + $ObjectID 4 + Version "1.11.1" + Array { + Type "Cell" + Dimension 4 + Cell "ZeroExternalMemoryAtStartup" + Cell "ZeroInternalMemoryAtStartup" + Cell "NoFixptDivByZeroProtection" + Cell "OptimizeModelRefInitCode" + PropName "DisabledProps" + } + BlockReduction on + BooleanDataType off + ConditionallyExecuteInputs on + InlineParams off + UseIntDivNetSlope off + UseFloatMulNetSlope off + UseSpecifiedMinMax off + InlineInvariantSignals off + OptimizeBlockIOStorage off + BufferReuse off + EnhancedBackFolding off + StrengthReduction off + ExpressionFolding off + BooleansAsBitfields off + BitfieldContainerType "uint_T" + EnableMemcpy on + MemcpyThreshold 64 + PassReuseOutputArgsAs "Structure reference" + ExpressionDepthLimit 2147483647 + FoldNonRolledExpr off + LocalBlockOutputs off + RollThreshold 5 + SystemCodeInlineAuto off + StateBitsets off + DataBitsets off + UseTempVars off + ZeroExternalMemoryAtStartup on + ZeroInternalMemoryAtStartup on + InitFltsAndDblsToZero on + NoFixptDivByZeroProtection off + EfficientFloat2IntCast off + EfficientMapNaN2IntZero on + OptimizeModelRefInitCode off + LifeSpan "inf" + MaxStackSize "Inherit from target" + BufferReusableBoundary on + SimCompilerOptimization "Off" + AccelVerboseBuild off + AccelParallelForEachSubsystem on + } + Simulink.DebuggingCC { + $ObjectID 5 + Version "1.11.1" + RTPrefix "error" + ConsistencyChecking "none" + ArrayBoundsChecking "none" + SignalInfNanChecking "none" + SignalRangeChecking "none" + ReadBeforeWriteMsg "UseLocalSettings" + WriteAfterWriteMsg "UseLocalSettings" + WriteAfterReadMsg "UseLocalSettings" + AlgebraicLoopMsg "warning" + ArtificialAlgebraicLoopMsg "warning" + SaveWithDisabledLinksMsg "warning" + SaveWithParameterizedLinksMsg "none" + CheckSSInitialOutputMsg on + UnderspecifiedInitializationDetection "Classic" + MergeDetectMultiDrivingBlocksExec "none" + CheckExecutionContextPreStartOutputMsg off + CheckExecutionContextRuntimeOutputMsg off + SignalResolutionControl "TryResolveAllWithWarning" + BlockPriorityViolationMsg "warning" + MinStepSizeMsg "warning" + TimeAdjustmentMsg "none" + MaxConsecutiveZCsMsg "error" + MaskedZcDiagnostic "warning" + IgnoredZcDiagnostic "warning" + SolverPrmCheckMsg "none" + InheritedTsInSrcMsg "none" + DiscreteInheritContinuousMsg "warning" + MultiTaskDSMMsg "warning" + MultiTaskCondExecSysMsg "none" + MultiTaskRateTransMsg "error" + SingleTaskRateTransMsg "none" + TasksWithSamePriorityMsg "warning" + SigSpecEnsureSampleTimeMsg "warning" + CheckMatrixSingularityMsg "none" + IntegerOverflowMsg "warning" + Int32ToFloatConvMsg "warning" + ParameterDowncastMsg "error" + ParameterOverflowMsg "error" + ParameterUnderflowMsg "none" + ParameterPrecisionLossMsg "warning" + ParameterTunabilityLossMsg "warning" + FixptConstUnderflowMsg "none" + FixptConstOverflowMsg "none" + FixptConstPrecisionLossMsg "none" + UnderSpecifiedDataTypeMsg "none" + UnnecessaryDatatypeConvMsg "none" + VectorMatrixConversionMsg "none" + InvalidFcnCallConnMsg "error" + FcnCallInpInsideContextMsg "Use local settings" + SignalLabelMismatchMsg "none" + UnconnectedInputMsg "warning" + UnconnectedOutputMsg "warning" + UnconnectedLineMsg "warning" + SFcnCompatibilityMsg "none" + FrameProcessingCompatibilityMsg "warning" + UniqueDataStoreMsg "none" + BusObjectLabelMismatch "warning" + RootOutportRequireBusObject "warning" + AssertControl "UseLocalSettings" + EnableOverflowDetection off + ModelReferenceIOMsg "none" + ModelReferenceMultiInstanceNormalModeStructChecksumCheck "error" + ModelReferenceVersionMismatchMessage "none" + ModelReferenceIOMismatchMessage "none" + ModelReferenceCSMismatchMessage "none" + UnknownTsInhSupMsg "warning" + ModelReferenceDataLoggingMessage "warning" + ModelReferenceSymbolNameMessage "warning" + ModelReferenceExtraNoncontSigs "error" + StateNameClashWarn "warning" + SimStateInterfaceChecksumMismatchMsg "warning" + SimStateOlderReleaseMsg "error" + InitInArrayFormatMsg "warning" + StrictBusMsg "None" + BusNameAdapt "WarnAndRepair" + NonBusSignalsTreatedAsBus "none" + LoggingUnavailableSignals "error" + BlockIODiagnostic "none" + SFUnusedDataAndEventsDiag "warning" + SFUnexpectedBacktrackingDiag "warning" + SFInvalidInputDataAccessInChartInitDiag "warning" + SFNoUnconditionalDefaultTransitionDiag "warning" + SFTransitionOutsideNaturalParentDiag "warning" + SFUnconditionalTransitionShadowingDiag "warning" + } + Simulink.HardwareCC { + $ObjectID 6 + Version "1.11.1" + ProdBitPerChar 8 + ProdBitPerShort 16 + ProdBitPerInt 32 + ProdBitPerLong 32 + ProdBitPerFloat 32 + ProdBitPerDouble 64 + ProdBitPerPointer 32 + ProdLargestAtomicInteger "Char" + ProdLargestAtomicFloat "None" + ProdIntDivRoundTo "Undefined" + ProdEndianess "Unspecified" + ProdWordSize 32 + ProdShiftRightIntArith on + ProdHWDeviceType "32-bit Generic" + TargetBitPerChar 8 + TargetBitPerShort 16 + TargetBitPerInt 32 + TargetBitPerLong 32 + TargetBitPerFloat 32 + TargetBitPerDouble 64 + TargetBitPerPointer 32 + TargetLargestAtomicInteger "Char" + TargetLargestAtomicFloat "None" + TargetShiftRightIntArith on + TargetIntDivRoundTo "Undefined" + TargetEndianess "Unspecified" + TargetWordSize 32 + TargetTypeEmulationWarnSuppressLevel 0 + TargetPreprocMaxBitsSint 32 + TargetPreprocMaxBitsUint 32 + TargetHWDeviceType "Specified" + TargetUnknown on + ProdEqTarget on + } + Simulink.ModelReferenceCC { + $ObjectID 7 + Version "1.11.1" + UpdateModelReferenceTargets "IfOutOfDateOrStructuralChange" + CheckModelReferenceTargetMessage "error" + EnableParallelModelReferenceBuilds off + ParallelModelReferenceErrorOnInvalidPool on + ParallelModelReferenceMATLABWorkerInit "None" + ModelReferenceNumInstancesAllowed "Multi" + PropagateVarSize "Infer from blocks in model" + ModelReferencePassRootInputsByReference on + ModelReferenceMinAlgLoopOccurrences off + PropagateSignalLabelsOutOfModel off + SupportModelReferenceSimTargetCustomCode off + } + Simulink.SFSimCC { + $ObjectID 8 + Version "1.11.1" + SFSimEnableDebug on + SFSimOverflowDetection on + SFSimEcho on + SimBlas on + SimCtrlC on + SimExtrinsic on + SimIntegrity on + SimUseLocalCustomCode off + SimParseCustomCode on + SimBuildMode "sf_incremental_build" + } + Simulink.RTWCC { + $BackupClass "Simulink.RTWCC" + $ObjectID 9 + Version "1.11.1" + Array { + Type "Cell" + Dimension 1 + Cell "IncludeHyperlinkInReport" + PropName "DisabledProps" + } + SystemTargetFile "grt.tlc" + GenCodeOnly off + MakeCommand "make_rtw" + GenerateMakefile on + TemplateMakefile "grt_default_tmf" + GenerateReport off + SaveLog off + RTWVerbose on + RetainRTWFile off + ProfileTLC off + TLCDebug off + TLCCoverage off + TLCAssert off + ProcessScriptMode "Default" + ConfigurationMode "Optimized" + ConfigAtBuild off + RTWUseLocalCustomCode off + RTWUseSimCustomCode off + IncludeHyperlinkInReport off + LaunchReport off + TargetLang "C" + IncludeBusHierarchyInRTWFileBlockHierarchyMap off + IncludeERTFirstTime on + GenerateTraceInfo off + GenerateTraceReport off + GenerateTraceReportSl off + GenerateTraceReportSf off + GenerateTraceReportEml off + GenerateCodeInfo off + GenerateSLWebview off + GenerateCodeMetricsReport off + RTWCompilerOptimization "Off" + CheckMdlBeforeBuild "Off" + CustomRebuildMode "OnUpdate" + Array { + Type "Handle" + Dimension 2 + Simulink.CodeAppCC { + $ObjectID 10 + Version "1.11.1" + Array { + Type "Cell" + Dimension 16 + Cell "IgnoreCustomStorageClasses" + Cell "InsertBlockDesc" + Cell "SFDataObjDesc" + Cell "SimulinkDataObjDesc" + Cell "DefineNamingRule" + Cell "SignalNamingRule" + Cell "ParamNamingRule" + Cell "InlinedPrmAccess" + Cell "CustomSymbolStr" + Cell "CustomSymbolStrGlobalVar" + Cell "CustomSymbolStrType" + Cell "CustomSymbolStrField" + Cell "CustomSymbolStrFcn" + Cell "CustomSymbolStrBlkIO" + Cell "CustomSymbolStrTmpVar" + Cell "CustomSymbolStrMacro" + PropName "DisabledProps" + } + ForceParamTrailComments off + GenerateComments on + IgnoreCustomStorageClasses off + IgnoreTestpoints off + IncHierarchyInIds off + MaxIdLength 31 + PreserveName off + PreserveNameWithParent off + ShowEliminatedStatement on + IncAutoGenComments off + SimulinkDataObjDesc off + SFDataObjDesc off + MATLABFcnDesc off + IncDataTypeInIds off + MangleLength 1 + CustomSymbolStrGlobalVar "$R$N$M" + CustomSymbolStrType "$N$R$M" + CustomSymbolStrField "$N$M" + CustomSymbolStrFcn "$R$N$M$F" + CustomSymbolStrFcnArg "rt$I$N$M" + CustomSymbolStrBlkIO "rtb_$N$M" + CustomSymbolStrTmpVar "$N$M" + CustomSymbolStrMacro "$R$N$M" + DefineNamingRule "None" + ParamNamingRule "None" + SignalNamingRule "None" + InsertBlockDesc off + InsertPolySpaceComments off + SimulinkBlockComments on + MATLABSourceComments off + EnableCustomComments off + InlinedPrmAccess "Literals" + ReqsInCode off + UseSimReservedNames off + } + Simulink.GRTTargetCC { + $BackupClass "Simulink.TargetCC" + $ObjectID 11 + Version "1.11.1" + Array { + Type "Cell" + Dimension 12 + Cell "IncludeMdlTerminateFcn" + Cell "CombineOutputUpdateFcns" + Cell "SuppressErrorStatus" + Cell "ERTCustomFileBanners" + Cell "GenerateSampleERTMain" + Cell "GenerateTestInterfaces" + Cell "MultiInstanceERTCode" + Cell "PurelyIntegerCode" + Cell "SupportNonInlinedSFcns" + Cell "SupportComplex" + Cell "SupportAbsoluteTime" + Cell "SupportContinuousTime" + PropName "DisabledProps" + } + TargetFcnLib "ansi_tfl_tmw.mat" + TargetLibSuffix "" + TargetPreCompLibLocation "" + TargetFunctionLibrary "ANSI_C" + UtilityFuncGeneration "Auto" + ERTMultiwordTypeDef "System defined" + CodeExecutionProfiling off + ERTMultiwordLength 256 + MultiwordLength 2048 + GenerateFullHeader on + GenerateSampleERTMain off + GenerateTestInterfaces off + IsPILTarget off + ModelReferenceCompliant on + ParMdlRefBuildCompliant on + CompOptLevelCompliant on + ConcurrentExecutionCompliant on + IncludeMdlTerminateFcn on + GeneratePreprocessorConditionals "Disable all" + CombineOutputUpdateFcns off + CombineSignalStateStructs off + SuppressErrorStatus off + ERTFirstTimeCompliant off + IncludeFileDelimiter "Auto" + ERTCustomFileBanners off + SupportAbsoluteTime on + LogVarNameModifier "rt_" + MatFileLogging on + MultiInstanceERTCode off + SupportNonFinite on + SupportComplex on + PurelyIntegerCode off + SupportContinuousTime on + SupportNonInlinedSFcns on + SupportVariableSizeSignals off + EnableShiftOperators on + ParenthesesLevel "Nominal" + PortableWordSizes off + ModelStepFunctionPrototypeControlCompliant off + CPPClassGenCompliant off + AutosarCompliant off + UseMalloc off + ExtMode off + ExtModeStaticAlloc off + ExtModeTesting off + ExtModeStaticAllocSize 1000000 + ExtModeTransport 0 + ExtModeMexFile "ext_comm" + ExtModeIntrfLevel "Level1" + RTWCAPISignals off + RTWCAPIParams off + RTWCAPIStates off + RTWCAPIRootIO off + GenerateASAP2 off + } + PropName "Components" + } + } + PropName "Components" + } + Name "Configuration" + CurrentDlgPage "Solver" + ConfigPrmDlgPosition [ 400, 210, 1280, 840 ] + } + PropName "ConfigurationSets" + } + Simulink.ConfigSet { + $PropName "ActiveConfigurationSet" + $ObjectID 1 + } + BlockDefaults { + ForegroundColor "black" + BackgroundColor "white" + DropShadow off + NamePlacement "normal" + FontName "Helvetica" + FontSize 10 + FontWeight "normal" + FontAngle "normal" + ShowName on + BlockRotation 0 + BlockMirror off + } + AnnotationDefaults { + HorizontalAlignment "center" + VerticalAlignment "middle" + ForegroundColor "black" + BackgroundColor "white" + DropShadow off + FontName "Helvetica" + FontSize 10 + FontWeight "normal" + FontAngle "normal" + UseDisplayTextAsClickCallback off + } + LineDefaults { + FontName "Helvetica" + FontSize 9 + FontWeight "normal" + FontAngle "normal" + } + BlockParameterDefaults { + Block { + BlockType Constant + Value "1" + VectorParams1D on + SamplingMode "Sample based" + OutMin "[]" + OutMax "[]" + OutDataTypeStr "Inherit: Inherit from 'Constant value'" + LockScale off + SampleTime "inf" + FramePeriod "inf" + PreserveConstantTs off + } + Block { + BlockType Demux + Outputs "4" + DisplayOption "none" + BusSelectionMode off + } + Block { + BlockType DiscretePulseGenerator + PulseType "Sample based" + TimeSource "Use simulation time" + Amplitude "1" + Period "2" + PulseWidth "1" + PhaseDelay "0" + SampleTime "1" + VectorParams1D on + } + Block { + BlockType Display + Format "short" + Decimation "10" + Floating off + SampleTime "-1" + } + Block { + BlockType Inport + Port "1" + OutputFunctionCall off + OutMin "[]" + OutMax "[]" + OutDataTypeStr "Inherit: auto" + LockScale off + BusOutputAsStruct off + PortDimensions "-1" + VarSizeSig "Inherit" + SampleTime "-1" + SignalType "auto" + SamplingMode "auto" + LatchByDelayingOutsideSignal off + LatchInputForFeedbackSignals off + Interpolate on + } + Block { + BlockType Mux + Inputs "4" + DisplayOption "none" + UseBusObject off + BusObject "BusObject" + NonVirtualBus off + } + Block { + BlockType Outport + Port "1" + OutMin "[]" + OutMax "[]" + OutDataTypeStr "Inherit: auto" + LockScale off + BusOutputAsStruct off + PortDimensions "-1" + VarSizeSig "Inherit" + SampleTime "-1" + SignalType "auto" + SamplingMode "auto" + SourceOfInitialOutputValue "Dialog" + OutputWhenDisabled "held" + InitialOutput "[]" + } + Block { + BlockType Scope + ModelBased off + TickLabels "OneTimeTick" + ZoomMode "on" + Grid "on" + TimeRange "auto" + YMin "-5" + YMax "5" + SaveToWorkspace off + SaveName "ScopeData" + LimitDataPoints on + MaxDataPoints "5000" + Decimation "1" + SampleInput off + SampleTime "-1" + } + Block { + BlockType SignalSpecification + OutMin "[]" + OutMax "[]" + OutDataTypeStr "Inherit: auto" + LockScale off + BusOutputAsStruct off + Dimensions "-1" + VarSizeSig "Inherit" + SampleTime "-1" + SignalType "auto" + SamplingMode "auto" + } + Block { + BlockType SubSystem + ShowPortLabels "FromPortIcon" + Permissions "ReadWrite" + PermitHierarchicalResolution "All" + TreatAsAtomicUnit off + CheckFcnCallInpInsideContextMsg off + SystemSampleTime "-1" + RTWFcnNameOpts "Auto" + RTWFileNameOpts "Auto" + RTWMemSecFuncInitTerm "Inherit from model" + RTWMemSecFuncExecute "Inherit from model" + RTWMemSecDataConstants "Inherit from model" + RTWMemSecDataInternal "Inherit from model" + RTWMemSecDataParameters "Inherit from model" + SimViewingDevice off + DataTypeOverride "UseLocalSettings" + DataTypeOverrideAppliesTo "AllNumericTypes" + MinMaxOverflowLogging "UseLocalSettings" + SFBlockType "NONE" + Variant off + GeneratePreprocessorConditionals off + } + Block { + BlockType Sum + IconShape "rectangular" + Inputs "++" + CollapseMode "All dimensions" + CollapseDim "1" + InputSameDT on + AccumDataTypeStr "Inherit: Inherit via internal rule" + OutMin "[]" + OutMax "[]" + OutDataTypeStr "Inherit: Same as first input" + LockScale off + RndMeth "Floor" + SaturateOnIntegerOverflow on + SampleTime "-1" + } + } + System { + Name "send_receive" + Location [611, 495, 1431, 1394] + Open on + ModelBrowserVisibility off + ModelBrowserWidth 247 + ScreenColor "white" + PaperOrientation "landscape" + PaperPositionMode "auto" + PaperType "usletter" + PaperUnits "inches" + TiledPaperMargins [0.500000, 0.500000, 0.500000, 0.500000] + TiledPageScale 1 + ShowPageBoundaries off + ZoomFactor "100" + ReportName "simulink-default.rpt" + SIDHighWatermark "44" + Block { + BlockType SubSystem + Name "sc_console" + SID "3" + Ports [3] + Position [410, 98, 610, 192] + BackgroundColor "lightBlue" + MinAlgLoopOccurrences off + PropExecContextOutsideSubsystem off + RTWSystemCode "Auto" + FunctionWithSeparateData off + Opaque off + RequestExecContextInheritance off + MaskHideContents off + System { + Name "sc_console" + Location [-17, 82, 1626, 997] + Open on + ModelBrowserVisibility off + ModelBrowserWidth 200 + ScreenColor "white" + PaperOrientation "landscape" + PaperPositionMode "auto" + PaperType "A4" + PaperUnits "centimeters" + TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] + TiledPageScale 1 + ShowPageBoundaries off + ZoomFactor "206" + Block { + BlockType Inport + Name "data recv" + SID "4" + Position [140, 168, 170, 182] + BackgroundColor "yellow" + IconDisplay "Port number" + } + Block { + BlockType Inport + Name "errors_status" + SID "5" + Position [140, 128, 170, 142] + BackgroundColor "yellow" + Port "2" + IconDisplay "Port number" + } + Block { + BlockType Inport + Name "data send" + SID "29" + Position [140, 208, 170, 222] + BackgroundColor "yellow" + Port "3" + IconDisplay "Port number" + } + Block { + BlockType Demux + Name "Demux" + SID "6" + Ports [1, 2] + Position [285, 116, 290, 154] + BackgroundColor "black" + ShowName off + Outputs "[2 1]" + } + Block { + BlockType Demux + Name "Demux1" + SID "32" + Ports [1, 5] + Position [375, 211, 380, 299] + ShowName off + Outputs "5" + DisplayOption "bar" + } + Block { + BlockType Demux + Name "Demux2" + SID "39" + Ports [1, 5] + Position [375, 306, 380, 394] + ShowName off + Outputs "5" + DisplayOption "bar" + } + Block { + BlockType Mux + Name "Mux" + SID "34" + Ports [2, 1] + Position [465, 246, 470, 284] + ShowName off + Inputs "2" + DisplayOption "bar" + } + Block { + BlockType Reference + Name "OpComm" + SID "9" + Ports [3, 3] + Position [225, 138, 265, 212] + LibraryVersion "1.348" + SourceBlock "rtlab/OpComm" + SourceType "RT-LAB OpComm" + nbport "3" + groupe_acq "1" + subsys_rate "0" + st "0" + Synchronization on + Interpolation on + Threshold "1.0" + Missed_Data off + Offset off + Sim_Time off + Samples off + dynSigOut off + from_console "0" + warning_done off + writeOpCommFile off + } + Block { + BlockType Sum + Name "Subtract" + SID "42" + Ports [2, 1] + Position [510, 312, 540, 343] + ZOrder -31 + Inputs "+-" + InputSameDT off + OutDataTypeStr "Inherit: Inherit via internal rule" + SaturateOnIntegerOverflow off + } + Block { + BlockType Display + Name "errors" + SID "10" + Ports [1] + Position [385, 82, 455, 128] + BackgroundColor "yellow" + FontName "Arial" + FontSize 8 + Decimation "1" + Lockdown off + } + Block { + BlockType Scope + Name "message 1" + SID "40" + Ports [1] + Position [590, 169, 620, 201] + BackgroundColor "yellow" + Floating off + Location [826, 517, 1334, 952] + Open off + NumInputPorts "1" + List { + ListType AxesTitles + axes1 "%" + } + List { + ListType ScopeGraphics + FigureColor "[0.5 0.5 0.5]" + AxesColor "[0 0 0]" + AxesTickColor "[1 1 1]" + LineColors "[1 1 0;1 0 1;0 1 1;1 0 0;0 1 0;0 0 1]" + LineStyles "-|-|-|-|-|-" + LineWidths "[0.5 0.5 0.5 0.5 0.5 0.5]" + MarkerStyles "none|none|none|none|none|none" + } + YMin "-1.75" + YMax "4" + SaveName "ScopeData1" + DataFormat "StructureWithTime" + SampleTime "0" + } + Block { + BlockType Scope + Name "message 2" + SID "33" + Ports [1] + Position [590, 249, 620, 281] + BackgroundColor "yellow" + Floating off + Location [826, 517, 1334, 952] + Open off + NumInputPorts "1" + List { + ListType AxesTitles + axes1 "%" + } + List { + ListType ScopeGraphics + FigureColor "[0.5 0.5 0.5]" + AxesColor "[0 0 0]" + AxesTickColor "[1 1 1]" + LineColors "[1 1 0;1 0 1;0 1 1;1 0 0;0 1 0;0 0 1]" + LineStyles "-|-|-|-|-|-" + LineWidths "[0.5 0.5 0.5 0.5 0.5 0.5]" + MarkerStyles "none|none|none|none|none|none" + } + YMin "-1.75" + YMax "4" + DataFormat "StructureWithTime" + SampleTime "0" + } + Block { + BlockType Scope + Name "message 3" + SID "41" + Ports [1] + Position [590, 389, 620, 421] + BackgroundColor "yellow" + Floating off + Location [826, 517, 1334, 952] + Open off + NumInputPorts "1" + List { + ListType AxesTitles + axes1 "%" + } + List { + ListType ScopeGraphics + FigureColor "[0.5 0.5 0.5]" + AxesColor "[0 0 0]" + AxesTickColor "[1 1 1]" + LineColors "[1 1 0;1 0 1;0 1 1;1 0 0;0 1 0;0 0 1]" + LineStyles "-|-|-|-|-|-" + LineWidths "[0.5 0.5 0.5 0.5 0.5 0.5]" + MarkerStyles "none|none|none|none|none|none" + } + YMin "-1.75" + YMax "4" + SaveName "ScopeData2" + DataFormat "StructureWithTime" + SampleTime "0" + } + Block { + BlockType Scope + Name "message 4" + SID "43" + Ports [1] + Position [590, 314, 620, 346] + BackgroundColor "yellow" + Floating off + Location [826, 517, 1334, 952] + Open off + NumInputPorts "1" + List { + ListType AxesTitles + axes1 "%" + } + List { + ListType ScopeGraphics + FigureColor "[0.5 0.5 0.5]" + AxesColor "[0 0 0]" + AxesTickColor "[1 1 1]" + LineColors "[1 1 0;1 0 1;0 1 1;1 0 0;0 1 0;0 0 1]" + LineStyles "-|-|-|-|-|-" + LineWidths "[0.5 0.5 0.5 0.5 0.5 0.5]" + MarkerStyles "none|none|none|none|none|none" + } + YMin "-1.75" + YMax "4" + SaveName "ScopeData3" + DataFormat "StructureWithTime" + SampleTime "0" + } + Block { + BlockType Display + Name "reception status" + SID "12" + Ports [1] + Position [390, 148, 450, 172] + BackgroundColor "yellow" + FontName "Arial" + FontSize 8 + Decimation "1" + Lockdown off + } + Line { + SrcBlock "errors_status" + SrcPort 1 + Points [25, 0; 0, 15] + DstBlock "OpComm" + DstPort 1 + } + Line { + SrcBlock "OpComm" + SrcPort 2 + Points [35, 0; 0, 80] + Branch { + Labels [1, 0] + DstBlock "Demux1" + DstPort 1 + } + Branch { + Points [0, -70] + DstBlock "message 1" + DstPort 1 + } + } + Line { + SrcBlock "data recv" + SrcPort 1 + DstBlock "OpComm" + DstPort 2 + } + Line { + SrcBlock "OpComm" + SrcPort 1 + DstBlock "Demux" + DstPort 1 + } + Line { + SrcBlock "Demux" + SrcPort 1 + Points [45, 0; 0, -20] + DstBlock "errors" + DstPort 1 + } + Line { + SrcBlock "Demux" + SrcPort 2 + Points [45, 0; 0, 15] + DstBlock "reception status" + DstPort 1 + } + Line { + Labels [0, 0] + SrcBlock "Mux" + SrcPort 1 + DstBlock "message 2" + DstPort 1 + } + Line { + SrcBlock "data send" + SrcPort 1 + Points [25, 0; 0, -15] + DstBlock "OpComm" + DstPort 3 + } + Line { + SrcBlock "OpComm" + SrcPort 3 + Points [15, 0; 0, 150] + Branch { + Points [0, 0] + DstBlock "Demux2" + DstPort 1 + } + Branch { + Points [0, 55] + DstBlock "message 3" + DstPort 1 + } + } + Line { + SrcBlock "Subtract" + SrcPort 1 + DstBlock "message 4" + DstPort 1 + } + Line { + Labels [1, 0] + SrcBlock "Demux1" + SrcPort 5 + Points [20, 0; 0, -30] + Branch { + DstBlock "Mux" + DstPort 1 + } + Branch { + Points [0, 65] + DstBlock "Subtract" + DstPort 1 + } + } + Line { + SrcBlock "Demux2" + SrcPort 5 + Points [35, 0; 0, -45] + Branch { + Points [0, -60] + DstBlock "Mux" + DstPort 2 + } + Branch { + DstBlock "Subtract" + DstPort 2 + } + } + Annotation { + Name "Simple analysis of round trip time" + Position [293, 52] + FontName "Verdana" + FontSize 14 + FontWeight "bold" + } + } + } + Block { + BlockType SubSystem + Name "sm_model" + SID "13" + Ports [0, 3] + Position [55, 97, 235, 193] + BackgroundColor "lightBlue" + MinAlgLoopOccurrences off + PropExecContextOutsideSubsystem off + RTWSystemCode "Auto" + FunctionWithSeparateData off + Opaque off + RequestExecContextInheritance off + MaskHideContents off + System { + Name "sm_model" + Location [2, 82, 1662, 980] + Open off + ModelBrowserVisibility off + ModelBrowserWidth 200 + ScreenColor "white" + PaperOrientation "landscape" + PaperPositionMode "auto" + PaperType "A4" + PaperUnits "centimeters" + TiledPaperMargins [1.270000, 1.270000, 1.270000, 1.270000] + TiledPageScale 1 + ShowPageBoundaries off + ZoomFactor "180" + Block { + BlockType Mux + Name "Mux" + SID "16" + Ports [3, 1] + Position [870, 140, 875, 190] + ShowName off + Inputs "3" + DisplayOption "bar" + } + Block { + BlockType Mux + Name "Mux1" + SID "17" + Ports [2, 1] + Position [290, 209, 295, 271] + BackgroundColor "yellow" + ShowName off + Inputs "2" + DisplayOption "bar" + } + Block { + BlockType Reference + Name "OpIPSocketCtrl1" + SID "18" + Ports [] + Position [105, 112, 234, 173] + LibraryVersion "1.10" + SourceBlock "rtio_generic_ip/OpIPSocketCtrl" + SourceType "OpAsyncIPCtrl" + ctl_id "1" + proto "UDP/IP" + ip_addr_remote "134.130.169.31" + ip_port_remote "10200" + ip_port_local "10201" + ip_addr_mcast "0.0.0.0" + exe_name "AsyncIP" + } + Block { + BlockType DiscretePulseGenerator + Name "Pulse\nGenerator" + SID "44" + Ports [0, 1] + Position [190, 238, 240, 272] + ZOrder -13 + BackgroundColor "yellow" + PulseType "Time based" + Amplitude "5" + Period "0.1" + PulseWidth "30" + } + Block { + BlockType Constant + Name "constants" + SID "19" + Position [180, 216, 250, 234] + BackgroundColor "yellow" + NamePlacement "alternate" + Value "[1 2 3 4]" + } + Block { + BlockType DiscretePulseGenerator + Name "data ready 1 kHz" + SID "20" + Ports [0, 1] + Position [290, 131, 335, 149] + NamePlacement "alternate" + SampleTime "0.001" + } + Block { + BlockType Reference + Name "receive message 1" + SID "21" + Ports [1, 3] + Position [625, 159, 800, 201] + LibraryVersion "1.348" + SourceBlock "rtlab/Communication/Asynchronous/OpAsyncRecv" + SourceType "OpAsyncRecv" + ctl_id "1" + recv_id "1" + enable_param off + fp1 "1" + fp2 "2" + fp3 "3" + fp4 "4" + fp5 "5" + sp1 "string1" + sp2 "string2" + sp3 "string3" + sp4 "string4" + sp5 "string5" + } + Block { + BlockType Reference + Name "send message 1" + SID "22" + Ports [2, 1] + Position [375, 129, 545, 171] + LibraryVersion "1.348" + SourceBlock "rtlab/Communication/Asynchronous/OpAsyncSend" + SourceType "OpAsyncSend" + ctl_id "1" + send_id "1" + mode "DONT_NEED_REPLY" + enable_param off + fp1 "1" + fp2 "2" + fp3 "3" + fp4 "4" + fp5 "5" + sp1 "string1" + sp2 "string2" + sp3 "string3" + sp4 "string4" + sp5 "string5" + } + Block { + BlockType SignalSpecification + Name "set width" + SID "23" + Position [830, 187, 855, 203] + Dimensions "5" + } + Block { + BlockType Constant + Name "timeout" + SID "25" + Position [580, 173, 610, 187] + Value "2" + } + Block { + BlockType Outport + Name "data recv" + SID "26" + Position [915, 187, 950, 203] + BackgroundColor "yellow" + IconDisplay "Port number" + } + Block { + BlockType Outport + Name "errors_status" + SID "27" + Position [915, 142, 950, 158] + BackgroundColor "yellow" + Port "2" + IconDisplay "Port number" + } + Block { + BlockType Outport + Name "data send" + SID "28" + Position [915, 232, 950, 248] + BackgroundColor "yellow" + Port "3" + IconDisplay "Port number" + } + Line { + SrcBlock "receive message 1" + SrcPort 3 + DstBlock "set width" + DstPort 1 + } + Line { + SrcBlock "receive message 1" + SrcPort 1 + DstBlock "Mux" + DstPort 2 + } + Line { + SrcBlock "receive message 1" + SrcPort 2 + DstBlock "Mux" + DstPort 3 + } + Line { + SrcBlock "timeout" + SrcPort 1 + DstBlock "receive message 1" + DstPort 1 + } + Line { + SrcBlock "send message 1" + SrcPort 1 + DstBlock "Mux" + DstPort 1 + } + Line { + SrcBlock "Mux" + SrcPort 1 + Points [0, -15] + DstBlock "errors_status" + DstPort 1 + } + Line { + SrcBlock "set width" + SrcPort 1 + DstBlock "data recv" + DstPort 1 + } + Line { + SrcBlock "constants" + SrcPort 1 + DstBlock "Mux1" + DstPort 1 + } + Line { + Labels [0, 0] + SrcBlock "Mux1" + SrcPort 1 + Points [45, 0] + Branch { + Points [0, -80] + DstBlock "send message 1" + DstPort 2 + } + Branch { + Labels [1, 0] + DstBlock "data send" + DstPort 1 + } + } + Line { + SrcBlock "data ready 1 kHz" + SrcPort 1 + DstBlock "send message 1" + DstPort 1 + } + Line { + SrcBlock "Pulse\nGenerator" + SrcPort 1 + DstBlock "Mux1" + DstPort 2 + } + Annotation { + Name "Simple S2SS to OPAL test using UDP messages" + Position [288, 52] + FontName "Verdana" + FontSize 14 + FontWeight "bold" + } + } + } + Line { + SrcBlock "sm_model" + SrcPort 1 + DstBlock "sc_console" + DstPort 1 + } + Line { + SrcBlock "sm_model" + SrcPort 2 + DstBlock "sc_console" + DstPort 2 + } + Line { + Labels [0, 0] + SrcBlock "sm_model" + SrcPort 3 + DstBlock "sc_console" + DstPort 3 + } + } +} diff --git a/clients/opal/models/send_receive/src/AsyncIP.c b/clients/opal/models/send_receive/src/AsyncIP.c new file mode 100644 index 000000000..fb26aeaa6 --- /dev/null +++ b/clients/opal/models/send_receive/src/AsyncIP.c @@ -0,0 +1,294 @@ +/** AsyncIP + * + * Code example of an asynchronous program. This program is started + * by the asynchronous controller and demonstrates how to send and + * receive data to and from the asynchronous icons and a UDP or TCP + * port. + * + * @author Steffen Vogel + * @author Mathieu Dubé-Dallaire + * @copyright 2014, Institute for Automation of Complex Power Systems, EONERC + * @copyright 2003, OPAL-RT Technologies inc + * @file + */ + +/* Standard ANSI C headers needed for this program */ +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(__QNXNTO__) +# include +# include +# include +# include +#elif defined(__linux__) +# define _GNU_SOURCE 1 +#endif + +/* Define RTLAB before including OpalPrint.h for messages to be sent + * to the OpalDisplay. Otherwise stdout will be used. */ +#define RTLAB +#include "OpalPrint.h" +#include "AsyncApi.h" + +/* This is the message format */ +#include "Config.h" +#include "MsgFormat.h" +#include "Socket.h" +#include "Interface.h" + +/* This is just for initializing the shared memory access to communicate + * with the RT-LAB model. It's easier to remember the arguments like this */ +#define ASYNC_SHMEM_NAME argv[1] +#define ASYNC_SHMEM_SIZE atoi(argv[2]) +#define PRINT_SHMEM_NAME argv[3] + +static void *SendToIPPort(void *arg) +{ + unsigned SendID = 1; + unsigned i, n; + int nbSend = 0; + unsigned ModelState; + + /* Data from OPAL-RT model */ + double mdldata[MSG_VALUES]; + int mdldata_size; + + /* Data from the S2SS server */ + struct msg msg = MSG_INIT(0); + int msg_size; + + OpalPrint("%s: SendToIPPort thread started\n", PROGNAME); + + OpalGetNbAsyncSendIcon(&nbSend); + if (nbSend >= 1) { + do { + /* This call unblocks when the 'Data Ready' line of a send icon is asserted. */ + if ((n = OpalWaitForAsyncSendRequest(&SendID)) != EOK) { + ModelState = OpalGetAsyncModelState(); + if ((ModelState != STATE_RESET) && (ModelState != STATE_STOP)) { + OpalSetAsyncSendIconError(n, SendID); + OpalPrint("%s: OpalWaitForAsyncSendRequest(), errno %d\n", PROGNAME, n); + } + + continue; + } + + /* No errors encountered yet */ + OpalSetAsyncSendIconError(0, SendID); + + /* Get the size of the data being sent by the unblocking SendID */ + OpalGetAsyncSendIconDataLength(&mdldata_size, SendID); + if (mdldata_size / sizeof(double) > MSG_VALUES) { + OpalPrint("%s: Number of signals for SendID=%d exceeds allowed maximum (%d)\n", + PROGNAME, SendID, MSG_VALUES); + + return NULL; + } + + /* Read data from the model */ + OpalGetAsyncSendIconData(mdldata, mdldata_size, SendID); + +/******* FORMAT TO SPECIFIC PROTOCOL HERE *****************************/ + // msg.dev_id = SendID; /* Use the SendID as a device ID here */ + msg.sequence++; + msg.length = mdldata_size / sizeof(double); + + for (i = 0; i < msg.length; i++) + msg.data[i] = (float) mdldata[i]; + + msg_size = 4 * (msg.length + 1); +/**********************************************************************/ + + /* Perform the actual write to the ip port */ + if (SendPacket((char *) &msg, msg_size) < 0) + OpalSetAsyncSendIconError(errno, SendID); + else + OpalSetAsyncSendIconError(0, SendID); + + /* This next call allows the execution of the "asynchronous" process + * to actually be synchronous with the model. To achieve this, you + * should set the "Sending Mode" in the Async_Send block to + * NEED_REPLY_BEFORE_NEXT_SEND or NEED_REPLY_NOW. This will force + * the model to wait for this process to call this + * OpalAsyncSendRequestDone function before continuing. */ + OpalAsyncSendRequestDone(SendID); + + /* Before continuing, we make sure that the real-time model + * has not been stopped. If it has, we quit. */ + ModelState = OpalGetAsyncModelState(); + } while ((ModelState != STATE_RESET) && (ModelState != STATE_STOP)); + + OpalPrint("%s: SendToIPPort: Finished\n", PROGNAME); + } + else { + OpalPrint("%s: SendToIPPort: No transimission block for this controller. Stopping thread.\n", PROGNAME); + } + + return NULL; +} + +static void *RecvFromIPPort(void *arg) +{ + unsigned RecvID = 1; + unsigned i, n; + int nbRecv = 0; + unsigned ModelState; + + /* Data from OPAL-RT model */ + double mdldata[MSG_VALUES]; + int mdldata_size; + + /* Data from the S2SS server */ + struct msg msg = MSG_INIT(0); + unsigned msg_size; + + OpalPrint("%s: RecvFromIPPort thread started\n", PROGNAME); + + OpalGetNbAsyncRecvIcon(&nbRecv); + if (nbRecv >= 1) { + do { + +/******* FORMAT TO SPECIFIC PROTOCOL HERE ******************************/ + msg_size = sizeof(msg); + n = RecvPacket((char *) &msg, msg_size, 1.0); + + if (msg.version != MSG_VERSION) { + OpalPrint("%s: Received message with unknown version. Skipping..\n", PROGNAME); + continue; + } + + if (msg.type != MSG_TYPE_DATA) { + OpalPrint("%s: Received no data. Skipping..\n", PROGNAME); + continue; + } + + msg_size = 4 * (msg.length + 1); +/***********************************************************************/ + + if (n < 1) { + ModelState = OpalGetAsyncModelState(); + if ((ModelState != STATE_RESET) && (ModelState != STATE_STOP)) { + // n == 0 means timeout, so we continue silently + //if (n == 0) + // OpalPrint("%s: Timeout while waiting for data\n", PROGNAME, errno); + // n == -1 means a more serious error, so we print it + if (n == -1) + OpalPrint("%s: Error %d while waiting for data\n", PROGNAME, errno); + continue; + } + break; + } + else if (n != msg_size) { + OpalPrint("%s: Received incoherent packet (size: %d, complete: %d)\n", PROGNAME, n, msg_size); + continue; + } + +/******* FORMAT TO SPECIFIC PROTOCOL HERE *******************************/ + OpalSetAsyncRecvIconStatus(msg.sequence, RecvID); /* Set the Status to the message ID */ + OpalSetAsyncRecvIconError(0, RecvID); /* Set the Error to 0 */ + + /* Get the number of signals to send back to the model */ + OpalGetAsyncRecvIconDataLength(&mdldata_size, RecvID); + + if (mdldata_size / sizeof(double) > MSG_VALUES) { + OpalPrint("%s: Number of signals for RecvID=%d (%d) exceeds allowed maximum (%d)\n", + PROGNAME, RecvID, mdldata_size / sizeof(double), MSG_VALUES); + return NULL; + } + + if (mdldata_size / sizeof(double) > msg.length) { + OpalPrint("%s: Number of signals for RecvID=%d (%d) exceeds what was received (%d)\n", + PROGNAME, RecvID, mdldata_size / sizeof(double), msg.length); + } + + for (i = 0; i < msg.length; i++) + mdldata[i] = (double) msg.data[i]; +/************************************************************************/ + + OpalSetAsyncRecvIconData(mdldata, mdldata_size, RecvID); + + /* Before continuing, we make sure that the real-time model + * has not been stopped. If it has, we quit. */ + ModelState = OpalGetAsyncModelState(); + } while ((ModelState != STATE_RESET) && (ModelState != STATE_STOP)); + + OpalPrint("%s: RecvFromIPPort: Finished\n", PROGNAME); + } + else { + OpalPrint("%s: RecvFromIPPort: No reception block for this controller. Stopping thread.\n", PROGNAME); + } + + return NULL; +} + +int main(int argc, char *argv[]) +{ + int err; + + Opal_GenAsyncParam_Ctrl IconCtrlStruct; + + pthread_t tid_send, tid_recv; + pthread_attr_t attr_send, attr_recv; + + OpalPrint("%s: This is a S2SS client\n", PROGNAME); + + /* Check for the proper arguments to the program */ + if (argc < 4) { + printf("Invalid Arguments: 1-AsyncShmemName 2-AsyncShmemSize 3-PrintShmemName\n"); + exit(0); + } + + /* Enable the OpalPrint function. This prints to the OpalDisplay. */ + if (OpalSystemCtrl_Register(PRINT_SHMEM_NAME) != EOK) { + printf("%s: ERROR: OpalPrint() access not available\n", PROGNAME); + exit(EXIT_FAILURE); + } + + /* Open Share Memory created by the model. */ + if ((OpalOpenAsyncMem(ASYNC_SHMEM_SIZE, ASYNC_SHMEM_NAME)) != EOK) { + OpalPrint("%s: ERROR: Model shared memory not available\n", PROGNAME); + exit(EXIT_FAILURE); + } + + /* For Redhawk, Assign this process to CPU 0 in order to support partial XHP */ + AssignProcToCpu0(); + + /* Get IP Controler Parameters (ie: ip address, port number...) and + * initialize the device on the QNX node. */ + memset(&IconCtrlStruct, 0, sizeof(IconCtrlStruct)); + if ((err = OpalGetAsyncCtrlParameters(&IconCtrlStruct, sizeof(IconCtrlStruct))) != EOK) { + OpalPrint("%s: ERROR: Could not get controller parameters (%d).\n", PROGNAME, err); + exit(EXIT_FAILURE); + } + + if (InitSocket(IconCtrlStruct) != EOK) { + OpalPrint("%s: ERROR: Initialization failed.\n", PROGNAME); + exit(EXIT_FAILURE); + } + + /* Start send/receive threads */ + if ((pthread_create(&tid_send, NULL, SendToIPPort, NULL)) == -1) + OpalPrint("%s: ERROR: Could not create thread (SendToIPPort), errno %d\n", PROGNAME, errno); + if ((pthread_create(&tid_recv, NULL, RecvFromIPPort, NULL)) == -1) + OpalPrint("%s: ERROR: Could not create thread (RecvFromIPPort), errno %d\n", PROGNAME, errno); + + /* Wait for both threads to finish */ + if ((err = pthread_join(tid_send, NULL)) != 0) + OpalPrint("%s: ERROR: pthread_join (SendToIPPort), errno %d\n", PROGNAME, err); + if ((err = pthread_join(tid_recv, NULL)) != 0) + OpalPrint("%s: ERROR: pthread_join (RecvFromIPPort), errno %d\n", PROGNAME, err); + + /* Close the ip port and shared memories */ + CloseSocket(IconCtrlStruct); + OpalCloseAsyncMem (ASYNC_SHMEM_SIZE, ASYNC_SHMEM_NAME); + OpalSystemCtrl_UnRegister(PRINT_SHMEM_NAME); + + return 0; +} diff --git a/clients/opal/models/send_receive/src/Interface.c b/clients/opal/models/send_receive/src/Interface.c new file mode 100644 index 000000000..97b5d6017 --- /dev/null +++ b/clients/opal/models/send_receive/src/Interface.c @@ -0,0 +1,26 @@ +/** OPAL Interface setup + * + * @author Steffen Vogel + * @copyright 2014, Institute for Automation of Complex Power Systems, EONERC + * @file + */ + +#include "Config.h" +#include "Interface.h" + +int if_setup(const char *op, const char *iface, const char *addr) +{ + char cmd[256]; + + /* Setup remote address */ + snprintf(cmd, 256, "ip addr %s %s/32 dev %s", op, addr, iface); + if (system(cmd)) + OpalPrint("Failed to add local address to interface"); + + /* Setup route for single IP address */ + snprintf(cmd, 256, "ip route %s %s/32 dev %s", op, addr, iface); + if (system(cmd)) + OpalPrint("Failed to add route for remote address"); + + return 0; +} diff --git a/clients/opal/models/send_receive/src/Sched.c b/clients/opal/models/send_receive/src/Sched.c new file mode 100644 index 000000000..f4744fcc9 --- /dev/null +++ b/clients/opal/models/send_receive/src/Sched.c @@ -0,0 +1,74 @@ +/** Configure Scheduler + * + * @author Steffen Vogel + * @author Mathieu DubĂ©-Dallaire + * @copyright 2014, Institute for Automation of Complex Power Systems, EONERC + * @copyright 2003, OPAL-RT Technologies inc + * @file + */ + +#include + +/* Define RTLAB before including OpalPrint.h for messages to be sent + * to the OpalDisplay. Otherwise stdout will be used. */ +#define RTLAB +#include "OpalPrint.h" + +#include "Config.h" +#include "Sched.h" + +#if defined(__QNXNTO__) +# include +# include +# include +# include +#elif defined(__linux__) +# define _GNU_SOURCE 1 +# include +# if defined(__redhawk__) +# include +# include +# endif +#endif + +int AssignProcToCpu0(void) +{ +#if defined(__linux__) + #if defined(__redhawk__) + int rc; + pid_t pid = getpid(); + cpuset_t *pCpuset; + + pCpuset = cpuset_alloc(); + if (NULL == pCpuset) { + OpalPrint("Error allocating a cpuset\n"); + return ENOMEM; + } + + cpuset_init(pCpuset); + cpuset_set_cpu(pCpuset, 0, 1); + + rc = mpadvise(MPA_PRC_SETBIAS, MPA_TID, pid, pCpuset); + if (MPA_FAILURE == rc) { + rc = errno; + OpalPrint("Error from mpadvise, %d %s, for pid %d\n", errno, strerror(errno), pid); + cpuset_free(pCpuset); + return rc; + } + + cpuset_free(pCpuset); + #else + cpu_set_t bindSet; + CPU_ZERO(&bindSet); + CPU_SET(0, &bindSet); + + /* changing process cpu affinity */ + if (sched_setaffinity(0, sizeof(cpu_set_t), &bindSet) != 0) { + OpalPrint("Unable to bind the process to CPU 0. (sched_setaffinity errno %d)\n", errno); + return EINVAL; + } + + #endif + return EOK; +#endif /* __linux__ */ +} diff --git a/clients/opal/models/send_receive/src/Socket.c b/clients/opal/models/send_receive/src/Socket.c new file mode 100644 index 000000000..a5f4b7393 --- /dev/null +++ b/clients/opal/models/send_receive/src/Socket.c @@ -0,0 +1,223 @@ +/** Helper functions for socket + * + * Code example of an asynchronous program. This program is started + * by the asynchronous controller and demonstrates how to send and + * receive data to and from the asynchronous icons and a UDP or TCP + * port. + * + * @author Steffen Vogel + * @author Mathieu Dubé-Dallaire + * @copyright 2014, Institute for Automation of Complex Power Systems, EONERC + * @copyright 2003, OPAL-RT Technologies inc + * @file + */ + +#include +#include +#include +#include +#include +#include +#include + +/* Define RTLAB before including OpalPrint.h for messages to be sent + * to the OpalDisplay. Otherwise stdout will be used. */ +#define RTLAB +#include "OpalPrint.h" +#include "AsyncApi.h" + +#include "Config.h" +#include "Socket.h" + +/* Globals variables */ +struct sockaddr_in send_ad; /* Send address */ +struct sockaddr_in recv_ad; /* Receive address */ +int sd = -1; /* socket descriptor */ +int proto = UDP_PROTOCOL; + +int InitSocket(Opal_GenAsyncParam_Ctrl IconCtrlStruct) +{ + struct ip_mreq mreq; /* Multicast group structure */ + int socket_type; + int socket_proto; + unsigned char TTL = 1; + unsigned char LOOP = 0; + int rc; + + proto = (int) IconCtrlStruct.FloatParam[0]; + OpalPrint("%s: Version : %s\n", PROGNAME, VERSION); + + switch (proto) { + case UDP_PROTOCOL: /* Communication using UDP/IP protocol */ + socket_proto = IPPROTO_UDP; + socket_type = SOCK_DGRAM; + OpalPrint("%s: Protocol : UDP/IP\n", PROGNAME); + break; + + case TCP_PROTOCOL: /* Communication using TCP/IP protocol */ + socket_proto = IPPROTO_IP; + socket_type = SOCK_STREAM; + OpalPrint("%s: Protocol : TCP/IP\n", PROGNAME); + break; + + default: /* Protocol is not recognized */ + OpalPrint("%s: ERROR: Protocol (%d) not supported!\n", PROGNAME, proto); + return EINVAL; + } + + OpalPrint("%s: Remote Address : %s\n", PROGNAME, IconCtrlStruct.StringParam[0]); + OpalPrint("%s: Remote Port : %d\n", PROGNAME, (int) IconCtrlStruct.FloatParam[1]); + + /* Initialize the socket */ + if ((sd = socket(AF_INET, socket_type, socket_proto)) < 0) { + OpalPrint("%s: ERROR: Could not open socket\n", PROGNAME); + return EIO; + } + + /* Set the structure for the remote port and address */ + memset(&send_ad, 0, sizeof(send_ad)); + send_ad.sin_family = AF_INET; + send_ad.sin_addr.s_addr = inet_addr(IconCtrlStruct.StringParam[0]); + send_ad.sin_port = htons((u_short)IconCtrlStruct.FloatParam[1]); + + /* Set the structure for the local port and address */ + memset(&recv_ad, 0, sizeof(recv_ad)); + recv_ad.sin_family = AF_INET; + recv_ad.sin_addr.s_addr = INADDR_ANY; + recv_ad.sin_port = htons((u_short)IconCtrlStruct.FloatParam[2]); + + /* Bind local port and address to socket. */ + if (bind(sd, (struct sockaddr *) &recv_ad, sizeof(struct sockaddr_in)) == -1) { + OpalPrint("%s: ERROR: Could not bind local port to socket\n", PROGNAME); + return EIO; + } + else + OpalPrint("%s: Local Port : %d\n", PROGNAME, (int) IconCtrlStruct.FloatParam[2]); + + switch (proto) { + case UDP_PROTOCOL: /* Communication using UDP/IP protocol */ + /* If sending to a multicast address */ + if ((inet_addr(IconCtrlStruct.StringParam[0]) & inet_addr("240.0.0.0")) == inet_addr("224.0.0.0")) { + if (setsockopt(sd, IPPROTO_IP, IP_MULTICAST_TTL, (char *) &TTL, sizeof(TTL)) == -1) { + OpalPrint("%s: ERROR: Could not set TTL for multicast send (%d)\n", PROGNAME, errno); + return EIO; + } + if (setsockopt(sd, IPPROTO_IP, IP_MULTICAST_LOOP, (char *)&LOOP, sizeof(LOOP)) == -1) { + OpalPrint("%s: ERROR: Could not set loopback for multicast send (%d)\n", PROGNAME, errno); + return EIO; + } + + OpalPrint("%s: Configured socket for sending to multicast address\n", PROGNAME); + } + + /* If receiving from a multicast group, register for it. */ + if (inet_addr(IconCtrlStruct.StringParam[1]) > 0) { + if ((inet_addr(IconCtrlStruct.StringParam[1]) & inet_addr("240.0.0.0")) == inet_addr("224.0.0.0")) { + mreq.imr_multiaddr.s_addr = inet_addr(IconCtrlStruct.StringParam[1]); + mreq.imr_interface.s_addr = INADDR_ANY; + + /* Have the multicast socket join the multicast group */ + if (setsockopt(sd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *) &mreq, sizeof(mreq)) == -1) { + OpalPrint("%s: ERROR: Could not join multicast group (%d)\n", PROGNAME, errno); + return EIO; + } + + OpalPrint("%s: Added process to multicast group (%s)\n", + PROGNAME, IconCtrlStruct.StringParam[1]); + } + else { + OpalPrint("%s: WARNING: IP address for multicast group is not in multicast range. Ignored\n", + PROGNAME); + } + } + break; + + case TCP_PROTOCOL: /* Communication using TCP/IP protocol */ + OpalPrint("%s: Calling connect()\n", PROGNAME); + + /* Connect to server to start data transmission */ + rc = connect(sd, (struct sockaddr *) &send_ad, sizeof(send_ad)); + if (rc < 0) { + OpalPrint("%s: ERROR: Call to connect() failed\n", PROGNAME); + return EIO; + } + break; + } + + return EOK; +} + +int SendPacket(char* DataSend, int datalength) +{ + int err; + + if(sd < 0) + return -1; + + /* Send the packet */ + if (proto == TCP_PROTOCOL) + err = send(sd, DataSend, datalength, 0); + else + err = sendto(sd, DataSend, datalength, 0, (struct sockaddr *)&send_ad, sizeof(send_ad)); + + return err; +} + +int RecvPacket(char* DataRecv, int datalength, double timeout) +{ + int len; + struct sockaddr_in client_ad; + socklen_t client_ad_size = sizeof(client_ad); + fd_set sd_set; + struct timeval tv; + + if (sd < 0) + return -1; + + /* Set the descriptor set for the select() call */ + FD_ZERO(&sd_set); + FD_SET(sd, &sd_set); + + /* Set the tv structure to the correct timeout value */ + tv.tv_sec = (int) timeout; + tv.tv_usec = (int) ((timeout - tv.tv_sec) * 1000000); + + /* Wait for a packet. We use select() to have a timeout. This is + * necessary when reseting the model so we don't wait indefinitely + * and prevent the process from exiting and freeing the port for + * a future instance (model load). */ + switch (select(sd+1, &sd_set, (fd_set *) 0, (fd_set *) 0, &tv)) { + case -1: /* Error */ + return -1; + case 0: /* We hit the timeout */ + return 0; + default: + if (!(FD_ISSET(sd, &sd_set))) { + /* We received something, but it's not on "sd". Since sd is the only + * descriptor in the set... */ + OpalPrint("%s: RecvPacket: God, is that You trying to reach me?\n", PROGNAME); + return -1; + } + } + + /* Clear the DataRecv array (in case we receive an incomplete packet) */ + memset(DataRecv, 0, datalength); + + /* Perform the reception */ + if (proto == TCP_PROTOCOL) + len = recv(sd, DataRecv, datalength, 0); + else + len = recvfrom(sd, DataRecv, datalength, 0, (struct sockaddr *) &client_ad, &client_ad_size); + + return len; +} + +int CloseSocket(Opal_GenAsyncParam_Ctrl IconCtrlStruct) +{ + if (sd < 0) { + shutdown(sd, SHUT_RDWR); + close(sd); + } + + return 0; +} diff --git a/clients/opal/s2ss_tests.llp b/clients/opal/s2ss_tests.llp new file mode 100644 index 000000000..faf3ee696 --- /dev/null +++ b/clients/opal/s2ss_tests.llp @@ -0,0 +1,18 @@ + + + + s2ss_tests + This is a project! + ON + D:\msv\svo\opal\s2ss_tests\s2ss_tests.llp + + + + + models\send_receive\send_receive.mdl + D:\msv\svo\opal\s2ss_tests\models\send_receive\send_receive.mdl + D:\msv\svo\opal\s2ss_tests\models\send_receive\send_receive.mdl + + + +