#!env_pi/bin/python from __future__ import division from run_local import log import sys;sys.path.append('/usr/lib/python2.7/dist-packages/') import io, logging, traceback import cyclone.web from twisted.internet import reactor from light9 import prof try: import picamera cameraCls = picamera.PiCamera except ImportError: class cameraCls(object): def __enter__(self): return self def __exit__(self): pass def capture(self, out, *a, **kw): out.write(open('yuv.demo').read()) @prof.logTime def getFrame(c, arg): res = int(arg('res', 480)) c.resolution = { 480: (640, 480), 1080: (1920, 1080), 1944: (2592, 1944), }[res] c.shutter_speed = int(arg('shutter', 50000)) c.exposure_mode = arg('exposure_mode', 'fixedfps') c.awb_mode = arg('awb_mode', 'off') c.brightness = int(arg('brightness', 50)) c.awb_gains = (float(arg('redgain', 1)), float(arg('bluegain', 1))) c.crop = (float(arg('x', 0)), float(arg('y', 0)), float(arg('w', 1)), float(arg('h', 1))) rw = rh = int(arg('resize', 100)) # width 1920, showing w=.3 of image, resize=100 -> scale is 100/.3*1920 # scl is [ output px / camera px ] scl1 = rw / (c.crop[2] * c.resolution[0]) scl2 = rh / (c.crop[3] * c.resolution[1]) if scl1 < scl2: # width is the constraint; reduce height to the same scale rh = int(scl1 * c.crop[3] * c.resolution[1]) else: # height is the constraint rw = int(scl2 * c.crop[2] * c.resolution[0]) c.ISO = int(arg('iso', 250)) out = io.BytesIO('w') prof.logTime(c.capture)(out, 'jpeg', use_video_port=True, resize=(rw, rh)) return out.getvalue() class Pic(cyclone.web.RequestHandler): def get(self): try: self.set_header('Content-Type', 'image/jpeg') self.write(getFrame(self.settings.camera, self.get_argument)) except Exception: traceback.print_exc() log.setLevel(logging.INFO) with cameraCls() as camera: port = 8001 reactor.listenTCP(port, cyclone.web.Application(handlers=[ (r'/pic', Pic), (r'/static/(.*)', cyclone.web.StaticFileHandler, {'path': 'static/'}), (r'/(|gui.js)', cyclone.web.StaticFileHandler, {'path': 'light9/vidref/', 'default_filename': 'index.html'}), ], debug=True, camera=camera)) log.info("serving on %s" % port) reactor.run()