source: remote_control/puzzlebox_brainstorms_network_client_thinkgear.py @ 87

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

remote_control/puzzlebox_brainstorms_network_client_thinkgear.py:

  • adjustment to debug output for clarity

remote_control/puzzlebox_brainstorms_network_client.py:

  • warning output on timeout waiting for server connections
  • adjustment to debug output for clarity

remote_control/puzzlebox_brainstorms_remote_control.py:

  • adjustment to debug output for clarity

remote_control/puzzlebox_brainstorms_client_interface.py:

  • forward driving halted when disconnected from ThinkGear? server
  • keyboard shortcuts added to direction buttons
  • virtual button presses drawn when driving activated by direction
  • better handling of speed changes in updateSpeed
  • speed dropped to 100 if NXT power threshold exceeded

remote_control/puzzlebox_brainstorms_configuration.ini:

  • ThinkGear? Connect Server Emulator configuration added
  • default Relaxation speed boosts tweaked

remote_control/interface/qt4_form.py:

  • faulty keyboard shortcuts removed

remote_control/puzzlebox_brainstorms_configuration.py:

  • ThinkGear? Connect Server Emulator configuration
  • default Relaxation speed boosts tweaked

remote_control/puzzlebox_brainstorms_client_interface_network.py:

  • initial checkin

remote_control/puzzlebox_brainstorms_client_interface_local.py:

  • initial checking
  • not properly establishing client/server communications

remote_control/puzzlebox_brainstorms_network_server_thinkgear.py

  • adjustment to debug output for clarity
  • some configuration settings moved to configuration module

remote_control/puzzlebox_brainstorms_network_server.py:

  • adjustment to debug output for clarity
File size: 7.3 KB
Line 
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3#
4# Puzzlebox - Brainstorms - Network - Client - Thinkgear
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.06
12#
13#####################################################################
14
15import os, sys
16import signal
17
18from PyQt4 import QtCore, 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.THINKGEAR_SERVER_HOST
32SERVER_PORT = configuration.THINKGEAR_SERVER_PORT
33
34CLIENT_NO_REPLY_WAIT = configuration.CLIENT_NO_REPLY_WAIT * 1000
35
36DELIMITER = configuration.THINKGEAR_DELIMITER
37
38THINKGEAR_CONFIGURATION_PARAMETERS = configuration.THINKGEAR_CONFIGURATION_PARAMETERS
39
40THINKGEAR_AUTHORIZATION_ENABLED = configuration.THINKGEAR_AUTHORIZATION_ENABLED
41AUTHORIZATION_REQUEST = configuration.THINKGEAR_AUTHORIZATION_REQUEST
42
43#####################################################################
44# Classes
45#####################################################################
46
47class puzzlebox_brainstorms_network_client_thinkgear:
48       
49        def __init__(self, log, \
50                          server_host=SERVER_HOST, \
51                          server_port=SERVER_PORT, \
52                          DEBUG=DEBUG, \
53                          parent=None):
54               
55                self.log = log
56                self.DEBUG = DEBUG
57                self.parent=parent
58               
59                self.server_host = server_host
60                self.server_port = server_port
61               
62                self.is_authorized = True
63               
64                self.configureNetwork()
65       
66       
67        ##################################################################
68       
69        def configureNetwork(self):
70       
71                #self.blockSize = 0
72                self.socket = QtNetwork.QTcpSocket()
73                self.socket.name = 'ThinkGear Client'
74               
75                self.socket.readyRead.connect(self.printReply)
76                self.socket.error.connect(self.displayError)
77               
78                # Perform ThinkGear authorization if enabled
79                if THINKGEAR_AUTHORIZATION_ENABLED:
80                        self.sendCommand(AUTHORIZATION_REQUEST)
81                        self.socket.waitForReadyRead()
82                        self.socket.disconnectFromHost()
83               
84                self.sendCommand(THINKGEAR_CONFIGURATION_PARAMETERS)
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                                       
99                                        data = json.loads(packet.data())
100                               
101                               
102                                except Exception, e:
103                                       
104                                        if self.DEBUG:
105                                                print "ERROR [%s]: Exception parsing packet:" % self.socket.name,
106                                                print packet.data()
107                                                print "ERROR [%s]: Data packet" % self.socket.name,
108                                                print e
109                                       
110                                        continue
111                               
112                               
113                                else:
114                                       
115                                        if self.DEBUG:
116                                                print "--> [%s] Received:" % self.socket.name,
117                                                print data
118                                       
119                                        self.processPacketThinkGear(data)
120       
121       
122        ##################################################################
123       
124        def displayError(self, socketError):
125               
126                if self.DEBUG:
127                        if ((socketError != QtNetwork.QAbstractSocket.RemoteHostClosedError) and \
128                                 (socketError != QtNetwork.QAbstractSocket.SocketTimeoutError)):
129                                print "ERROR [%s]:" % self.socket.name,
130                                print self.socket.errorString()
131               
132               
133                if (self.parent != None):
134               
135                        if ((socketError == QtNetwork.QAbstractSocket.RemoteHostClosedError) or \
136                                 (socketError != QtNetwork.QAbstractSocket.SocketTimeoutError)):
137                                pass
138                       
139                        elif socketError == QtNetwork.QAbstractSocket.HostNotFoundError:
140                                QtGui.QMessageBox.information(self.parent, \
141                                                                   self.socket.name, \
142                                           "The server host was not found. Please check the host name and "
143                                           "port settings.")
144                       
145                        elif socketError == QtNetwork.QAbstractSocket.ConnectionRefusedError:
146                                QtGui.QMessageBox.information(self.parent, \
147                                                                   self.socket.name,
148                                           "The server connection was refused by the peer. Make sure the "
149                                           "server is running, and check that the host name "
150                                           "and port settings are correct.")
151                       
152                        else:
153                                QtGui.QMessageBox.information(self.parent, \
154                                                                   self.socket.name, \
155                                           "The following error occurred: %s." % \
156                                           self.socket.errorString())
157       
158       
159        ##################################################################
160       
161        def sendCommand(self, command):
162               
163                if self.DEBUG:
164                        print "<-- [%s] Sending:" % self.socket.name,
165                        print command
166               
167                self.socket.abort()
168                self.socket.connectToHost(self.server_host, self.server_port)
169               
170                data = json.dumps(command)
171               
172                self.socket.waitForConnected(CLIENT_NO_REPLY_WAIT)
173               
174                self.socket.write(data)
175               
176                try:
177                        self.socket.waitForBytesWritten(CLIENT_NO_REPLY_WAIT)
178                except Exception, e:
179                        print "ERROR [%s]: Exception:" % self.socket.name,
180                        print e
181       
182       
183        ##################################################################
184       
185        def processPacketThinkGear(self, packet):
186               
187                if ('isAuthorized' in packet.keys()):
188                        self.isAuthorized = packet['isAuthorized']
189               
190                # Pass GUI updating to Client Interface application
191                if (self.parent != None):
192                        self.parent.processPacketThinkGear(packet)
193               
194       
195        ##################################################################
196       
197        def disconnectFromHost(self):
198               
199                self.socket.disconnectFromHost()
200
201
202#####################################################################
203# Command line class
204#####################################################################
205
206class puzzlebox_brainstorms_network_client_thinkgear_command_line( \
207              puzzlebox_brainstorms_network_client_thinkgear):
208       
209        def __init__(self, log, \
210                          command_parameters, \
211                          server_host=SERVER_HOST, \
212                          server_port=SERVER_PORT, \
213                          DEBUG=DEBUG):
214               
215                self.log = log
216                self.DEBUG = DEBUG
217                self.parent = None
218               
219                self.command_parameters = command_parameters
220                self.server_host = server_host
221                self.server_port = server_port
222               
223                self.configureNetwork()
224               
225                self.execute_command_line()
226       
227       
228        ##################################################################
229       
230        def execute_command_line(self):
231               
232                (command) = self.parse_command_line(self.command_parameters)
233               
234                if (command != None):
235               
236                        self.sendCommand(command)
237                       
238                        self.socket.waitForReadyRead(CLIENT_NO_REPLY_WAIT)
239       
240       
241        ##################################################################
242       
243        def parse_command_line(self, command_parameters):
244               
245                try:
246                        command = command_parameters[0]
247                except:
248                        command = None
249               
250               
251                return(command)
252
253
254#####################################################################
255# Main
256#####################################################################
257
258if __name__ == '__main__':
259       
260        # Perform correct KeyboardInterrupt handling
261        signal.signal(signal.SIGINT, signal.SIG_DFL)
262       
263        #log = puzzlebox_logger.puzzlebox_logger(logfile='client_thinkgear')
264        log = None
265       
266        command_parameters = sys.argv[1:]
267       
268        #log.info("Command parameters: %s" % command_parameters)
269       
270        app = QtCore.QCoreApplication(sys.argv)
271       
272        client = puzzlebox_brainstorms_network_client_thinkgear_command_line(log, \
273                    command_parameters, \
274                    server_host=SERVER_HOST, \
275                    server_port=SERVER_PORT, \
276                    DEBUG=DEBUG)
277       
278        #while True:
279                #while client.socket.waitForReadyRead(CLIENT_NO_REPLY_WAIT):
280                        #pass
281       
282        sys.exit(app.exec_())
283
Note: See TracBrowser for help on using the repository browser.