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

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 $Schnittstelle=`/ids/$SPID/scripts/work/sonstiges/DbAbfrageC TasterSchnittstelle`;
my @DaliAdressRange = (1..64);

my $DaliAbfrage = DaliAbfrage(1); 

my $DaliSchreiben = DaliSchreiben(2, 9); 

select(undef, undef, undef, 1);
AGAIN:
my $DaliAbfrage = DaliAbfrage(1);


if ($DaliAbfrage == 2){
select(undef, undef, undef, 1);
goto AGAIN;
}

if ($DaliAbfrage == 4){
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;
}


if ($DaliAbfrage == 3 or $DaliAbfrage == 1){

	foreach(@DaliAdressRange){
	$RegisterAdr = 3000 + $_;

	my $DaliWert = DaliAbfrage($RegisterAdr);


	print "DaliWert:$DaliWert bei RegisterAdr:$RegisterAdr\n";

		if ($DaliWert ne "0"){
			my $DaliAdresse = 100 + $_;
			$AnzInstanzenReg = 3100 + $_;

			print("Check bei AnzInstanzenReg:$AnzInstanzenReg\n");	
			my $AnzInstanzen = DaliAbfrage($AnzInstanzenReg);
			print "AnzInstanzen:$AnzInstanzen bei DaliAdresse:$DaliAdresse\n";

			DaliSchreiben(60, $_);

			for (my $i = 1; $i <= $AnzInstanzen; $i++){
				DaliSchreiben(61, $i);
				# Instanz Type abfragen
				DaliSchreiben(62, 1);
	
				DaliSchreiben(2, 11);	
				# Warten bis die Dali Funktion sauber abgeschlossen wurde
				my $ok = DaliQuerryAfterWrite();

				print("Checke Instanztype bei i:$i\n");

				if ($ok) {
    					print "Schreibvorgang erfolgreich abgeschlossen.\n";
					my $InstanzenType = DaliAbfrage(66);
					print "Instanzt:$i Instanztype:$InstanzenType\n";

					# Instanz Stauts (aktive / deaktiviert) abfrage
                                	DaliSchreiben(62, 23);
					DaliSchreiben(2, 11);

                                	# Warten bis die Dali Funktion sauber abgeschlossen wurde
                                	my $ok2 = DaliQuerryAfterWrite();

					if ($ok2) {
						print "Schreibvorgang ok2 erfolgreich abgeschlossen.\n";
						my $InstanceActiveDeactive = DaliAbfrage(66);
						print "Instanzt:$i Instanztype:$InstanzenType State:$InstanceActiveDeactive\n";
					}
					else {
						print "Schreicorgange ok2 nicht erfolgreich\n";
					}

				}
				else {

					print "Schreicorgange nicht erfolgreich\n";
				}

			}	


		$StringToSend = $StringToSend.">".$_."<".$DaliInfo."<".$DaliGrInfo."<".$DaliWert;
		}
		else {
		$StringToSend = $StringToSend.">".$_."<<<".$DaliWert;
		}

	}

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

select(undef, undef, undef, 0.5);

#my $DaliSchreiben = `/scripts/work/sonstiges/ModbusAbfrageSend Send $DaliID $Schnittstelle 57600 2 6`;
#if ($DaliSchreiben eq "FF"){
#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;
#}

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

}






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

	my $DaliStart = `/scripts/work/sonstiges/ModbusAbfrageSend Abfrage $DaliID $Schnittstelle 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 DaliSchreiben {
	my ($register, $wert) = @_;

	my $DaliStart = `/scripts/work/sonstiges/ModbusAbfrageSend Send $DaliID $Schnittstelle 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 $DaliAbfrage = DaliAbfrage(1);

        if ($DaliAbfrage eq "2") {
            # Noch in Bearbeitung → kurz warten und erneut probieren
            select(undef, undef, undef, 0.5);
            next;
        }
        elsif ($DaliAbfrage eq "3") {
            # Alles gut → Erfolg
            return 1;
        }
        elsif ($DaliAbfrage 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 $DaliAbfrage;
        }
    }

    # Falls nach 20 Versuchen immer noch kein "3" oder "4" da ist
    return undef;
}

