source: remote_control/puzzlebox_brainstorms_client_interface_qt.py @ 67

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

configuration:

  • power thresholds added for concentration and relaxation

client_interface_qt:

  • basic client networking added
  • signal connections added to widgets
  • configuration settings added for widgets

qt4_form:

  • LEGO Mindstorms NXT label added to Bluetooth section

client:

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