source: remote_control/puzzlebox_brainstorms_network_server.py @ 76

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

network_client_thinkgear:

  • debug output fix

network_server:

  • initial checkin
  • replaces Twisted server with Qt based network code
  • Property svn:executable set to *
File size: 6.3 KB
Line 
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3#
4# Puzzlebox - Brainstorms - Network - Server
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
18import simplejson as json
19
20from PyQt4 import QtNetwork
21
22import puzzlebox_brainstorms_configuration as configuration
23import puzzlebox_brainstorms_remote_control as remote_control
24#import puzzlebox_logger
25
26#####################################################################
27# Globals
28#####################################################################
29
30DEBUG = 1
31
32SERVER_INTERFACE = configuration.BRAINSTORMS_SERVER_INTERFACE
33SERVER_PORT = configuration.BRAINSTORMS_SERVER_PORT
34
35CLIENT_NO_REPLY_WAIT = configuration.CLIENT_NO_REPLY_WAIT * 1000
36
37DELIMITER = configuration.BRAINSTORMS_DELIMITER
38
39BLUETOOTH_DEVICE = configuration.NXT_BLUETOOTH_DEVICE
40
41DISCRETE_CONTROL_COMMANDS = configuration.BRAINSTORMS_DISCRETE_CONTROL_COMMANDS
42
43#####################################################################
44# Classes
45#####################################################################
46
47class puzzlebox_brainstorms_network_server:
48       
49        def __init__(self, log, \
50                          server_interface=SERVER_INTERFACE, \
51                          server_port=SERVER_PORT, \
52                          DEBUG=DEBUG):
53               
54                self.log = log
55                self.DEBUG = DEBUG
56               
57                self.server_interface = server_interface
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.QTcpServer()
69                self.socket.name = 'Puzzlebox Brainstorms Server'
70               
71                if self.DEBUG:
72                        print "----> [Server] Initializing server on %s:%i" % \
73                                (server_interface, server_port)
74       
75                if (self.server_interface == ''):
76                        result = self.socket.listen(port=self.server_port)
77                else:
78                        result = self.socket.listen(address=self.server_interface, \
79                                           port=self.server_port)
80               
81                if not result:
82                        if self.DEBUG:
83                                print "ERROR [%s] Unable to start the server:", self.socket.name,
84                                print self.socket.errorString()
85                               
86                        self.socket.close()
87                        return
88               
89               
90                self.socket.newConnection.connect(self.processConnection)
91                #self.socket.error.connect(self.displayError)
92       
93       
94        ##################################################################
95       
96        def processConnection(self):
97               
98                clientConnection = self.socket.nextPendingConnection()
99                clientConnection.disconnected.connect(clientConnection.deleteLater)
100               
101                if not clientConnection.waitForReadyRead(CLIENT_NO_REPLY_WAIT):
102                        if self.DEBUG:
103                                print "ERROR [%s] Timeout waiting for client to transmit data"
104                        return
105               
106                socket_buffer = clientConnection.readAll()
107               
108                for packet in socket_buffer.split(DELIMITER):
109                       
110                        if packet != '':
111                               
112                                try:
113                                        data = json.loads(packet.data())
114                                except:
115                                        data = packet
116                               
117                                if self.DEBUG:
118                                        print "<-- [%s] Received:" % self.socket.name,
119                                        print data
120                               
121                                response = self.processCommand(data)
122                               
123                                data = json.dumps(response)
124                               
125                               
126                                if clientConnection.waitForConnected(CLIENT_NO_REPLY_WAIT):
127                                        clientConnection.write(data)
128                               
129                                clientConnection.disconnectFromHost()
130       
131       
132        ##################################################################
133       
134        def processCommand(self, command):
135               
136                response = '%s command received' % command
137               
138                if DISCRETE_CONTROL_COMMANDS:
139                       
140                        self.executeCommand(command)
141               
142               
143                return(response)
144       
145       
146        ##################################################################
147       
148        def executeCommand(self, command):
149               
150                #command_line = 'python puzzlebox_brainstorms_remote_control.py --command=%s' % command
151               
152                #os.system(command_line)
153               
154                rc = remote_control.puzzlebox_brainstorms_remote_control( \
155                        device=BLUETOOTH_DEVICE, \
156                        command=command, \
157                        DEBUG=DEBUG)
158               
159                if rc.connection != None:
160                        rc.run(rc.command)
161                        rc.stop()
162       
163       
164        ##################################################################
165       
166        #def process_connection_lost(self, command):
167               
168                #if not command:
169                       
170                        ##self.log.debug("Connection lost with no command")
171                       
172                        #if self.DEBUG:
173                                #print "--> [Server] Connection lost with no command"
174               
175               
176                #else:
177                       
178                        ##self.log.debug("Connection lost")
179                       
180                        ##if self.DEBUG:
181                                ##print "--> [Server] Connection lost"
182                       
183                        #pass
184       
185       
186        ##################################################################
187       
188        #def dataReceived(self, data):
189               
190                #self.data_chunk += data
191               
192                #try:
193                        ##self.command = pickle.loads(self.data_chunk)
194                        #self.command = json.loads(self.data_chunk)
195               
196                #except Exception, e:
197                        ##self.factory.log.error("Partial data received (or error: %s)." % e)
198                        #if DEBUG:
199                                #print "Partial data received (or error:",
200                                #print e
201                                #print ")."
202               
203                #else:
204                        #self.data_chunk = ""
205                       
206                        #d = self.factory.process_command("%s" % self.command)
207                        #d.addCallback(self.send_response)
208       
209       
210        ##################################################################
211       
212        #def send_response(self, response):
213               
214                ##response = pickle.dumps(response)
215                #response = json.dumps(response)
216               
217                #self.transport.write(response)
218       
219       
220        ##################################################################
221       
222        #def connectionLost(self, reason):
223               
224                #self.factory.process_connection_lost(self.command)
225
226
227#####################################################################
228# Main
229#####################################################################
230
231if __name__ == '__main__':
232       
233        # Perform correct KeyboardInterrupt handling
234        signal.signal(signal.SIGINT, signal.SIG_DFL)
235       
236        #log = puzzlebox_logger.puzzlebox_logger(logfile='master_control')
237        log = None
238       
239        # Collect default settings and command line parameters
240        server_interface = SERVER_INTERFACE
241        server_port = SERVER_PORT
242       
243        for each in sys.argv:
244               
245                if each.startswith("--interface="):
246                        server_interface = each[ len("--interface="): ]
247                if each.startswith("--port="):
248                        server_port = each[ len("--port="): ]
249       
250       
251        server = puzzlebox_brainstorms_network_server(log, \
252                                                      server_interface, \
253                                                      server_port, \
254                                                      DEBUG=DEBUG)
255       
256        while server.socket.waitForNewConnection(-1):
257                pass
258
Note: See TracBrowser for help on using the repository browser.