source: remote_control/puzzlebox_brainstorms_network_server.py @ 103

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

remote_control/PuzzleboxBrainstorms-install.nsi:

  • preparation for 0.2.0 release

remote_control/setup.py:

  • preparation for 0.2.0 release

remote_control/puzzlebox_brainstorms_network_server.py:

  • debug cleanup
  • 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.07.09
12#
13#####################################################################
14
15import os, sys
16import signal
17
18import simplejson as json
19
20from PyQt4 import QtCore, 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
41VARIABLE_CONTROL_DURATION = configuration.BRAINSTORMS_VARIABLE_CONTROL_DURATION
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                          embedded_mode=False, \
53                          DEBUG=DEBUG, \
54                          parent=None):
55               
56                self.log = log
57                self.DEBUG = DEBUG
58               
59                self.server_interface = server_interface
60                self.server_port = server_port
61               
62                self.embedded_mode=embedded_mode
63               
64                self.configureNetwork()
65               
66                self.rc = remote_control.puzzlebox_brainstorms_remote_control( \
67                            device=BLUETOOTH_DEVICE, \
68                            DEBUG=DEBUG)
69       
70       
71        ##################################################################
72       
73        def configureNetwork(self):
74       
75                #self.blockSize = 0
76                self.socket = QtNetwork.QTcpServer()
77                self.socket.name = 'Brainstorms Server'
78               
79                if self.DEBUG:
80                        print "<---- [%s] Initializing server on %s:%i" % \
81                                (self.socket.name, self.server_interface, self.server_port)
82       
83                if (self.server_interface == ''):
84                        result = self.socket.listen(port=self.server_port)
85                else:
86                        result = self.socket.listen(address=self.server_interface, \
87                                           port=self.server_port)
88               
89                if not result:
90                        if self.DEBUG:
91                                print "ERROR [%s] Unable to start the server:", self.socket.name,
92                                print self.socket.errorString()
93                               
94                        self.socket.close()
95                        return
96               
97               
98                self.socket.newConnection.connect(self.processConnection)
99       
100       
101        ##################################################################
102       
103        def processData(self, clientConnection=None):
104               
105                if (clientConnection == None):
106                        clientConnection = self.clientConnection
107               
108                socket_buffer = clientConnection.readAll()
109               
110                for packet in socket_buffer.split(DELIMITER):
111                       
112                        if packet != '':
113                               
114                                try:
115                                        data = json.loads(packet.data())
116                                except:
117                                        data = packet
118                               
119                                if self.DEBUG:
120                                        print "--> [%s] Received:" % self.socket.name,
121                                        print data
122                               
123                                response = self.processCommand(data)
124                               
125                                if response != None:
126                               
127                                        data = json.dumps(response)
128                                       
129                                       
130                                        if clientConnection.waitForConnected(CLIENT_NO_REPLY_WAIT):
131                                                clientConnection.write(data)
132       
133       
134        ##################################################################
135       
136        def processConnection(self):
137               
138                if self.DEBUG:
139                        print "--> [%s]: Client connected" % self.socket.name
140               
141                clientConnection = self.socket.nextPendingConnection()
142                clientConnection.disconnected.connect(clientConnection.deleteLater)
143               
144                if (self.embedded_mode):
145                       
146                        # Only one client connection to server will work in embedded mode
147                        self.clientConnection = clientConnection
148                        clientConnection.readyRead.connect(self.processData)
149               
150               
151                else:
152               
153                        if not clientConnection.waitForReadyRead(CLIENT_NO_REPLY_WAIT):
154                                if self.DEBUG:
155                                        print "WARNING [%s] Timeout waiting for client to transmit data" % \
156                                                self.socket.name
157                                        #print "State:",
158                                        #print clientConnection.state()
159                                clientConnection.disconnectFromHost()
160                                return
161                       
162                       
163                        self.processData(clientConnection)
164                       
165                        clientConnection.disconnectFromHost()
166       
167       
168        ##################################################################
169       
170        def processCommand(self, data):
171               
172                #response = '%s command received' % command
173                response = {}
174               
175                if not VARIABLE_CONTROL_DURATION:
176                       
177                        response['status'] = self.executeCommand(data['command'], data['power'])
178                       
179                       
180                elif self.rc.connection != None:
181                       
182                        self.rc.run(data['command'], data['power'])
183                        response['status'] = self.rc.get_battery_voltage(self.rc.connection)
184                       
185                else:
186                       
187                        response = {}
188                        response['status'] = 'LEGO NXT N/A'
189               
190               
191                return(response)
192       
193       
194        ##################################################################
195       
196        def executeCommand(self, command):
197               
198                #command_line = 'python puzzlebox_brainstorms_remote_control.py --command=%s' % command
199               
200                #os.system(command_line)
201               
202                status = 'N/A'
203               
204                rc = remote_control.puzzlebox_brainstorms_remote_control( \
205                        device=BLUETOOTH_DEVICE, \
206                        command=command, \
207                        DEBUG=DEBUG)
208               
209                if rc.connection != None:
210                        rc.run(rc.command)
211                        rc.stop()
212                        status = rc.get_battery_voltage(rc.connection)
213               
214               
215                return(status)
216
217
218#####################################################################
219# Main
220#####################################################################
221
222if __name__ == '__main__':
223       
224        # Perform correct KeyboardInterrupt handling
225        signal.signal(signal.SIGINT, signal.SIG_DFL)
226       
227        #log = puzzlebox_logger.puzzlebox_logger(logfile='server_brainstorms')
228        log = None
229       
230        # Collect default settings and command line parameters
231        server_interface = SERVER_INTERFACE
232        server_port = SERVER_PORT
233       
234        for each in sys.argv:
235               
236                if each.startswith("--interface="):
237                        server_interface = each[ len("--interface="): ]
238                if each.startswith("--port="):
239                        server_port = each[ len("--port="): ]
240       
241       
242        app = QtCore.QCoreApplication(sys.argv)
243       
244        server = puzzlebox_brainstorms_network_server(log, \
245                                                      server_interface, \
246                                                      server_port, \
247                                                      embedded_mode=False, \
248                                                      DEBUG=DEBUG)
249       
250        sys.exit(app.exec_())
251
Note: See TracBrowser for help on using the repository browser.