Statistics
| Branch: | Tag: | Revision:

hlrc / client / python / hlrc_client / hlrc_test_gui.py @ 3877047d

History | View | Annotate | Download (7.943 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 3877047d Simon Schulz
    def __init__(self, scope, mw):
44
        super(HLRCExample, self).__init__()
45 0c286af0 Simon Schulz
        
46 3877047d Simon Schulz
        self.scope = scope
47
        self.mw = mw
48
        self.initUI()
49
        self.robot_controller = RobotController(self.mw, self.scope, logging.DEBUG)
50 f8fa1217 Simon Schulz
51
        def initUtteranceUI(self):
52 3877047d Simon Schulz
            groupBox = QtGui.QGroupBox("utterances")
53 f8fa1217 Simon Schulz
54 3877047d Simon Schulz
            hello = QtGui.QPushButton("hello...")
55
            hello.clicked.connect(self.utterance_button_clicked)
56 f8fa1217 Simon Schulz
57 3877047d Simon Schulz
            count = QtGui.QPushButton("12345...")
58
            count.clicked.connect(self.utterance_button_clicked)
59 f8fa1217 Simon Schulz
60
61 3877047d Simon Schulz
            vbox = QtGui.QVBoxLayout()
62
            vbox.addWidget(hello)
63
            vbox.addWidget(count)
64
            vbox.addStretch(1)
65
            groupBox.setLayout(vbox)
66 f8fa1217 Simon Schulz
67 3877047d Simon Schulz
            return groupBox
68 f8fa1217 Simon Schulz
69
        def initSpinbox(self, _min, _max, _init, double):
70 3877047d Simon Schulz
            if (double):
71
                s = QtGui.QDoubleSpinBox()
72 f8fa1217 Simon Schulz
                else:
73 3877047d Simon Schulz
                    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()