source: remote_control/puzzlebox_brainstorms_network_server.py @ 98

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

remote_control/puzzlebox_brainstorms_network_client.py:

  • NXT voltage status updates to client interface

remote_control/puzzlebox_brainstorms_remote_control.py:

  • NXT voltage status updates to client interface

remote_control/puzzlebox_brainstorms_client_interface_local.py:

  • automatic connection to local Brainstorms server instance

remote_control/puzzlebox_brainstorms_network_server.py:

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