source: remote_control/puzzlebox_brainstorms_network_server.py @ 109

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

remote_control/puzzlebox_brainstorms_client_interface_design.py:

  • concentration/relaxation/speed enable buttons working

remote_control/puzzlebox_brainstorms_network_client.py:

  • LEGO Mindstorms NXT status label bugfix

remote_control/puzzlebox_brainstorms_client_interface.py:

  • concentration/relaxation/speed enable buttons working
  • exit dialog added
  • driving motors stopped when client disconnected

remote_control/puzzlebox_brainstorms_client_interface_network.py:

  • client instantiation bugfix

remote_control/puzzlebox_brainstorms_client_interface_local.py:

  • connection to local server instance added

remote_control/puzzlebox_brainstorms_network_server.py:

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