source: rc/puzzlebox_brainstorms_client_interface.py @ 19

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

configuration:

  • interface settings updates and fixes

client_interface_button:

  • activated button drawing added

client_interface:

  • activated button drawing added
  • background drawing added

client_interface_component:

  • whitespace cleanup
  • Property svn:executable set to *
File size: 10.3 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
25#import 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                if (os.name == "nt") or (os.name == "dos"):
77                        self.operating_system = "windows"
78                else:
79                        self.operating_system = os.name
80               
81                self.pygame = pygame
82                self.screen = None
83                self.FLIP = FLIP
84                self.image_directory = IMAGE_DIRECTORY
85               
86                self.initialize_pygame()
87               
88                self.pygame.FLIP = self.FLIP
89               
90                self.buttons = []
91               
92                self.initialize_buttons(BUTTON_LAYOUT)
93               
94                self.update_display()
95       
96       
97        #####################################################################
98       
99        def initialize_pygame(self):
100               
101                os.environ['SDL_VIDEO_WINDOW_POS'] = "%i,%i" % (self.display_window_x_coordinate, \
102                                                                self.display_window_y_coordinate)
103               
104                self.pygame.init()
105               
106                if (self.FLIP):
107                       
108                        self.screen = self.pygame.display.set_mode((self.display_window_x_dimension, \
109                                                                    self.display_window_y_dimension), \
110                                                                   pygame.HWSURFACE|pygame.DOUBLEBUF)
111               
112                else:
113                       
114                        self.screen = self.pygame.display.set_mode((self.display_window_x_dimension, \
115                                                                    self.display_window_y_dimension), \
116                                                                   pygame.HWSURFACE)
117               
118               
119                if (self.DEBUG >= 2):
120                        print "Display Driver:",
121                        print pygame.display.get_driver()
122                        print "Display Info:",
123                        print pygame.display.Info()
124                        #print "Get Flags:",
125                        #print pygame.display.screen.get_flags()
126               
127               
128                #self.pygame.mouse.set_visible(0)
129                self.pygame.mouse.set_visible(1)
130               
131               
132                self.pygame.display.set_caption('Puzzlebox Brainstorms - Client Interface')
133               
134                # Set Background
135                self.background = pygame.Surface(self.screen.get_size())
136                #self.background.set_alpha(0)
137                self.draw_background()
138       
139       
140        ##################################################################
141
142        def draw_background(self):
143               
144                self.background.fill(self.window_background_color)
145               
146                self.screen.blit(self.background, (0,0))
147       
148       
149        #####################################################################
150       
151        def initialize_buttons(self, button_layout):
152               
153                self.buttons = []
154               
155                for each in button_layout['buttons']:
156                        button_image = each[0]
157                        activated_image = each[1]
158                        button_x = each[2]
159                        button_y = each[3]
160                        command = each[4]
161                       
162                        if ((button_image != None) and \
163                            (button_image != '.') and \
164                            (button_image != '..') and \
165                            (os.path.exists(os.path.join(self.image_directory, button_image)))):
166                               
167                                button_image = os.path.join(self.image_directory, button_image)
168                       
169                        else:
170                                if self.DEBUG:
171                                        print "Error: Button image does not exist:"
172                                        print "   %s" % os.path.join(self.image_directory, button_image)
173                                continue
174                       
175                       
176                        if ((activated_image != None) and \
177                            (activated_image != '.') and \
178                            (activated_image != '..') and \
179                            (os.path.exists(os.path.join(self.image_directory, activated_image)))):
180                               
181                                activated_image = os.path.join(self.image_directory, activated_image)
182                       
183                        else:
184                                if self.DEBUG:
185                                        print "Error: Activated button image does not exist:"
186                                        print "   %s" % os.path.join(self.image_directory, activated_image)
187                                continue
188                       
189                       
190                        interface_button = \
191                           button.puzzlebox_brainstorms_client_interface_button( \
192                                   self.pygame, \
193                                   self.screen, \
194                                   button_image, \
195                                   activated_image, \
196                                   button_x, \
197                                   button_y, \
198                                   command, \
199                                   self.DEBUG)
200                       
201                       
202                        self.buttons.append(interface_button)
203       
204       
205        ##################################################################
206       
207        def update_button(self, command):
208               
209                for each in self.buttons:
210                        if each.command == command:
211                                each.activated = True
212                                each.display()
213       
214       
215        ##################################################################
216       
217        def send_commands_to_server(self, commands):
218       
219                #client = \
220                   #puzzlebox_brainstorms_client.puzzlebox_brainstorms_client_command_line(
221                         #self.log, \
222                         #commands, \
223                         #SERVER_HOST, \
224                         #SERVER_PORT)
225                #puzzlebox_brainstorms_client.reactor.callWhenRunning(client.execute_command_line)
226                #puzzlebox_brainstorms_client.reactor.run()
227               
228               
229                command = 'python puzzlebox_brainstorms_client.py'
230               
231                for each in commands:
232                        command = '%s %s' % (command, each)
233               
234                if self.DEBUG:
235                        print "executing: %s" % command
236               
237                os.system(command)
238       
239       
240        ##################################################################
241       
242        def start(self):
243               
244                update_screen_on_next_pass = False
245                clock = self.pygame.time.Clock()
246               
247                while 1:
248                       
249                        if (update_screen_on_next_pass):
250                                # Redraw Background
251                                self.draw_background()
252                               
253                                for each in self.buttons:
254                                        each.activated = False
255                                        each.display()
256                               
257                               
258                                self.update_display()
259                               
260                                update_screen_on_next_pass = False
261                       
262                       
263                        commands = []
264                       
265                        for event in self.pygame.event.get():
266                               
267                                if (event.type is self.pygame.locals.QUIT):
268                                        sys.exit()
269                               
270                               
271                                elif (event.type == self.pygame.locals.KEYDOWN):
272                                       
273                                        if 'key' in event.dict.keys():
274                                               
275                                                if (event.dict['key'] == self.pygame.K_ESCAPE):
276                                                        sys.exit()
277                                               
278                                                elif ((event.dict['key'] == self.pygame.K_UP) or \
279                                                           (event.dict['key'] == self.pygame.K_w)):
280                                                        command = 'drive_forward'
281                                                        self.update_button(command)
282                                                        commands.append(command)
283                                               
284                                                elif ((event.dict['key'] == self.pygame.K_DOWN) or \
285                                                           (event.dict['key'] == self.pygame.K_s)):
286                                                        command = 'drive_reverse'
287                                                        self.update_button(command)
288                                                        commands.append(command)
289                                               
290                                                elif ((event.dict['key'] == self.pygame.K_LEFT) or \
291                                                           (event.dict['key'] == self.pygame.K_a)):
292                                                        command = 'turn_left'
293                                                        self.update_button(command)
294                                                        commands.append(command)
295                                               
296                                                elif ((event.dict['key'] == self.pygame.K_RIGHT) or \
297                                                           (event.dict['key'] == self.pygame.K_d)):
298                                                        command = 'turn_right'
299                                                        self.update_button(command)
300                                                        commands.append(command)
301                                               
302                                                elif ((event.dict['key'] == self.pygame.K_PAGEDOWN) or \
303                                                           (event.dict['key'] == self.pygame.K_c)):
304                                                        command = 'turn_in_reverse'
305                                                        self.update_button(command)
306                                                        commands.append(command)
307                       
308                       
309                        if commands != []:
310                                self.update_display()
311                                self.send_commands_to_server(commands)
312                                update_screen_on_next_pass = True
313                       
314                       
315                        clock.tick(60)
316
317
318#####################################################################
319# Functions
320#####################################################################
321
322#####################################################################
323# Main
324#####################################################################
325
326if __name__ == '__main__':
327       
328        #log = puzzlebox_logger.puzzlebox_logger(logfile='mcc')
329        log = None
330       
331       
332        # Collect default settings and command line parameters
333        server_host = SERVER_HOST
334        server_port = SERVER_PORT
335        display_window_x_coordinate = DISPLAY_WINDOW_X_COORDINATE
336        display_window_y_coordinate = DISPLAY_WINDOW_Y_COORDINATE
337        display_window_x_dimension = DISPLAY_WINDOW_X_DIMENSION
338        display_window_y_dimension = DISPLAY_WINDOW_Y_DIMENSION
339        window_background_color = WINDOW_BACKGROUND_COLOR
340       
341       
342        for each in sys.argv:
343               
344                if each.startswith("--host="):
345                        server_host = each[ len("--host="): ]
346                if each.startswith("--port="):
347                        server_port = each[ len("--port="): ]
348       
349       
350        # Window Defaults
351        try:
352                display_window_x_coordinate = string.atoi(sys.argv[-4])
353                display_window_y_coordinate = string.atoi(sys.argv[-3])
354                display_window_x_dimension = string.atoi(sys.argv[-2])
355                display_window_y_dimension = string.atoi(sys.argv[-1])
356        except:
357                if DEBUG:
358                        print "Using default display coordinates"
359       
360       
361        interface = puzzlebox_brainstorms_client_interface( \
362                                             log, \
363                                             display_window_x_coordinate, \
364                                             display_window_y_coordinate, \
365                                             display_window_x_dimension, \
366                                             display_window_y_dimension, \
367                                             window_background_color, \
368                                             DEBUG=DEBUG)
369       
370        interface.start()
371
372
Note: See TracBrowser for help on using the repository browser.