Example #1
0
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)
Example #2
0
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)