source: remote_control/puzzlebox_brainstorms_client_interface.py @ 84

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

remote_control/puzzlebox_brainstorms_network_client.py:

  • power transmission settings added

remote_control/puzzlebox_brainstorms_remote_control.py:

  • custom power settings added

remote_control/puzzlebox_brainstorms_client_interface.py:

  • power transmission settings added
  • udpateSpeed method tracks and calculates power settings
  • power transmission settings added

remote_control/puzzlebox_brainstorms_configuration.ini:

  • DEFAULT_NXT_POWER_LEVEL added and set to 80

remote_control/interface/qt4_form.py:

  • font sizes tweaked

remote_control/puzzlebox_brainstorms_configuration.py:

  • DEFAULT_NXT_POWER_LEVEL added and set to 80

remote_control/puzzlebox_brainstorms_network_server.py

  • power transmission settings added
File size: 9.6 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
48DEFAULT_NXT_POWER_LEVEL = configuration.DEFAULT_NXT_POWER_LEVEL
49
50THINKGEAR_SERVER_HOST = configuration.THINKGEAR_SERVER_HOST
51THINKGEAR_SERVER_PORT = configuration.THINKGEAR_SERVER_PORT
52
53#####################################################################
54# Classes
55#####################################################################
56
57class puzzlebox_brainstorms_client_interface(QtGui.QWidget, Ui_Form):
58       
59        def __init__(self, log, DEBUG=DEBUG, parent = None):
60               
61                self.log = log
62                self.DEBUG = DEBUG
63               
64                QtGui.QWidget.__init__(self, parent)
65                self.setupUi(self)
66               
67                self.configureSettings()
68                self.configureNetworkBrainstorms()
69                self.connectWidgets()
70               
71                self.drive_state = 'stop_motors'
72                self.current_speed = 0
73       
74       
75        ##################################################################
76       
77        def configureSettings(self):
78               
79                # LEGO Mindstorms
80               
81                # NXT Bluetooth readout current not available
82                self.textLabelNXTStatus.setText("Status: N/A")
83               
84                # Display communication port for LEGO Mindstorms NXT device
85                self.lineEditNXTPort.setText(NXT_BLUETOOTH_DEVICE)
86                self.lineEditNXTPort.setEnabled(False)
87               
88                # NXT Bluetooth connection control not available
89                self.pushButtonNXTConnect.setEnabled(False)
90               
91               
92                # EEG Headset
93               
94                # Display Host for ThinkGear Connect Socket Server
95                self.lineEditThinkGearHost.setText(THINKGEAR_SERVER_HOST)
96                self.lineEditThinkGearHost.setEnabled(False)
97               
98                # Display Port for ThinkGear Connect Socket Server
99                self.lineEditThinkGearPort.setText('%i' % THINKGEAR_SERVER_PORT)
100                self.lineEditThinkGearPort.setEnabled(False)
101       
102       
103        ##################################################################
104       
105        def getMinimumThreshold(self, threshold):
106               
107                '''Return the minimum detection level which results
108                in a non-zero power setting'''
109               
110                minimum = 100
111               
112                threshold_keys = threshold.keys()
113                threshold_keys.sort()
114                threshold_keys.reverse()
115               
116                for key in threshold_keys:
117                       
118                        if ((threshold[key] < minimum) and \
119                                 (threshold[key] > 0)):
120                                minimum = key
121               
122               
123                return(minimum)
124       
125       
126        ##################################################################
127       
128        def configureNetworkBrainstorms(self):
129               
130                self.brainstormsClient = \
131                   brainstorms_client.puzzlebox_brainstorms_network_client(self.log, parent=self)
132       
133       
134        ##################################################################
135       
136        def connectToThinkGearHost(self):
137               
138                if self.DEBUG:
139                        print "Connecting to ThinkGear Host"
140               
141                self.thinkgearClient = \
142                   thinkgear_client.puzzlebox_brainstorms_network_client_thinkgear( \
143                           self.log, \
144                           DEBUG=0, \
145                           parent=self)
146               
147                self.disconnect(self.pushButtonThinkGearConnect, \
148                             QtCore.SIGNAL("clicked()"), \
149                             self.connectToThinkGearHost)
150               
151                self.connect(self.pushButtonThinkGearConnect, \
152                                  QtCore.SIGNAL("clicked()"), \
153                                  self.diconnectFromThinkGearHost)
154               
155                self.pushButtonThinkGearConnect.setText('Disconnect')
156       
157       
158        ##################################################################
159       
160        def diconnectFromThinkGearHost(self):
161               
162                if self.DEBUG:
163                        print "Disconnecting from ThinkGear Host"
164               
165                self.thinkgearClient.disconnectFromHost()
166               
167                self.disconnect(self.pushButtonThinkGearConnect, \
168                                  QtCore.SIGNAL("clicked()"), \
169                                  self.diconnectFromThinkGearHost)
170               
171                self.connect(self.pushButtonThinkGearConnect, \
172                                  QtCore.SIGNAL("clicked()"), \
173                                  self.connectToThinkGearHost)
174               
175                self.pushButtonThinkGearConnect.setText('Connect')
176               
177                self.progressBarConcentration.setValue(0)
178                self.progressBarRelaxation.setValue(0)
179                self.progressBarSpeed.setValue(0)
180       
181       
182        ##################################################################
183       
184        def connectWidgets(self):
185               
186                self.connect(self.pushButtonTurnLeft, QtCore.SIGNAL("pressed()"), \
187                             self.turnLeft)
188                self.connect(self.pushButtonTurnLeft, QtCore.SIGNAL("released()"), \
189                             self.stopMotors)
190               
191                self.connect(self.pushButtonForward, QtCore.SIGNAL("pressed()"), \
192                             self.driveForward)
193                self.connect(self.pushButtonForward, QtCore.SIGNAL("released()"), \
194                             self.stopMotors)
195               
196                self.connect(self.pushButtonTurnRight, QtCore.SIGNAL("pressed()"), \
197                             self.turnRight)
198                self.connect(self.pushButtonTurnRight, QtCore.SIGNAL("released()"), \
199                             self.stopMotors)
200               
201                self.connect(self.pushButtonTurnLeftReverse, QtCore.SIGNAL("pressed()"), \
202                             self.turnLeftInReverse)
203                self.connect(self.pushButtonTurnLeftReverse, QtCore.SIGNAL("released()"), \
204                             self.stopMotors)
205               
206                self.connect(self.pushButtonReverse, QtCore.SIGNAL("pressed()"), \
207                             self.driveReverse)
208                self.connect(self.pushButtonReverse, QtCore.SIGNAL("released()"), \
209                             self.stopMotors)
210               
211                self.connect(self.pushButtonTurnRightReverse, QtCore.SIGNAL("pressed()"), \
212                             self.turnRightInReverse)
213                self.connect(self.pushButtonTurnRightReverse, QtCore.SIGNAL("released()"), \
214                             self.stopMotors)
215               
216               
217                self.connect(self.pushButtonThinkGearConnect, \
218                                  QtCore.SIGNAL("clicked()"), \
219                                  self.connectToThinkGearHost)
220       
221       
222        ##################################################################
223       
224        def turnLeft(self):
225                self.brainstormsClient.sendCommand('turn_left')
226                self.drive_state = 'turn_left'
227       
228        def driveForward(self):
229                self.updateSpeed(new_speed=DEFAULT_NXT_POWER_LEVEL)
230                self.brainstormsClient.sendCommand('drive_forward', power=self.current_speed)
231                self.drive_state = 'drive_forward'
232       
233        def turnRight(self):
234                self.brainstormsClient.sendCommand('turn_right')
235                self.drive_state = 'turn_right'
236       
237        def turnLeftInReverse(self):
238                self.brainstormsClient.sendCommand('turn_left_in_reverse')
239                self.drive_state = 'turn_left_in_reverse'
240       
241        def driveReverse(self):
242                self.brainstormsClient.sendCommand('drive_reverse')
243                self.drive_state = 'drive_reverse'
244       
245        def turnRightInReverse(self):
246                self.brainstormsClient.sendCommand('turn_right_in_reverse')
247                self.drive_state = 'turn_right_in_reverse'
248       
249        def stopMotors(self):
250                self.updateSpeed(new_speed=0)
251                self.brainstormsClient.sendCommand('stop_motors')
252                self.drive_state = '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               
268                self.updateSpeed()
269       
270       
271        ##################################################################
272       
273        def updateSpeed(self, new_speed=None):
274               
275                if new_speed == None:
276               
277                        concentration=self.progressBarConcentration.value()
278                        relaxation=self.progressBarRelaxation.value()
279                       
280                        new_speed = self.calculateSpeed(concentration, relaxation)
281               
282               
283                # Update GUI
284                self.progressBarSpeed.setValue(new_speed)
285               
286                # GUI button under "Speed" progress bar set to Enabled
287                speed_control = (self.pushButtonSpeedEnable.text() == 'Enabled')
288               
289                if ((self.current_speed != new_speed) and \
290                         ((self.drive_state == 'drive_forward') or \
291                          (speed_control))):
292                       
293                        self.current_speed = new_speed
294                        self.brainstormsClient.sendCommand('drive_forward', new_speed)
295               
296                else:
297                        self.current_speed = new_speed
298       
299       
300        ##################################################################
301       
302        def calculateSpeed(self, concentration, relaxation):
303               
304                speed = 0
305               
306                thresholds = THINKGEAR_POWER_THRESHOLDS
307               
308                match = int(concentration)
309               
310                while ((match not in thresholds['concentration'].keys()) and \
311                            (match >= 0)):
312                        match -= 1
313               
314               
315                if match in thresholds['concentration'].keys():
316                        speed = thresholds['concentration'][match]
317               
318               
319                match = int(relaxation)
320               
321                while ((match not in thresholds['relaxation'].keys()) and \
322                            (match >= 0)):
323                        match -= 1
324               
325                if match in thresholds['relaxation'].keys():
326                        speed = speed + thresholds['relaxation'][match]
327               
328               
329                return(speed)
330
331
332#####################################################################
333# Functions
334#####################################################################
335
336#####################################################################
337# Main
338#####################################################################
339
340if __name__ == '__main__':
341       
342        log = None
343       
344        app = QtGui.QApplication(sys.argv)
345       
346        window = puzzlebox_brainstorms_client_interface(log, DEBUG)
347        window.show()
348       
349        sys.exit(app.exec_())
350
Note: See TracBrowser for help on using the repository browser.