source: remote_control/puzzlebox_brainstorms_client_interface.py @ 82

Last change on this file since 82 was 82, checked in by sc, 11 years ago

remote_control/puzzlebox_brainstorms_network_client_thinkgear.py:

  • GUI updates moved to client interface

remote_control/puzzlebox_brainstorms_client_interface.py:

  • speed processing added
  • GUI updated moved from network_client_thinkgear

remote_control/puzzlebox_brainstorms_network_server_thinkgear.py:

  • DEFAULT_SAMPLE_WAVELENGTH increased to 30 seconds
  • minor cleanup
File size: 9.2 KB
Line 
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3#
4# Puzzlebox - Brainstorms - Client Interface - Qt
5#
6# Copyright Puzzlebox Productions, LLC (2010)
7#
8# This code is released under the GNU Pulic License (GPL) version 2
9# For more information please refer to http://www.gnu.org/copyleft/gpl.html
10#
11# Last Update: 2010.07.01
12#
13#####################################################################
14
15import os, sys
16
17#try:
18        #from PySide import QtCore, QtGui, QtNetwork
19#except:
20        #print "Using PyQt4 module"
21        #from PyQt4 import QtCore, QtGui, QtNetwork
22#else:
23        #print "Using PySide module"
24
25from PyQt4 import QtCore, QtGui, QtNetwork
26#from PySide import QtCore, QtGui, QtNetwork
27
28sys.path.append(os.path.join(os.getcwd(), "interface"))
29from qt4_form import Ui_Form
30
31import simplejson as json
32
33import puzzlebox_brainstorms_configuration as configuration
34import puzzlebox_brainstorms_network_client as brainstorms_client
35import puzzlebox_brainstorms_network_client_thinkgear as thinkgear_client
36#import puzzlebox_logger
37
38#####################################################################
39# Globals
40#####################################################################
41
42DEBUG = 1
43
44THINKGEAR_POWER_THRESHOLDS = configuration.THINKGEAR_POWER_THRESHOLDS
45
46NXT_BLUETOOTH_DEVICE = configuration.NXT_BLUETOOTH_DEVICE
47
48THINKGEAR_SERVER_HOST = configuration.THINKGEAR_SERVER_HOST
49THINKGEAR_SERVER_PORT = configuration.THINKGEAR_SERVER_PORT
50
51#####################################################################
52# Classes
53#####################################################################
54
55class puzzlebox_brainstorms_client_interface(QtGui.QWidget, Ui_Form):
56       
57        def __init__(self, log, DEBUG=DEBUG, parent = None):
58               
59                self.log = log
60                self.DEBUG = DEBUG
61               
62                QtGui.QWidget.__init__(self, parent)
63                self.setupUi(self)
64               
65                self.configureSettings()
66                self.configureNetworkBrainstorms()
67                self.connectWidgets()
68       
69       
70        ##################################################################
71       
72        def configureSettings(self):
73               
74                # LEGO Mindstorms
75               
76                # NXT Bluetooth readout current not available
77                self.textLabelNXTStatus.setText("Status: N/A")
78               
79                # Display communication port for LEGO Mindstorms NXT device
80                self.lineEditNXTPort.setText(NXT_BLUETOOTH_DEVICE)
81                self.lineEditNXTPort.setEnabled(False)
82               
83                # NXT Bluetooth connection control not available
84                self.pushButtonNXTConnect.setEnabled(False)
85               
86               
87                # EEG Headset
88               
89                # Display Host for ThinkGear Connect Socket Server
90                self.lineEditThinkGearHost.setText(THINKGEAR_SERVER_HOST)
91                self.lineEditThinkGearHost.setEnabled(False)
92               
93                # Display Port for ThinkGear Connect Socket Server
94                self.lineEditThinkGearPort.setText('%i' % THINKGEAR_SERVER_PORT)
95                self.lineEditThinkGearPort.setEnabled(False)
96               
97               
98                # Thresholds Removed
99               
100                # Set concentration threshold value
101                #concentration_threshold = \
102                        #self.getMinimumThreshold(THINKGEAR_POWER_THRESHOLDS['concentration'])
103                #self.spinBoxConcentrationThreshold.setValue(concentration_threshold)
104                #self.spinBoxConcentrationThreshold.update()
105               
106                # Concentration threshold value not modifiable
107                #self.spinBoxConcentrationThreshold.setEnabled(False)
108               
109                # Set relaxation threshold value
110                #relaxation_threshold = \
111                        #self.getMinimumThreshold(THINKGEAR_POWER_THRESHOLDS['relaxation'])
112                #self.spinBoxRelaxationThreshold.setValue(relaxation_threshold)
113                #self.spinBoxRelaxationThreshold.update()
114               
115                # Relaxation threshold value not modifiable
116                #self.spinBoxRelaxationThreshold.setEnabled(False)
117       
118       
119        ##################################################################
120       
121        def getMinimumThreshold(self, threshold):
122               
123                '''Return the minimum detection level which results
124                in a non-zero power setting'''
125               
126                minimum = 100
127               
128                threshold_keys = threshold.keys()
129                threshold_keys.sort()
130                threshold_keys.reverse()
131               
132                for key in threshold_keys:
133                       
134                        if ((threshold[key] < minimum) and \
135                                 (threshold[key] > 0)):
136                                minimum = key
137               
138               
139                return(minimum)
140       
141       
142        ##################################################################
143       
144        def configureNetworkBrainstorms(self):
145               
146                self.brainstormsClient = \
147                   brainstorms_client.puzzlebox_brainstorms_network_client(self.log, parent=self)
148       
149       
150        ##################################################################
151       
152        def connectToThinkGearHost(self):
153               
154                if self.DEBUG:
155                        print "Connecting to ThinkGear Host"
156               
157                self.thinkgearClient = \
158                   thinkgear_client.puzzlebox_brainstorms_network_client_thinkgear(self.log, parent=self)
159               
160                self.disconnect(self.pushButtonThinkGearConnect, \
161                             QtCore.SIGNAL("clicked()"), \
162                             self.connectToThinkGearHost)
163               
164                self.connect(self.pushButtonThinkGearConnect, \
165                                  QtCore.SIGNAL("clicked()"), \
166                                  self.diconnectFromThinkGearHost)
167               
168                self.pushButtonThinkGearConnect.setText('Disconnect')
169       
170       
171        ##################################################################
172       
173        def diconnectFromThinkGearHost(self):
174               
175                if self.DEBUG:
176                        print "Disconnecting from ThinkGear Host"
177               
178                self.thinkgearClient.disconnectFromHost()
179               
180                self.disconnect(self.pushButtonThinkGearConnect, \
181                                  QtCore.SIGNAL("clicked()"), \
182                                  self.diconnectFromThinkGearHost)
183               
184                self.connect(self.pushButtonThinkGearConnect, \
185                                  QtCore.SIGNAL("clicked()"), \
186                                  self.connectToThinkGearHost)
187               
188                self.pushButtonThinkGearConnect.setText('Connect')
189       
190       
191        ##################################################################
192       
193        def connectWidgets(self):
194               
195                self.connect(self.pushButtonTurnLeft, QtCore.SIGNAL("pressed()"), \
196                             self.turnLeft)
197                self.connect(self.pushButtonTurnLeft, QtCore.SIGNAL("released()"), \
198                             self.stopMotors)
199               
200                self.connect(self.pushButtonForward, QtCore.SIGNAL("pressed()"), \
201                             self.driveForward)
202                self.connect(self.pushButtonForward, QtCore.SIGNAL("released()"), \
203                             self.stopMotors)
204               
205                self.connect(self.pushButtonTurnRight, QtCore.SIGNAL("pressed()"), \
206                             self.turnRight)
207                self.connect(self.pushButtonTurnRight, QtCore.SIGNAL("released()"), \
208                             self.stopMotors)
209               
210                self.connect(self.pushButtonTurnLeftReverse, QtCore.SIGNAL("pressed()"), \
211                             self.turnLeftInReverse)
212                self.connect(self.pushButtonTurnLeftReverse, QtCore.SIGNAL("released()"), \
213                             self.stopMotors)
214               
215                self.connect(self.pushButtonReverse, QtCore.SIGNAL("pressed()"), \
216                             self.driveReverse)
217                self.connect(self.pushButtonReverse, QtCore.SIGNAL("released()"), \
218                             self.stopMotors)
219               
220                self.connect(self.pushButtonTurnRightReverse, QtCore.SIGNAL("pressed()"), \
221                             self.turnRightInReverse)
222                self.connect(self.pushButtonTurnRightReverse, QtCore.SIGNAL("released()"), \
223                             self.stopMotors)
224               
225               
226                self.connect(self.pushButtonThinkGearConnect, \
227                                  QtCore.SIGNAL("clicked()"), \
228                                  self.connectToThinkGearHost)
229       
230       
231        ##################################################################
232       
233        def turnLeft(self):
234                self.brainstormsClient.sendCommand('turn_left')
235       
236        def driveForward(self):
237                self.brainstormsClient.sendCommand('drive_forward')
238       
239        def turnRight(self):
240                self.brainstormsClient.sendCommand('turn_right')
241       
242        def turnLeftInReverse(self):
243                self.brainstormsClient.sendCommand('turn_left_in_reverse')
244       
245        def driveReverse(self):
246                self.brainstormsClient.sendCommand('drive_reverse')
247       
248        def turnRightInReverse(self):
249                self.brainstormsClient.sendCommand('turn_right_in_reverse')
250       
251        def stopMotors(self):
252                self.brainstormsClient.sendCommand('stop_motors')
253       
254       
255        ##################################################################
256       
257        def processPacketThinkGear(self, packet):
258               
259                if ('eSense' in packet.keys()):
260                       
261                        if ('attention' in packet['eSense'].keys()):
262                                self.progressBarConcentration.setValue(packet['eSense']['attention'])
263                       
264                        if ('meditation' in packet['eSense'].keys()):
265                                self.progressBarRelaxation.setValue(packet['eSense']['meditation'])
266                       
267                        if (('attention' in packet['eSense'].keys()) and \
268                                 ('meditation' in packet['eSense'].keys())):
269                               
270                                self.calculateSpeed(packet['eSense']['attention'], \
271                                                    packet['eSense']['meditation'])
272       
273       
274        ##################################################################
275       
276        def calculateSpeed(self, concentration, relaxation):
277               
278                speed = 0
279               
280                thresholds = THINKGEAR_POWER_THRESHOLDS
281               
282                match = int(concentration)
283               
284                while ((match not in thresholds['concentration'].keys()) and \
285                            (match >= 0)):
286                        match -= 1
287               
288               
289                if match in thresholds['concentration'].keys():
290                        speed = thresholds['concentration'][match]
291               
292               
293                match = int(relaxation)
294               
295                while ((match not in thresholds['relaxation'].keys()) and \
296                            (match >= 0)):
297                        match -= 1
298               
299                if match in thresholds['relaxation'].keys():
300                        speed = speed + thresholds['relaxation'][match]
301               
302               
303                self.progressBarSpeed.setValue(speed)
304
305
306#####################################################################
307# Functions
308#####################################################################
309
310#####################################################################
311# Main
312#####################################################################
313
314if __name__ == '__main__':
315       
316        log = None
317       
318        app = QtGui.QApplication(sys.argv)
319       
320        window = puzzlebox_brainstorms_client_interface(log, DEBUG)
321        window.show()
322       
323        sys.exit(app.exec_())
324
Note: See TracBrowser for help on using the repository browser.