source: remote_control/puzzlebox_brainstorms_client_thinkgear.py @ 60

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

server_thinkgear:

  • queue based packet responses
  • blink detection simulation support added

client_thinkgear:

  • minor debugging output cleanup
File size: 8.4 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.22
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#THINKGEAR_PARAMETERS = configuration.FLASH_POLICY_FILE_REQUEST
43
44#####################################################################
45# Classes
46#####################################################################
47
48class puzzlebox_brainstorms_client_thinkgear(client.puzzlebox_brainstorms_client):
49       
50        def __init__(self, log, \
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.server_host = server_host
59                self.server_port = server_port
60                self.max_connection_attempts = MAX_CONNECTION_ATTEMPTS
61
62                self.is_authorized = True
63               
64
65        ##################################################################
66
67        def authorize_and_send_parameters(self,\
68                                          thinkgear_parameters, \
69                                          authorization_request):
70
71                if self.DEBUG:
72                        print "--> [ThinkGear Client] Sending Authorization Request:",
73                        print authorization_request
74
75                       
76                d = self.send_parameters(thinkgear_parameters, authorization_request)
77                d.addCallback(self.update_authorization)
78
79
80        ##################################################################
81
82        def update_authorization(self, authorization):
83
84                if self.DEBUG:
85                        print "--> [ThinkGear Client] Authorization:",
86                        print authorization
87                       
88                self.is_authorized = authorization
89
90               
91        ##################################################################
92
93        def send_parameters(self, \
94                         parameters, \
95                         authentication=None, \
96                         max_connection_attempts=MAX_CONNECTION_ATTEMPTS):
97               
98                self.factory = puzzlebox_brainstorms_client_thinkgear_factory(self.log, \
99                             parameters, \
100                             authentication, \
101                             self.server_host, \
102                             self.server_port, \
103                             max_connection_attempts, \
104                             self.DEBUG)
105               
106                reactor.connectTCP(self.server_host, self.server_port, self.factory)
107
108                return self.factory.replyDefer
109
110
111        ##################################################################
112
113        def send_parameters_and_print_response(self, parameters):
114
115                if self.DEBUG:
116                        print "----> [ThinkGear Client] Sending:",
117                        print parameters
118
119                       
120                d = self.send_parameters(parameters)
121                d.addCallback(self.print_response)
122
123
124        ##################################################################
125
126        def print_response(self, response):
127               
128                if self.DEBUG:
129                        print "--> [ThinkGear Client] Server Response:",
130                        print response
131               
132
133#####################################################################
134# ThinkGear Client Protocol class
135#####################################################################
136
137class puzzlebox_brainstorms_client_thinkgear_protocol( \
138        basic.LineReceiver):
139
140        delimiter = THINKGEAR_DELIMITER
141       
142        def __init__(self):
143               
144                self.DEBUG = DEBUG
145
146       
147        ##################################################################
148       
149        def connectionMade(self):
150
151                if self.DEBUG:
152                        print "----> [ThinkGear Client] Connected to %s:%i" % \
153                              (self.factory.server_host, \
154                               self.factory.server_port)
155
156
157                if (self.factory.authentication != None):
158                        self.send_data(self.factory.authentication)
159
160                else:
161                        self.send_data(self.factory.parameters)
162
163
164        ##################################################################
165
166        def send_data(self, data):
167
168                packet = json.dumps(data)
169
170                if self.DEBUG:
171                        print "----> [ThinkGear Client] Sending:",
172                        print packet
173
174               
175                self.sendLine(packet)
176               
177##              self.factory.noReply = reactor.callLater(NO_REPLY_WAIT, self.noReply)
178       
179       
180        ##################################################################
181       
182        def noReply(self):
183               
184                try:
185                        self.factory.replyDefer.callback('NO_REPLY')
186                except:
187                        if self.DEBUG:
188                                print "noReply failed to call callback"
189
190
191        ##################################################################
192
193        def lineReceived(self, line):
194
195                # Ignore blank lines
196                if not line:
197                        return
198
199                try:
200                        data = json.loads(line)
201                except Exception, e:
202                        if SELF.DEBUG:
203                                print "Partial data received (or error:",
204                                print e
205                                print ")."
206
207                                print "line:",
208                                print line
209                               
210                else:
211
212                        if (type(data) == type({})):
213
214                                self.factory.process_response(data)
215##                              self.factory.replyDefer.callback(data)
216
217                        else:
218                                if self.DEBUG:
219                                        print "data:",
220                                        print data
221
222
223        ##################################################################
224
225        def connectionLost(self, reason):
226
227                if self.DEBUG > 1:
228                        print "Connection lost:",
229                        print reason
230
231
232        ##################################################################
233
234        def connectionDone(self, reason):
235
236                if self.DEBUG > 1:
237                        print "Connection done:",
238                        print reason
239
240       
241#####################################################################
242# ThinkGear Client Factory class
243#####################################################################
244
245class puzzlebox_brainstorms_client_thinkgear_factory( \
246        client.puzzlebox_brainstorms_client_send_command_factory):
247       
248        def __init__(self, log, \
249                     parameters, \
250                     authentication, \
251                     server_host=SERVER_HOST, \
252                     server_port=SERVER_PORT, \
253                     max_connection_attempts=MAX_CONNECTION_ATTEMPTS, \
254                     DEBUG=DEBUG):
255               
256                self.log = log
257                self.DEBUG = DEBUG
258                self.server_host = server_host
259                self.server_port = server_port
260                self.parameters = parameters
261                self.authentication = authentication
262               
263                self.max_connection_attempts = max_connection_attempts
264                self.connection_attempt = 1
265               
266                self.protocol = \
267                   puzzlebox_brainstorms_client_thinkgear_protocol
268               
269                self.replyDefer = defer.Deferred()
270
271
272        ##################################################################
273
274        def process_response(self, response):
275
276                if self.DEBUG:
277                        if (('rawEeg' not in response.keys()) or \
278                            (self.DEBUG > 1)):
279                                print "<-- [ThinkGear Client] Received:",
280                                print response
281
282
283                if response.has_key('isAuthorized'):
284
285                        if (response['isAuthorized'] == True):
286                                self.replyDefer.callback(True)
287                        else:
288                                self.replyDefer.callback(False)
289
290
291#####################################################################
292# Main
293#####################################################################
294
295if __name__ == '__main__':
296       
297        #log = puzzlebox_logger.puzzlebox_logger(logfile='client_thinkgear')
298        log = None
299       
300        authorization_request = AUTHORIZATION_REQUEST
301        thinkgear_parameters = THINKGEAR_PARAMETERS
302       
303        thinkgear_client = puzzlebox_brainstorms_client_thinkgear( \
304                    log, \
305                    server_host=SERVER_HOST, \
306                    server_port=SERVER_PORT, \
307                    DEBUG=DEBUG)
308
309        # Use ThinkGear authentication
310        reactor.callWhenRunning( \
311                thinkgear_client.authorize_and_send_parameters, \
312                thinkgear_parameters, \
313                authorization_request)
314       
315        # Do not use ThinkGear authentication
316##      authorization_request = None
317##      reactor.callWhenRunning( \
318##              thinkgear_client.send_parameters, \
319##              thinkgear_parameters, \
320##              authorization_request)
321
322
323
324
325        reactor.run()
326
Note: See TracBrowser for help on using the repository browser.