source: remote_control/puzzlebox_brainstorms_server.py @ 43

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

server:

  • import of remote_control by server to execute in order

to avoid pathing issues for Python under Windows

configuration:

  • sane platform dependent defaults for Bluetooth communications

port

py2exe:

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