public virtual List <MConstraint> GetBoundaryConstraints(MInstruction instruction, string mmuID, string sessionID)
        {
            SessionContent sessionContent = null;
            AvatarContent  avatarContent  = null;

            MBoolResponse sessionResult = SessionData.GetContents(sessionID, out sessionContent, out avatarContent);

            if (!sessionResult.Successful)
            {
                return(new List <MConstraint>());
            }

            sessionContent.UpdateLastAccessTime();

            return(avatarContent.MMUs[mmuID].GetBoundaryConstraints(instruction));
        }
        public virtual List <MMUDescription> GetMMus(string sessionID)
        {
            SessionContent sessionContent = null;
            AvatarContent  avatarContent  = null;

            MBoolResponse sessionResult = SessionData.GetContents(sessionID, out sessionContent, out avatarContent);

            if (!sessionResult.Successful)
            {
                return(new List <MMUDescription>());
            }

            sessionContent.UpdateLastAccessTime();

            return(SessionData.MMUDescriptions.Where(s => avatarContent.MMUs.Keys.Contains(s.ID)).ToList());
        }
        public virtual MBoolResponse Dispose(string mmuID, string sessionID)
        {
            SessionContent sessionContent = null;
            AvatarContent  avatarContent  = null;

            MBoolResponse sessionResult = SessionData.GetContents(sessionID, out sessionContent, out avatarContent);

            if (!sessionResult.Successful)
            {
                return(sessionResult);
            }

            sessionContent.UpdateLastAccessTime();

            //Call the dispose method of the respective MMU
            return(avatarContent.MMUs[mmuID].Dispose(new Dictionary <string, string>()));
        }
        public virtual MBoolResponse Abort(string instructionId, string mmuID, string sessionID)
        {
            SessionContent sessionContent = null;
            AvatarContent  avatarContent  = null;

            MBoolResponse sessionResult = SessionData.GetContents(sessionID, out sessionContent, out avatarContent);

            if (!sessionResult.Successful)
            {
                return(sessionResult);
            }

            sessionContent.UpdateLastAccessTime();

            //Abort the respective MMU
            return(avatarContent.MMUs[mmuID].Abort(instructionId));
        }
Esempio n. 5
0
        /// <summary>
        /// Returns the session content given the current session id
        /// </summary>
        /// <param name="sessionId"></param>
        /// <returns></returns>
        public SessionContent CreateSessionContent(string sessionId)
        {
            if (sessionId == null)
            {
                Logger.Log(Log_level.L_ERROR, "Warning: Session id is null!");
                return(null);
            }

            //Get the ids
            string sceneId  = null;
            string avatarId = null;

            SessionID.GetSplittedIDs(sessionId, out sceneId, out avatarId);

            //Create a new session content
            SessionContent sessionContent = null;


            //Session already avilable
            if (SessionContents.TryGetValue(sceneId, out sessionContent))
            {
                //Check avatar content -> If not available add it
                if (!sessionContent.AvatarContent.ContainsKey(avatarId))
                {
                    AvatarContent avatarContent = new AvatarContent(avatarId);
                    sessionContent.AvatarContent.TryAdd(avatarId, avatarContent);
                }
            }

            //Session not available -> Create new
            else
            {
                Logger.Log(Log_level.L_INFO, $"Create new session id: {sessionId})");

                //Create new session content
                sessionContent = new SessionContent(this, sceneId);


                AvatarContent avatarContent = new AvatarContent(avatarId);

                sessionContent.AvatarContent.TryAdd(avatarId, avatarContent);
                SessionContents.TryAdd(sceneId, sessionContent);
            }

            return(sessionContent);
        }
        /// <summary>
        /// Basic initialization of a MMMU
        /// </summary>
        /// <param name="mmuID"></param>
        /// <param name="sessionID"></param>
        public virtual MBoolResponse Initialize(MAvatarDescription avatarDescription, Dictionary <string, string> properties, string mmuID, string sessionID)
        {
            SessionContent sessionContent = null;
            AvatarContent  avatarContent  = null;

            MBoolResponse sessionResult = SessionData.GetContents(sessionID, out sessionContent, out avatarContent);

            this.skeletonAccess = new IntermediateSkeleton();
            this.skeletonAccess.InitializeAnthropometry(avatarDescription);

            //Skip if invalid session result
            if (!sessionResult.Successful)
            {
                return(sessionResult);
            }

            try
            {
                //Update the access time
                sessionContent.UpdateLastAccessTime();

                //Get the corresponding MMU
                IMotionModelUnitDev mmu = avatarContent.MMUs[mmuID];

                Logger.Log(Log_level.L_INFO, "MMU initialized: " + mmu.Name + " " + sessionID);

                //Call the respective MMU
                return(avatarContent.MMUs[mmuID].Initialize(avatarDescription, properties));
            }
            catch (Exception e)
            {
                Logger.Log(Log_level.L_ERROR, $"Problem at initializing MMU: {mmuID}, message: {e.Message}");

                return(new MBoolResponse(false)
                {
                    LogData = new List <string>()
                    {
                        e.Message,
                        e.StackTrace,
                        e.InnerException.ToString(),
                        e.StackTrace
                    }
                });
            }
        }
        public virtual MBoolResponse CheckPrerequisites(MInstruction instruction, string mmuID, string sessionID)
        {
            SessionContent sessionContent = null;
            AvatarContent  avatarContent  = null;

            MBoolResponse sessionResult = SessionData.GetContents(sessionID, out sessionContent, out avatarContent);

            if (!sessionResult.Successful)
            {
                return(sessionResult);
            }


            sessionContent.UpdateLastAccessTime();

            //Execute the method of the MMU
            return(avatarContent.MMUs[mmuID].CheckPrerequisites(instruction));
        }
        /// <summary>
        /// Basic do step routine which triggers the simulation update of the repsective MMU
        /// </summary>
        /// <param name="time"></param>
        /// <param name="simulationState"></param>
        /// <param name="mmuID"></param>
        /// <param name="sessionID"></param>
        /// <returns></returns>
        public virtual MSimulationResult DoStep(double time, MSimulationState simulationState, string mmuID, string sessionID)
        {
            SessionContent sessionContent = null;
            AvatarContent  avatarContent  = null;

            MBoolResponse sessionResult = SessionData.GetContents(sessionID, out sessionContent, out avatarContent);

            //Skip if invalid session result
            if (!sessionResult.Successful)
            {
                return(null);
            }

            sessionContent.UpdateLastAccessTime();

            //Execute the do step of the respective MMU
            return(avatarContent.MMUs[mmuID].DoStep(time, simulationState));
        }
        public Dictionary <string, string> ExecuteFunction(string name, Dictionary <string, string> parameters, string mmuID, string sessionID)
        {
            SessionContent sessionContent = null;
            AvatarContent  avatarContent  = null;

            MBoolResponse sessionResult = SessionData.GetContents(sessionID, out sessionContent, out avatarContent);

            if (!sessionResult.Successful)
            {
                return(null);
            }

            sessionContent.UpdateLastAccessTime();


            Logger.Log(Log_level.L_DEBUG, $"Ecexute function {name} of {mmuID}");

            return(avatarContent.MMUs[mmuID].ExecuteFunction(name, parameters));
        }
        public virtual MBoolResponse RestoreCheckpoint(string mmuID, string sessionID, byte[] checkpointData)
        {
            SessionContent sessionContent = null;
            AvatarContent  avatarContent  = null;

            MBoolResponse sessionResult = SessionData.GetContents(sessionID, out sessionContent, out avatarContent);

            if (!sessionResult.Successful)
            {
                return(sessionResult);
            }

            sessionContent.UpdateLastAccessTime();

            Logger.Log(Log_level.L_INFO, $"Restore checkpoint of {mmuID}");


            return(avatarContent.MMUs[mmuID].RestoreCheckpoint(checkpointData));
        }
        /// <summary>
        /// Creates a checkpoint for all specified MMUs.
        /// The checkpoint contains the internal state of each MMU whoch can be later used to restore the state.
        /// </summary>
        /// <param name="mmuIDs"></param>
        /// <param name="sessionID"></param>
        /// <param name="checkpointID"></param>
        public virtual byte[] CreateCheckpoint(string mmuID, string sessionID)
        {
            SessionContent sessionContent = null;
            AvatarContent  avatarContent  = null;

            MBoolResponse sessionResult = SessionData.GetContents(sessionID, out sessionContent, out avatarContent);

            if (!sessionResult.Successful)
            {
                return(null);
            }

            sessionContent.UpdateLastAccessTime();

            //Add method to interface
            byte[] checkpointData = avatarContent.MMUs[mmuID].CreateCheckpoint();

            Logger.Log(Log_level.L_INFO, $"Checkpoint of {mmuID} sucessfully created ({checkpointData.Length} bytes)");

            return(checkpointData);
        }
        /// <summary>
        /// Execute command of a MMU
        /// </summary>
        /// <param name="instruction"></param>
        /// <param name="simulationState"></param>
        /// <param name="hierarchy"></param>
        /// <param name="mmuID"></param>
        /// <param name="sessionID"></param>
        public virtual MBoolResponse AssignInstruction(MInstruction instruction, MSimulationState simulationState, string mmuID, string sessionID)
        {
            SessionContent sessionContent = null;
            AvatarContent  avatarContent  = null;

            MBoolResponse sessionResult = SessionData.GetContents(sessionID, out sessionContent, out avatarContent);

            //Directly return if not successfull
            if (!sessionResult.Successful)
            {
                return(sessionResult);
            }

            sessionContent.UpdateLastAccessTime();


            Logger.Log(Log_level.L_DEBUG, $"Execute instruction {instruction.Name}, {mmuID}");


            //Directly assign the instruction
            return(avatarContent.MMUs[mmuID].AssignInstruction(instruction, simulationState));
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="mmus"></param>
        /// <param name="sessionID"></param>
        /// <returns>A mapping from MMUID to a specific instance id</returns>
        public virtual Dictionary <string, string> LoadMMUs(List <string> mmus, string sessionID)
        {
            SessionContent sessionContent = null;
            SessionID      idContainer    = new SessionID(sessionID);

            //Get the session content for the id
            MBoolResponse sessionResult = SessionData.GetSessionContent(sessionID, out sessionContent);

            //Skip if invalid session result
            if (!sessionResult.Successful)
            {
                Logger.Log(Log_level.L_ERROR, "Cannot generate session content");
                return(new Dictionary <string, string>());
            }

            //Set the last access time
            sessionContent.UpdateLastAccessTime();

            Dictionary <string, string> mmuInstanceMapping = new Dictionary <string, string>();

            //Iterate over each desired MMU
            foreach (string mmuID in mmus)
            {
                MMULoadingProperty mmuLoadingProperty = null;

                //Skip MMU is not contained in adapter
                if (!SessionData.MMULoadingProperties.TryGetValue(mmuID, out mmuLoadingProperty))
                {
                    continue;
                }

                IMotionModelUnitDev mmu = null;

                //Instantiate MMU
                try
                {
                    mmu = this.mmuInstantiator.InstantiateMMU(mmuLoadingProperty);
                }
                catch (Exception e)
                {
                    Logger.Log(Log_level.L_ERROR, $"Problem at loading MMU {mmuLoadingProperty.Description.Name}, Exception: {e.Message}, {e.StackTrace}");

                    return(new Dictionary <string, string>());
                }

                //Assign the service access
                mmu.ServiceAccess = sessionContent.ServiceAccess;

                //Assign the scene
                mmu.SceneAccess = sessionContent.SceneBuffer;

                //Assign a new instance of the skeleton access
                mmu.SkeletonAccess = this.skeletonAccess;//new SkeletonAccess();

                //Set the instance as the adapter
                mmu.AdapterEndpoint = new AdapterEndpoint()
                {
                    Instance           = SessionData.AdapterInstance,
                    Description        = SessionData.AdapterDescription,
                    MMIRegisterAddress = SessionData.MMIRegisterAddress
                };


                Logger.Log(Log_level.L_INFO, $"Loaded MMU: {mmuLoadingProperty.Description.Name} for session: {sessionID}");

                //Add to the specific avatar content
                AvatarContent avatarContent = null;

                if (!sessionContent.AvatarContent.TryGetValue(idContainer.AvatarID, out avatarContent))
                {
                    avatarContent = new AvatarContent(idContainer.AvatarID);

                    sessionContent.AvatarContent.TryAdd(idContainer.AvatarID, avatarContent);
                }

                //Add the mmu
                avatarContent.MMUs.Add(mmuLoadingProperty.Description.ID, mmu);

                //To do -> create a unique instance ID
                mmuInstanceMapping.Add(mmuLoadingProperty.Description.ID, "tbd");
            }

            return(mmuInstanceMapping);
        }
Esempio n. 14
0
        /// <summary>
        /// Returns the contents of the respective sessionID (if available).
        /// Otherwise false is returned, whereas the specific message is provided in the LogData.
        /// </summary>
        /// <param name="sessionID"></param>
        /// <param name="sessionContent"></param>
        /// <param name="avatarContent"></param>
        /// <returns></returns>
        public MBoolResponse GetContents(string sessionID, out SessionContent sessionContent, out AvatarContent avatarContent)
        {
            sessionContent = null;
            avatarContent  = null;


            MBoolResponse sessionResult = GetSessionContent(sessionID, out sessionContent);

            if (!sessionResult.Successful)
            {
                return(sessionResult);
            }

            SessionID idContainer = new SessionID(sessionID);


            if (!sessionContent.AvatarContent.TryGetValue(idContainer.AvatarID, out avatarContent))
            {
                //Session content not available
                return(new MBoolResponse(false)
                {
                    LogData = new List <string>()
                    {
                        "Avatar content not available " + sessionID + ", avatarId: " + idContainer.AvatarID
                    }
                });
            }


            return(new MBoolResponse(true));
        }