source: rc/puzzlebox_brainstorms_client_interface.py @ 26

Last change on this file since 26 was 26, checked in by sc, 12 years ago

server:

  • now listening on all server's interfaces

configuration:

  • now listening on all server's interfaces

client:

client_interface:

  • Property svn:executable set to *
File size: 11.4 KB
Line 
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3#
4# Puzzlebox - Brainstorms - Client Interface
5#
6# Copyright Puzzlebox Productions, LLC (2010)
7#
8# Portions of this code have been previously
9# released under the GNU Pulic License (GPL) version 2
10# and is Copyright Steven M. Castellotti (2010)
11# For more information please refer to http://www.gnu.org/copyleft/gpl.htm
12#
13# Last Update: 2010.02.03
14#
15#####################################################################
16
17import os, sys
18
19import pygame
20#import pygame.font
21import pygame.image
22import pygame.locals
23
24from twisted.internet import reactor, protocol, defer
25
26import puzzlebox_brainstorms_configuration as configuration
27import puzzlebox_brainstorms_client as client
28import puzzlebox_brainstorms_client_interface_component as component
29import puzzlebox_brainstorms_client_interface_button as button
30#import puzzlebox_logger
31
32#####################################################################
33# Globals
34#####################################################################
35
36DEBUG = 1
37
38FLIP = 1
39
40SERVER_HOST = configuration.SERVER_HOST
41SERVER_PORT = configuration.SERVER_PORT
42
43DISPLAY_WINDOW_X_COORDINATE = configuration.DISPLAY_WINDOW_X_COORDINATE
44DISPLAY_WINDOW_Y_COORDINATE = configuration.DISPLAY_WINDOW_Y_COORDINATE
45DISPLAY_WINDOW_X_DIMENSION = configuration.DISPLAY_WINDOW_X_DIMENSION
46DISPLAY_WINDOW_Y_DIMENSION = configuration.DISPLAY_WINDOW_Y_DIMENSION
47
48WINDOW_BACKGROUND_COLOR = configuration.WINDOW_BACKGROUND_COLOR
49
50IMAGE_DIRECTORY = configuration.IMAGE_DIRECTORY
51
52BUTTON_LAYOUT = configuration.BUTTON_LAYOUT
53
54#####################################################################
55# Classes
56#####################################################################
57
58class puzzlebox_brainstorms_client_interface( \
59         component.puzzlebox_brainstorms_client_interface_component, \
60         client.puzzlebox_brainstorms_client):
61       
62        def __init__(self, log, \
63                     display_window_x_coordinate, \
64                     display_window_y_coordinate, \
65                     display_window_x_dimension, \
66                     display_window_y_dimension, \
67                     window_background_color, \
68                     DEBUG=DEBUG):
69       
70                self.log = log
71                self.DEBUG = DEBUG
72               
73                self.display_window_x_coordinate = display_window_x_coordinate
74                self.display_window_y_coordinate = display_window_y_coordinate
75                self.display_window_x_dimension = display_window_x_dimension
76                self.display_window_y_dimension = display_window_y_dimension
77                self.window_background_color = window_background_color
78               
79                if (os.name == "nt") or (os.name == "dos"):
80                        self.operating_system = "windows"
81                else:
82                        self.operating_system = os.name
83               
84                self.pygame = pygame
85                self.screen = None
86                self.FLIP = FLIP
87                self.image_directory = IMAGE_DIRECTORY
88               
89                self.initialize_pygame()
90               
91                self.pygame.FLIP = self.FLIP
92               
93                self.buttons = []
94               
95                self.initialize_buttons(BUTTON_LAYOUT)
96               
97                self.update_display()
98               
99                #self.client = \
100                   #puzzlebox_brainstorms_client.puzzlebox_brainstorms_client(
101                         #self.log, \
102                         #configuration.SERVER_HOST, \
103                         #configuration.SERVER_PORT, \
104                         #configuration.MAX_CONNECTION_ATTEMPTS)
105               
106                self.server_host = configuration.SERVER_HOST
107                self.server_port = configuration.SERVER_PORT
108                self.max_connection_attempts = configuration.MAX_CONNECTION_ATTEMPTS
109       
110       
111        #####################################################################
112       
113        def initialize_pygame(self):
114               
115                if (self.operating_system != "windows"):
116                        os.environ['SDL_VIDEO_WINDOW_POS'] = \
117                           "%i,%i" % (self.display_window_x_coordinate, \
118                                 self.display_window_y_coordinate)
119               
120                self.pygame.init()
121               
122                if (self.FLIP):
123                       
124                        self.screen = self.pygame.display.set_mode((self.display_window_x_dimension, \
125                                                                    self.display_window_y_dimension), \
126                                                                   pygame.HWSURFACE|pygame.DOUBLEBUF)
127               
128                else:
129                       
130                        self.screen = self.pygame.display.set_mode((self.display_window_x_dimension, \
131                                                                    self.display_window_y_dimension), \
132                                                                   pygame.HWSURFACE)
133               
134               
135                if (self.DEBUG >= 2):
136                        print "Display Driver:",
137                        print pygame.display.get_driver()
138                        print "Display Info:",
139                        print pygame.display.Info()
140                        #print "Get Flags:",
141                        #print pygame.display.screen.get_flags()
142               
143               
144                #self.pygame.mouse.set_visible(0)
145                self.pygame.mouse.set_visible(1)
146               
147               
148                self.pygame.display.set_caption('Puzzlebox Brainstorms - Client Interface')
149               
150                # Set Background
151                self.background = pygame.Surface(self.screen.get_size())
152                #self.background.set_alpha(0)
153                self.draw_background()
154       
155       
156        ##################################################################
157
158        def draw_background(self):
159               
160                self.background.fill(self.window_background_color)
161               
162                self.screen.blit(self.background, (0,0))
163       
164       
165        #####################################################################
166       
167        def initialize_buttons(self, button_layout):
168               
169                self.buttons = []
170               
171                for each in button_layout['buttons']:
172                        button_image = each[0]
173                        activated_image = each[1]
174                        button_x = each[2]
175                        button_y = each[3]
176                        command = each[4]
177                       
178                        if ((button_image != None) and \
179                            (button_image != '.') and \
180                            (button_image != '..') and \
181                            (os.path.exists(os.path.join(self.image_directory, button_image)))):
182                               
183                                button_image = os.path.join(self.image_directory, button_image)
184                       
185                        else:
186                                if self.DEBUG:
187                                        print "Error: Button image does not exist:"
188                                        print "   %s" % os.path.join(self.image_directory, button_image)
189                                continue
190                       
191                       
192                        if ((activated_image != None) and \
193                            (activated_image != '.') and \
194                            (activated_image != '..') and \
195                            (os.path.exists(os.path.join(self.image_directory, activated_image)))):
196                               
197                                activated_image = os.path.join(self.image_directory, activated_image)
198                       
199                        else:
200                                if self.DEBUG:
201                                        print "Error: Activated button image does not exist:"
202                                        print "   %s" % os.path.join(self.image_directory, activated_image)
203                                continue
204                       
205                       
206                        interface_button = \
207                           button.puzzlebox_brainstorms_client_interface_button( \
208                                   self.pygame, \
209                                   self.screen, \
210                                   button_image, \
211                                   activated_image, \
212                                   button_x, \
213                                   button_y, \
214                                   command, \
215                                   self.DEBUG)
216                       
217                       
218                        self.buttons.append(interface_button)
219       
220       
221        ##################################################################
222       
223        def update_button(self, command):
224               
225                for each in self.buttons:
226                        if each.command == command:
227                                each.activated = True
228                                each.display()
229       
230       
231        ##################################################################
232       
233        def send_commands_to_server(self, commands):
234               
235                for command in commands:
236                       
237                        d = self.send_command(command)
238                       
239                       
240                        #Command Line Client version
241                        #command_line = 'python puzzlebox_brainstorms_client.py %s' % command
242                       
243                        #if self.DEBUG:
244                                #print "executing: %s" % command_line
245                       
246                        #os.system(command_line)
247       
248       
249        ##################################################################
250       
251        def print_response_and_stop(self, response):
252               
253                if self.DEBUG:
254                        print "---> [Client] Server Response:",
255                        print response
256               
257                #try:
258                        #reactor.stop()
259                #except:
260                        #print "ERROR: Can't stop reactor that isn't running."
261       
262       
263        ##################################################################
264       
265        def update_screen(self):
266               
267                print "here"
268               
269                # Redraw Background
270                self.draw_background()
271               
272                for each in self.buttons:
273                        each.activated = False
274                        each.display()
275               
276               
277                self.update_display()
278       
279       
280        ##################################################################
281       
282        def test(self):
283               
284                print "test"
285       
286       
287        ##################################################################
288       
289        def checkEvents(self):
290               
291                self.test()
292               
293                # Redraw Background
294                self.draw_background()
295               
296                for each in self.buttons:
297                        each.activated = False
298                        each.display()
299               
300               
301                self.update_display()
302               
303                commands = []
304               
305                for event in self.pygame.event.get():
306                       
307                        if (event.type is self.pygame.locals.QUIT):
308                                reactor.stop()
309                                sys.exit()
310                       
311                       
312                        elif (event.type == self.pygame.locals.KEYDOWN):
313                               
314                                if 'key' in event.dict.keys():
315                                       
316                                        if (event.dict['key'] == self.pygame.K_ESCAPE):
317                                                sys.exit()
318                                       
319                                        elif ((event.dict['key'] == self.pygame.K_UP) or \
320                                                        (event.dict['key'] == self.pygame.K_w)):
321                                                command = 'drive_forward'
322                                                self.update_button(command)
323                                                commands.append(command)
324                                       
325                                        elif ((event.dict['key'] == self.pygame.K_DOWN) or \
326                                                        (event.dict['key'] == self.pygame.K_s) or \
327                                                        (event.dict['key'] == self.pygame.K_x)):
328                                                command = 'drive_reverse'
329                                                self.update_button(command)
330                                                commands.append(command)
331                                       
332                                        elif ((event.dict['key'] == self.pygame.K_LEFT) or \
333                                                        (event.dict['key'] == self.pygame.K_a) or \
334                                                        (event.dict['key'] == self.pygame.K_q)):
335                                                command = 'turn_left'
336                                                self.update_button(command)
337                                                commands.append(command)
338                                       
339                                        elif ((event.dict['key'] == self.pygame.K_RIGHT) or \
340                                                        (event.dict['key'] == self.pygame.K_d) or \
341                                                        (event.dict['key'] == self.pygame.K_e)):
342                                                command = 'turn_right'
343                                                self.update_button(command)
344                                                commands.append(command)
345                                       
346                                        elif (event.dict['key'] == self.pygame.K_z):
347                                                command = 'turn_left_in_reverse'
348                                                self.update_button(command)
349                                                commands.append(command)
350                                       
351                                        elif ((event.dict['key'] == self.pygame.K_PAGEDOWN) or \
352                                                        (event.dict['key'] == self.pygame.K_c)):
353                                                command = 'turn_right_in_reverse'
354                                                self.update_button(command)
355                                                commands.append(command)
356               
357               
358                if commands != []:
359                        self.update_display()
360                        self.send_commands_to_server(commands)
361                        #self.update_screen()
362               
363               
364                reactor.callLater(0.03, self.checkEvents)
365
366
367#####################################################################
368# Functions
369#####################################################################
370
371#####################################################################
372# Main
373#####################################################################
374
375if __name__ == '__main__':
376       
377        #log = puzzlebox_logger.puzzlebox_logger(logfile='mcc')
378        log = None
379       
380       
381        # Collect default settings and command line parameters
382        server_host = SERVER_HOST
383        server_port = SERVER_PORT
384        display_window_x_coordinate = DISPLAY_WINDOW_X_COORDINATE
385        display_window_y_coordinate = DISPLAY_WINDOW_Y_COORDINATE
386        display_window_x_dimension = DISPLAY_WINDOW_X_DIMENSION
387        display_window_y_dimension = DISPLAY_WINDOW_Y_DIMENSION
388        window_background_color = WINDOW_BACKGROUND_COLOR
389       
390       
391        for each in sys.argv:
392               
393                if each.startswith("--host="):
394                        server_host = each[ len("--host="): ]
395                if each.startswith("--port="):
396                        server_port = each[ len("--port="): ]
397       
398       
399        # Window Defaults
400        try:
401                display_window_x_coordinate = string.atoi(sys.argv[-4])
402                display_window_y_coordinate = string.atoi(sys.argv[-3])
403                display_window_x_dimension = string.atoi(sys.argv[-2])
404                display_window_y_dimension = string.atoi(sys.argv[-1])
405        except:
406                if DEBUG:
407                        print "Using default display coordinates"
408       
409       
410        interface = puzzlebox_brainstorms_client_interface( \
411                                             log, \
412                                             display_window_x_coordinate, \
413                                             display_window_y_coordinate, \
414                                             display_window_x_dimension, \
415                                             display_window_y_dimension, \
416                                             window_background_color, \
417                                             DEBUG=DEBUG)
418       
419        reactor.callWhenRunning(interface.checkEvents)
420        reactor.run()
421
Note: See TracBrowser for help on using the repository browser.