#!/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 $DaliAnzInst = $ARGV[3];
my $Interface=`/ids/$SPID/scripts/work/sonstiges/DbAbfrageC TasterSchnittstelle`;

my $DaliQuery = DaliQuery(1); 

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


for my $i (1 .. $DaliAnzInst) {
	print "Durchlauf Instanz:$i\n";
	DaliWrite(61, $i);
	
	#Instanz Type
	DaliWrite(62, 1);
	DaliWrite(2,11);

        my $ok = DaliQuerryAfterWrite();

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

			if ($DaliInstanzType != "3"){
				next;
			}
			#select(undef, undef, undef, 0.1);
			#Instanz enabled / disabled
			DaliWrite(62, 23);
			DaliWrite(2,11);

			my $ok2 = DaliQuerryAfterWrite();

			if ($ok2) {
				print "Schreibvorgang ok2 erfolgreich\n";
				my $DaliInstanzAktivDeaktiv = DaliQuery(66);
                                tie (%SP_DBC, 'DB_File', "/ids/${SPID}/scripts/work/sonstiges/JHJBKKDHBSHBDHSDKJSNLKJKHHLSKNKJHDSJSu665768675CS", O_RDONLY, 0644);
                                print("Dali2_".$DaliID."_".$DaliAdr."_".$i."\n");
				my $DaliInstanzSPInfos = $SP_DBC{"Dali2_".$DaliID."_".$DaliAdr."_".$i};
                                untie %SP_DBC;

				print("DaliInstanzSPInfos:$DaliInstanzSPInfos\n");
				$StringToSend = $StringToSend.">".$i."<".$DaliInstanzType."<".$DaliInstanzAktivDeaktiv."<".$DaliInstanzSPInfos;			

			}
			else {
				print "Schreibvorgang ok nicht erfolgreich\n";


			}

		}
		else {

			print "Schreibvorgang ok nicht erfolgreich\n";

		}


}

$StringToSend =~ s/^.//;
system "/scripts/work/2dbs/GoPlGoS CLIENTFRONTUPDATE \"$Sec~$ClientID~Dali2InstancesInfoBack;DaliGwErreichbar;$ARGV[0];$DaliAdr;$DaliAnzInst;$StringToSend\"";


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

