source: remote_control/puzzlebox_brainstorms_client_thinkgear.py @ 53

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

client_thinkgear:

  • code cleanups
  • enhanced debugging
  • need to fix Deferred error on C terminated connections

client_server:

  • good progress towards basic signal generator
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.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                        #self.factory.log.error("noReply failed to call callback")
138               
139##              self.transport.loseConnection()
140       
141       
142        ##################################################################
143
144        def lineReceived(self, line):
145
146                # Ignore blank lines
147                if not line:
148                        return
149
150                try:
151                        data = json.loads(line)
152                except Exception, e:
153                        if DEBUG:
154                                print "Partial data received (or error:",
155                                print e
156                                print ")."
157
158                                print "line:",
159                                print line
160                               
161
162                if self.DEBUG:
163                        if ('rawEeg' in data.keys()):
164                                if self.DEBUG > 1:
165                                        print "data:",
166                                        print data
167                        else:
168                                print "data:",
169                                print data
170
171##                self.factory.send_command_and_print_response(data)
172
173
174        ##################################################################
175
176        def connectionLost(self, reason):
177
178                if self.DEBUG > 1:
179                        print "Connection lost:",
180                        print reason
181
182       
183#####################################################################
184# ThinkGear Client Factory class
185#####################################################################
186
187class puzzlebox_brainstorms_client_thinkgear_factory( \
188        client.puzzlebox_brainstorms_client_send_command_factory):
189       
190        def __init__(self, log, \
191                     command, \
192                     server_host=SERVER_HOST, \
193                     server_port=SERVER_PORT, \
194                     max_connection_attempts=MAX_CONNECTION_ATTEMPTS, \
195                     DEBUG=DEBUG):
196               
197                self.log = log
198                self.DEBUG = DEBUG
199                self.server_host = server_host
200                self.server_port = server_port
201                self.command = command
202               
203                self.max_connection_attempts = max_connection_attempts
204                self.connection_attempt = 1
205               
206                self.protocol = \
207                   puzzlebox_brainstorms_client_thinkgear_protocol
208               
209                self.replyDefer = defer.Deferred()
210
211
212#####################################################################
213# Main
214#####################################################################
215
216if __name__ == '__main__':
217       
218        #log = puzzlebox_logger.puzzlebox_logger(logfile='client')
219        log = None
220       
221        #authorization_request = AUTHORIZATION_REQUEST
222        authorization_request = None # ThinkGear authentication not working
223        thinkgear_parameters = THINKGEAR_PARAMETERS
224       
225        #log.info("Command parameters: %s" % command_parameters)
226
227        thinkgear_client = puzzlebox_brainstorms_client_thinkgear( \
228                    log, \
229                    authorization_request, \
230                    server_host=SERVER_HOST, \
231                    server_port=SERVER_PORT, \
232                    DEBUG=DEBUG)
233
234        reactor.callWhenRunning( \
235                thinkgear_client.send_command_and_print_response, \
236                        thinkgear_parameters)
237
238
239        reactor.run()
240
Note: See TracBrowser for help on using the repository browser.