#!/usr/bin/perl -w
#  $Id: probe 29580 2013-09-30 13:57:20Z teetov $
# -----------------------------------------------------------------------------
#  Purpose:
#    - probe the camera
#    - pre-tune camera befor for retriever (RC and Audio)
# -----------------------------------------------------------------------------
#  Call:
#    probe DEVID=123   
#    probe DEVID=123 PROBE=FAST  
#    probe DEVID=123 DEVIP=192.168.17.177 [ ... ]
#    probe DEVIP=192.168.17.177 USRNAME=admin PASSWD=pass PROBE=DEFINE
# -----------------------------------------------------------------------------
#  Does:
#   0. can be called without DEVID argument. 
#      In this case DEVIP,USRNAME,PASSWD should be provided in command line
#   1. load $APL_CONF/<DEVID>/conf if DEVID is provided
#   2. combine conf and args into one hash
#   3. connect to camera over http and read MODELID and FIRMWARE
#   4. report MODELID|FIRMWARE|STATUS to $APL_CONF/<DEVID>/conf.probe and stdout
#   5. if PROBE=DEFINE then get
#         IMAGESIZE_LIST,MEDIA_FORMAT_LIST
#         AUDIO_LIST,AUDIO_FORMAT_LIST
#         SNAPSHOT (picture)
#   6. set RC camera attributes    if mpeg4 | h264
#   7. set AUDIO camera attributes if AUDIO is on 
#   8. example output:
#       AUDIO_SET=OK
#       FIRMWARE=5.02
#       MODELID=Q1755
#       RC_SET=OK
#       STATUS=OK
#       -------------
#       AUDIO_SET=NONE
#       FIRMWARE=5.02
#       MODELID=Q1755
#       RC_SET=NONE
#       STATUS=OK
#       SNAPSHOT=/tmp/probe/192.168.17.177-12367576123.jpg
#       IMAGESIZE_LIST=640x480,480x360,320x240,240x180,176x144,160x120
#       MEDIA_FORMAT_LIST=mjpeg,h264
#       AUDIO_LIST=off,on
#       AUDIO_FORMAT_LIST=g711,g726,aac
#   9. sample errors: 
#       STATUS=ERROR: PCE-0001 [101] configuration is not found
#       STATUS=ERROR: PCE-0002 [101] USRNAME and PASSWD should provided
#       STATUS=ERROR: PCE-0003 [101] DEVIP is not defined
#       STATUS=ERROR: PCE-0500 [101] Device does not respond (http://207.107.163.123:80)
#       STATUS=ERROR: PCE-0401 [101] Authorization error 
#       STATUS=ERROR: PCE-0403 [101] Forbidden 
#       STATUS=ERROR: PCE-0030 [101] Cannot get MODELID
#       note: [101] is DEVID
#  10. warnings:
#       STATUS=WARNING: PCW-0001 [101] MODELID does not match configuration
#       STATUS=WARNING: PCW-0002 [101] FIRMWARE does not match configuration
#       STATUS=WARNING: PCW-0009 [101] PROBE=RESET is not supported
#       
# -----------------------------------------------------------------------------
#  Note:
#   1. CAMERAMODEL file is obsolite. ptz_axisv2.pl & ptz_udp.pl has to be modified
#   2. Script mast be in the directory .../camera/<BRAND>/bin/
# -----------------------------------------------------------------------------
#  Author: teetov, 03/22/10
#  Edited by:
#  QA by:
#  Copyright: videoNEXT Network Solutions, Inc, 2010
# -----------------------------------------------------------------------------
#
use strict;
use LWP::UserAgent;
use HTTP::Request::Common;
use Device::Conf ":all";
#use Data::Dumper;
# cons -------------------------------------------------------------------------
# no code for Sony
# --------- check required parameters: DEVID,USRNAME,PASSWD,
my $conf=ProbeInit();  # uses <BRAND> from path and ARGV
ProbeErr("PCE-0001","configuration is not found") if not defined $conf->{DEVID}; 
ProbeErr("PCE-0003","DEVIP is not defined")       if not defined $conf->{DEVIP};
ProbeErr("PCE-0002","USRNAME and PASSWD should be provided") 
                 if not defined $conf->{USRNAME} or not defined $conf->{PASSWD};
ProbeWarn("PCW-0009","PROBE=RESET is not supported") if $conf->{PROBE} eq 'RESET';
#------------------------------------------------------------------------------
# Probe camera MODELID & FIRMWARE 
#------------------------------------------------------------------------------
my %result=(MODELID=>'0',FIRMWARE=>'0.0',STATUS=>'OK',RC_SET=>'NONE',AUDIO_SET=>'NONE');

UA()->timeout(10);
my $respond=ProbeRequest("/command/camera.cgi");
if($respond=~ /^HTTP ERROR/) {
  my ($err)=$respond=~/^HTTP ERROR \[(\d+)\]/;
  ProbeErr("PCE-0500","Device does not respond",$respond) if $err=~/^5\d\d/;
  ProbeErr("PCE-0401","Authorization error",    $respond) if $err==401;
}
$respond=ProbeRequest("/command/inquiry.cgi?inqjs=sysinfo");
if($respond!~/^HTTP ERROR/) {
  $result{MODELID} = $1 if $respond =~ /var\s+ModelName="(.+)"/i;
  $result{FIRMWARE} = $1 if $respond =~ /var\s+SoftVersion="(.+)"/i;
}
ProbeErr("PCE-0030","Cannot get MODELID or FIRMWARE",$respond) if ! $result{MODELID};

# Check MODELID & FIRMWARE ---------------------------------------------------
if(defined $conf->{MODELID} and $result{MODELID} ne $conf->{MODELID}) {
  $result{STATUS}="WARNING: PCW-0001 [$conf->{DEVID}] MODELID does not match configuration";
}elsif(defined $conf->{CAMERAFIRMWARE} and $result{FIRMWARE} ne $conf->{CAMERAFIRMWARE}) {
  $result{STATUS}="WARNING: PCW-0001 [$conf->{DEVID}] FIRMWARE does not match configuration";
}

#------------------------------------------------------------------------------
# get Sample picture 
#------------------------------------------------------------------------------
if($conf->{PROBE} eq 'DEFINE') {
   $result{SNAPSHOT}=ProbeSamplePicture();
}

#------------------------------------------------------------------------------
# get video and audio properties ( only firmware 4.x 5.x)
#------------------------------------------------------------------------------

# no code for Sony

#------------------------------------------------------------------------------
# interim report & exit 
#------------------------------------------------------------------------------
ProbeResult(\%result)  if $conf->{PROBE} =~ /^(DEFINE|FAST)$/;
ProbeResult(\%result) unless exists $conf->{DEVID} && $conf->{DEVID};

#------------------------------------------------------------------------------
# set RC (rate control) parameters + quality + imagesize
#------------------------------------------------------------------------------
#

my $postmortem="";
my $params=[];

if ($result{MODELID}=~/SNC-RZ30|SNC-Z20|SNC-CS3/) {
    $respond=ProbeRequest("/command/system.cgi",'POST',[],[DefFrameRate=>$conf->{FRAMERATE}]);
    if ($respond=~/^HTTP ERROR/){
        # AT: die "Could not set framerate for " . $model . ": "  . $rsp->content() . " : " . $rsp->status_line;
        $postmortem.="Could not set framerate for $result{MODELID}: $respond\n";
    }
}


if ($conf->{MEDIA_FORMAT} eq "audio" && $result{MODELID}!~/SNC-RZ30|SNC-Z20|SNC-CS3/) {
    push @$params, ('AudioIn'=>'on', 'AudInCodec'=>'g711_64');
}
elsif ($conf->{MEDIA_FORMAT} eq "mjpg") {
    push @$params,(ImageCodec=>'jpeg') if $result{MODELID}!~/SNC-RZ30|SNC-Z20|SNC-CS3/;
    
    if ($result{MODELID}=~/^(SNC-CH|SNC-DH|SNC-RH)/) {
	push @$params,(ImageSize1=>$conf->{IMAGESIZE});
    } elsif ($result{MODELID}!~/SNC-RZ30|SNC-Z20|SNC-CS3|SNC-CS10|SNC-CS11|SNC-DF70|SNC-P1|SNC-P5|SNC-RZ25/) {
        push @$params,(JpImageSize=>$conf->{IMAGESIZE});
    } else {
        push @$params,(ImageSize=>$conf->{IMAGESIZE});
    }
    
    if ($result{MODELID} =~ /SNC-RZ30|SNC-Z20|SNC-CS3/) {
        push @$params,(Quality=>$conf->{CAMCOMPRESSION});
    } elsif ($result{MODELID}=~/^(SNC-CH|SNC-DH|SNC-RH)/) {
	push @$params,(Quality1=>$conf->{CAMCOMPRESSION});
    } else {
        push @$params,(JpQuality=>$conf->{CAMCOMPRESSION});
    }

    push @$params,(JpFrameRate=>$conf->{FRAMERATE}) if $result{MODELID}!~/SNC-RZ30|SNC-Z20|SNC-CS3/;
    push @$params,(Bandwidth1=>'0.0') if $result{MODELID}=~/^(SNC-CH|SNC-DH|SNC-RH)/;
}
elsif ($conf->{MEDIA_FORMAT} eq "mpeg4")
{
    if ($result{MODELID}=~/^(SNC-CH|SNC-DH|SNC-RH)/) {
	push @$params, (
	    ImageCodec1 => 'mpeg4',
	    ImageSize1  => $conf->{IMAGESIZE},
	    FrameRate1  => $conf->{FRAMERATE}
	);
	push @$params, (BitRate1=>$conf->{RC_TARGETBITRATE}) if $conf->{RC_TARGETBITRATE} ne "cam-defined";
    }
    else {
	push @$params, (
	    ImageCodec  => 'mpeg4',
	    M4ImageSize => $conf->{IMAGESIZE},
	    M4FrameRate => $conf->{FRAMERATE}
	);
	push @$params, (M4BitRate=>$conf->{RC_TARGETBITRATE}) if $conf->{RC_TARGETBITRATE} ne "cam-defined";
    }
}
elsif ($conf->{MEDIA_FORMAT} eq "h264")
{
    if ($result{MODELID}=~/^(SNC-CH|SNC-DH|SNC-RH|SNC-EP)/) {
        push @$params, (
    	    ImageCodec1  => 'h264',
	    ImageSize1  => $conf->{IMAGESIZE},
	    FrameRate1  => $conf->{FRAMERATE}
	);
	push @$params,(BitRate1=>$conf->{RC_TARGETBITRATE}) if $conf->{RC_TARGETBITRATE} ne "cam-defined";
    }
    else {
	push @$params, (
	    ImageCodec    => 'h264',
	    H264ImageSize => $conf->{IMAGESIZE},
	    H264FrameRate => $conf->{FRAMERATE}
	);
	push @$params,(H264BitRate=>$conf->{RC_TARGETBITRATE}) if $conf->{RC_TARGETBITRATE} ne "cam-defined";
    }
}

if (@$params)
{
    $respond=ProbeRequest("/command/camera.cgi",'POST',[],$params);
    if ($respond=~/^HTTP ERROR/) {
        # AT: die "Could not set settings: " . $rsp->content() . " : " . $rsp->status_line;
        $postmortem.="Could not set settings: $respond\n";
    }
}
if($postmortem) {                               # AT: 
    my $ret=join "\n#",split(/\n/,$postmortem);
    $result{RC_SET}="ERROR\n#$ret"; 
}else {
    $result{RC_SET}="OK";
}
#------------------------------------------------------------------------------
# set AudioParams
#------------------------------------------------------------------------------
if ( exists $conf->{AUDIO} and $conf->{AUDIO} eq 'on' ) { 
# no code for Sony
}
# final report-----------------------------------------------------------------------
ProbeResult(\%result);

