source: remote_control/puzzlebox_brainstorms_client_interface_qt.py @ 71

Last change on this file since 71 was 71, checked in by sc, 12 years ago

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