source: remote_control/puzzlebox_brainstorms_network_client.py @ 103

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

remote_control/puzzlebox_brainstorms_network_client.py:

  • timestamp update

remote_control/puzzlebox_brainstorms_client_interface.py:

  • pushButtons disabled when not connected to LEGO Mindstorms NXT

remote_control/puzzlebox_brainstorms_client_interface_local.py:

  • Brainstorms server embedded_mode support added
  • import requirement cleanup
  • threaded server code cleanup

remote_control/puzzlebox_brainstorms_network_server.py:

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