source: remote_control/puzzlebox_brainstorms_network_client.py @ 111

Last change on this file since 111 was 111, checked in by sc, 11 years ago
  • PySide? import attempted before PyQt4 where available
  • problem specifying port when calling socket.listen on QTcpServer
File size: 6.8 KB
Line 
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3#
4# Puzzlebox - Brainstorms - Network - Client
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.10
12#
13#####################################################################
14
15import os, sys
16import signal
17
18try:
19        import PySide as PyQt4
20        from PySide import QtCore, QtGui, QtNetwork
21except:
22        print "Using PyQt4 module"
23        from PyQt4 import QtCore, QtGui, QtNetwork
24else:
25        print "Using PySide module"
26
27#from PyQt4 import QtCore, QtGui, QtNetwork
28
29import simplejson as json
30
31import puzzlebox_brainstorms_configuration as configuration
32#import puzzlebox_logger
33
34#####################################################################
35# Globals
36#####################################################################
37
38DEBUG = 1
39
40SERVER_HOST = configuration.BRAINSTORMS_SERVER_HOST
41SERVER_PORT = configuration.BRAINSTORMS_SERVER_PORT
42
43CLIENT_NO_REPLY_WAIT = configuration.CLIENT_NO_REPLY_WAIT * 1000
44
45DELIMITER = configuration.BRAINSTORMS_DELIMITER
46
47BLUETOOTH_DEVICE = configuration.NXT_BLUETOOTH_DEVICE
48
49DEFAULT_NXT_POWER_LEVEL = configuration.DEFAULT_NXT_POWER_LEVEL
50NXT_DEFAULT_RC_COMMAND = configuration.NXT_DEFAULT_RC_COMMAND
51
52#####################################################################
53# Classes
54#####################################################################
55
56class puzzlebox_brainstorms_network_client:
57       
58        def __init__(self, log, \
59                          server_host=SERVER_HOST, \
60                          server_port=SERVER_PORT, \
61                          bluetooth_device=BLUETOOTH_DEVICE, \
62                          DEBUG=DEBUG, \
63                          parent=None):
64               
65                self.log = log
66                self.DEBUG = DEBUG
67                self.parent=parent
68               
69                self.server_host = server_host
70                self.server_port = server_port
71               
72                self.configureNetwork()
73       
74       
75        ##################################################################
76       
77        def configureNetwork(self):
78       
79                #self.blockSize = 0
80                self.socket = QtNetwork.QTcpSocket()
81                self.socket.name = 'Brainstorms Client'
82               
83                self.socket.readyRead.connect(self.printReply)
84                self.socket.error.connect(self.displayError)
85       
86       
87        ##################################################################
88       
89        def printReply(self):
90               
91                socket_buffer = self.socket.readAll()
92               
93                for packet in socket_buffer.split(DELIMITER):
94                       
95                        if packet != '':
96                               
97                                try:
98                                        data = json.loads(packet.data())
99                                except:
100                                        data = packet
101                               
102                                if self.DEBUG:
103                                        print "--> [%s] Received:" % self.socket.name,
104                                        print data
105                               
106                               
107                                # If Brainstorms server is connected to a LEGO Mindstorms NXT
108                                # robot, it will send back a voltage measurement which
109                                # can be presented to the user through the client interface
110                                if ((self.parent != None) and \
111                                         (type(data) == type({})) and \
112                                         ('status' in data.keys())):
113                                       
114                                        status = str(data['status'])
115                                       
116                                        if (status.find('N/A') == -1):
117                                                status = status[:4]
118                                                status = "%s volts" % status
119                                       
120                                        label = 'Status: %s' % status
121                                       
122                                        self.parent.textLabelNXTStatus.setText(label)
123       
124       
125        ##################################################################
126       
127        def displayError(self, socketError):
128               
129                if self.DEBUG:
130                        if (socketError != QtNetwork.QAbstractSocket.RemoteHostClosedError):
131                                print "ERROR [%s]:" % self.socket.name,
132                                print self.socket.errorString()
133               
134               
135                if (self.parent != None):
136               
137                        if socketError == QtNetwork.QAbstractSocket.RemoteHostClosedError:
138                                pass
139                       
140                        elif socketError == QtNetwork.QAbstractSocket.HostNotFoundError:
141                                QtGui.QMessageBox.information(self.parent, \
142                                                                   self.socket.name, \
143                                           "The server host was not found. Please check the host name and "
144                                           "port settings.")
145                       
146                        elif socketError == QtNetwork.QAbstractSocket.ConnectionRefusedError:
147                                QtGui.QMessageBox.information(self.parent, \
148                                                                   self.socket.name,
149                                           "The server connection was refused by the peer. Make sure the "
150                                           "server is running, and check that the host name "
151                                           "and port settings are correct.")
152                       
153                        else:
154                                QtGui.QMessageBox.information(self.parent, \
155                                                                   self.socket.name, \
156                                           "The following error occurred: %s." % \
157                                           self.socket.errorString())
158       
159       
160        ##################################################################
161       
162        def sendCommand(self, command, power=DEFAULT_NXT_POWER_LEVEL, bluetooth_device=None):
163               
164                packet = {}
165                packet['command'] = command
166                packet['power'] = power
167               
168                if bluetooth_device != None:
169                        packet['bluetooth_device'] = str(bluetooth_device)
170               
171                if self.DEBUG:
172                        print "<-- [%s] Sending:" % self.socket.name,
173                        print packet
174               
175                self.socket.abort()
176                self.socket.connectToHost(self.server_host, self.server_port)
177               
178                data = json.dumps(packet)
179               
180                if self.socket.waitForConnected(CLIENT_NO_REPLY_WAIT):
181                        self.socket.write(data)
182                else:
183                        if self.DEBUG:
184                                print "WARNING [%s] Timeout waiting for connection to server" % \
185                                   self.socket.name
186
187
188#####################################################################
189# Command line class
190#####################################################################
191
192class puzzlebox_brainstorms_network_client_command_line( \
193              puzzlebox_brainstorms_network_client):
194       
195        def __init__(self, log, \
196                          command_parameters, \
197                          server_host=SERVER_HOST, \
198                          server_port=SERVER_PORT, \
199                          DEBUG=DEBUG):
200               
201                self.log = log
202                self.DEBUG = DEBUG
203                self.parent = None
204               
205                self.command_parameters = command_parameters
206                self.server_host = server_host
207                self.server_port = server_port
208               
209                self.configureNetwork()
210               
211                self.execute_command_line()
212       
213       
214        ##################################################################
215       
216        def execute_command_line(self):
217               
218                (command) = self.parse_command_line(self.command_parameters)
219               
220                if (command != None):
221               
222                        self.sendCommand(command)
223               
224                        self.socket.waitForReadyRead(CLIENT_NO_REPLY_WAIT)
225       
226       
227        ##################################################################
228       
229        def parse_command_line(self, command_parameters):
230               
231                try:
232                        command = command_parameters[0]
233                except:
234                        command = NXT_DEFAULT_RC_COMMAND
235               
236               
237                return(command)
238
239
240#####################################################################
241# Main
242#####################################################################
243
244if __name__ == '__main__':
245       
246        # Perform correct KeyboardInterrupt handling
247        signal.signal(signal.SIGINT, signal.SIG_DFL)
248       
249        #log = puzzlebox_logger.puzzlebox_logger(logfile='client')
250        log = None
251       
252        command_parameters = sys.argv[1:]
253       
254        #log.info("Command parameters: %s" % command_parameters)
255       
256        client = puzzlebox_brainstorms_network_client_command_line(log, \
257                    command_parameters, \
258                    server_host=SERVER_HOST, \
259                    server_port=SERVER_PORT, \
260                    DEBUG=DEBUG)
261
Note: See TracBrowser for help on using the repository browser.