#!/usr/bin/perl
###########################################
use strict;
use warnings;
use Camcap;
use Imager::Misc;
use Log::Log4perl qw(:easy);
use Cache::SharedMemoryCache;
use Time::Piece;
use List::Util qw(maxstr);

my $c = Cache::SharedMemoryCache->new({
    namespace          => "tracker",
    default_expires_in => 48*3600 });

Log::Log4perl->easy_init($DEBUG);

my $cam = Camcap->new();

while(1) {
  my $lkey = maxstr grep /\d/,
                    $c->get_keys();

  if(! $c->get("calibrated")) {
    $cam->calibrate();
    $c->set("calibrated", 1, 300);
    my $img = $cam->capture();
    saveimg($img, $c, $lkey);
    next;
  }

  my $img = $cam->capture();

  if($lkey) {
    my $limg = Imager->new();
    $limg->read(type => "jpeg", 
                data => $c->get($lkey));
    my $dpix = Imager::Misc::changed($limg,
                                 $img, 80);
    DEBUG "$dpix pixels changed";
    if($dpix > 2000) {
        saveimg($img, $c);
        next;
    } else {
          # minor change, 
          # refresh reference
        saveimg($img, $c, $lkey);
    }
  } else {
      # save first img
    saveimg($img, $c);
  }

  sleep(1);
}

###########################################
sub saveimg {
###########################################
    my($img, $cache, $date) = @_;

    if(! $date) {
        $date = localtime()->
             strftime("%Y/%m/%d-%H:%M:%S");
    }

    DEBUG "Saving image $date";
    $img->write(type => "jpeg", 
                data => \my $val) or die;
    $cache->set($date, $val);
}
