source: remote_control/puzzlebox_brainstorms_network_server_twisted.py @ 97

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

brainstorms:

  • continued file and class renaming in response to conversions

from PyGame/Twisted? frameworks to Qt

network_client:

  • initial checkin of Qt based Brainstorms client

network_client_thinkgear:

File size: 4.7 KB
Line 
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3#
4# Puzzlebox - Brainstorms - Server - Twisted
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, signal, sys, time
16#import cPickle as pickle
17import simplejson as json
18
19from twisted.internet import reactor, protocol, defer
20
21import puzzlebox_brainstorms_configuration as configuration
22import puzzlebox_brainstorms_remote_control as remote_control
23#import puzzlebox_logger
24
25#####################################################################
26# Globals
27#####################################################################
28
29DEBUG = 1
30
31DISCRETE_CONTROL_COMMANDS = configuration.BRAINSTORMS_DISCRETE_CONTROL_COMMANDS
32
33SERVER_INTERFACE = configuration.BRAINSTORMS_SERVER_INTERFACE
34SERVER_PORT = configuration.BRAINSTORMS_SERVER_PORT
35
36BLUETOOTH_DEVICE = configuration.NXT_BLUETOOTH_DEVICE
37
38#####################################################################
39# Classes
40#####################################################################
41
42class puzzlebox_brainstorms_network_server_twisted(protocol.ServerFactory):
43       
44        def __init__(self, log, DEBUG=DEBUG):
45               
46                self.log = log
47                self.DEBUG = DEBUG
48               
49                self.protocol = puzzlebox_brainstorms_network_server_twisted_protocol
50       
51       
52        ##################################################################
53       
54        def process_command(self, command):
55               
56                d = defer.Deferred()
57               
58                response = '%s command received' % command
59               
60                if self.DEBUG:
61                        print '--> [Server] %s' % response
62               
63               
64                if DISCRETE_CONTROL_COMMANDS:
65                       
66                        self.execute_command(command)
67               
68               
69                if response:
70                        d.callback(response)
71               
72               
73                return d
74       
75       
76        ##################################################################
77       
78        def execute_command(self, command):
79               
80                #command_line = 'python puzzlebox_brainstorms_remote_control.py --command=%s' % command
81               
82                #os.system(command_line)
83               
84                rc = remote_control.puzzlebox_brainstorms_remote_control( \
85                        device=BLUETOOTH_DEVICE, \
86                        command=command, \
87                        DEBUG=DEBUG)
88               
89                if rc.connection != None:
90                        rc.run(rc.command)
91                        rc.stop()
92       
93       
94        ##################################################################
95       
96        def process_connection_lost(self, command):
97               
98                if not command:
99                       
100                        #self.log.debug("Connection lost with no command")
101                       
102                        if self.DEBUG:
103                                print "--> [Server] Connection lost with no command"
104               
105               
106                else:
107                       
108                        #self.log.debug("Connection lost")
109                       
110                        #if self.DEBUG:
111                                #print "--> [Server] Connection lost"
112                       
113                        pass
114
115
116#####################################################################
117# Protocol
118#####################################################################
119
120class puzzlebox_brainstorms_network_server_twisted_protocol(protocol.Protocol):
121       
122        def __init__(self):
123               
124                self.command = None
125                self.data_chunk = ""
126       
127       
128        ##################################################################
129       
130        def dataReceived(self, data):
131               
132                self.data_chunk += data
133               
134                try:
135                        #self.command = pickle.loads(self.data_chunk)
136                        self.command = json.loads(self.data_chunk)
137               
138                except Exception, e:
139                        #self.factory.log.error("Partial data received (or error: %s)." % e)
140                        if DEBUG:
141                                print "Partial data received (or error:",
142                                print e
143                                print ")."
144               
145                else:
146                        self.data_chunk = ""
147                       
148                        d = self.factory.process_command("%s" % self.command)
149                        d.addCallback(self.send_response)
150       
151       
152        ##################################################################
153       
154        def send_response(self, response):
155               
156                #response = pickle.dumps(response)
157                response = json.dumps(response)
158               
159                self.transport.write(response)
160       
161       
162        ##################################################################
163       
164        def connectionLost(self, reason):
165               
166                self.factory.process_connection_lost(self.command)
167
168
169#####################################################################
170# Main
171#####################################################################
172
173if __name__ == '__main__':
174       
175        #log = puzzlebox_logger.puzzlebox_logger(logfile='master_control')
176        log = None
177       
178        # Collect default settings and command line parameters
179        server_interface = SERVER_INTERFACE
180        server_port = SERVER_PORT
181       
182        for each in sys.argv:
183               
184                if each.startswith("--interface="):
185                        server_interface = each[ len("--interface="): ]
186                if each.startswith("--port="):
187                        server_port = each[ len("--port="): ]
188       
189       
190        server = puzzlebox_brainstorms_network_server_twisted(log, DEBUG=DEBUG)
191       
192        if DEBUG:
193                print "--> [Server] Initializing server on %s:%i" % \
194                        (server_interface, server_port)
195       
196        reactor.listenTCP(interface=server_interface, port=server_port, factory=server)
197       
198        reactor.run()
199
Note: See TracBrowser for help on using the repository browser.