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

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


my $SPID=`grep ^PID /scripts/work/sonstiges/neustart | cut -d "=" -f 2 | tr -d "\n"`;
my $ClientID = ${ARGV[1]};
my $Sec = `date +%s`;
chomp($Sec);
my $DaliID = 100 + $ARGV[0];
my $DaliAdr = $ARGV[2];
my $DaliInst = $ARGV[3];
my $Interface=`/ids/$SPID/scripts/work/sonstiges/DbAbfrageC TasterSchnittstelle`;

my $DaliWrite = DaliWrite(60, $DaliAdr); 
my $DaliWrite = DaliWrite(61, $DaliInst);

#Aktivierte Events
DaliWrite(62, 10);
DaliWrite(2, 11);
my $ok = DaliQuerryAfterWrite();

if ($ok) {
	print "Schreibvorgang ok erfolgreich\n";
	$AktivierteEvents = DaliQuery(66);
	print "AktivierteEvents:$AktivierteEvents\n";
}

#Hold Timer
DaliWrite(62, 16);
DaliWrite(2, 11);
my $ok = DaliQuerryAfterWrite();

if ($ok) {
	print "Schreibvorgang ok2 erfolgreich\n";
	$HoldTimer = DaliQuery(66);
	print "HoldTimer:$HoldTimer\n";
}

#Report Timer
DaliWrite(62, 18);	
DaliWrite(2, 11);
my $ok = DaliQuerryAfterWrite();

if ($ok) {
	print "Schreibvorgang ok3 erfolgreich\n";
	$ReportTimer = DaliQuery(66);
	print "ReportTimer:$ReportTimer\n";
}

#Dead Timer
DaliWrite(62, 21);
DaliWrite(2, 11);
my $ok = DaliQuerryAfterWrite();

if ($ok) {
	print "Schreibvorgang ok4 erfolgreich\n";
	$DeadTimer = DaliQuery(66);
}

#MemoryBank
DaliWrite(62, 14);
DaliWrite(2, 11);
my $ok = DaliQuerryAfterWrite();

if ($ok) {
	print "Schreibvorgang ok5 erfolgreich\n";
	$MemoryBank = DaliQuery(66);
}

$StringToSend = $AktivierteEvents."<".$HoldTimer."<".$ReportTimer."<".$DeadTimer."<".$MemoryBank;
			
system "/scripts/work/2dbs/GoPlGoS CLIENTFRONTUPDATE \"$Sec~$ClientID~Dali2InstancesInfoExtendedType3Back;DaliGwErreichbar;$ARGV[0];$DaliAdr;$DaliInst;$StringToSend\"";


select(undef, undef, undef, 0.5);
system "/scripts/work/2dbs/GoPlGoS CLIENTFRONTUPDATE \"$Sec~$ClientID~Dali2InstancesExtendFinBack;$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 &";

#print("StringToSend:$StringToSend\n");



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

	#print("/scripts/work/sonstiges/ModbusAbfrageSend Abfrage $DaliID $Interface 57600 $register - DEBUGOFF 2000000");
	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;
}

