source: remote_control/puzzlebox_brainstorms_network_client_thinkgear.py @ 76

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

network_client_thinkgear:

  • debug output fix

network_server:

  • initial checkin
  • replaces Twisted server with Qt based network code
File size: 6.7 KB
Line 
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3#
4# Puzzlebox - Brainstorms - Network - Client - Thinkgear
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.28
12#
13#####################################################################
14
15import os, sys
16import signal
17
18from PyQt4 import QtCore, QtGui, QtNetwork
19
20import simplejson as json
21
22import puzzlebox_brainstorms_configuration as configuration
23#import puzzlebox_logger
24
25#####################################################################
26# Globals
27#####################################################################
28
29DEBUG = 1
30
31SERVER_HOST = configuration.THINKGEAR_SERVER_HOST
32SERVER_PORT = configuration.THINKGEAR_SERVER_PORT
33
34CLIENT_NO_REPLY_WAIT = configuration.CLIENT_NO_REPLY_WAIT * 1000
35
36DELIMITER = configuration.THINKGEAR_DELIMITER
37
38THINKGEAR_CONFIGURATION_PARAMETERS = configuration.THINKGEAR_CONFIGURATION_PARAMETERS
39
40THINKGEAR_AUTHORIZATION_ENABLED = configuration.THINKGEAR_AUTHORIZATION_ENABLED
41AUTHORIZATION_REQUEST = configuration.THINKGEAR_AUTHORIZATION_REQUEST
42
43#####################################################################
44# Classes
45#####################################################################
46
47class puzzlebox_brainstorms_network_client_thinkgear:
48       
49        def __init__(self, log, \
50                          server_host=SERVER_HOST, \
51                          server_port=SERVER_PORT, \
52                          DEBUG=DEBUG, \
53                          parent=None):
54               
55                self.log = log
56                self.DEBUG = DEBUG
57                self.parent=parent
58               
59                self.server_host = server_host
60                self.server_port = server_port
61               
62                self.is_authorized = True
63               
64                self.configureNetwork()
65       
66       
67        ##################################################################
68       
69        def configureNetwork(self):
70       
71                #self.blockSize = 0
72                self.socket = QtNetwork.QTcpSocket()
73                self.socket.name = 'ThinkGear Client'
74               
75                self.socket.readyRead.connect(self.printReply)
76                self.socket.error.connect(self.displayError)
77               
78                # Perform ThinkGear authorization if enabled
79                if THINKGEAR_AUTHORIZATION_ENABLED:
80                        self.sendCommand(AUTHORIZATION_REQUEST)
81                        self.socket.waitForReadyRead()
82                        self.socket.disconnectFromHost()
83               
84                self.sendCommand(THINKGEAR_CONFIGURATION_PARAMETERS)
85       
86       
87        ##################################################################
88       
89        def printReply(self):
90               
91                socket_buffer = self.socket.readAll()
92               
93                for packet in socket_buffer.split(DELIMITER):
94                       
95                        if packet != '':
96                               
97                                data = json.loads(packet.data())
98                               
99                                if self.DEBUG:
100                                        print "<-- [%s] Received:" % self.socket.name,
101                                        print data
102                               
103                                self.processPacketThinkGear(data)
104       
105       
106        ##################################################################
107       
108        def displayError(self, socketError):
109               
110                if self.DEBUG:
111                        if (socketError != QtNetwork.QAbstractSocket.RemoteHostClosedError):
112                                print "ERROR [%s]:" % self.socket.name,
113                                print self.socket.errorString()
114               
115               
116                if (self.parent != None):
117               
118                        if socketError == QtNetwork.QAbstractSocket.RemoteHostClosedError:
119                                pass
120                       
121                        elif socketError == QtNetwork.QAbstractSocket.HostNotFoundError:
122                                QtGui.QMessageBox.information(self.parent, \
123                                                                   self.socket.name, \
124                                           "The server host was not found. Please check the host name and "
125                                           "port settings.")
126                       
127                        elif socketError == QtNetwork.QAbstractSocket.ConnectionRefusedError:
128                                QtGui.QMessageBox.information(self.parent, \
129                                                                   self.socket.name,
130                                           "The server connection was refused by the peer. Make sure the "
131                                           "server is running, and check that the host name "
132                                           "and port settings are correct.")
133                       
134                        else:
135                                QtGui.QMessageBox.information(self.parent, \
136                                                                   self.socket.name, \
137                                           "The following error occurred: %s." % \
138                                           self.socket.errorString())
139       
140       
141        ##################################################################
142       
143        def sendCommand(self, command):
144               
145                if self.DEBUG:
146                        print "--> [%s] Sending:" % self.socket.name,
147                        print command
148               
149                self.socket.abort()
150                self.socket.connectToHost(self.server_host, self.server_port)
151               
152                data = json.dumps(command)
153               
154                if self.socket.waitForConnected(CLIENT_NO_REPLY_WAIT):
155                        self.socket.write(data)
156       
157       
158        ##################################################################
159       
160        def processPacketThinkGear(self, packet):
161               
162                if ('isAuthorized' in packet.keys()):
163                       
164                        self.isAuthorized = packet['isAuthorized']
165               
166               
167                if ('eSense' in packet.keys()):
168                       
169                        if ('attention' in packet['eSense'].keys()):
170                                if (self.parent != None):
171                                        self.parent.progressBarConcentration.setValue(packet['eSense']['attention'])
172                       
173                        if ('meditation' in packet['eSense'].keys()):
174                                if (self.parent != None):
175                                        self.parent.progressBarRelaxation.setValue(packet['eSense']['meditation'])
176
177
178#####################################################################
179# Command line class
180#####################################################################
181
182class puzzlebox_brainstorms_network_client_thinkgear_command_line( \
183              puzzlebox_brainstorms_network_client_thinkgear):
184       
185        def __init__(self, log, \
186                          command_parameters, \
187                          server_host=SERVER_HOST, \
188                          server_port=SERVER_PORT, \
189                          DEBUG=DEBUG):
190               
191                self.log = log
192                self.DEBUG = DEBUG
193                self.parent = None
194               
195                self.command_parameters = command_parameters
196                self.server_host = server_host
197                self.server_port = server_port
198               
199                self.configureNetwork()
200               
201                self.execute_command_line()
202       
203       
204        ##################################################################
205       
206        def execute_command_line(self):
207               
208                (command) = self.parse_command_line(self.command_parameters)
209               
210                if (command != None):
211               
212                        self.sendCommand(command)
213                       
214                        self.socket.waitForReadyRead(CLIENT_NO_REPLY_WAIT)
215       
216       
217        ##################################################################
218       
219        def parse_command_line(self, command_parameters):
220               
221                try:
222                        command = command_parameters[0]
223                except:
224                        command = None
225               
226               
227                return(command)
228
229
230#####################################################################
231# Main
232#####################################################################
233
234if __name__ == '__main__':
235       
236        # Perform correct KeyboardInterrupt handling
237        signal.signal(signal.SIGINT, signal.SIG_DFL)
238       
239        #log = puzzlebox_logger.puzzlebox_logger(logfile='client')
240        log = None
241       
242        command_parameters = sys.argv[1:]
243       
244        #log.info("Command parameters: %s" % command_parameters)
245       
246        client = puzzlebox_brainstorms_network_client_thinkgear_command_line(log, \
247                    command_parameters, \
248                    server_host=SERVER_HOST, \
249                    server_port=SERVER_PORT, \
250                    DEBUG=DEBUG)
251       
252        while client.socket.waitForReadyRead(CLIENT_NO_REPLY_WAIT):
253                pass
254
Note: See TracBrowser for help on using the repository browser.