Source code for morse.middleware.moos.abstract_moos
import logging; logger = logging.getLogger("morse.moos")
import pymoos.MOOSCommClient
from morse.middleware import AbstractDatastream
from morse.core import blenderapi
[docs]class AbstractMOOS(AbstractDatastream):
""" Base class for all MOOS Publishers and Subscribers """
# used to generate documentation, TODO fill in subclasses
_type_name = "db entries"
_type_url = ""
_moosapps = {}
_save_messages = {}
[docs] def initialize(self):
""" Initialize the MOOS app. """
logger.info("MOOS datastream initialize %s"%self)
self.moos_host = self.kwargs.get('moos_host', '127.0.0.1')
self.moos_port = self.kwargs.get('moos_port', 9000)
self.moos_freq = self.kwargs.get('moos_freq', 10.0)
key = (self.moos_host, self.moos_port)
if not key in AbstractMOOS._moosapps:
AbstractMOOS._save_messages[key] = []
AbstractMOOS._moosapps[key] = pymoos.MOOSCommClient.MOOSApp()
AbstractMOOS._moosapps[key].Run(self.moos_host,
self.moos_port,
"uMorse",
self.moos_freq)
logger.info("\tdatastream: host=%s:port=%d (freq: %.2fHz)"
%(self.moos_host, self.moos_port, self.moos_freq))
logger.info("\tnew interface initialized")
# all instance share the same static MOOSApp according to host and port
self.m = AbstractMOOS._moosapps[key]
[docs] def getRecentMail(self):
""" Get recent messages from MOOS. """
key = (self.moos_host, self.moos_port)
messages = self.m.FetchRecentMail()
# a call to FetchRecentMail empties the mail list in MOOSCommClient.MOOSApp
# because multiple actuators can share the same MOOSApp instance,
# it is necessary to save new mails statically
# when there are new messages, the static list is updated
if len(messages) != 0:
AbstractMOOS._save_messages[key] = messages
return AbstractMOOS._save_messages[key]
[docs] def finalize(self):
""" Kill the morse MOOS app."""
key = (self.moos_host, self.moos_port)
if key in AbstractMOOS._moosapps:
AbstractMOOS._moosapps[key].Close()
AbstractMOOS._moosapps.pop(key)
AbstractMOOS._save_messages.pop(key)
logger.info("MOOS datastream finalized: %s:%d"
%(self.moos_host, self.moos_port))
[docs]class StringPublisher(AbstractMOOS):
""" Publish a string containing a printable representation of the
local data. """
[docs] def default(self, ci='unused'):
logger.debug("Posting message to the MOOS database.")
current_time = blenderapi.persistantstorage().time.time
#iterate through all objects of the component_instance and post the data
for variable, data in self.data.items():
name = "%s_%s" % (self.component_name, variable)
logger.debug("name: %s, type: %s, data: %s"%
(name, type(data), str(data)))
self.m.Notify(name, str(data), current_time)
[docs]class StringReader(AbstractMOOS):
""" Log messages. """
[docs] def default(self, ci='unused'):
# get latest mail from the MOOS comm client
messages = self.m.FetchRecentMail()
# log messages
for message in messages:
logger.info("message: %s" % str(message))