source: remote_control/puzzlebox_brainstorms_client_thinkgear.py @ 54

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

client_thinkgear:

  • general cleanup

server_thinkgear:

  • structure in place for packet updating

server:

  • comment cleanup
File size: 6.9 KB
RevLine 
[48]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#
[53]11# Last Update: 2010.06.18
[48]12#
13#####################################################################
14
15import os, sys
16import simplejson as json
17
18from twisted.internet import reactor, protocol, defer
[50]19from twisted.protocols import basic
[48]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
[53]36THINKGEAR_DELIMITER = '\r'
[50]37
[48]38AUTHORIZATION_REQUEST = configuration.THINKGEAR_AUTHORIZATION_REQUEST
39
[50]40THINKGEAR_PARAMETERS = {"enableRawOutput": False, "format": "Json"}
41#THINKGEAR_PARAMETERS = {"enableRawOutput": True, "format": "Json"}
[49]42
[48]43#####################################################################
44# Classes
45#####################################################################
46
[49]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
[50]62
[49]63       
[50]64        ##################################################################
[49]65       
[50]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               
[54]79##              return factory.replyDefer
[50]80       
81       
[49]82        ##################################################################
83       
84        def send_command_and_print_response(self, command):
[48]85
[49]86                if self.DEBUG:
87                        print "---> [Client] Sending:",
88                        print command
89
90                       
91                d = self.send_command(command)
[54]92                #d.addCallback(self.print_response)
[49]93       
94       
95        ##################################################################
96       
97        def print_response(self, response):
98               
99                if self.DEBUG:
100                        print "---> [Client] Server Response:",
101                        print response
[50]102               
[49]103
[50]104#####################################################################
105# ThinkGear Client Protocol class
106#####################################################################
107
108class puzzlebox_brainstorms_client_thinkgear_protocol( \
109        basic.LineReceiver):
110
[53]111        delimiter = THINKGEAR_DELIMITER
[49]112       
[51]113        def __init__(self):
114               
115                self.DEBUG = DEBUG
116
[50]117       
118        ##################################################################
119       
[52]120        def connectionMade(self):
121               
122                data = json.dumps(self.factory.command)
[53]123                self.sendLine(data)
[52]124               
[53]125##              self.factory.noReply = reactor.callLater(NO_REPLY_WAIT, self.noReply)
[50]126       
127       
128        ##################################################################
129       
[52]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"
[50]137       
138       
139        ##################################################################
[49]140
[50]141        def lineReceived(self, line):
142
143                # Ignore blank lines
144                if not line:
145                        return
146
[53]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 ")."
[50]154
[53]155                                print "line:",
156                                print line
157                               
158
[51]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
[50]167
[51]168
[53]169        ##################################################################
170
171        def connectionLost(self, reason):
172
173                if self.DEBUG > 1:
174                        print "Connection lost:",
175                        print reason
176
[54]177
178        ##################################################################
179
180        def connectionDone(self, reason):
181
182                if self.DEBUG > 1:
183                        print "Connection done:",
184                        print reason
185
[53]186       
[48]187#####################################################################
[50]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#####################################################################
[48]217# Main
218#####################################################################
219
220if __name__ == '__main__':
221       
222        #log = puzzlebox_logger.puzzlebox_logger(logfile='client')
223        log = None
224       
[49]225        #authorization_request = AUTHORIZATION_REQUEST
[50]226        authorization_request = None # ThinkGear authentication not working
227        thinkgear_parameters = THINKGEAR_PARAMETERS
[48]228       
229        #log.info("Command parameters: %s" % command_parameters)
[49]230
231        thinkgear_client = puzzlebox_brainstorms_client_thinkgear( \
[48]232                    log, \
[49]233                    authorization_request, \
[48]234                    server_host=SERVER_HOST, \
235                    server_port=SERVER_PORT, \
236                    DEBUG=DEBUG)
[49]237
238        reactor.callWhenRunning( \
[54]239                thinkgear_client.send_command, \
[50]240                        thinkgear_parameters)
[49]241
242
[48]243        reactor.run()
244
Note: See TracBrowser for help on using the repository browser.