Source code for morse.services.time_services

import logging; logger = logging.getLogger("morse." + __name__)
from morse.core.services import service, async_service
from morse.core import status, blenderapi
from morse.core.abstractobject import AbstractObject
from morse.core.morse_time import time_isafter

[docs]class TimeServices(AbstractObject): def __init__(self): AbstractObject.__init__(self) self.time = blenderapi.persistantstorage().time self.ref_fps = blenderapi.getfrequency() self._alarm_time = None
[docs] def name(self): return "time"
[docs] @service def mode(self): """ Return the current time management mode """ return self.time.name()
[docs] @service def now(self): """ Return the simulator time, in seconds, since Epoch """ return self.time.time
[docs] @service def statistics(self): """ Return various statistics associated to the specific time management mode """ return self.time.statistics()
[docs] @service def set_time_scale(self, value): """ Modify the time_scale parameter, allowing to slowing or accelerating time """ success = blenderapi.set_time_scale(value) if success: logger.info("Changing time scale to %f. Your simulation is now running" " %f times %s than real-time." % ( value, value if value >= 1.0 else 1.0 / value, "faster" if value >= 1.0 else "slower")) new_fps = self.ref_fps * value internal_syncer = blenderapi.persistantstorage().internal_syncer if internal_syncer: internal_syncer.set_period(1.0 / new_fps) blenderapi.setfrequency(new_fps) return success
@async_service def sleep(self, time): """ Sleep for time seconds :param: a float representing the time to wait (in second) """ self._alarm_time = self.time.time + float(time) logger.debug('alarm registered for %f' % self._alarm_time)
[docs] def action(self): if self._alarm_time and time_isafter(self.time.time, self._alarm_time): logger.debug('alarm fired at %f difference %f' % (self.time.time, self._alarm_time - self.time.time)) self._alarm_time = None self.completed(status.SUCCESS)