#!/usr/bin/perl
#use Proc::Daemon;
#Proc::Daemon::Init;
#Proc::Daemon::Init({ pid_file => "/tmp/DaliIdent.pid"} );

system "/sbin/start-stop-daemon -s 9 -K --pidfile /tmp/GetDataFromSensor1.pid";
system "/sbin/start-stop-daemon -s 9 -K --pidfile /tmp/DaliAllg.pid";

# $ARGV[0] = Start / Stop 
# $ARGV[1] = 1 (id)
# $ARGV[2] = 5 (Ausgaenge)

my $SPID=`grep ^PID /scripts/work/sonstiges/neustart | cut -d "=" -f 2 | tr -d "\n"`;
my $Interface=`/ids/$SPID/scripts/work/sonstiges/DbAbfrageC TasterSchnittstelle`;
my $DaliID = 100 + $ARGV[1];

if ($ARGV[0] eq "Start"){

	DaliWrite(60, $ARGV[2]);
	DaliWrite(61, 3);
	DaliWrite(62, 22);

                while(){
		print("DaliID:$DaliID DaliWrite(2, 11)\n");
		DaliWrite(2, 11);
                select(undef, undef, undef, 5.0);
                }

select(undef, undef, undef, 1.0);
system "/sbin/start-stop-daemon -s 9 -K --pidfile /tmp/GetDataFromSensor1.pid";
system "/sbin/start-stop-daemon -S -x /usr/bin/nohup /scripts/work/sonstiges/GetDataFromSensor1  -m --pidfile /tmp/GetDataFromSensor1.pid >/dev/null 2>&1 &";
}


sub DaliQuery {
        my ($register) = @_;

        my $DaliStart = `/scripts/work/sonstiges/ModbusAbfrageSend Abfrage $DaliID $Interface 57600 $register - DEBUGOFF 2000000`;
        chomp($DaliStart);    # Leerzeichen/Zeilenende entfernen

        if ($DaliStart eq "FF") {
                print "ERROR:FF\n";
                system "/scripts/work/2dbs/GoPlGoS CLIENTFRONTUPDATE \"$Sec~$ClientID~DaliInfoBack;DaliGwNichtErreichbar;$ARGV[0]\"";
                system "/sbin/start-stop-daemon -s 9 -K --pidfile /tmp/GetDataFromSensor1.pid";
                system "/sbin/start-stop-daemon -S -x /usr/bin/nohup /scripts/work/sonstiges/GetDataFromSensor1 -m --pidfile /tmp/GetDataFromSensor1.pid >/dev/null 2>&1 &";
                exit 0;
        }

        return $DaliStart;
}




sub DaliWrite {
        my ($register, $wert) = @_;

        my $DaliStart = `/scripts/work/sonstiges/ModbusAbfrageSend Send $DaliID $Interface 57600 $register $wert`;
        chomp($DaliStart);

        if ($DaliStart eq "FF") {
                print "ERROR:FF\n";
                system "/scripts/work/2dbs/GoPlGoS CLIENTFRONTUPDATE \"$Sec~$ClientID~DaliInfoBack;DaliGwNichtErreichbar;$ARGV[0]\"";
                system "/sbin/start-stop-daemon -s 9 -K --pidfile /tmp/GetDataFromSensor1.pid";
                system "/sbin/start-stop-daemon -S -x /usr/bin/nohup /scripts/work/sonstiges/GetDataFromSensor1 -m --pidfile /tmp/GetDataFromSensor1.pid >/dev/null 2>&1 &";
                exit 0;
        }

        return $DaliStart;
}

sub DaliQuerryAfterWrite {
    # Jetzt max. 20 Abfragen auf Register 1
    for (my $i = 0; $i < 20; $i++) {
        my $DaliQuery = DaliQuery(1);

        if ($DaliQuery eq "2") {
            # Noch in Bearbeitung → kurz warten und erneut probieren
            select(undef, undef, undef, 0.5);
            next; 
        }
        elsif ($DaliQuery eq "3") {
            # Alles gut → Erfolg
            return 1;
        }
        elsif ($DaliQuery eq "4") {
            # Fehlerstatus → spezielle Behandlung
            print "ERROR:4\n";
            system "/scripts/work/2dbs/GoPlGoS CLIENTFRONTUPDATE \"$Sec~$ClientID~DaliInfoStatusReg1;$ARGV[0];4\"";
            system "/sbin/start-stop-daemon -s 9 -K --pidfile /tmp/GetDataFromSensor1.pid";
            system "/sbin/start-stop-daemon -S -x /usr/bin/nohup /scripts/work/sonstiges/GetDataFromSensor1 -m --pidfile /tmp/GetDataFromSensor1.pid >/dev/null 2>&1 &";
            exit 0;
        }
        else {
            # Unerwarteter Wert → einfach zurückgeben
            return $DaliQuery;
        }
    }           
                        
    # Falls nach 20 Versuchen immer noch kein "3" oder "4" da ist
    return undef;       
}  
