source: remote_control/puzzlebox_brainstorms_network_client.py @ 75

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

network_client_thinkgear:

  • ThinkGear? authorization support added
  • correct KeyboardInterrupt? handling
  • timeouts applied to socket communications
  • command line support added

network_client:

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