source: remote_control/puzzlebox_brainstorms_network_client.py @ 109

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

remote_control/puzzlebox_brainstorms_client_interface_design.py:

  • concentration/relaxation/speed enable buttons working

remote_control/puzzlebox_brainstorms_network_client.py:

  • LEGO Mindstorms NXT status label bugfix

remote_control/puzzlebox_brainstorms_client_interface.py:

  • concentration/relaxation/speed enable buttons working
  • exit dialog added
  • driving motors stopped when client disconnected

remote_control/puzzlebox_brainstorms_client_interface_network.py:

  • client instantiation bugfix

remote_control/puzzlebox_brainstorms_client_interface_local.py:

  • connection to local server instance added

remote_control/puzzlebox_brainstorms_network_server.py:

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