Statistics
| Branch: | Tag: | Revision:

hlrc / client / python / hlrc_client / hlrc_test_gui.py @ e983fef1

History | View | Annotate | Download (7.007 KB)

1
#!/usr/bin/python
2

    
3
"""
4
This file is part of hlrc
5

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

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

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

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

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

    
30

    
31
import logging
32
from hlrc_client import *
33
import time
34
import errno
35
import sys
36
import os.path
37

    
38
from PyQt4 import QtGui, QtCore
39
from PyQt4.QtCore import SIGNAL
40

    
41
class HLRCExample(QtGui.QWidget):
42
    
43
        def __init__(self, scope, mw):
44
                super(HLRCExample, self).__init__()
45
        
46
                self.scope = scope
47
                self.mw = mw
48
                self.initUI()
49
                self.robot_controller = RobotController(self.mw, self.scope, logging.DEBUG)
50

    
51
        def initUtteranceUI(self):
52
                groupBox = QtGui.QGroupBox("utterances")
53

    
54
                hello = QtGui.QPushButton("hello...")
55
                hello.clicked.connect(self.utterance_button_clicked)
56

    
57
                count = QtGui.QPushButton("12345...")
58
                count.clicked.connect(self.utterance_button_clicked)
59

    
60

    
61
                vbox = QtGui.QVBoxLayout()
62
                vbox.addWidget(hello)
63
                vbox.addWidget(count)
64
                vbox.addStretch(1)
65
                groupBox.setLayout(vbox)
66

    
67
                return groupBox
68

    
69
        def initSpinbox(self, _min, _max, _init, double):
70
                if (double): 
71
                        s = QtGui.QDoubleSpinBox()
72
                else:
73
                        s = QtGui.QSpinBox()
74

    
75
                s.setMinimum(_min)
76
                s.setMaximum(_max)
77
                s.setValue(_init)
78
                return s
79

    
80
        def initPushButton(self, base_layout, text, action):
81
                button = QtGui.QPushButton(text)
82
                button.clicked.connect(action)
83
                base_layout.addWidget(button)
84
                
85
        def initEmotionUI(self):
86
                vbox = QtGui.QVBoxLayout()
87
                self.duration_spinbox = self.initSpinbox(100, 10000, 1000, 0)
88
                vbox.addWidget(self.duration_spinbox)
89
                
90
                #self.duration_spinbox = self.initSpinbox(50, 10000, 1000, 0)
91
                self.initPushButton(vbox, "neutral",  self.emotion_button_clicked)
92
                self.initPushButton(vbox, "surprise", self.emotion_button_clicked)
93
                self.initPushButton(vbox, "angry",    self.emotion_button_clicked)
94
                self.initPushButton(vbox, "happy",    self.emotion_button_clicked)
95
                self.initPushButton(vbox, "sad",      self.emotion_button_clicked)
96
                self.initPushButton(vbox, "fear",     self.emotion_button_clicked)
97
                vbox.addStretch(1)
98
                
99
                groupBox = QtGui.QGroupBox("emotion")
100
                groupBox.setLayout(vbox)
101
                return groupBox
102

    
103
        def initAnimationButton(self, base_layout, name):
104
                b = QtGui.QPushButton(name)
105
                b.clicked.connect(self.animation_button_clicked)
106
                base_layout.addWidget(b)
107

    
108
        def initAnimUI(self):
109
                groupBox = QtGui.QGroupBox("animations")
110
        
111
                #options
112
                options = QtGui.QHBoxLayout()
113
                vbox_r = QtGui.QVBoxLayout()
114
                vbox_r.addWidget(QtGui.QLabel("repetitions"))
115
                self.repetitions_spinbox = self.initSpinbox(1,10,1,0)
116
                vbox_r.addWidget(self.repetitions_spinbox)
117

    
118
                vbox_d = QtGui.QVBoxLayout()
119
                vbox_d.addWidget(QtGui.QLabel("duration/ms (each)"))
120
                self.duration_each_spinbox = self.initSpinbox(50,10000,1000,0)
121
                vbox_d.addWidget(self.duration_each_spinbox)
122

    
123
                vbox_s = QtGui.QVBoxLayout()
124
                vbox_s.addWidget(QtGui.QLabel("scale"))
125
                self.scale_spinbox = self.initSpinbox(0.1, 5.0, 1.0, 1)
126
                vbox_s.addWidget(self.scale_spinbox)
127

    
128

    
129
                options.addLayout(vbox_r)
130
                options.addLayout(vbox_d)        
131
                options.addLayout(vbox_s)
132

    
133
                #buttons
134
                vbox = QtGui.QVBoxLayout()
135
                vbox.addLayout(options)
136
                self.initAnimationButton(vbox, "head shake")
137
                self.initAnimationButton(vbox, "head nod")
138
                self.initAnimationButton(vbox, "eyeblink left")
139
                self.initAnimationButton(vbox, "eyeblink right")
140
                self.initAnimationButton(vbox, "eyeblink both")
141
                self.initAnimationButton(vbox, "eyebrows raise")
142
                self.initAnimationButton(vbox, "eyebrows lower")
143
                vbox.addStretch(1)
144
                groupBox.setLayout(vbox)
145

    
146
                return groupBox
147

    
148
        def initUI(self):
149
                vbox = QtGui.QVBoxLayout()
150
                
151
                hboxl = QtGui.QHBoxLayout()
152
                hboxl.addWidget(QtGui.QLabel("base scope: "))
153
                hboxl.addWidget(QtGui.QLabel(self.scope))
154
                vbox.addLayout(hboxl)
155

    
156
                hbox = QtGui.QHBoxLayout()
157
                vbox.addLayout(hbox)
158
                
159
                #emotion
160
                hbox.addWidget(self.initEmotionUI())
161

    
162
                #utterance:
163
                hbox.addWidget(self.initUtteranceUI())
164

    
165
                #animations:
166
                hbox.addWidget(self.initAnimUI())
167

    
168
                self.setLayout(vbox)
169
                #sld.valueChanged.connect(lcd.display)
170
                
171
                self.setGeometry(400, 100, 250, 150)
172
                self.setWindowTitle("HLRC Server test GUI - %s" % self.scope)
173
                self.show()
174

    
175
        def utterance_button_clicked(self):
176
                button = self.sender().text()
177
                
178
                
179
                if (button == "12345..."):
180
                        self.robot_controller.set_speak("1 2 3 4 5 6 7 8 9 10", False)
181
                elif (button == "hello..."):
182
                        self.robot_controller.set_speak("Hello my name is flobi. How can i help you?", False)
183
                else:
184
                        self.robot_controller.set_speak("invalid button name", False)
185
                        print "invalid button '%s'" % (button)
186

    
187
        def emotion_button_clicked(self):
188
                button = self.sender().text()
189
                
190
                re = RobotEmotion()
191
                re.time_ms = self.duration_spinbox.value()
192
                
193
                if (button == "angry"):
194
                        re.value = RobotEmotion.ANGRY
195
                elif (button == "neutral"):
196
                        re.value = RobotEmotion.NEUTRAL
197
                elif (button == "happy"):
198
                        re.value = RobotEmotion.HAPPY
199
                elif (button == "sad"):
200
                        re.value = RobotEmotion.SAD
201
                elif (button == "surprise"):
202
                        re.value = RobotEmotion.SURPRISED
203
                elif (button == "fear"):
204
                        re.value = RobotEmotion.FEAR
205
                else:
206
                        print "invalid emotion id '%s'" % (button)
207
                        return 
208
                
209
                self.robot_controller.set_current_emotion(re, False)
210
                
211
        def animation_button_clicked(self):
212
                button = self.sender().text()
213
                
214
                ra = RobotAnimation()
215
                ra.time_ms =  self.duration_each_spinbox.value()
216
                ra.repetitions = self.repetitions_spinbox.value()
217
                ra.scale = self.scale_spinbox.value()
218

    
219
                if (button == "head nod"):
220
                        ra.value = RobotAnimation.HEAD_NOD
221
                elif (button == "head shake"):
222
                        ra.value = RobotAnimation.HEAD_SHAKE
223
                elif (button == "eyeblink left"):
224
                        ra.value = RobotAnimation.EYEBLINK_L
225
                elif (button == "eyeblink right"):
226
                        ra.value = RobotAnimation.EYEBLINK_R
227
                elif (button == "eyeblink both"):
228
                        ra.value = RobotAnimation.EYEBLINK_BOTH
229
                elif (button == "eyebrows raise"):
230
                        ra.value = RobotAnimation.EYEBROWS_RAISE
231
                elif (button == "eyebrows lower"):
232
                        ra.value = RobotAnimation.EYEBROWS_LOWER
233
                else:
234
                        print "invalid button '%s'" % (button)
235
                        return
236
                
237
                self.robot_controller.set_head_animation(ra, False)
238

    
239
def main():
240
        if (len(sys.argv) != 3):
241
                print("usage:   hlrc_test_gui.py <middleware> <scope>\n\n")
242
                print("example: hlrc_test_gui.py ROS /flobi\n\n")
243
                sys.exit(errno.EINVAL)
244
                
245
        scope = sys.argv[1]
246
        mw    = sys.argv[2]
247

    
248
        app = QtGui.QApplication(sys.argv)
249
        ex = HLRCExample(mw, scope)
250
        sys.exit(app.exec_())
251

    
252

    
253
if __name__ == '__main__':
254
        main()