''' Created on Nov 10, 2012 @author: attero ''' import random, pygame, sys #import time from pygame.locals import * from math import fabs from math import ceil import serial #import and init pygame pygame.init() def main(): #create the screen window = pygame.display.set_mode((640, 480)) #draw a line pygame.draw.line(window, (255, 255, 255), (0,0), (300, 50)) #draw it to the screen GRAY = ( 182, 182, 182) VIOLET = (150, 100, 190) RED = (150, 0, 0) GREEN = (0, 150, 0) BLUE = (0, 0, 150) VERYLIGHT = (210, 210, 210) BACKGROUND_COLOR = GREEN colors = [GRAY, VIOLET, RED, GREEN, BLUE, VERYLIGHT] window.fill(BACKGROUND_COLOR) mouseClicked = False pygame.display.flip() cannon = CannonController() screen = Screen(window, colors) screen.draw_surface(cannon) gunpoint = Gunpoint((5, 4), (200, 4), (5, 210)) coords = gunpoint.aim((0,0)) #input handling ( code): while True: screen.draw_surface(cannon) mouseClicked = False for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit(0) elif event.type == KEYUP and event.key == K_SPACE: if cannon.fired: cannon.fired = False else: cannon.fired = True elif event.type == KEYUP and event.key == K_RIGHT: cannon.move_right(2) elif event.type == KEYUP and event.key == K_LEFT: cannon.move_left(2) elif event.type == KEYUP and event.key == K_UP: cannon.move_up(2) elif event.type == KEYUP and event.key == K_DOWN: cannon.move_down(2) elif event.type == KEYUP and event.key == K_l: if cannon.laser: cannon.disable_laser() if "Laser enabled" in screen.communicates : screen.communicates.remove("Laser enabled") screen.communicates.append("Laser disabled") else: cannon.enable_laser() if "Laser disabled" in screen.communicates : screen.communicates.remove("Laser disabled") screen.communicates.append("Laser enabled") elif event.type == KEYUP and event.key == K_c: point1 = get_calibration_point(window, "Point1") point2 = get_calibration_point(window, "Point2") point3 = get_calibration_point(window, "Point3") print point1, point2, point3 gunpoint.calibrate(point1, point2, point3) print gunpoint.horizontal_angle, gunpoint.vertical_angle elif event.type == MOUSEBUTTONUP: mouseClicked = True screen.change_color() cannon.send_data() if mouseClicked : coords = [gunpoint.aim((x/10.0,x/10.0)) for x in range(0,11)] samples = [(x/10.0,x/10.0) for x in range(0, 11)] print samples print coords def get_key(): while 1: event = pygame.event.poll() if event.type == KEYDOWN: return event.key else: pass def display_box(screen, message, xx, yy): "Print a message in a box in the middle of the screen" font_object = pygame.font.Font(None,18) pygame.draw.rect(screen, (0,0,0),(xx, yy, 200,20), 0) pygame.draw.rect(screen, (255,255,255), (xx -2, yy-2, 202,24), 1) if len(message) != 0: screen.blit(font_object.render(message, 1, (255,255,255)), (xx + 6, yy + 6) ) pygame.display.flip() def ask(screen, question): "ask(screen, question) -> answer" pygame.font.init() current_string = [] display_box(screen, question + ": " + "".join(current_string), 20, 400) while 1: inkey = get_key() if inkey == K_BACKSPACE: current_string = current_string[0:-1] elif inkey == K_RETURN: break elif inkey == K_MINUS: current_string.append("_") elif inkey <= 127: current_string.append(chr(inkey)) display_box(screen, question + ": " + "".join(current_string), 20, 400) return "".join(current_string) def get_calibration_point(screen, message): point_string = ask(screen, message) while(not (is_valid_point(point_string)) ): point_string = ask(screen, "Again, " + message) return [float(x) for x in point_string.split(",")] def is_valid_point(string): point = string.split(',') if (len(point) != 2): return False if((not point[0].isdigit()) or (not point[1].isdigit())): return False if(float(point[0]) > 255 or float(point[1]) > 255 or float(point[0])< 0 or float(point[1]) <0 ): return False return True class Screen: def __init__(self, window, colors): self.communicates = [] self.communicates.append("Press space to fire!") self.communicates.append("Use arrows to adjust position") self.communicates.append("Press C for calibration") self.communicates.append("Press L to enable laser") self.window = window self.colors = colors self.color = random.choice(self.colors) def change_color(self): self.color = random.choice(self.colors) def draw_surface(self, cannon): self.window.fill(self.color) for i, text in enumerate(self.communicates): self.print_text(text, 20, 20 + i*20, (0, 0, 0), 20, self.window) if cannon.fired: self.print_text("Fired!", 20, 150, (150, 20, 40), 40, self.window) self.print_text([str(x) for x in cannon.get_data()].__str__(), 20, 300, (0, 0, 0), 30, self.window) pygame.display.flip() def print_text(self, text,xx,yy,color,text_size, screen): font = pygame.font.SysFont("Courier New",text_size) ren = font.render(text,1,color) screen.blit(ren, (xx,yy)) class CannonController : def __init__(self): print("cannon controller started") self.position = [0, 0] self.fired = False self.laser = False def fire(self): self.fired = True def enable_laser(self): self.laser = True def disable_laser(self): self.laser = False def move_left(self, change): if(self.position[0] >= change): self.position[0] -= change def move_right(self, change): if(self.position[0] < 255 - change): self.position[0] += change def move_up(self, change): if(self.position[1] < 255 - change): self.position[1] += change def move_down(self, change): if(self.position[1] >= change): self.position[1] -= change def check_validity_of_data(self): if(fabs(self.position[0]) > 255): return False if (fabs(self.position[1]) > 255): return False return True def get_data(self): if self.check_validity_of_data(): data = [] data.extend(self.position) if(self.fired): data.append(255) else: data.append(0) if(self.laser): data.append(255) else: data.append(0) return data else: return [0, 0, 0, 0] def get_data_to_send(self): data = self.get_data() return [chr(x) for x in data] def send_data(self): ser = serial.Serial("/dev/ttyACM0", 115200, timeout=1) data = self.get_data_to_send() ser.write('a') ser.write(data[0]) ser.write('b') ser.write(data[1]) ser.write('c') ser.write(data[2]) ser.write('d') ser.write(data[3]) class Gunpoint : def __init__(self, point1, point2, point3): self.vertical_angle = point3[1] - point1[1] self.horizontal_angle = point2[0] - point1[0] self.beginnig_horizontal = point1[0] self.beginnig_vertical = point1[1] def calibrate(self, point1, point2, point3): self.vertical_angle = point3[1] - point1[1] self.horizontal_angle = point2[0] - point1[0] self.beginnig_horizontal = point1[0] self.beginnig_vertical = point1[1] def aim(self, point): horizontal = ceil(self.beginnig_horizontal + self.horizontal_angle*point[0]) vertical = ceil(self.beginnig_vertical + self.vertical_angle*point[1]) return [horizontal, vertical] if __name__ == '__main__': main()