nenuscanner/camera.py

73 lines
1.7 KiB
Python

import gphoto2 as gp
import shutil
from . import leds, config
class Camera:
def capture(self):
return None
class RealCamera(Camera):
def __init__(self):
self.inner = gp.Camera()
def __enter__(self):
self.inner.init()
return self
def __exit__(self, *args):
self.inner.exit()
def capture(self):
try:
return self.inner.capture(gp.GP_CAPTURE_IMAGE)
except Exception as e:
print('An error occured when capturing photo', e)
return None
def save(self, capture, output_file):
preview = self.inner.file_get(capture.folder, capture.name[:-3] + 'JPG', gp.GP_FILE_TYPE_NORMAL)
raw = self.inner.file_get(capture.folder, capture.name, gp.GP_FILE_TYPE_RAW)
preview.save(output_file + '.jpg')
raw.save(output_file + '.cr2')
class DummyCamera(Camera):
def __init__(self, leds: leds.DummyLeds):
self.leds = leds
def __enter__(self):
return self
def __exit__(self, *args):
pass
def capture(self):
# Find which leds are turned on
found = None
all_on = False
for led in self.leds.leds:
if led.is_on:
if found is None:
found = led
else:
all_on = True
if all_on:
return 'data-keep/small/all_on.jpg'
elif found is not None:
return 'data-keep/small/' + str(found) + '.jpg'
else:
return 'data-keep/small/all_off.jpg'
def save(self, capture, output_file):
shutil.copyfile(capture, output_file + '.jpg')
camera = DummyCamera(leds.get()) if config.CAMERA == "dummy" else RealCamera()
def get():
return camera