source: remote_control/puzzlebox_brainstorms_client_thinkgear.py @ 56

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

client_thinkgear:

  • graceful handling of non-JSON replies

configuration:

  • NULL byte termination for Flash socket handling

server_thinkgear:

  • NULL byte termination for Flash socket policy file request
File size: 6.9 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.21
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                          authorization_request, \
52                          server_host=SERVER_HOST, \
53                          server_port=SERVER_PORT, \
54                          DEBUG=DEBUG):
55               
56                self.log = log
57                self.DEBUG=DEBUG
58               
59                self.authorization_request = authorization_request
60                self.server_host = server_host
61                self.server_port = server_port
62                self.max_connection_attempts = MAX_CONNECTION_ATTEMPTS
63
64       
65        ##################################################################
66       
67        def send_command(self, \
68                         command, \
69                         max_connection_attempts=MAX_CONNECTION_ATTEMPTS):
70               
71                factory = puzzlebox_brainstorms_client_thinkgear_factory(self.log, \
72                                                       command, \
73                                                       self.server_host, \
74                                                       self.server_port, \
75                                                       max_connection_attempts, \
76                                                       self.DEBUG)
77               
78                reactor.connectTCP(self.server_host, self.server_port, factory)
79               
80##              return factory.replyDefer
81       
82       
83        ##################################################################
84       
85        def send_command_and_print_response(self, command):
86
87                if self.DEBUG:
88                        print "---> [Client] Sending:",
89                        print command
90
91                       
92                d = self.send_command(command)
93                d.addCallback(self.print_response)
94       
95       
96        ##################################################################
97       
98        def print_response(self, response):
99               
100                if self.DEBUG:
101                        print "---> [Client] Server Response:",
102                        print response
103               
104
105#####################################################################
106# ThinkGear Client Protocol class
107#####################################################################
108
109class puzzlebox_brainstorms_client_thinkgear_protocol( \
110        basic.LineReceiver):
111
112        delimiter = THINKGEAR_DELIMITER
113       
114        def __init__(self):
115               
116                self.DEBUG = DEBUG
117
118       
119        ##################################################################
120       
121        def connectionMade(self):
122               
123                data = json.dumps(self.factory.command)
124                self.sendLine(data)
125               
126##              self.factory.noReply = reactor.callLater(NO_REPLY_WAIT, self.noReply)
127       
128       
129        ##################################################################
130       
131        def noReply(self):
132               
133                try:
134                        self.factory.replyDefer.callback('NO_REPLY')
135                except:
136                        if self.DEBUG:
137                                print "noReply failed to call callback"
138       
139       
140        ##################################################################
141
142        def lineReceived(self, line):
143
144                # Ignore blank lines
145                if not line:
146                        return
147
148                try:
149                        data = json.loads(line)
150                except Exception, e:
151                        if DEBUG:
152                                print "Partial data received (or error:",
153                                print e
154                                print ")."
155
156                                print "line:",
157                                print line
158                               
159                else:
160                        if self.DEBUG:
161                                if ('rawEeg' in data.keys()):
162                                        if self.DEBUG > 1:
163                                                print "data:",
164                                                print data
165                                else:
166                                        print "data:",
167                                        print data
168
169
170        ##################################################################
171
172        def connectionLost(self, reason):
173
174                if self.DEBUG > 1:
175                        print "Connection lost:",
176                        print reason
177
178
179        ##################################################################
180
181        def connectionDone(self, reason):
182
183                if self.DEBUG > 1:
184                        print "Connection done:",
185                        print reason
186
187       
188#####################################################################
189# ThinkGear Client Factory class
190#####################################################################
191
192class puzzlebox_brainstorms_client_thinkgear_factory( \
193        client.puzzlebox_brainstorms_client_send_command_factory):
194       
195        def __init__(self, log, \
196                     command, \
197                     server_host=SERVER_HOST, \
198                     server_port=SERVER_PORT, \
199                     max_connection_attempts=MAX_CONNECTION_ATTEMPTS, \
200                     DEBUG=DEBUG):
201               
202                self.log = log
203                self.DEBUG = DEBUG
204                self.server_host = server_host
205                self.server_port = server_port
206                self.command = command
207               
208                self.max_connection_attempts = max_connection_attempts
209                self.connection_attempt = 1
210               
211                self.protocol = \
212                   puzzlebox_brainstorms_client_thinkgear_protocol
213               
214                self.replyDefer = defer.Deferred()
215
216
217#####################################################################
218# Main
219#####################################################################
220
221if __name__ == '__main__':
222       
223        #log = puzzlebox_logger.puzzlebox_logger(logfile='client')
224        log = None
225       
226        #authorization_request = AUTHORIZATION_REQUEST
227        authorization_request = None # ThinkGear authentication not working
228        thinkgear_parameters = THINKGEAR_PARAMETERS
229       
230        thinkgear_client = puzzlebox_brainstorms_client_thinkgear( \
231                    log, \
232                    authorization_request, \
233                    server_host=SERVER_HOST, \
234                    server_port=SERVER_PORT, \
235                    DEBUG=DEBUG)
236
237        reactor.callWhenRunning( \
238                thinkgear_client.send_command, \
239                thinkgear_parameters)
240
241
242        reactor.run()
243
Note: See TracBrowser for help on using the repository browser.