source: remote_control/puzzlebox_brainstorms_server.py @ 42

Last change on this file since 42 was 42, checked in by sc, 12 years ago
  • initial support for discrete control commands
File size: 4.0 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.05.03
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
22#import puzzlebox_logger
23
24#####################################################################
25# Globals
26#####################################################################
27
28DEBUG = 1
29
30DISCRETE_CONTROL_COMMANDS = configuration.DISCRETE_CONTROL_COMMANDS
31
32SERVER_INTERFACE = configuration.SERVER_INTERFACE
33SERVER_PORT = configuration.SERVER_PORT
34
35#####################################################################
36# Classes
37#####################################################################
38
39class puzzlebox_brainstorms_server(protocol.ServerFactory):
40       
41        def __init__(self, log, DEBUG=DEBUG):
42               
43                self.log = log
44                self.DEBUG = DEBUG
45               
46                self.protocol = puzzlebox_brainstorms_server_protocol
47       
48       
49        ##################################################################
50       
51        def process_command(self, command):
52               
53                d = defer.Deferred()
54               
55                response = '%s command received' % command
56               
57                if self.DEBUG:
58                        print '--> [Server] %s' % response
59               
60               
61                if DISCRETE_CONTROL_COMMANDS:
62                       
63                        command_line = 'python puzzlebox_brainstorms_remote_control.py --command=%s' % command
64                       
65                        os.system(command_line)
66               
67               
68                if response:
69                        d.callback(response)
70               
71               
72                return d
73       
74       
75        ##################################################################
76       
77        def process_connection_lost(self, command):
78               
79                if not command:
80                       
81                        #self.log.debug("Connection lost with no command")
82                       
83                        if self.DEBUG:
84                                print "--> [Server] Connection lost with no command"
85               
86               
87                else:
88                       
89                        #self.log.debug("Connection lost")
90                       
91                        #if self.DEBUG:
92                                #print "--> [Server] Connection lost"
93                       
94                        pass
95
96
97#####################################################################
98# Protocol
99#####################################################################
100
101class puzzlebox_brainstorms_server_protocol(protocol.Protocol):
102       
103        def __init__(self):
104               
105                self.command = None
106                self.data_chunk = ""
107       
108       
109        ##################################################################
110       
111        def dataReceived(self, data):
112               
113                self.data_chunk += data
114               
115                try:
116                        self.command = pickle.loads(self.data_chunk)
117               
118                except Exception, e:
119                        self.factory.log.error("Partial data received (or error: %s)." % e)
120               
121                else:
122                        self.data_chunk = ""
123                       
124                        d = self.factory.process_command("%s" % self.command)
125                        d.addCallback(self.send_response)
126       
127       
128        ##################################################################
129       
130        def send_response(self, response):
131               
132                response = pickle.dumps(response)
133               
134                self.transport.write(response)
135       
136       
137        ##################################################################
138       
139        def connectionLost(self, reason):
140               
141                self.factory.process_connection_lost(self.command)
142
143
144#####################################################################
145# Main
146#####################################################################
147
148if __name__ == '__main__':
149       
150        #log = puzzlebox_logger.puzzlebox_logger(logfile='master_control')
151        log = None
152       
153        # Collect default settings and command line parameters
154        server_interface = SERVER_INTERFACE
155        server_port = SERVER_PORT
156       
157        for each in sys.argv:
158               
159                if each.startswith("--interface="):
160                        server_interface = each[ len("--interface="): ]
161                if each.startswith("--port="):
162                        server_port = each[ len("--port="): ]
163       
164       
165        server = puzzlebox_brainstorms_server(log, DEBUG=DEBUG)
166       
167        if DEBUG:
168                print "--> [Server] Initializing server on %s:%i" % \
169                        (server_interface, server_port)
170       
171        reactor.listenTCP(interface=server_interface, port=server_port, factory=server)
172       
173        reactor.run()
174
Note: See TracBrowser for help on using the repository browser.