source: rc/puzzlebox_brainstorms_client_interface.py @ 21

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

rc:

  • turn_left_in_reverse support added

server:

  • turn_left_in_reverse support added

configuration:

  • tweaked settings for vector arrows

images:

  • svg arrows scaled down to 254x242 for n900 display

client:

  • turn_left_in_reverse support added

client_interface:

  • turn_left_in_reverse support added
  • Property svn:executable set to *
File size: 10.7 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) or \
286                                                           (event.dict['key'] == self.pygame.K_x)):
287                                                        command = 'drive_reverse'
288                                                        self.update_button(command)
289                                                        commands.append(command)
290                                               
291                                                elif ((event.dict['key'] == self.pygame.K_LEFT) or \
292                                                           (event.dict['key'] == self.pygame.K_a) or \
293                                                           (event.dict['key'] == self.pygame.K_q)):
294                                                        command = 'turn_left'
295                                                        self.update_button(command)
296                                                        commands.append(command)
297                                               
298                                                elif ((event.dict['key'] == self.pygame.K_RIGHT) or \
299                                                           (event.dict['key'] == self.pygame.K_d) or \:
300                                                           (event.dict['key'] == self.pygame.K_e)):
301                                                        command = 'turn_right'
302                                                        self.update_button(command)
303                                                        commands.append(command)
304                                               
305                                                elif ((event.dict['key'] == self.pygame.K_PAGEDOWN) or \
306                                                           (event.dict['key'] == self.pygame.K_z)):
307                                                        command = 'turn_left_in_reverse'
308                                                        self.update_button(command)
309                                                        commands.append(command)
310                                               
311                                                elif ((event.dict['key'] == self.pygame.K_PAGEDOWN) or \
312                                                           (event.dict['key'] == self.pygame.K_c)):
313                                                        command = 'turn_right_in_reverse'
314                                                        self.update_button(command)
315                                                        commands.append(command)
316                       
317                       
318                        if commands != []:
319                                self.update_display()
320                                self.send_commands_to_server(commands)
321                                update_screen_on_next_pass = True
322                       
323                       
324                        clock.tick(60)
325
326
327#####################################################################
328# Functions
329#####################################################################
330
331#####################################################################
332# Main
333#####################################################################
334
335if __name__ == '__main__':
336       
337        #log = puzzlebox_logger.puzzlebox_logger(logfile='mcc')
338        log = None
339       
340       
341        # Collect default settings and command line parameters
342        server_host = SERVER_HOST
343        server_port = SERVER_PORT
344        display_window_x_coordinate = DISPLAY_WINDOW_X_COORDINATE
345        display_window_y_coordinate = DISPLAY_WINDOW_Y_COORDINATE
346        display_window_x_dimension = DISPLAY_WINDOW_X_DIMENSION
347        display_window_y_dimension = DISPLAY_WINDOW_Y_DIMENSION
348        window_background_color = WINDOW_BACKGROUND_COLOR
349       
350       
351        for each in sys.argv:
352               
353                if each.startswith("--host="):
354                        server_host = each[ len("--host="): ]
355                if each.startswith("--port="):
356                        server_port = each[ len("--port="): ]
357       
358       
359        # Window Defaults
360        try:
361                display_window_x_coordinate = string.atoi(sys.argv[-4])
362                display_window_y_coordinate = string.atoi(sys.argv[-3])
363                display_window_x_dimension = string.atoi(sys.argv[-2])
364                display_window_y_dimension = string.atoi(sys.argv[-1])
365        except:
366                if DEBUG:
367                        print "Using default display coordinates"
368       
369       
370        interface = puzzlebox_brainstorms_client_interface( \
371                                             log, \
372                                             display_window_x_coordinate, \
373                                             display_window_y_coordinate, \
374                                             display_window_x_dimension, \
375                                             display_window_y_dimension, \
376                                             window_background_color, \
377                                             DEBUG=DEBUG)
378       
379        interface.start()
380
381
Note: See TracBrowser for help on using the repository browser.