Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (7.007 KB)

1 0c286af0 Simon Schulz
#!/usr/bin/python
2 f8fa1217 Simon Schulz
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 0c286af0 Simon Schulz
import sys
36
import os.path
37 f8fa1217 Simon Schulz
38 0c286af0 Simon Schulz
from PyQt4 import QtGui, QtCore
39
from PyQt4.QtCore import SIGNAL
40
41 f8fa1217 Simon Schulz
class HLRCExample(QtGui.QWidget):
42 0c286af0 Simon Schulz
    
43 f8fa1217 Simon Schulz
        def __init__(self, scope, mw):
44
                super(HLRCExample, self).__init__()
45 0c286af0 Simon Schulz
        
46 f8fa1217 Simon Schulz
                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 00c26660 Simon Schulz
                self.duration_spinbox = self.initSpinbox(100, 10000, 1000, 0)
88 f8fa1217 Simon Schulz
                vbox.addWidget(self.duration_spinbox)
89
                
90 7a4bc347 Simon Schulz
                #self.duration_spinbox = self.initSpinbox(50, 10000, 1000, 0)
91 f8fa1217 Simon Schulz
                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 0c286af0 Simon Schulz
        
111 f8fa1217 Simon Schulz
                #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 00c26660 Simon Schulz
                self.duration_each_spinbox = self.initSpinbox(50,10000,1000,0)
121 f8fa1217 Simon Schulz
                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 0c286af0 Simon Schulz
239
def main():
240 f8fa1217 Simon Schulz
        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 0c286af0 Simon Schulz
        scope = sys.argv[1]
246 f8fa1217 Simon Schulz
        mw    = sys.argv[2]
247 0c286af0 Simon Schulz
248 f8fa1217 Simon Schulz
        app = QtGui.QApplication(sys.argv)
249
        ex = HLRCExample(mw, scope)
250
        sys.exit(app.exec_())
251 0c286af0 Simon Schulz
252
253
if __name__ == '__main__':
254 f8fa1217 Simon Schulz
        main()