00001
00007 #include <argos3/core/simulator/visualization/default_visualization.h>
00008 #include <argos3/core/simulator/space/space.h>
00009 #include <argos3/core/simulator/loop_functions.h>
00010
00011 #include <unistd.h>
00012
00013 namespace argos {
00014
00015
00016
00017
00018 static Real TVTimeToHumanReadable(::timeval& t_time) {
00019 return
00020 static_cast<Real>(t_time.tv_sec) +
00021 static_cast<Real>(t_time.tv_usec * 10e-6);
00022 }
00023
00024
00025
00026
00027 CDefaultVisualization::CDefaultVisualization() {
00028
00029 if(m_cSimulator.IsRealTimeClock()) {
00030
00031 m_tStepFunction = &CDefaultVisualization::RealTimeStep;
00032 timerclear(&m_tStepClockTime);
00033 m_tStepClockTime.tv_usec = 1e6 * CPhysicsEngine::GetSimulationClockTick();
00034 ::gettimeofday(&m_tStepStartTime, NULL);
00035 }
00036 else {
00037
00038 m_tStepFunction = &CDefaultVisualization::NormalStep;
00039 }
00040 }
00041
00042
00043
00044
00045 void CDefaultVisualization::Execute() {
00046
00047 while(!m_cSimulator.IsExperimentFinished()) {
00048 (this->*m_tStepFunction)();
00049 }
00050
00051 m_cSimulator.GetLoopFunctions().PostExperiment();
00052 LOG.Flush();
00053 LOGERR.Flush();
00054 }
00055
00056
00057
00058
00059 void CDefaultVisualization::NormalStep() {
00060 m_cSimulator.UpdateSpace();
00061 }
00062
00063
00064
00065
00066 void CDefaultVisualization::RealTimeStep() {
00067
00068 m_cSimulator.UpdateSpace();
00069
00070 ::gettimeofday(&m_tStepEndTime, NULL);
00071
00072 timersub(&m_tStepEndTime, &m_tStepStartTime, &m_tStepElapsedTime);
00073
00074 if(!timercmp(&m_tStepElapsedTime, &m_tStepClockTime, >)) {
00075
00076 timersub(&m_tStepClockTime, &m_tStepElapsedTime, &m_tStepWaitTime);
00077
00078 ::usleep(m_tStepWaitTime.tv_sec * 1e6 + m_tStepWaitTime.tv_usec);
00079
00080 ::gettimeofday(&m_tStepEndTime, NULL);
00081 }
00082 else {
00083 LOGERR << "[WARNING] Clock tick took "
00084 << TVTimeToHumanReadable(m_tStepElapsedTime)
00085 << " sec, more than the expected "
00086 << TVTimeToHumanReadable(m_tStepClockTime)
00087 << " sec."
00088 << std::endl;
00089 }
00090
00091 m_tStepStartTime.tv_sec = m_tStepEndTime.tv_sec;
00092 m_tStepStartTime.tv_usec = m_tStepEndTime.tv_usec;
00093 }
00094
00095
00096
00097
00098 }