Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (7.881 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 PyQt5 import QtCore
39
from PyQt5.QtWidgets import QWidget, QApplication, QVBoxLayout, QHBoxLayout, QLabel, QPushButton, QSpinBox, QGroupBox, QDoubleSpinBox
40

    
41
class HLRCExample(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 = QGroupBox("utterances")
53

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

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

    
60

    
61
        vbox = 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 = QDoubleSpinBox()
72
        else:
73
            s = 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 = QPushButton(text)
82
        button.clicked.connect(action)
83
        base_layout.addWidget(button)
84

    
85
    def initEmotionUI(self):
86
        vbox = 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 = QGroupBox("emotion")
100
        groupBox.setLayout(vbox)
101
        return groupBox
102

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

    
108
    def initAnimUI(self):
109
        groupBox = QGroupBox("animations")
110

    
111
        #options
112
        options = QHBoxLayout()
113
        vbox_r = QVBoxLayout()
114
        vbox_r.addWidget(QLabel("repetitions"))
115
        self.repetitions_spinbox = self.initSpinbox(1,10,1,0)
116
        vbox_r.addWidget(self.repetitions_spinbox)
117

    
118
        vbox_d = QVBoxLayout()
119
        vbox_d.addWidget(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 = QVBoxLayout()
124
        vbox_s.addWidget(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 = 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 = QVBoxLayout()
150

    
151
        hboxl = QHBoxLayout()
152
        hboxl.addWidget(QLabel("base scope: "))
153
        hboxl.addWidget(QLabel(self.scope))
154
        vbox.addLayout(hboxl)
155

    
156
        hbox = 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 = QApplication(sys.argv)
249
    ex = HLRCExample(mw, scope)
250
    sys.exit(app.exec_())
251

    
252

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