class CameraWindow(Thread): def __init__(self, settings): self.settings = settings self.events = { "shutter": Event(), "register-jancode": Event(), "quit": Event(), "run": Event() } Thread.__init__(self) def run(self): self.camera = Camera() while not self.event("quit"): time.sleep(GUI_UPDATE_WAIT) run = self.event("run") if run and run.arg == "start": self.camera.update() if self.event("shutter"): path = self.event("shutter").arg self.event_clear("shutter") self.event_set("run", "start") self.camera.shutter(path) self.event_set("run", "stop") if self.event("write"): self.camera.write(self.event("write").arg) self.event_clear("write") if self.event("register-jancode"): self.register_jancode(self.event("register-jancode").arg) self.event_clear("register-jancode") event = self.camera.event() if event.type == pygame.NOEVENT: continue elif event.type == pygame.QUIT: self.event_set("quit", True) elif event.type == pygame.KEYDOWN: name = pygame.key.name(event.key) if event.key == pygame.K_ESCAPE: self.event_set("quit", True) elif event.key == pygame.K_p: path = "%s.jpg" % time.strftime("%Y%m%d-%H%M%S") self.camera.save(path) elif event.key == pygame.K_r: if run and run.arg == "start": self.event_set("run", "stop") else: self.event_set("run", "start") def event_set(self, name, arg): if name in self.events and self.events[name]: self.events[name].arg = arg self.events[name].set() def event_clear(self, name): if name in self.events and self.events[name]: self.events[name].clear() def event(self, name): if name in self.events and self.events[name].isSet(): return self.events[name] def register_jancode(self, id): print("register jancode") self.camera.fill() self.camera.write("Unknown RFID: " + id + ". Scan JAN-CODE.") jancode = self.read_jancode() print("read jancode: " + jancode) jancodes = self.settings.get("jancodes") jancodes[id] = jancode self.settings.set("jancodes", jancodes) self.settings.save() self.camera.fill() self.camera.write("RFID: '" + id + ". JAN-CODE: " + jancode + ".") time.sleep(5) self.event_set("run", "start") def read_jancode(self): jancode = "" while not self.event("quit"): event = self.camera.event() if event.type == pygame.KEYDOWN: if event.key == pygame.K_RETURN: return jancode name = pygame.key.name(event.key) jancode += name self.camera.fill() self.camera.write(jancode)
class Graphx(object): """Master class of the graphics engine""" def __init__(self, screen_size=(800, 600), clear_color=(0, 0, 0), camera_initial_position=(0, 0, 0), camera_initial_direction=(0, 0, 1)): """ Initialize the graphics engine screen_size -- tuple(width, height): represents the size of the screen """ super(Graphx, self).__init__() pygame.init() screen = pygame.display.set_mode(screen_size, HWSURFACE|OPENGL|DOUBLEBUF) self.camera = Camera(camera_initial_position) self.screen_width, self.screen_height = self.screen_size = screen_size glEnable(GL_DEPTH_TEST) glShadeModel(GL_FLAT) glClearColor(*clear_color) glEnable(GL_COLOR_MATERIAL) glEnable(GL_LIGHTING) glEnable(GL_LIGHT0) glLight(GL_LIGHT0, GL_POSITION, (0, 1, 1, 0)) self.resize(*screen_size) glMaterial(GL_FRONT, GL_AMBIENT, (0.1, 0.1, 0.1, 1.0)) glMaterial(GL_FRONT, GL_DIFFUSE, (1.0, 1.0, 1.0, 1.0)) def resize(self, width, height): glViewport(0, 0, width, height) glMatrixMode(GL_PROJECTION) glLoadIdentity() gluPerspective(60.0, float(width)/height, .1, 1000.) glMatrixMode(GL_MODELVIEW) glLoadIdentity() def event(self, e): """ Handle the event. Propagate it to the camera object. e -- the event to handle """ self.camera.event(e) def keyPress(self, pressed=None): """ Manage pressed keys. """ if pressed is None: pressed = pygame.key.get_pressed() self.camera.keyPress(pressed) def update(self, frame_time=5, key_pressed=None): """ Update the internal state of the camera. This need to be called once per frame. pressed -- dict: (optional) for each key hold a boolean set to true if the key is pressed If not provided, call pygame.key.get_pressed() to retrieve it frame_time -- float (optional): the time passed since the last drawed frame in milliseconds (computed by the pygame.time.Clock tick call) If not provided, assume that 5 milliseconds have passed """ self.keyPress(key_pressed) self.camera.update(frame_time) # Upload the inverse camera matrix to OpenGL glLoadMatrixd(self.camera.camera_matrix.get_inverse().to_opengl()) # Light must be transformed as well glLight(GL_LIGHT0, GL_POSITION, (0, 1.5, 1, 0)) # Show the screen pygame.display.flip() self.__clear() def __clear(self): """ Clear the screen. Should be called before any drawing. """ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)