Skip to content

Commit

Permalink
Ready for testing, only the overlayed image is left as TODO
Browse files Browse the repository at this point in the history
  • Loading branch information
reinzor committed Nov 9, 2015
1 parent de42e57 commit eaa0ccd
Show file tree
Hide file tree
Showing 3 changed files with 120 additions and 95 deletions.
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
.DS_Store
images
*.pyc
47 changes: 24 additions & 23 deletions src/app.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#!/usr/bin/python

# from selfieboot import Selfieboot
from selfieboot import Selfieboot

import sys, os
import yaml
Expand All @@ -21,32 +21,38 @@
sys.exit()

# Check if we have everything in the config
bottom_image = "%s/%s"%(config_dirname, cfg['bottom_image'])
top_image = "%s/%s"%(config_dirname, cfg['top_image'])
flash_image = "%s/%s"%(config_dirname, cfg['flash_image'])
countdown_images = ["%s/%s"%(config_dirname, i) for i in cfg['countdown_images']]
screensaver_images = ["%s/%s"%(config_dirname, i) for i in cfg['screensaver_images']]
try:
bottom_image = "%s/%s"%(config_dirname, cfg['bottom_image'])
top_image = "%s/%s"%(config_dirname, cfg['top_image'])
flash_image = "%s/%s"%(config_dirname, cfg['flash_image'])
countdown_images = ["%s/%s"%(config_dirname, i) for i in cfg['countdown_images']]
screensaver_images = ["%s/%s"%(config_dirname, i) for i in cfg['screensaver_images']]

flash_time = float(cfg['flash_time'])
freeze_time = float(cfg['freeze_time'])
flash_time = float(cfg['flash_time'])
freeze_time = float(cfg['freeze_time'])

screensaver_time = float(cfg['screensaver_time'])
screensaver_slide_time = float(cfg['screensaver_slide_time'])
screensaver_time = float(cfg['screensaver_time'])
screensaver_slide_time = float(cfg['screensaver_slide_time'])

# Screen specific things
screen_width = int(cfg['screen_width'])
screen_height = int(cfg['screen_height'])
# Screen specific things
screen_width = int(cfg['screen_width'])
screen_height = int(cfg['screen_height'])

# Output
raw_output_dir = "%s/%s"%(config_dirname, cfg['raw_output_dir'])
overlay_image = "%s/%s"%(config_dirname, cfg['overlay_image'])
overlayed_output_dir = "%s/%s"%(config_dirname, cfg['overlayed_output_dir'])
# Output
raw_output_dir = "%s/%s"%(config_dirname, cfg['raw_output_dir'])
overlay_image = "%s/%s"%(config_dirname, cfg['overlay_image'])
overlayed_output_dir = "%s/%s"%(config_dirname, cfg['overlayed_output_dir'])
except Exception as e:
print "Invalid configuration file. Key %s not present." % str(e)
sys.exit()

with Selfieboot(screen_width,
screen_height
screen_height,
bottom_image,
top_image,
flash_image,
countdown_images,
screensaver_images,
flash_time,
freeze_time,
screensaver_time,
Expand All @@ -55,11 +61,6 @@
overlay_image,
overlayed_output_dir) as boot:

boot.add_screensaver(ROOT + "assets/slide1.png")
boot.add_screensaver(ROOT + "assets/slide2.png")
boot.add_screensaver(ROOT + "assets/slide3.png")
boot.add_screensaver(ROOT + "assets/slide4.png")

boot.run()

except IOError as e:
Expand Down
166 changes: 95 additions & 71 deletions src/selfieboot.py
Original file line number Diff line number Diff line change
@@ -1,49 +1,96 @@
#!/usr/bin/python

import picamera
import io
import io, os
from PIL import Image
from time import sleep, time
from collections import deque
from random import shuffle

# GPIO
# RPI stuff
import picamera
import RPi.GPIO as GPIO

class Selfieboot(picamera.PiCamera):
_time_last_press = 0
_screensavers = deque()
_screensaver_overlay = None

def __init__(self, width, height):
def __init__(self,
screen_width,
screen_height,
bottom_image,
top_image,
flash_image,
countdown_images,
screensaver_images,
flash_time,
freeze_time,
screensaver_time,
screensaver_slide_time,
raw_output_dir,
overlay_image,
overlayed_output_dir):

# Call the picamera constructor
super(Selfieboot, self).__init__()

self.resolution = (width, height)
# Picamera setup
self.resolution = (screen_width, screen_height)
self.framerate = 24
self.start_preview()

top_layer = boot.add_img_overlay(ROOT + "assets/top.png", where="top", layer=3)
bottom_layer = boot.add_img_overlay(ROOT + "assets/bottom.png", where="bottom", layer=4)
self._top_overlay = self._add_img_overlay(top_image, where="top", layer=3)
self._bottom_overlay = self._add_img_overlay(bottom_image, where="bottom", layer=4)
self._flash_overlay = self._add_img_overlay(flash_image, layer=999)

self._time_last_press = 0

self._screensaver_overlays = [self._add_img_overlay(screensaver_image, layer=100+idx) for idx, screensaver_image in enumerate(screensaver_images)]
self._countdown_overlays = [self._add_img_overlay(countdown_image, layer=200+idx) for idx, countdown_image in enumerate(countdown_images)]

self._flash_time = flash_time
self._freeze_time = freeze_time
self._screensaver_time = screensaver_time
self._screensaver_slide_time = screensaver_slide_time

self._setup_gpio()
self._raw_output_dir = raw_output_dir
self._overlay_image = overlay_image # TODO, use this one
self._overlayed_output_dir = overlayed_output_dir

# Check if folders exist
if not os.path.isdir(raw_output_dir):
print "Raw output dir %s does not exist!" % raw_output_dir
sys.exit()
if not os.path.isdir(overlayed_output_dir):
print "Overlayed output dir %s does not exist!" % overlayed_output_dir
sys.exit()

self._setup_gpio()

self._setup_overlays()

def _setup_gpio(self):
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.IN, GPIO.PUD_UP)
GPIO.add_event_detect(17, GPIO.FALLING)

def add_img_overlay(self, filename, where=None, fullscreen=False, alpha = 255, layer = 99):
def _setup_overlays(self):
self._flash_layer.opacity = 0
for overlay in self._screensaver_overlays + self._countdown_overlays:
overlay.opacity = 0

def _add_img_overlay(self, filename, where=None, fullscreen=False, alpha = 255, layer = 99):
if not where or where != "top" or where != "bottom":
x = 0
y = 0

img = Image.open(filename)
try:
img = Image.open(filename)
except Exception as e:
print e
sys.exit()

width = img.size[0]
height = img.size[1]

if where == "bottom":
x = 0
y = screen_height_ - height
y = self.resolution[1] - height

pad = Image.new('RGB', ( ((width + 31) // 32) * 32, ((height + 15) // 16) * 16, ))
pad.paste(img, (0, 0))
Expand All @@ -55,85 +102,62 @@ def add_img_overlay(self, filename, where=None, fullscreen=False, alpha = 255, l
alpha=alpha,
layer=layer)

def add_screensaver(self, path):
self._screensavers.appendleft(path)

def check_screensaver(self):
if time() - self._time_last_press > SCREENSAVER_TIME:
self._screensavers.rotate()
screensaver = self._screensavers[0]
def _check_screensaver(self):
if time() - self._time_last_press > self._screensaver_time:
# Create a deque from screensavers
screensavers = deque(self._screensaver_overlays)
shuffle(screensavers)

slide_start_time = time()
screensavers[0].opacity = 255

if self._screensaver_overlay:
tmp_screensaver_overlay = self.add_img_overlay(screensaver, layer = 10)
self.remove_overlay(self._screensaver_overlay)
self._screensaver_overlay = tmp_screensaver_overlay
else:
self._screensaver_overlay = self.add_img_overlay(screensaver, layer = 10)

while time() - slide_start_time < SCREENSAVER_SLIDE_TIME:
if self.push_button_pressed():
if self._screensaver_overlay:
self.remove_overlay(self._screensaver_overlay)
self._screensaver_overlay = None
break

def make_picture(self):
countdown_overlay_time = None
countdown_overlay = None

press_time = time()
while time() - press_time < COUNTDOWN_TIME:
time_left = COUNTDOWN_TIME - int(time()-press_time)
if countdown_overlay_time != time_left:
countdown_overlay_time = time_left
if countdown_overlay:
tmp_countdown_overlay = self.add_img_overlay(ROOT + "assets/countdown%d.png"%time_left, layer = 11)
self.remove_overlay(countdown_overlay)
countdown_overlay = tmp_countdown_overlay
else:
countdown_overlay = self.add_img_overlay(ROOT + "assets/countdown%d.png"%time_left, layer = 11)

self.push_button_pressed(always_false=True)
while not self._push_button_pressed():
if time() - slide_start_time > self._screensaver_slide_time:
screensavers[0].opacity = 0
screensavers.rotate()
screensavers[0].opacity = 255
slide_start_time = time()

flash_overlay = self.add_img_overlay(ROOT + "assets/white.png", layer = 14)
screensavers[0].opacity = 255

self.remove_overlay(countdown_overlay)
def _make_picture(self):
# Countdown
for overlay in self._countdown_overlays:
overlay.opacity = 255
sleep(1)
overlay.opacity = 0

# Take picture
stream = io.BytesIO()
self.capture(stream, format="jpeg")
stream.seek(0)
img = Image.open(stream)

width = img.size[0]
height = img.size[1]

pad = Image.new('RGB', ( ((width + 31) // 32) * 32, ((height + 15) // 16) * 16, ))
# Picture to overlay
pad = Image.new('RGB', ( ((img.size[0] + 31) // 32) * 32, ((img.size[1] + 15) // 16) * 16, ))
pad.paste(img, (0, 0))

capture_overlay = self.add_overlay(pad.tostring(), size=img.size, fullscreen=True, alpha=255, layer=13)

start_freeze_time = time()
while time() - start_freeze_time < FREEZE_TIME:
while time() - start_freeze_time < self._freeze_time:
duration = time() - start_freeze_time

if duration < FLASH_TIME:
alpha = int ( ( (FLASH_TIME - duration) / FLASH_TIME ) * 255 )
flash_overlay.alpha = alpha
if duration < self._flash_time:
flash_overlay.alpha = int ( ( (self._flash_time - duration) / self._flash_time ) * 255 )

self.push_button_pressed(always_false=True)

self.remove_overlay(flash_overlay)
self._flash_overlay.opacity = 0
self.remove_overlay(capture_overlay)

# Store the image
img.save(ROOT + "images/%d.jpeg"%int(press_time), "JPEG")
img.save("%s/images/%d.jpeg" % (self._raw_output_dir, int(start_freeze_time)), "JPEG")

# TODO: Create overlay image and save to overlayed_output_dir

self._time_last_picture = time()

def push_button_pressed(self, always_false=False):
def _push_button_pressed(self, always_false=False):
sleep(.01)
if GPIO.event_detected(17) and time() - self._time_last_press > 1.0 and not always_false:
self._time_last_press = time()
Expand All @@ -145,8 +169,8 @@ def run(self):
# Run it
while True:
# Always check the pushbutton press
if self.push_button_pressed():
self.make_picture()
if self._push_button_pressed():
self._make_picture()

# Check the screensaver
self.check_screensaver()
self._check_screensaver()

0 comments on commit eaa0ccd

Please sign in to comment.