source: remote_control/puzzlebox_brainstorms_client_interface.py @ 73

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

brainstorms:

  • comprehensive file and class renaming in response to conversions

from PyGame/Twisted? frameworks to Qt

File size: 9.3 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.06.28
12#
13#####################################################################
14
15import os, sys
16
17try:
18        import PySide as PyQT4
19except:
20        print "Using PyQt4 module"
21else:
22        print "Using PySide module"
23
24from PyQt4 import QtCore, QtGui, QtNetwork
25
26sys.path.append(os.path.join(os.getcwd(), "interface"))
27from qt4_form import Ui_Form
28
29import simplejson as json
30
31import puzzlebox_brainstorms_configuration as configuration
32import puzzlebox_brainstorms_client as client
33#import puzzlebox_logger
34
35#####################################################################
36# Globals
37#####################################################################
38
39DEBUG = 1
40
41BRAINSTORMS_SERVER_HOST = configuration.BRAINSTORMS_SERVER_HOST
42BRAINSTORMS_SERVER_PORT = configuration.BRAINSTORMS_SERVER_PORT
43
44THINKGEAR_SERVER_HOST = configuration.THINKGEAR_SERVER_HOST
45THINKGEAR_SERVER_PORT = configuration.THINKGEAR_SERVER_PORT
46
47THINKGEAR_DELIMITER = configuration.THINKGEAR_DELIMITER
48
49THINKGEAR_CONFIGURATION_PARAMETERS = configuration.THINKGEAR_CONFIGURATION_PARAMETERS
50
51THINKGEAR_POWER_THRESHOLDS = configuration.THINKGEAR_POWER_THRESHOLDS
52
53NXT_BLUETOOTH_DEVICE = configuration.NXT_BLUETOOTH_DEVICE
54
55#####################################################################
56# Classes
57#####################################################################
58
59class puzzlebox_brainstorms_client_interface( \
60              QtGui.QWidget, Ui_Form, \
61              client.puzzlebox_brainstorms_client):
62       
63        def __init__(self, log, DEBUG=DEBUG, parent = None):
64               
65                self.log = log
66                self.DEBUG = DEBUG
67               
68                QtGui.QWidget.__init__(self, parent)
69                self.setupUi(self)
70               
71                self.configureSettings()
72                self.connectWidgets()
73                self.configureNetwork()
74       
75       
76        ##################################################################
77       
78        def configureSettings(self):
79               
80                # Bluetooth readout current not available
81                self.textLabelBluetoothStatus.setText("Status: N/A")
82               
83                # Display communication port for LEGO Mindstorms NXT device
84                self.lineEditBluetoothPort.setText(NXT_BLUETOOTH_DEVICE)
85               
86                # Bluetooth connection control not available
87                self.pushButtonBluetoothConnect.setEnabled(False)
88               
89                # Set concentration threshold value
90                concentration_threshold = \
91                        self.getMinimumThreshold(THINKGEAR_POWER_THRESHOLDS['concentration'])
92                self.spinBoxConcentrationThreshold.setValue(concentration_threshold)
93                self.spinBoxConcentrationThreshold.update()
94               
95                # Concentration threshold value not modifiable
96                self.spinBoxConcentrationThreshold.setEnabled(False)
97               
98                # Set relaxation threshold value
99                relaxation_threshold = \
100                        self.getMinimumThreshold(THINKGEAR_POWER_THRESHOLDS['relaxation'])
101                self.spinBoxRelaxationThreshold.setValue(relaxation_threshold)
102                self.spinBoxRelaxationThreshold.update()
103               
104                # Relaxation threshold value not modifiable
105                self.spinBoxRelaxationThreshold.setEnabled(False)
106       
107       
108        ##################################################################
109       
110        def getMinimumThreshold(self, threshold):
111               
112                '''Return the minimum detection level which results
113                in a non-zero power setting'''
114               
115                minimum = 100
116               
117                threshold_keys = threshold.keys()
118                threshold_keys.sort()
119                threshold_keys.reverse()
120               
121                for key in threshold_keys:
122                       
123                        if ((threshold[key] < minimum) and \
124                                 (threshold[key] > 0)):
125                                minimum = key
126               
127               
128                return(minimum)
129       
130       
131        ##################################################################
132       
133        def connectWidgets(self):
134               
135                self.connect(self.pushButtonTurnLeft, QtCore.SIGNAL("pressed()"), \
136                             self.turnLeft)
137                self.connect(self.pushButtonTurnLeft, QtCore.SIGNAL("released()"), \
138                             self.stopMotors)
139               
140                self.connect(self.pushButtonForward, QtCore.SIGNAL("pressed()"), \
141                             self.driveForward)
142                self.connect(self.pushButtonForward, QtCore.SIGNAL("released()"), \
143                             self.stopMotors)
144               
145                self.connect(self.pushButtonTurnRight, QtCore.SIGNAL("pressed()"), \
146                             self.turnRight)
147                self.connect(self.pushButtonTurnRight, QtCore.SIGNAL("released()"), \
148                             self.stopMotors)
149               
150                self.connect(self.pushButtonTurnLeftReverse, QtCore.SIGNAL("pressed()"), \
151                             self.turnLeftInReverse)
152                self.connect(self.pushButtonTurnLeftReverse, QtCore.SIGNAL("released()"), \
153                             self.stopMotors)
154               
155                self.connect(self.pushButtonReverse, QtCore.SIGNAL("pressed()"), \
156                             self.driveReverse)
157                self.connect(self.pushButtonReverse, QtCore.SIGNAL("released()"), \
158                             self.stopMotors)
159               
160                self.connect(self.pushButtonTurnRightReverse, QtCore.SIGNAL("pressed()"), \
161                             self.turnRightInReverse)
162                self.connect(self.pushButtonTurnRightReverse, QtCore.SIGNAL("released()"), \
163                             self.stopMotors)
164               
165               
166                #self.connect(self.pushButtonBluetoothConnect, \
167                                  #QtCore.SIGNAL("clicked()"), \
168                                  #self.test)
169       
170       
171        ##################################################################
172       
173        def configureNetwork(self):
174               
175                #self.blockSize = 0
176                self.brainstormsClientTcpSocket = QtNetwork.QTcpSocket(self)
177                self.brainstormsClientTcpSocket.name = 'Brainstorms Server'
178               
179                #self.brainstormsClientTcpSocket.readyRead.connect(self.printReply)
180                self.brainstormsClientTcpSocket.error.connect(self.displayError)
181               
182               
183                self.thinkgearClientTcpSocket = QtNetwork.QTcpSocket(self)
184                self.thinkgearClientTcpSocket.name = 'ThinkGear Server'
185               
186                self.thinkgearClientTcpSocket.readyRead.connect(self.printReply)
187                self.thinkgearClientTcpSocket.error.connect(self.displayError)
188               
189                self.sendCommand(THINKGEAR_CONFIGURATION_PARAMETERS, \
190                                 self.thinkgearClientTcpSocket, \
191                                 THINKGEAR_SERVER_HOST, \
192                                 THINKGEAR_SERVER_PORT)
193       
194       
195        ##################################################################
196       
197        def printReply(self, reply=None):
198               
199                socket = self.thinkgearClientTcpSocket
200               
201                socket_buffer = socket.readAll()
202               
203                for packet in socket_buffer.split(THINKGEAR_DELIMITER):
204                       
205                        if packet != '':
206                               
207                                data = json.loads(packet.data())
208                               
209                                if self.DEBUG:
210                                        print "<-- [%s] Received:" % socket.name,
211                                        print data
212                               
213                                self.processPacketThinkGear(data)
214       
215       
216        ##################################################################
217       
218        def processPacketThinkGear(self, packet):
219               
220                if ('eSense' in packet.keys()):
221                               
222                        if ('attention' in packet['eSense'].keys()):
223                                self.progressBarConcentration.setValue(packet['eSense']['attention'])
224                       
225                        if ('meditation' in packet['eSense'].keys()):
226                                self.progressBarRelaxation.setValue(packet['eSense']['meditation'])                     
227       
228       
229        ##################################################################
230       
231        def displayError(self, socketError):
232               
233                if socketError == QtNetwork.QAbstractSocket.RemoteHostClosedError:
234                        pass
235               
236                elif socketError == QtNetwork.QAbstractSocket.HostNotFoundError:
237                        QtGui.QMessageBox.information(self, "Puzzlebox Brainstorms Client",
238                                        "The server host was not found. Please check the host name and "
239                                        "port settings.")
240               
241                elif socketError == QtNetwork.QAbstractSocket.ConnectionRefusedError:
242                        QtGui.QMessageBox.information(self, "Puzzlebox Brainstorms Client",
243                                        "The server connection was refused by the peer. Make sure the "
244                                        "server is running, and check that the host name "
245                                        "and port settings are correct.")
246               
247                else:
248                        QtGui.QMessageBox.information(self, "Puzzlebox Brainstorms Client",
249                                        "The following error occurred: %s." % \
250                                           self.brainstormsClientTcpSocket.errorString())
251       
252       
253        ##################################################################
254       
255        def turnLeft(self):
256                self.sendCommand('turn_left', self.brainstormsClientTcpSocket)
257       
258        def driveForward(self):
259                self.sendCommand('drive_forward', self.brainstormsClientTcpSocket)
260       
261        def turnRight(self):
262                self.sendCommand('turn_right', self.brainstormsClientTcpSocket)
263       
264        def turnLeftInReverse(self):
265                self.sendCommand('turn_left_in_reverse', self.brainstormsClientTcpSocket)
266       
267        def driveReverse(self):
268                self.sendCommand('drive_reverse', self.brainstormsClientTcpSocket)
269       
270        def turnRightInReverse(self):
271                self.sendCommand('turn_right_in_reverse', self.brainstormsClientTcpSocket)
272       
273        def stopMotors(self):
274                self.sendCommand('stop_motors', self.brainstormsClientTcpSocket)
275       
276       
277        ##################################################################
278       
279        def sendCommand(self, \
280                             command, \
281                             socket, \
282                             host=BRAINSTORMS_SERVER_HOST, \
283                             port=BRAINSTORMS_SERVER_PORT):
284               
285                if self.DEBUG:
286                        print "--> [%s] Sending:" % socket.name,
287                        print command
288               
289                socket.abort()
290                socket.connectToHost(host, port)
291               
292                data = json.dumps(command)
293                socket.write(data)
294       
295       
296        ##################################################################
297       
298        def test(self):
299               
300                print "Test Successful"
301
302
303#####################################################################
304# Functions
305#####################################################################
306
307#####################################################################
308# Main
309#####################################################################
310
311if __name__ == '__main__':
312       
313        log = None
314       
315        app = QtGui.QApplication(sys.argv)
316       
317        window = puzzlebox_brainstorms_client_interface(log, DEBUG)
318        window.show()
319       
320        app.exec_()
321
Note: See TracBrowser for help on using the repository browser.