Statistics
| Branch: | Tag: | Revision:

hlrc / client / python / hlrc_client / Middleware.py @ 84534fbf

History | View | Annotate | Download (5.982 KB)

1
"""
2
This file is part of hlrc
3

4
Copyright(c) sschulz <AT> techfak.uni-bielefeld.de
5
http://opensource.cit-ec.de/projects/hlrc
6

7
This file may be licensed under the terms of the
8
GNU General Public License Version 3 (the ``GPL''),
9
or (at your option) any later version.
10

11
Software distributed under the License is distributed
12
on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either
13
express or implied. See the GPL for the specific language
14
governing rights and limitations.
15

16
You should have received a copy of the GPL along with this
17
program. If not, go to http://www.gnu.org/licenses/gpl.html
18
or write to the Free Software Foundation, Inc.,
19
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20

21
The development of this software was supported by the
22
Excellence Cluster EXC 277 Cognitive Interaction Technology.
23
The Excellence Cluster EXC 277 is a grant of the Deutsche
24
Forschungsgemeinschaft (DFG) in the context of the German
25
Excellence Initiative.
26
"""
27

    
28
import sys
29
import logging
30
from .RobotEmotion import *
31
from .RobotGaze import *
32
from .RobotMouth import *
33
from .RobotAnimation import *
34

    
35
class Middleware:
36
    #######################################################################
37
    def __init__(self, scope, loglevel=logging.WARNING):
38
        """initialise
39
        :param scope: base scope we want to listen on
40
        """
41
        self.base_scope = scope
42

    
43
        self.logger = logging.getLogger(__name__)
44

    
45
        # create nice and actually usable formatter and add it to the handler
46
        self.config_logger(loglevel)
47

    
48
        #initialise defaults
49
        self.default_emotion = RobotEmotion()
50
        self.current_emotion = RobotEmotion()
51
        self.gaze_target = RobotGaze()
52
        self.mouth_target = RobotMouth()
53
        self.robot_animation = RobotAnimation()
54

    
55
    def __del__(self):
56
        """destructor
57
        """
58
        self.logger.debug("destructor of Middleware called")
59

    
60
    def config_logger(self, level):
61
        formatter = logging.Formatter('%(asctime)s %(name)-30s %(levelname)-8s > %(message)s')
62
        ch = logging.StreamHandler()
63
        #ch.setLevel(level)
64
        ch.setFormatter(formatter)
65
        self.logger.setLevel(level)
66
        self.logger.addHandler(ch)
67

    
68
    #######################################################################
69
    #abstract/virtual functions
70
    def die_virtual(self, funcname):
71
        raise NotImplementedError(funcname + "() is virtual, must be overwritten")
72

    
73
    def is_running(self):
74
        self.die_virtual(sys._getframe().f_code.co_name)
75

    
76
    def init_middleware(self):
77
        self.die_virtual(sys._getframe().f_code.co_name)
78

    
79
    def publish_default_emotion(self, emotion, blocking):
80
        self.die_virtual(sys._getframe().f_code.co_name)
81

    
82
    def publish_current_emotion(self, emotion, blocking):
83
        self.die_virtual(sys._getframe().f_code.co_name)
84

    
85
    def publish_gaze_target(self, gaze, blocking):
86
        self.die_virtual(sys._getframe().f_code.co_name)
87

    
88
    def publish_lookat_target(self, x, y, z, blocking, frame_id, roll):
89
        self.die_virtual(sys._getframe().f_code.co_name)
90

    
91
    def publish_mouth_target(self, mouth, blocking):
92
        self.die_virtual(sys._getframe().f_code.co_name)
93

    
94
    def publish_head_animation(self, animation, blocking):
95
        self.die_virtual(sys._getframe().f_code.co_name)
96

    
97
    def publish_speech(self, text, blocking):
98
        self.die_virtual(sys._getframe().f_code.co_name)
99

    
100
    #######################################################################
101
    #finally some implemented functions
102
    def set_default_emotion(self, emotion, blocking):
103
        """set the default emotion
104
        :param emotion: RobotEmotion to set
105
        :param blocking: True if this call should block until execution finished on robot
106
        """
107
        self.default_emotion = emotion
108
        self.publish_default_emotion(emotion, blocking)
109

    
110
    def set_current_emotion(self, emotion, blocking):
111
        """set a temporary emotion (duration: see emotion.time_ms)
112
        :param emotion: RobotEmotion to set temporarily
113
        :param blocking: True if this call should block until execution finished on robot
114
        """
115
        self.current_emotion = emotion
116
        self.publish_current_emotion(emotion, blocking)
117

    
118
    def set_head_animation(self, animation, blocking):
119
        """trigger a head animation
120
        :param animation: RobotAnimation to set
121
        :param blocking: True if this call should block until execution finished on robot
122
        """
123
        self.animation = animation
124
        self.publish_head_animation(animation, blocking)
125

    
126
    def set_mouth_target(self, mouth, blocking):
127
        """set a mouth target
128
        :param mouth: RobotMouth to set
129
        :param blocking: True if this call should block until execution finished on robot
130
        """
131
        self.mouth_target = mouth
132
        self.publish_mouth_target(mouth, blocking)
133

    
134
    def set_speak(self, text, blocking):
135
        """trigger a tts speech output
136
        :param text: text to synthesize and speak
137
        :param blocking: True if this call should block until execution finished on robot
138
        """
139
        self.publish_speech(text, blocking)
140

    
141
    def set_gaze_target(self, gaze, blocking):
142
        """set a new gaze
143
        :param gaze: RobotGaze to set
144
        :param blocking: True if this call should block until execution finished on robot
145
        """
146
        self.gaze_target = gaze
147
        self.publish_gaze_target(gaze, blocking)
148

    
149
    def set_lookat_target(self, x, y, z, blocking=False, frame_id='', roll=0.0):
150
        """set a gaze at a Cartesian position
151
        :param x,y,z: position to look at (in eyes frame or frame_id)
152
        :param roll: side-ways motion of head
153
        :param blocking: True if this call should block until execution finished on robot
154
        """
155
        self.publish_lookat_target(x, y, z, blocking, frame_id, roll)
156

    
157
    #######################################################################
158
    #some get methods
159
    #def get_current_emotion(self):
160
    #       return self.current_emotion
161
    #
162
    #def get_default_emotion(self):
163
    #       return self.default_emotion
164
    #