source: remote_control/puzzlebox_brainstorms_client_thinkgear.py @ 55

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

client_thinkgear:

  • default response cleanup
  • comment cleanup

configuration:

  • Special socket handling for Flash applications

server_thinkgear:

  • Special socket handling for Flash applications
File size: 6.8 KB
Line 
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3#
4# Puzzlebox - Brainstorms - Client - ThinkGear Connector
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.18
12#
13#####################################################################
14
15import os, sys
16import simplejson as json
17
18from twisted.internet import reactor, protocol, defer
19from twisted.protocols import basic
20
21import puzzlebox_brainstorms_configuration as configuration
22import puzzlebox_brainstorms_client as client
23
24#####################################################################
25# Globals
26#####################################################################
27
28DEBUG = 1
29
30SERVER_HOST = configuration.THINKGEAR_SERVER_HOST
31SERVER_PORT = configuration.THINKGEAR_SERVER_PORT
32
33MAX_CONNECTION_ATTEMPTS = configuration.MAX_CONNECTION_ATTEMPTS
34NO_REPLY_WAIT = configuration.NO_REPLY_WAIT
35
36THINKGEAR_DELIMITER = '\r'
37
38AUTHORIZATION_REQUEST = configuration.THINKGEAR_AUTHORIZATION_REQUEST
39
40THINKGEAR_PARAMETERS = {"enableRawOutput": False, "format": "Json"}
41#THINKGEAR_PARAMETERS = {"enableRawOutput": True, "format": "Json"}
42
43#####################################################################
44# Classes
45#####################################################################
46
47class puzzlebox_brainstorms_client_thinkgear(client.puzzlebox_brainstorms_client):
48       
49        def __init__(self, log, \
50                          authorization_request, \
51                          server_host=SERVER_HOST, \
52                          server_port=SERVER_PORT, \
53                          DEBUG=DEBUG):
54               
55                self.log = log
56                self.DEBUG=DEBUG
57               
58                self.authorization_request = authorization_request
59                self.server_host = server_host
60                self.server_port = server_port
61                self.max_connection_attempts = MAX_CONNECTION_ATTEMPTS
62
63       
64        ##################################################################
65       
66        def send_command(self, \
67                         command, \
68                         max_connection_attempts=MAX_CONNECTION_ATTEMPTS):
69               
70                factory = puzzlebox_brainstorms_client_thinkgear_factory(self.log, \
71                                                       command, \
72                                                       self.server_host, \
73                                                       self.server_port, \
74                                                       max_connection_attempts, \
75                                                       self.DEBUG)
76               
77                reactor.connectTCP(self.server_host, self.server_port, factory)
78               
79##              return factory.replyDefer
80       
81       
82        ##################################################################
83       
84        def send_command_and_print_response(self, command):
85
86                if self.DEBUG:
87                        print "---> [Client] Sending:",
88                        print command
89
90                       
91                d = self.send_command(command)
92                d.addCallback(self.print_response)
93       
94       
95        ##################################################################
96       
97        def print_response(self, response):
98               
99                if self.DEBUG:
100                        print "---> [Client] Server Response:",
101                        print response
102               
103
104#####################################################################
105# ThinkGear Client Protocol class
106#####################################################################
107
108class puzzlebox_brainstorms_client_thinkgear_protocol( \
109        basic.LineReceiver):
110
111        delimiter = THINKGEAR_DELIMITER
112       
113        def __init__(self):
114               
115                self.DEBUG = DEBUG
116
117       
118        ##################################################################
119       
120        def connectionMade(self):
121               
122                data = json.dumps(self.factory.command)
123                self.sendLine(data)
124               
125##              self.factory.noReply = reactor.callLater(NO_REPLY_WAIT, self.noReply)
126       
127       
128        ##################################################################
129       
130        def noReply(self):
131               
132                try:
133                        self.factory.replyDefer.callback('NO_REPLY')
134                except:
135                        if self.DEBUG:
136                                print "noReply failed to call callback"
137       
138       
139        ##################################################################
140
141        def lineReceived(self, line):
142
143                # Ignore blank lines
144                if not line:
145                        return
146
147                try:
148                        data = json.loads(line)
149                except Exception, e:
150                        if DEBUG:
151                                print "Partial data received (or error:",
152                                print e
153                                print ")."
154
155                                print "line:",
156                                print line
157                               
158
159                if self.DEBUG:
160                        if ('rawEeg' in data.keys()):
161                                if self.DEBUG > 1:
162                                        print "data:",
163                                        print data
164                        else:
165                                print "data:",
166                                print data
167
168
169        ##################################################################
170
171        def connectionLost(self, reason):
172
173                if self.DEBUG > 1:
174                        print "Connection lost:",
175                        print reason
176
177
178        ##################################################################
179
180        def connectionDone(self, reason):
181
182                if self.DEBUG > 1:
183                        print "Connection done:",
184                        print reason
185
186       
187#####################################################################
188# ThinkGear Client Factory class
189#####################################################################
190
191class puzzlebox_brainstorms_client_thinkgear_factory( \
192        client.puzzlebox_brainstorms_client_send_command_factory):
193       
194        def __init__(self, log, \
195                     command, \
196                     server_host=SERVER_HOST, \
197                     server_port=SERVER_PORT, \
198                     max_connection_attempts=MAX_CONNECTION_ATTEMPTS, \
199                     DEBUG=DEBUG):
200               
201                self.log = log
202                self.DEBUG = DEBUG
203                self.server_host = server_host
204                self.server_port = server_port
205                self.command = command
206               
207                self.max_connection_attempts = max_connection_attempts
208                self.connection_attempt = 1
209               
210                self.protocol = \
211                   puzzlebox_brainstorms_client_thinkgear_protocol
212               
213                self.replyDefer = defer.Deferred()
214
215
216#####################################################################
217# Main
218#####################################################################
219
220if __name__ == '__main__':
221       
222        #log = puzzlebox_logger.puzzlebox_logger(logfile='client')
223        log = None
224       
225        #authorization_request = AUTHORIZATION_REQUEST
226        authorization_request = None # ThinkGear authentication not working
227        thinkgear_parameters = THINKGEAR_PARAMETERS
228       
229        thinkgear_client = puzzlebox_brainstorms_client_thinkgear( \
230                    log, \
231                    authorization_request, \
232                    server_host=SERVER_HOST, \
233                    server_port=SERVER_PORT, \
234                    DEBUG=DEBUG)
235
236        reactor.callWhenRunning( \
237                thinkgear_client.send_command, \
238                thinkgear_parameters)
239
240
241        reactor.run()
242
Note: See TracBrowser for help on using the repository browser.