source: rc/puzzlebox_brainstorms_client_interface.py @ 18

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

configuration:

  • button layout added

client_interface_button:

  • initial checking as distinct module

client_interface:

  • button initializing and drawing added

client_interface_component:

  • initial checking as distinct module
  • Property svn:executable set to *
File size: 10.5 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.01
14#
15#####################################################################
16
17import os, sys
18
19import pygame
20#import pygame.font
21import pygame.image
22import pygame.locals
23
24import puzzlebox_brainstorms_configuration as configuration
25import puzzlebox_brainstorms_client
26import puzzlebox_brainstorms_client_interface_component as component
27import puzzlebox_brainstorms_client_interface_button as button
28#import puzzlebox_logger
29
30#####################################################################
31# Globals
32#####################################################################
33
34DEBUG = 1
35
36FLIP = 1
37
38SERVER_HOST = configuration.SERVER_HOST
39SERVER_PORT = configuration.SERVER_PORT
40
41DISPLAY_WINDOW_X_COORDINATE = configuration.DISPLAY_WINDOW_X_COORDINATE
42DISPLAY_WINDOW_Y_COORDINATE = configuration.DISPLAY_WINDOW_Y_COORDINATE
43DISPLAY_WINDOW_X_DIMENSION = configuration.DISPLAY_WINDOW_X_DIMENSION
44DISPLAY_WINDOW_Y_DIMENSION = configuration.DISPLAY_WINDOW_Y_DIMENSION
45
46WINDOW_BACKGROUND_COLOR = configuration.WINDOW_BACKGROUND_COLOR
47
48IMAGE_DIRECTORY = configuration.IMAGE_DIRECTORY
49
50BUTTON_LAYOUT = configuration.BUTTON_LAYOUT
51
52#####################################################################
53# Classes
54#####################################################################
55
56class puzzlebox_brainstorms_client_interface( \
57         component.puzzlebox_brainstorms_client_interface_component):
58       
59        def __init__(self, log, \
60                     display_window_x_coordinate, \
61                     display_window_y_coordinate, \
62                     display_window_x_dimension, \
63                     display_window_y_dimension, \
64                     window_background_color, \
65                     DEBUG=DEBUG):
66       
67                self.log = log
68                self.DEBUG = DEBUG
69               
70                self.display_window_x_coordinate = display_window_x_coordinate
71                self.display_window_y_coordinate = display_window_y_coordinate
72                self.display_window_x_dimension = display_window_x_dimension
73                self.display_window_y_dimension = display_window_y_dimension
74                self.window_background_color = window_background_color
75               
76                #self.hostname = hostname
77                #self.port = port
78                #self.service_name = service_name
79                #self.target_name = target_name
80                #self.max_connection_attempts = max_connection_attempts
81               
82                if (os.name == "nt") or (os.name == "dos"):
83                        self.operating_system = "windows"
84                else:
85                        self.operating_system = os.name
86               
87                self.pygame = pygame
88                self.FLIP = FLIP
89               
90                self.initialize_pygame()
91                #self.initialize_speech()
92               
93                self.pygame.FLIP = FLIP
94               
95                #self.draw_background()
96               
97                #self.pointer = thinking_cap_pointer(self.pygame, \
98                                                                                                                #self.screen, \
99                                                                                                                #os.path.join(IMAGE_DIRECTORY, \
100                                                                                                                                                 #POINTER_IMAGE),
101                                                                                                                #self.DEBUG)
102                #self.action_message = 'Thinking Cap Demo'
103                #self.message = ''
104               
105                self.buttons = []
106               
107                self.initialize_buttons(BUTTON_LAYOUT)
108               
109                self.update_display()
110       
111       
112        #####################################################################
113       
114        def initialize_pygame(self):
115               
116                os.environ['SDL_VIDEO_WINDOW_POS'] = "%i,%i" % (self.display_window_x_coordinate, \
117                                                                                                                                                self.display_window_y_coordinate)
118               
119                self.pygame.init()
120               
121                if (self.FLIP):
122                       
123                        self.screen = pygame.display.set_mode((self.display_window_x_dimension, \
124                                                                                                                                self.display_window_y_dimension), \
125                                                                                                                                pygame.HWSURFACE|pygame.DOUBLEBUF)
126               
127                else:
128                       
129                        self.screen = pygame.display.set_mode((self.display_window_x_dimension, \
130                                                                                                                                self.display_window_y_dimension), \
131                                                                                                                                pygame.HWSURFACE)
132               
133               
134                if (self.DEBUG >= 2):
135                        print "Display Driver:",
136                        print pygame.display.get_driver()
137                        print "Display Info:",
138                        print pygame.display.Info()
139                        #print "Get Flags:",
140                        #print pygame.display.screen.get_flags()
141               
142               
143                #self.pygame = pygame
144                #self.pygame.FLIP = FLIP
145                self.pygame.mouse.set_visible(0)
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.fill(self.window_background_color)
153                #self.background.set_alpha(0)
154                self.screen.blit(self.background, (0,0))
155       
156       
157        ##################################################################
158
159        def initialize_buttons(self, button_layout):
160               
161                self.buttons = []
162               
163                for each in button_layout['buttons']:
164                        button_image = each[0]
165                        activated_image = each[1]
166                        button_x = each[2]
167                        button_y = each[3]
168                        command = each[4]
169                       
170                        if ((button_image != None) and \
171                            (button_image != '.') and \
172                            (button_image != '..') and \
173                            (os.path.exists(os.path.join(IMAGE_DIRECTORY, button_image)))):
174                               
175                                button_image = os.path.join(IMAGE_DIRECTORY, button_image)
176                       
177                        else:
178                                if self.DEBUG:
179                                        print "Error: Button image does not exist:"
180                                        print "   %s" % os.path.join(IMAGE_DIRECTORY, button_image)
181                                continue
182                       
183                       
184                        if ((activated_image != None) and \
185                            (activated_image != '.') and \
186                            (activated_image != '..') and \
187                            (os.path.exists(os.path.join(IMAGE_DIRECTORY, activated_image)))):
188                               
189                                activated_image = os.path.join(IMAGE_DIRECTORY, activated_image)
190                       
191                        else:
192                                if self.DEBUG:
193                                        print "Error: Activated button image does not exist:"
194                                        print "   %s" % os.path.join(IMAGE_DIRECTORY, activated_image)
195                                continue
196                       
197                       
198                        interface_button = \
199                           button.puzzlebox_brainstorms_client_interface_button( \
200                                   self.pygame, \
201                                   self.screen, \
202                                   button_image, \
203                                   activated_image, \
204                                   button_x, \
205                                   button_y, \
206                                   command, \
207                                   self.DEBUG)
208                       
209                       
210                        self.buttons.append(interface_button)
211       
212       
213        ##################################################################
214       
215        def send_commands_to_server(self, commands):
216       
217                #client = \
218                   #puzzlebox_brainstorms_client.puzzlebox_brainstorms_client_command_line(
219                         #self.log, \
220                         #commands, \
221                         #SERVER_HOST, \
222                         #SERVER_PORT)
223                #puzzlebox_brainstorms_client.reactor.callWhenRunning(client.execute_command_line)
224                #puzzlebox_brainstorms_client.reactor.run()
225               
226               
227                command = 'python puzzlebox_brainstorms_client.py'
228               
229                for each in commands:
230                        command = '%s %s' % (command, each)
231               
232                if self.DEBUG:
233                        print "executing: %s" % command
234               
235                os.system(command)
236       
237       
238        ##################################################################
239       
240        def start(self):
241               
242                self.update_screen = 0
243                clock = self.pygame.time.Clock()
244               
245                while 1:
246                       
247                        #update_screen = self.pointer.update()
248
249                        #if (update_screen):
250                                ## Redraw Background
251                                ##self.display_image(self.background_image)
252                                #self.draw_background()
253
254                                #for icon in self.icons:
255                                        #icon.display()
256
257                                #self.pointer.display()
258
259                                #self.draw_action_message()
260                                #self.draw_message()
261
262                                #self.update_display()
263
264
265                        #for icon in self.icons:
266                                #collision = icon.check_collision(self.pointer.location_rect())
267
268                                #if collision:
269                                        #if (icon.action != None):
270
271                                                #if self.DEBUG > 1:
272                                                        #print icon.action,
273
274                                                #if (icon.hits >= HITS_TO_CHANGE):
275                                                        #self.execute_action(icon.action)
276                                                        #icon.hits = 0
277
278
279                                                #else:
280                                                        #self.action_message = icon.action
281
282                                        #else:
283                                                #if self.DEBUG > 1:
284                                                        #print "bling!",
285
286                                        #if self.DEBUG > 1:
287                                                #print ":%i" % icon.hits
288                       
289                        commands = []
290                       
291                        for event in self.pygame.event.get():
292                               
293                                if (event.type is self.pygame.locals.QUIT):
294                                        sys.exit()
295                               
296                               
297                                elif (event.type == self.pygame.locals.KEYDOWN):
298                                       
299                                        if 'key' in event.dict.keys():
300                                               
301                                                if (event.dict['key'] == self.pygame.K_ESCAPE):
302                                                        sys.exit()
303                                               
304                                                elif ((event.dict['key'] == self.pygame.K_UP) or \
305                                                           (event.dict['key'] == self.pygame.K_w)):
306                                                        commands.append('drive_forward')
307                                               
308                                                elif ((event.dict['key'] == self.pygame.K_DOWN) or \
309                                                           (event.dict['key'] == self.pygame.K_s)):
310                                                        commands.append('drive_reverse')
311                                               
312                                                elif ((event.dict['key'] == self.pygame.K_LEFT) or \
313                                                           (event.dict['key'] == self.pygame.K_a)):
314                                                        commands.append('turn_left')
315                                               
316                                                elif ((event.dict['key'] == self.pygame.K_RIGHT) or \
317                                                           (event.dict['key'] == self.pygame.K_d)):
318                                                        commands.append('turn_right')
319                                               
320                                                elif ((event.dict['key'] == self.pygame.K_PAGEDOWN) or \
321                                                           (event.dict['key'] == self.pygame.K_c)):
322                                                        commands.append('turn_in_reverse')
323                       
324                       
325                        if commands != []:
326                                self.send_commands_to_server(commands)
327                       
328                        clock.tick(60)
329
330
331#####################################################################
332#####################################################################
333
334
335#####################################################################
336# Functions
337#####################################################################
338
339#####################################################################
340# Main
341#####################################################################
342
343if __name__ == '__main__':
344       
345        #log = puzzlebox_logger.puzzlebox_logger(logfile='mcc')
346        log = None
347       
348       
349        # Collect default settings and command line parameters
350        server_host = SERVER_HOST
351        server_port = SERVER_PORT
352        display_window_x_coordinate = DISPLAY_WINDOW_X_COORDINATE
353        display_window_y_coordinate = DISPLAY_WINDOW_Y_COORDINATE
354        display_window_x_dimension = DISPLAY_WINDOW_X_DIMENSION
355        display_window_y_dimension = DISPLAY_WINDOW_Y_DIMENSION
356        window_background_color = WINDOW_BACKGROUND_COLOR
357       
358       
359        for each in sys.argv:
360               
361                if each.startswith("--host="):
362                        server_host = each[ len("--host="): ]
363                if each.startswith("--port="):
364                        server_port = each[ len("--port="): ]
365       
366       
367        # Window Defaults
368        try:
369                display_window_x_coordinate = string.atoi(sys.argv[-4])
370                display_window_y_coordinate = string.atoi(sys.argv[-3])
371                display_window_x_dimension = string.atoi(sys.argv[-2])
372                display_window_y_dimension = string.atoi(sys.argv[-1])
373        except:
374                if DEBUG:
375                        print "Using default display coordinates"
376       
377       
378        interface = puzzlebox_brainstorms_client_interface( \
379                                             log, \
380                                             display_window_x_coordinate, \
381                                             display_window_y_coordinate, \
382                                             display_window_x_dimension, \
383                                             display_window_y_dimension, \
384                                             window_background_color, \
385                                             DEBUG=DEBUG)
386       
387        interface.start()
388
389
Note: See TracBrowser for help on using the repository browser.