source: remote_control/puzzlebox_brainstorms_server_thinkgear.py @ 52

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

client_thinkgear:

  • bugfix for client failing to send initial message

server:

  • debug/log cleanup
  • removed unnecessary client import

server_thinkgear:

install.nsi:

  • updated to include emokey and emoscripts files
File size: 5.8 KB
Line 
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3#
4# Puzzlebox - Brainstorms - Server - ThinkGear Emulator
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.16
12#
13#####################################################################
14
15import os, signal, sys, time
16import simplejson as json
17
18from twisted.internet import reactor, protocol, defer, task
19
20import puzzlebox_brainstorms_configuration as configuration
21#import puzzlebox_brainstorms_client
22#import puzzlebox_logger
23
24#####################################################################
25# Globals
26#####################################################################
27
28DEBUG = 1
29
30SERVER_INTERFACE = configuration.SERVER_INTERFACE
31SERVER_PORT = configuration.THINKGEAR_SERVER_PORT
32
33MESSAGE_FREQUENCY_TIMER = 1 # 1 Hz
34BLINK_FREQUENCY_TIMER = 10 # 10 seconds
35
36DEFAULT_SIGNAL_LEVEL_MESSAGE = \
37        {"poorSignalLevel": 0}
38                # A quantifier of the quality of the brainwave signal.
39                # This is an integer value that is generally in the
40                # range of 0 to 200, with 0 indicating a
41                # good signal and 200 indicating an off-head state.
42
43DEFAULT_EEG_POWER_MESSAGE = \
44        {'eegPower': { \
45                'lowGamma': 0, \
46                'highGamma': 0, \
47                'highAlpha': 0, \
48                'delta': 0, \
49                'highBeta': 0, \
50                'lowAlpha': 0, \
51                'lowBeta': 0, \
52                'theta': 0, \
53                }, \
54         }
55
56DEFAULT_ESENSE_MESSAGE = \
57        {'eSense': { \
58                'meditation': 0, \
59                'attention': 0, \
60                }, \
61        }
62               
63DEFAULT_BLINK_MESSAGE = {"blinkStrength": 100}
64
65DEFAULT_RAWEEG_MESSAGE = {"rawEeg": 255}
66
67DEFAULT_PACKET = {}
68DEFAULT_PACKET.update(DEFAULT_EEG_POWER_MESSAGE)
69DEFAULT_PACKET.update(DEFAULT_SIGNAL_LEVEL_MESSAGE)
70DEFAULT_PACKET.update(DEFAULT_ESENSE_MESSAGE)
71
72DEFAULT_RESPONSE_MESSAGE = DEFAULT_SIGNAL_LEVEL_MESSAGE
73
74#####################################################################
75# Classes
76#####################################################################
77
78class puzzlebox_brainstorms_server_thinkgear(protocol.ServerFactory):
79       
80        def __init__(self, log, DEBUG=DEBUG):
81               
82                self.log = log
83                self.DEBUG = DEBUG
84               
85                self.protocol = puzzlebox_brainstorms_server_protocol
86       
87       
88        ##################################################################
89       
90        def process_data(self, data):
91               
92                d = defer.Deferred()
93               
94##              response = '%s command received' % data
95
96                response = DEFAULT_RESPONSE_MESSAGE
97               
98                if self.DEBUG:
99                        print '--> [ThinkGear Emulator] %s data received' % data
100               
101               
102##              if DISCRETE_CONTROL_COMMANDS:
103##                     
104##                      self.execute_command(command)
105               
106               
107                if response:
108                        d.callback(response)
109               
110               
111                return d
112       
113       
114        ##################################################################
115       
116##      def execute_command(self, command):
117##             
118##              #command_line = 'python puzzlebox_brainstorms_remote_control.py --command=%s' % command
119##             
120##              #os.system(command_line)
121##             
122##              rc = remote_control.puzzlebox_brainstorms_rc( \
123##                      device=configuration.BLUETOOTH_DEVICE, \
124##                      command=command, \
125##                      DEBUG=DEBUG)
126##             
127##              if rc.connection != None:
128##                      rc.run(rc.command)
129##                      rc.stop()
130       
131       
132        ##################################################################
133       
134        def process_connection_lost(self, data):
135               
136                if not data:
137                       
138                        #self.log.debug("Connection lost with no data")
139                       
140                        if self.DEBUG:
141                                print "--> [ThinkGear Emulator] Connection lost with no data"
142               
143               
144                else:
145                       
146                        #self.log.debug("Connection lost")
147                       
148                        #if self.DEBUG:
149                                #print "--> [Server] Connection lost"
150                       
151                        pass
152
153
154        ##################################################################
155
156        def send_packet(self):
157
158                pass
159
160
161        ##################################################################
162
163        def start(self):
164
165                self.looping_timer = task.LoopingCall(self.send_packet)
166                self.looping_timer.start(MESSAGE_FREQUENCY_TIMER)
167
168
169#####################################################################
170# Protocol
171#####################################################################
172
173class puzzlebox_brainstorms_server_protocol(protocol.Protocol):
174       
175        def __init__(self):
176               
177                self.data = None
178                self.data_chunk = ""
179       
180       
181        ##################################################################
182       
183        def dataReceived(self, data):
184
185                print data
186               
187                self.data_chunk += data
188               
189                try:
190                        self.data = json.loads(self.data_chunk)
191               
192                except Exception, e:
193##                      self.factory.log.error("Partial data received (or error:",
194##                                             e, ").")
195                        if DEBUG:
196                                print "Partial data received (or error:",
197                                print e
198                                print ")."
199               
200                else:
201                        self.data_chunk = ""
202                       
203                        d = self.factory.process_data("%s" % self.data)
204                        d.addCallback(self.send_response)
205       
206       
207        ##################################################################
208       
209        def send_response(self, response):
210               
211                response = json.dumps(response)
212               
213                self.transport.write(response)
214       
215       
216        ##################################################################
217       
218        def connectionLost(self, reason):
219               
220                self.factory.process_connection_lost(self.data)
221
222
223#####################################################################
224# Main
225#####################################################################
226
227if __name__ == '__main__':
228       
229        #log = puzzlebox_logger.puzzlebox_logger(logfile='master_control')
230        log = None
231       
232        # Collect default settings and command line parameters
233        server_interface = SERVER_INTERFACE
234        server_port = SERVER_PORT
235       
236        for each in sys.argv:
237               
238                if each.startswith("--interface="):
239                        server_interface = each[ len("--interface="): ]
240                if each.startswith("--port="):
241                        server_port = each[ len("--port="): ]
242       
243       
244        thinkgear_server = puzzlebox_brainstorms_server_thinkgear(log, DEBUG=DEBUG)
245       
246        if DEBUG:
247                print "--> [ThinkGear Emulator] Initializing server on %s:%i" % \
248                        (server_interface, server_port)
249       
250        reactor.listenTCP(interface=server_interface, \
251                          port=server_port, \
252                          factory=thinkgear_server)
253        reactor.callWhenRunning(reactor.callLater, 0, thinkgear_server.start)
254        reactor.run()
255
Note: See TracBrowser for help on using the repository browser.